1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-19 17:06:50 +00:00

Add a combobox to switch languages of an Excel sheet

This commit is contained in:
Joshua Goins 2025-03-23 20:18:39 -04:00
parent 0dcad9c5f6
commit f99c3e4360
3 changed files with 47 additions and 23 deletions

View file

@ -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")

View file

@ -6,7 +6,6 @@
#include <KLocalizedString>
#include <QFile>
#include <QGroupBox>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QLabel>
@ -14,6 +13,8 @@
#include <QVBoxLayout>
#include <physis.hpp>
#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<int>(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;
}
}
// 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<QString, int> EXDPart::getColumnData(physis_ColumnData &columnData)

View file

@ -3,7 +3,9 @@
#pragma once
#include <QComboBox>
#include <QFormLayout>
#include <QJsonArray>
#include <QMap>
#include <QTabWidget>
#include <QWidget>
@ -21,11 +23,13 @@ public:
private:
std::pair<QString, int> 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<QString, CachedExcel> cachedExcelSheets;
Language getSuitableLanguage(physis_EXH *pExh);
Language preferredLanguage = Language::English;
physis_EXH *exh = nullptr;
QString name;
QJsonArray definitionList;
};