diff --git a/common/include/filetypes.h b/common/include/filetypes.h index 7842b3c..66f3d9a 100644 --- a/common/include/filetypes.h +++ b/common/include/filetypes.h @@ -5,7 +5,7 @@ #include -enum class FileType { Unknown, ExcelList, ExcelHeader, ExcelData, Model, Texture, ShaderPackage, CharaMakeParams, Skeleton }; +enum class FileType { Unknown, ExcelList, ExcelHeader, ExcelData, Model, Texture, ShaderPackage, CharaMakeParams, Skeleton, Dictionary }; class FileTypes { diff --git a/common/src/filetypes.cpp b/common/src/filetypes.cpp index 9c94fb0..46609cb 100644 --- a/common/src/filetypes.cpp +++ b/common/src/filetypes.cpp @@ -13,7 +13,8 @@ const static QMap extensionToType{{QStringLiteral("exl"), Fil {QStringLiteral("tex"), FileType::Texture}, {QStringLiteral("shpk"), FileType::ShaderPackage}, {QStringLiteral("cmp"), FileType::CharaMakeParams}, - {QStringLiteral("sklb"), FileType::Skeleton}}; + {QStringLiteral("sklb"), FileType::Skeleton}, + {QStringLiteral("dic"), FileType::Dictionary}}; const static QMap typeToName{{FileType::Unknown, i18n("Unknown")}, {FileType::ExcelList, i18n("Excel List")}, @@ -23,17 +24,19 @@ const static QMap typeToName{{FileType::Unknown, i18n("Unknow {FileType::Texture, i18n("Texture")}, {FileType::ShaderPackage, i18n("Shader Package")}, {FileType::CharaMakeParams, i18n("Chara Make Params")}, - {FileType::Skeleton, i18n("Skeleton")}}; + {FileType::Skeleton, i18n("Skeleton")}, + {FileType::Dictionary, i18n("Dictionary")}}; -const static QMap typeToIcon{{FileType::Unknown, i18n("unknown")}, - {FileType::ExcelList, i18n("x-office-spreadsheet")}, - {FileType::ExcelHeader, i18n("x-office-spreadsheet")}, - {FileType::ExcelData, i18n("x-office-spreadsheet")}, - {FileType::Model, i18n("shape-cuboid-symbolic")}, - {FileType::Texture, i18n("viewimage-symbolic")}, - {FileType::ShaderPackage, i18n("paint-pattern-symbolic")}, - {FileType::CharaMakeParams, i18n("step_object_SoftBody-symbolic")}, - {FileType::Skeleton, i18n("user-symbolic")}}; +const static QMap typeToIcon{{FileType::Unknown, QStringLiteral("unknown")}, + {FileType::ExcelList, QStringLiteral("x-office-spreadsheet")}, + {FileType::ExcelHeader, QStringLiteral("x-office-spreadsheet")}, + {FileType::ExcelData, QStringLiteral("x-office-spreadsheet")}, + {FileType::Model, QStringLiteral("shape-cuboid-symbolic")}, + {FileType::Texture, QStringLiteral("viewimage-symbolic")}, + {FileType::ShaderPackage, QStringLiteral("paint-pattern-symbolic")}, + {FileType::CharaMakeParams, QStringLiteral("step_object_SoftBody-symbolic")}, + {FileType::Skeleton, QStringLiteral("user-symbolic")}, + {FileType::Dictionary, QStringLiteral("accessories-dictionary-symbolic")}}; FileType FileTypes::getFileType(const QString &extension) { diff --git a/extern/libphysis b/extern/libphysis index 6cd4b5d..d90badd 160000 --- a/extern/libphysis +++ b/extern/libphysis @@ -1 +1 @@ -Subproject commit 6cd4b5ddfa3c13cadf0ef0b39a5d23d0ac1ff431 +Subproject commit d90badda85518997d9e639c49744531d4745d165 diff --git a/parts/CMakeLists.txt b/parts/CMakeLists.txt index c76962c..75ac1cb 100644 --- a/parts/CMakeLists.txt +++ b/parts/CMakeLists.txt @@ -2,6 +2,7 @@ # SPDX-License-Identifier: CC0-1.0 add_subdirectory(cmp) +add_subdirectory(dic) add_subdirectory(exd) add_subdirectory(exl) add_subdirectory(hex) diff --git a/parts/dic/CMakeLists.txt b/parts/dic/CMakeLists.txt new file mode 100644 index 0000000..5e162b0 --- /dev/null +++ b/parts/dic/CMakeLists.txt @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2024 Joshua Goins +# SPDX-License-Identifier: CC0-1.0 + +add_library(dicpart STATIC) +target_sources(dicpart PRIVATE dicpart.cpp) +target_link_libraries(dicpart + PUBLIC + KF6::I18n + Physis::Physis + Qt6::Core + Qt6::Widgets) +target_include_directories(dicpart PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_compile_definitions(dicpart PRIVATE TRANSLATION_DOMAIN="novus") + +add_library(Novus::DicPart ALIAS dicpart) \ No newline at end of file diff --git a/parts/dic/dicpart.cpp b/parts/dic/dicpart.cpp new file mode 100644 index 0000000..7626666 --- /dev/null +++ b/parts/dic/dicpart.cpp @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "dicpart.h" + +#include +#include +#include +#include +#include +#include +#include + +DicPart::DicPart(QWidget *parent) + : QWidget(parent) +{ + auto layout = new QVBoxLayout(); + layout->setContentsMargins(0, 0, 0, 0); + m_tableWidget = new QTableWidget(); + layout->addWidget(m_tableWidget); + setLayout(layout); +} + +void DicPart::load(physis_Buffer file) +{ + auto dic = physis_parse_dictionary(file); + if (dic.num_words > 0) { + m_tableWidget->clear(); + m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); + + m_tableWidget->setColumnCount(1); + m_tableWidget->setRowCount(dic.num_words); + + m_tableWidget->setHorizontalHeaderLabels({i18nc("@title:column", "Word")}); + + for (int i = 0; i < dic.num_words; i++) { + // TODO: it seems not all utf8 characters are parsed correctly? + auto item = new QTableWidgetItem(QString::fromUtf8(dic.words[i])); + + m_tableWidget->setItem(i, 0, item); + } + + m_tableWidget->resizeColumnsToContents(); + } +} + +#include "moc_dicpart.cpp" \ No newline at end of file diff --git a/parts/dic/dicpart.h b/parts/dic/dicpart.h new file mode 100644 index 0000000..def4428 --- /dev/null +++ b/parts/dic/dicpart.h @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include + +class DicPart : public QWidget +{ + Q_OBJECT + +public: + explicit DicPart(QWidget *parent = nullptr); + + void load(physis_Buffer file); + +private: + GameData *data = nullptr; + + QTableWidget *m_tableWidget = nullptr; +}; \ No newline at end of file diff --git a/sagasu/CMakeLists.txt b/sagasu/CMakeLists.txt index 98c7ab1..4c4b739 100644 --- a/sagasu/CMakeLists.txt +++ b/sagasu/CMakeLists.txt @@ -43,6 +43,7 @@ target_link_libraries(novus-sagasu Novus::MdlPart Novus::ExdPart Novus::TexPart + Novus::DicPart Physis::Logger Qt6::Concurrent Qt6::Network) diff --git a/sagasu/src/mainwindow.cpp b/sagasu/src/mainwindow.cpp index 0f866e9..34b9c79 100644 --- a/sagasu/src/mainwindow.cpp +++ b/sagasu/src/mainwindow.cpp @@ -17,6 +17,7 @@ #include #include "cmppart.h" +#include "dicpart.h" #include "exdpart.h" #include "exlpart.h" #include "filepropertieswindow.h" @@ -126,6 +127,11 @@ void MainWindow::refreshParts(const QString &path) sklbWidget->load(physis_parse_skeleton(file)); partHolder->addTab(sklbWidget, i18nc("@title:tab", "Skeleton")); } break; + case FileType::Dictionary: { + auto dicWidget = new DicPart(); + dicWidget->load(file); + partHolder->addTab(dicWidget, i18nc("@title:tab", "Dictionary")); + } break; default: break; }