From 9cdddae7a617b3f9f51d55cc1366f22655d691d6 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Thu, 12 Oct 2023 20:30:17 -0400 Subject: [PATCH] sagasu: Index all ffxiv index files, stop hardcoding a path you dunce --- sagasu/include/filetreemodel.h | 2 +- sagasu/include/filetreewindow.h | 2 +- sagasu/include/mainwindow.h | 2 +- sagasu/src/filetreemodel.cpp | 28 ++++++++++++++++++---------- sagasu/src/filetreewindow.cpp | 4 ++-- sagasu/src/indexer.cpp | 2 ++ sagasu/src/main.cpp | 2 +- sagasu/src/mainwindow.cpp | 4 ++-- 8 files changed, 28 insertions(+), 18 deletions(-) diff --git a/sagasu/include/filetreemodel.h b/sagasu/include/filetreemodel.h index a155865..65f4afe 100644 --- a/sagasu/include/filetreemodel.h +++ b/sagasu/include/filetreemodel.h @@ -26,7 +26,7 @@ class FileTreeModel : public QAbstractItemModel Q_OBJECT public: - explicit FileTreeModel(GameData *data); + explicit FileTreeModel(QString gamePath, GameData *data); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; diff --git a/sagasu/include/filetreewindow.h b/sagasu/include/filetreewindow.h index e2d2a47..43d5429 100644 --- a/sagasu/include/filetreewindow.h +++ b/sagasu/include/filetreewindow.h @@ -12,7 +12,7 @@ class FileTreeWindow : public QWidget { Q_OBJECT public: - explicit FileTreeWindow(GameData *data, QWidget *parent = nullptr); + explicit FileTreeWindow(QString gamePath, GameData *data, QWidget *parent = nullptr); Q_SIGNALS: void extractFile(QString path); diff --git a/sagasu/include/mainwindow.h b/sagasu/include/mainwindow.h index 564afd6..18384ff 100644 --- a/sagasu/include/mainwindow.h +++ b/sagasu/include/mainwindow.h @@ -14,7 +14,7 @@ struct GameData; class MainWindow : public NovusMainWindow { public: - MainWindow(GameData *data); + MainWindow(QString gamePath, GameData *data); private: QMdiArea *mdiArea = nullptr; diff --git a/sagasu/src/filetreemodel.cpp b/sagasu/src/filetreemodel.cpp index e940065..9cae4d0 100644 --- a/sagasu/src/filetreemodel.cpp +++ b/sagasu/src/filetreemodel.cpp @@ -6,7 +6,7 @@ #include -FileTreeModel::FileTreeModel(GameData *data) +FileTreeModel::FileTreeModel(QString gamePath, GameData *data) : gameData(data) , QAbstractItemModel() { @@ -17,16 +17,24 @@ FileTreeModel::FileTreeModel(GameData *data) addKnownFolder(knownFolder); } - auto indexEntries = physis_index_parse("/home/josh/.local/share/astra/game/{1973dab7-aa23-4af1-8a48-bfec78dd6c8e}/game/sqpack/ffxiv/000000.win32.index"); - for (int i = 0; i < indexEntries.num_entries; i++) { - if (knownDirHashes.contains(indexEntries.dir_entries[i])) { - QString name; - if (m_database.knowsFile(indexEntries.filename_entries[i])) { - name = m_database.getFilename(indexEntries.filename_entries[i]); + QDirIterator it(QStringLiteral("%1/sqpack/ffxiv").arg(gamePath)); + while (it.hasNext()) { + it.next(); + QFileInfo info = it.fileInfo(); + if (info.exists() && (info.completeSuffix() == QStringLiteral("win32.index") || info.completeSuffix() == QStringLiteral("win32.index2"))) { + std::string pathStd = info.filePath().toStdString(); + auto indexEntries = physis_index_parse(pathStd.c_str()); + for (int i = 0; i < indexEntries.num_entries; i++) { + if (knownDirHashes.contains(indexEntries.dir_entries[i])) { + QString name; + if (m_database.knowsFile(indexEntries.filename_entries[i])) { + name = m_database.getFilename(indexEntries.filename_entries[i]); + } + addFile(knownDirHashes[indexEntries.dir_entries[i]], indexEntries.filename_entries[i], name); + } else { + addFolder(rootItem, indexEntries.dir_entries[i]); + } } - addFile(knownDirHashes[indexEntries.dir_entries[i]], indexEntries.filename_entries[i], name); - } else { - addFolder(rootItem, indexEntries.dir_entries[i]); } } } diff --git a/sagasu/src/filetreewindow.cpp b/sagasu/src/filetreewindow.cpp index 2be36d1..ea71f74 100644 --- a/sagasu/src/filetreewindow.cpp +++ b/sagasu/src/filetreewindow.cpp @@ -7,7 +7,7 @@ #include #include -FileTreeWindow::FileTreeWindow(GameData *data, QWidget *parent) +FileTreeWindow::FileTreeWindow(QString gamePath, GameData *data, QWidget *parent) : QWidget(parent) , data(data) { @@ -16,7 +16,7 @@ FileTreeWindow::FileTreeWindow(GameData *data, QWidget *parent) auto layout = new QHBoxLayout(); setLayout(layout); - m_fileModel = new FileTreeModel(data); + m_fileModel = new FileTreeModel(gamePath, data); auto treeWidget = new QTreeView(); treeWidget->setModel(m_fileModel); diff --git a/sagasu/src/indexer.cpp b/sagasu/src/indexer.cpp index 5e31db6..b842ed9 100644 --- a/sagasu/src/indexer.cpp +++ b/sagasu/src/indexer.cpp @@ -147,6 +147,8 @@ int main(int argc, char *argv[]) database.addFile(QLatin1String(file)); } + database.addFile(QStringLiteral("exd/root.exl")); + /*const QString gameDir{getGameDirectory()}; const std::string gameDirStd{gameDir.toStdString()}; auto data = physis_gamedata_initialize(gameDirStd.c_str()); diff --git a/sagasu/src/main.cpp b/sagasu/src/main.cpp index d7a0510..7ab518f 100644 --- a/sagasu/src/main.cpp +++ b/sagasu/src/main.cpp @@ -20,7 +20,7 @@ int main(int argc, char *argv[]) const QString gameDir{getGameDirectory()}; const std::string gameDirStd{gameDir.toStdString()}; - MainWindow w(physis_gamedata_initialize(gameDirStd.c_str())); + MainWindow w(gameDir, physis_gamedata_initialize(gameDirStd.c_str())); w.show(); return app.exec(); diff --git a/sagasu/src/mainwindow.cpp b/sagasu/src/mainwindow.cpp index de2ed12..8954c72 100644 --- a/sagasu/src/mainwindow.cpp +++ b/sagasu/src/mainwindow.cpp @@ -13,7 +13,7 @@ #include "filetreewindow.h" #include "hexpart.h" -MainWindow::MainWindow(GameData *data) +MainWindow::MainWindow(QString gamePath, GameData *data) : NovusMainWindow() , data(data) { @@ -25,7 +25,7 @@ MainWindow::MainWindow(GameData *data) auto layout = new QHBoxLayout(); dummyWidget->setLayout(layout); - auto tree = new FileTreeWindow(data); + auto tree = new FileTreeWindow(gamePath, data); connect(tree, &FileTreeWindow::extractFile, this, [this, data](QString path) { const QFileInfo info(path);