From f99c3e4360e3d4842f627f5e12bd40eac04e4e6c Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 23 Mar 2025 20:18:39 -0400 Subject: [PATCH] Add a combobox to switch languages of an Excel sheet --- parts/exd/CMakeLists.txt | 3 +- parts/exd/exdpart.cpp | 59 +++++++++++++++++++++++++--------------- parts/exd/exdpart.h | 8 ++++++ 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/parts/exd/CMakeLists.txt b/parts/exd/CMakeLists.txt index e98b662..77af741 100644 --- a/parts/exd/CMakeLists.txt +++ b/parts/exd/CMakeLists.txt @@ -8,7 +8,8 @@ target_link_libraries(exdpart KF6::I18n Physis::Physis Qt6::Core - Qt6::Widgets) + Qt6::Widgets + magic_enum) target_include_directories(exdpart PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(exdpart PRIVATE TRANSLATION_DOMAIN="novus") diff --git a/parts/exd/exdpart.cpp b/parts/exd/exdpart.cpp index 6a9290f..4364016 100644 --- a/parts/exd/exdpart.cpp +++ b/parts/exd/exdpart.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -14,6 +13,8 @@ #include #include +#include "magic_enum.hpp" + EXDPart::EXDPart(GameData *data, QWidget *parent) : QWidget(parent) , data(data) @@ -22,11 +23,14 @@ EXDPart::EXDPart(GameData *data, QWidget *parent) layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); - // TODO: This information should really be somewhere else - /*auto headerBox = new QGroupBox(QStringLiteral("Header")); - layout->addWidget(headerBox); - headerFormLayout = new QFormLayout(); - headerBox->setLayout(headerFormLayout);*/ + languageComboBox = new QComboBox(); + connect(languageComboBox, &QComboBox::activated, this, [this](const int index) { + auto selectedLanguage = languageComboBox->itemData(index); + preferredLanguage = (Language)selectedLanguage.toInt(); + + loadTables(); + }); + layout->addWidget(languageComboBox); pageTabWidget = new QTabWidget(); pageTabWidget->setTabPosition(QTabWidget::TabPosition::South); @@ -36,12 +40,9 @@ EXDPart::EXDPart(GameData *data, QWidget *parent) void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString &definitionPath) { - pageTabWidget->clear(); - QFile definitionFile(definitionPath); definitionFile.open(QIODevice::ReadOnly); - QJsonArray definitionList; if (definitionFile.isOpen()) { auto document = QJsonDocument::fromJson(definitionFile.readAll()); definitionList = document.object()[QLatin1String("definitions")].toArray(); @@ -66,19 +67,24 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString } } - auto exh = physis_parse_excel_sheet_header(buffer); + this->name = name; + exh = physis_parse_excel_sheet_header(buffer); - // ditto - /*QLayoutItem *child; - while ((child = headerFormLayout->takeAt(0)) != nullptr) { - delete child->widget(); - delete child; + languageComboBox->clear(); + for (int i = 0; i < exh->language_count; i++) { + const auto itemText = QString::fromUtf8(magic_enum::enum_name(exh->languages[i])); + // Don't add duplicates + if (languageComboBox->findText(itemText) == -1) { + languageComboBox->addItem(itemText, static_cast(exh->languages[i])); + } } - headerFormLayout->addRow(QStringLiteral("Num Rows"), new QLabel(QString::number(exh->row_count))); - headerFormLayout->addRow(QStringLiteral("Num Columns"), new QLabel(QString::number(exh->column_count))); - headerFormLayout->addRow(QStringLiteral("Num Pages"), new QLabel(QString::number(exh->page_count))); - headerFormLayout->addRow(QStringLiteral("Num Languages"), new QLabel(QString::number(exh->language_count)));*/ + loadTables(); +} + +void EXDPart::loadTables() +{ + pageTabWidget->clear(); for (uint32_t i = 0; i < exh->page_count; i++) { auto tableWidget = new QTableWidget(); @@ -185,13 +191,22 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString Language EXDPart::getSuitableLanguage(physis_EXH *pExh) { + // Find the preferred language first for (uint32_t i = 0; i < pExh->language_count; i++) { - if (pExh->languages[i] == Language::English) { - return Language::English; + if (pExh->languages[i] == preferredLanguage) { + return preferredLanguage; } } - return Language::None; + // Fallback to None + for (uint32_t i = 0; i < pExh->language_count; i++) { + if (pExh->languages[i] == Language::None) { + return Language::None; + } + } + + // Then English + return Language::English; } std::pair EXDPart::getColumnData(physis_ColumnData &columnData) diff --git a/parts/exd/exdpart.h b/parts/exd/exdpart.h index 4d37f92..23d6b4d 100644 --- a/parts/exd/exdpart.h +++ b/parts/exd/exdpart.h @@ -3,7 +3,9 @@ #pragma once +#include #include +#include #include #include #include @@ -21,11 +23,13 @@ public: private: std::pair getColumnData(physis_ColumnData &columnData); + void loadTables(); GameData *data = nullptr; QTabWidget *pageTabWidget = nullptr; QFormLayout *headerFormLayout = nullptr; + QComboBox *languageComboBox = nullptr; struct CachedExcel { physis_EXH *exh = nullptr; @@ -33,4 +37,8 @@ private: }; QMap cachedExcelSheets; Language getSuitableLanguage(physis_EXH *pExh); + Language preferredLanguage = Language::English; + physis_EXH *exh = nullptr; + QString name; + QJsonArray definitionList; }; \ No newline at end of file