#include "RaveWelcomeViewStep.h" #include "RaveBillentyuzet.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include CALAMARES_PLUGIN_FACTORY_DEFINITION(RaveWelcomeViewStepFactory, registerPlugin();) namespace { struct LanguageTexts { QString title; QString next; QString installer; }; LanguageTexts textsFor(const QString& localeId) { if (localeId.startsWith(QLatin1String("hu"))) return { QStringLiteral("VÁLASSZ NYELVET"), QStringLiteral("Tovább"), QStringLiteral("TELEPÍTŐ") }; if (localeId.startsWith(QLatin1String("de"))) return { QStringLiteral("SPRACHE WÄHLEN"), QStringLiteral("Weiter"), QStringLiteral("INSTALLATION") }; return { QStringLiteral("CHOOSE YOUR LANGUAGE"), QStringLiteral("Next"), QStringLiteral("INSTALLER") }; } QString fullLocaleName(const QString& localeId) { QString lang = QLocale(localeId).name(); if (lang.isEmpty()) lang = localeId; return lang.contains('.') ? lang : lang + ".UTF-8"; } QString nativeName(const QString& localeId) { QString name = QLocale(localeId).nativeLanguageName(); if (name.isEmpty()) return localeId; name[0] = name[0].toUpper(); return name; } } class BgWidget : public QWidget { public: explicit BgWidget(QWidget* parent = nullptr) : QWidget(parent) {} void setPixmap(const QPixmap& px) { m_pixmap = px; update(); } protected: void paintEvent(QPaintEvent*) override { QPainter p(this); p.fillRect(rect(), QColor(0x1a, 0x1b, 0x1d)); if (m_pixmap.isNull()) return; const QSize scaled = m_pixmap.size().scaled(size(), Qt::KeepAspectRatioByExpanding); const QRect target((width() - scaled.width()) / 2, (height() - scaled.height()) * 4 / 10, scaled.width(), scaled.height()); p.setRenderHint(QPainter::SmoothPixmapTransform); p.drawPixmap(target, m_pixmap); } private: QPixmap m_pixmap; }; RaveWelcomeViewStep::RaveWelcomeViewStep(QObject* parent) : Calamares::ViewStep(parent) { RaveBillentyuzet::regisztral(); m_localeIds = { "hu", "en", "en_GB", "de" }; } RaveWelcomeViewStep::~RaveWelcomeViewStep() { if (m_widget && m_widget->parent() == nullptr) delete m_widget; } QString RaveWelcomeViewStep::prettyName() const { const QString locale = getLocale(); if (locale.startsWith("hu")) { return QStringLiteral("Nyelv"); } if (locale.startsWith("de")) { return QStringLiteral("Sprache"); } return tr("Language"); } QString RaveWelcomeViewStep::getLocale() const { if (Calamares::JobQueue::instance()) { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if (gs) { if (gs->contains("locale")) { const QString loc = gs->value("locale").toString(); if (!loc.isEmpty()) return loc; } if (gs->contains("localeConf")) { const QString loc = gs->value("localeConf").toMap().value("LANG").toString(); if (!loc.isEmpty()) return loc; } } } return QLocale::system().name(); } void RaveWelcomeViewStep::buildWidget() { auto* bg = new BgWidget(); bg->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QString imgPath; if (Calamares::Branding::instance()) imgPath = Calamares::Branding::instance()->imagePath(Calamares::Branding::ProductWelcome); if (!imgPath.isEmpty()) bg->setPixmap(QPixmap(imgPath)); m_tag = new QLabel(); m_tag->setObjectName("ravewelcomeTag"); auto* panel = new QFrame(); panel->setObjectName("ravewelcomeBar"); m_title = new QLabel(); m_title->setObjectName("ravewelcomeTitle"); m_localeLabel = new QLabel(); m_localeLabel->setObjectName("ravewelcomeLocale"); auto* headerLayout = new QHBoxLayout(); headerLayout->setContentsMargins(0, 0, 0, 0); headerLayout->addWidget(m_title); headerLayout->addStretch(); headerLayout->addWidget(m_localeLabel, 0, Qt::AlignBottom); m_langButtons = new QButtonGroup(panel); m_langButtons->setExclusive(true); auto* langLayout = new QGridLayout(); langLayout->setContentsMargins(0, 0, 0, 0); langLayout->setHorizontalSpacing(8); for (int i = 0; i < m_localeIds.size(); ++i) { auto* button = new QPushButton(nativeName(m_localeIds[i])); button->setObjectName("ravewelcomeLang"); button->setCheckable(true); button->setMinimumHeight(48); button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_langButtons->addButton(button, i); langLayout->addWidget(button, 0, i); } m_next = new QPushButton(); m_next->setObjectName("ravewelcomeNext"); m_next->setMinimumHeight(48); connect(m_next, &QPushButton::clicked, this, []() { if (auto* vm = Calamares::ViewManager::instance()) vm->next(); }); auto* actionLayout = new QHBoxLayout(); actionLayout->setContentsMargins(0, 0, 0, 0); actionLayout->setSpacing(12); actionLayout->addLayout(langLayout, 1); actionLayout->addWidget(m_next); auto* panelLayout = new QVBoxLayout(panel); panelLayout->setContentsMargins(24, 20, 24, 20); panelLayout->setSpacing(14); panelLayout->addLayout(headerLayout); panelLayout->addLayout(actionLayout); const QString sysName = QLocale::system().name(); int exact = -1; int prefix = -1; for (int i = 0; i < m_localeIds.size(); ++i) { if (m_localeIds[i] == sysName) exact = i; else if (prefix < 0 && sysName.startsWith(m_localeIds[i].left(2))) prefix = i; } if (exact >= 0) m_currentLocaleIndex = exact; else if (prefix >= 0) m_currentLocaleIndex = prefix; else m_currentLocaleIndex = qMax(0, m_localeIds.indexOf("en")); if (auto* button = m_langButtons->button(m_currentLocaleIndex)) button->setChecked(true); applyLiveKeyboardLayout(m_localeIds.value(m_currentLocaleIndex)); connect(m_langButtons, &QButtonGroup::idClicked, this, &RaveWelcomeViewStep::onLanguageChanged); auto* mainLayout = new QVBoxLayout(bg); mainLayout->setSpacing(0); mainLayout->addWidget(m_tag, 0, Qt::AlignLeft | Qt::AlignTop); mainLayout->addStretch(); mainLayout->addWidget(panel); m_widget = bg; updateTexts(); } void RaveWelcomeViewStep::updateTexts() { const QString localeId = m_localeIds.value(m_currentLocaleIndex); const LanguageTexts texts = textsFor(localeId); QString version; if (Calamares::Branding::instance()) version = Calamares::Branding::instance()->string(Calamares::Branding::Version); const QString product = version.isEmpty() ? QStringLiteral("RAVEOS") : QStringLiteral("RAVEOS ") + version; m_tag->setText(product + QStringLiteral(" · ") + texts.installer); m_title->setText(texts.title); m_localeLabel->setText(fullLocaleName(localeId)); m_next->setText(texts.next); } QSize RaveWelcomeViewStep::widgetMargins(Qt::Orientations) { return QSize(28, 24); } QWidget* RaveWelcomeViewStep::widget() { if (!m_widget) buildWidget(); return m_widget; } void RaveWelcomeViewStep::onLanguageChanged(int index) { if (index < 0 || index >= m_localeIds.size()) return; m_currentLocaleIndex = index; QString localeId = m_localeIds[index]; if (Calamares::JobQueue::instance()) { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if (gs) { QString lang = QLocale(localeId).name(); if (lang.isEmpty()) lang = localeId; const QString fullLocale = fullLocaleName(localeId); const char* lcKeys[] = { "LANG", "LC_NUMERIC", "LC_TIME", "LC_MONETARY", "LC_PAPER", "LC_NAME", "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION" }; QVariantMap localeConf = gs->value("localeConf").toMap(); for (const char* k : lcKeys) localeConf.insert(QLatin1String(k), fullLocale); gs->insert("localeConf", localeConf); gs->insert("locale", lang); } } Calamares::Locale::Translation::Id tid { localeId }; Calamares::installTranslator(tid, brandingTranslationsPrefix()); applyLiveKeyboardLayout(localeId); updateTexts(); } QString RaveWelcomeViewStep::brandingTranslationsPrefix() const { if (Calamares::Branding::instance()) return Calamares::Branding::instance()->translationsDirectory(); return QString(); } void RaveWelcomeViewStep::applyLiveKeyboardLayout(const QString& localeId) { QString layout = QStringLiteral("us"); if (localeId.startsWith(QLatin1String("hu"))) { layout = QStringLiteral("hu"); } else if (localeId.startsWith(QLatin1String("de"))) { layout = QStringLiteral("de"); } else if (localeId == QLatin1String("en_GB")) { layout = QStringLiteral("gb"); } const QStringList args { QStringLiteral("-layout"), layout }; QProcess::startDetached(QStringLiteral("setxkbmap"), args); } bool RaveWelcomeViewStep::isNextEnabled() const { return true; } bool RaveWelcomeViewStep::isBackEnabled() const { return false; } bool RaveWelcomeViewStep::isAtBeginning() const { return true; } bool RaveWelcomeViewStep::isAtEnd() const { return true; } Calamares::JobList RaveWelcomeViewStep::jobs() const { return {}; } void RaveWelcomeViewStep::setConfigurationMap(const QVariantMap& config) { if (config.contains("languages")) { QStringList langs; for (const auto& v : config.value("languages").toList()) langs << v.toString(); if (!langs.isEmpty()) m_localeIds = langs; } }