Skip to content

Commit f99c3e4

Browse files
committed
Add a combobox to switch languages of an Excel sheet
1 parent 0dcad9c commit f99c3e4

File tree

3 files changed

+47
-23
lines changed

3 files changed

+47
-23
lines changed

parts/exd/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ target_link_libraries(exdpart
88
KF6::I18n
99
Physis::Physis
1010
Qt6::Core
11-
Qt6::Widgets)
11+
Qt6::Widgets
12+
magic_enum)
1213
target_include_directories(exdpart PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
1314
target_compile_definitions(exdpart PRIVATE TRANSLATION_DOMAIN="novus")
1415

parts/exd/exdpart.cpp

+37-22
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
#include <KLocalizedString>
77
#include <QFile>
88
#include <QGroupBox>
9-
#include <QJsonArray>
109
#include <QJsonDocument>
1110
#include <QJsonObject>
1211
#include <QLabel>
1312
#include <QTableWidget>
1413
#include <QVBoxLayout>
1514
#include <physis.hpp>
1615

16+
#include "magic_enum.hpp"
17+
1718
EXDPart::EXDPart(GameData *data, QWidget *parent)
1819
: QWidget(parent)
1920
, data(data)
@@ -22,11 +23,14 @@ EXDPart::EXDPart(GameData *data, QWidget *parent)
2223
layout->setContentsMargins(0, 0, 0, 0);
2324
setLayout(layout);
2425

25-
// TODO: This information should really be somewhere else
26-
/*auto headerBox = new QGroupBox(QStringLiteral("Header"));
27-
layout->addWidget(headerBox);
28-
headerFormLayout = new QFormLayout();
29-
headerBox->setLayout(headerFormLayout);*/
26+
languageComboBox = new QComboBox();
27+
connect(languageComboBox, &QComboBox::activated, this, [this](const int index) {
28+
auto selectedLanguage = languageComboBox->itemData(index);
29+
preferredLanguage = (Language)selectedLanguage.toInt();
30+
31+
loadTables();
32+
});
33+
layout->addWidget(languageComboBox);
3034

3135
pageTabWidget = new QTabWidget();
3236
pageTabWidget->setTabPosition(QTabWidget::TabPosition::South);
@@ -36,12 +40,9 @@ EXDPart::EXDPart(GameData *data, QWidget *parent)
3640

3741
void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString &definitionPath)
3842
{
39-
pageTabWidget->clear();
40-
4143
QFile definitionFile(definitionPath);
4244
definitionFile.open(QIODevice::ReadOnly);
4345

44-
QJsonArray definitionList;
4546
if (definitionFile.isOpen()) {
4647
auto document = QJsonDocument::fromJson(definitionFile.readAll());
4748
definitionList = document.object()[QLatin1String("definitions")].toArray();
@@ -66,19 +67,24 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString
6667
}
6768
}
6869

69-
auto exh = physis_parse_excel_sheet_header(buffer);
70+
this->name = name;
71+
exh = physis_parse_excel_sheet_header(buffer);
7072

71-
// ditto
72-
/*QLayoutItem *child;
73-
while ((child = headerFormLayout->takeAt(0)) != nullptr) {
74-
delete child->widget();
75-
delete child;
73+
languageComboBox->clear();
74+
for (int i = 0; i < exh->language_count; i++) {
75+
const auto itemText = QString::fromUtf8(magic_enum::enum_name(exh->languages[i]));
76+
// Don't add duplicates
77+
if (languageComboBox->findText(itemText) == -1) {
78+
languageComboBox->addItem(itemText, static_cast<int>(exh->languages[i]));
79+
}
7680
}
7781

78-
headerFormLayout->addRow(QStringLiteral("Num Rows"), new QLabel(QString::number(exh->row_count)));
79-
headerFormLayout->addRow(QStringLiteral("Num Columns"), new QLabel(QString::number(exh->column_count)));
80-
headerFormLayout->addRow(QStringLiteral("Num Pages"), new QLabel(QString::number(exh->page_count)));
81-
headerFormLayout->addRow(QStringLiteral("Num Languages"), new QLabel(QString::number(exh->language_count)));*/
82+
loadTables();
83+
}
84+
85+
void EXDPart::loadTables()
86+
{
87+
pageTabWidget->clear();
8288

8389
for (uint32_t i = 0; i < exh->page_count; i++) {
8490
auto tableWidget = new QTableWidget();
@@ -185,13 +191,22 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString
185191

186192
Language EXDPart::getSuitableLanguage(physis_EXH *pExh)
187193
{
194+
// Find the preferred language first
195+
for (uint32_t i = 0; i < pExh->language_count; i++) {
196+
if (pExh->languages[i] == preferredLanguage) {
197+
return preferredLanguage;
198+
}
199+
}
200+
201+
// Fallback to None
188202
for (uint32_t i = 0; i < pExh->language_count; i++) {
189-
if (pExh->languages[i] == Language::English) {
190-
return Language::English;
203+
if (pExh->languages[i] == Language::None) {
204+
return Language::None;
191205
}
192206
}
193207

194-
return Language::None;
208+
// Then English
209+
return Language::English;
195210
}
196211

197212
std::pair<QString, int> EXDPart::getColumnData(physis_ColumnData &columnData)

parts/exd/exdpart.h

+8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
#pragma once
55

6+
#include <QComboBox>
67
#include <QFormLayout>
8+
#include <QJsonArray>
79
#include <QMap>
810
#include <QTabWidget>
911
#include <QWidget>
@@ -21,16 +23,22 @@ class EXDPart : public QWidget
2123

2224
private:
2325
std::pair<QString, int> getColumnData(physis_ColumnData &columnData);
26+
void loadTables();
2427

2528
GameData *data = nullptr;
2629

2730
QTabWidget *pageTabWidget = nullptr;
2831
QFormLayout *headerFormLayout = nullptr;
32+
QComboBox *languageComboBox = nullptr;
2933

3034
struct CachedExcel {
3135
physis_EXH *exh = nullptr;
3236
physis_EXD exd{};
3337
};
3438
QMap<QString, CachedExcel> cachedExcelSheets;
3539
Language getSuitableLanguage(physis_EXH *pExh);
40+
Language preferredLanguage = Language::English;
41+
physis_EXH *exh = nullptr;
42+
QString name;
43+
QJsonArray definitionList;
3644
};

0 commit comments

Comments
 (0)