diff --git a/sagasu/CMakeLists.txt b/sagasu/CMakeLists.txt index b4391a0..287feed 100644 --- a/sagasu/CMakeLists.txt +++ b/sagasu/CMakeLists.txt @@ -22,6 +22,6 @@ target_sources(novus-sagasu PRIVATE src/filepropertieswindow.cpp src/filetreemodel.cpp) target_include_directories(novus-sagasu PRIVATE include) -target_link_libraries(novus-sagasu PRIVATE Qt6::Concurrent hexpart novus-sagasu-static) +target_link_libraries(novus-sagasu PRIVATE Qt6::Concurrent hexpart exlpart mdlpart exdpart novus-sagasu-static) install(TARGETS novus-sagasu ${KF${QT_MAJOR_VERSION}_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/sagasu/include/mainwindow.h b/sagasu/include/mainwindow.h index 18384ff..3302a65 100644 --- a/sagasu/include/mainwindow.h +++ b/sagasu/include/mainwindow.h @@ -7,6 +7,7 @@ #include #include +#include "filecache.h" #include "novusmainwindow.h" struct GameData; @@ -21,5 +22,7 @@ private: GameData *data = nullptr; QTabWidget *partHolder = nullptr; + FileCache fileCache; + void refreshParts(QString qString); }; \ No newline at end of file diff --git a/sagasu/src/filetreewindow.cpp b/sagasu/src/filetreewindow.cpp index de602da..3b6243e 100644 --- a/sagasu/src/filetreewindow.cpp +++ b/sagasu/src/filetreewindow.cpp @@ -63,7 +63,7 @@ FileTreeWindow::FileTreeWindow(QString gamePath, GameData *data, QWidget *parent connect(treeWidget, &QTreeView::clicked, [this, treeWidget](const QModelIndex &item) { if (item.isValid()) { - auto path = m_fileModel->data(item, Qt::UserRole).toString(); + auto path = m_searchModel->data(item, Qt::UserRole).toString(); Q_EMIT pathSelected(path); } }); diff --git a/sagasu/src/indexer.cpp b/sagasu/src/indexer.cpp index b842ed9..92e3047 100644 --- a/sagasu/src/indexer.cpp +++ b/sagasu/src/indexer.cpp @@ -4,7 +4,15 @@ #include "hashdatabase.h" #include "settings.h" -const std::array known_folders{"common", "common/font", "common/graphics", "common/graphics/texture", "common/softwarecursor", "exd"}; +const std::array known_folders{"common", + "common/font", + "common/graphics", + "common/graphics/texture", + "common/softwarecursor", + "exd", + "chara/equipment/e0000/material/v0001", + "chara/equipment/e0000/texture", + "chara/human/c0101/obj/face/f0001/model"}; const std::array common_font{"common/VulgarWordsFilter.dic", "common/VulgarWordsFilter_party.dic", @@ -148,6 +156,11 @@ int main(int argc, char *argv[]) } database.addFile(QStringLiteral("exd/root.exl")); + database.addFile(QStringLiteral("exd/achievement.exh")); + database.addFile(QStringLiteral("exd/Achievement_0_en.exd")); + database.addFile(QStringLiteral("chara/equipment/e0000/material/v0001/mt_c0101e0000_sho_a.mtrl")); + database.addFile(QStringLiteral("chara/equipment/e0000/texture/v01_c0101e0000_sho_d.tex")); + database.addFile(QStringLiteral("chara/human/c0101/obj/face/f0001/model/c0101f0001_fac.mdl")); /*const QString gameDir{getGameDirectory()}; const std::string gameDirStd{gameDir.toStdString()}; diff --git a/sagasu/src/mainwindow.cpp b/sagasu/src/mainwindow.cpp index 8954c72..d28a475 100644 --- a/sagasu/src/mainwindow.cpp +++ b/sagasu/src/mainwindow.cpp @@ -7,15 +7,20 @@ #include #include #include +#include #include +#include "exdpart.h" +#include "exlpart.h" #include "filepropertieswindow.h" #include "filetreewindow.h" #include "hexpart.h" +#include "mdlpart.h" MainWindow::MainWindow(QString gamePath, GameData *data) : NovusMainWindow() , data(data) + , fileCache(*data) { setupMenubar(); @@ -66,11 +71,28 @@ void MainWindow::refreshParts(QString path) auto file = physis_gamedata_extract_file(data, path.toStdString().c_str()); - // Add properties tab - auto propertiesWidget = new FilePropertiesWindow(path, file); - partHolder->addTab(propertiesWidget, QStringLiteral("Properties")); + QFileInfo info(path); + if (info.completeSuffix() == QStringLiteral("exl")) { + auto exlWidget = new EXLPart(data); + exlWidget->load(file); + partHolder->addTab(exlWidget, QStringLiteral("Excel List")); + } else if (info.completeSuffix() == QStringLiteral("exh")) { + auto exdWidget = new EXDPart(data); + exdWidget->loadSheet(info.baseName(), file); + partHolder->addTab(exdWidget, QStringLiteral("Excel Sheet")); + } else if (info.completeSuffix() == QStringLiteral("exd")) { + auto exdWidget = new QLabel(QStringLiteral("Note: Excel data files cannot be previewed standalone, select the EXH file instead.")); + partHolder->addTab(exdWidget, QStringLiteral("Note")); + } else if (info.completeSuffix() == QStringLiteral("mdl")) { + auto mdlWidget = new MDLPart(data, fileCache); + mdlWidget->addModel(physis_mdl_parse(file.size, file.data), QStringLiteral("mdl"), {}, 0); + partHolder->addTab(mdlWidget, QStringLiteral("Model")); + } auto hexWidget = new HexPart(); hexWidget->loadFile(file); partHolder->addTab(hexWidget, QStringLiteral("Raw Hex")); + + auto propertiesWidget = new FilePropertiesWindow(path, file); + partHolder->addTab(propertiesWidget, QStringLiteral("Properties")); }