diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a1b98a..5f8a6c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,15 +51,15 @@ if(APPLE) endif() add_subdirectory(renderer) -add_subdirectory(exdviewer) +add_subdirectory(karuku) add_subdirectory(armoury) add_subdirectory(argcracker) -add_subdirectory(explorer) +add_subdirectory(sagasu) #add_subdirectory(bonedecomp) # not yet ported to physis add_subdirectory(parts) add_subdirectory(common) add_subdirectory(mdlviewer) -add_subdirectory(sdklauncher) +add_subdirectory(launcher) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/README.md b/README.md index 46becb7..9b745c9 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,11 @@ any stable releases. This repository contains many parts of Novus, such as: -* [Argcracker](argcracker), a program that can decrypt game arguments. -* [Armoury](armoury), a graphical gear and character viewer. -* [Bone Decompiler](bonedecomp), a tool to decompile Havok skeleton files into TexTools-compatible JSON. -* [EXD Viewer](exdviewer), a graphical program to view Excel (EXD) sheets from the game. -* [Explorer](explorer), a graphical interface to explore DAT files. -* [Model Viewer](mdlviewer), a graphical model viewer for MDL files. +* [Argcracker](argcracker), a program that can help decrypt game arguments. +* [Armoury](armoury), a graphical gear and character viewer. It also supports GLTF export. +* [Karuku](karuku), a graphical program to view Excel data sheets. +* [MDLViewer](mdlviewer), a graphical model viewer for MDL files. +* [Sagasu](sagasu), a graphical interface to explore FFXIV data archive files. ## Building diff --git a/exdviewer/CMakeLists.txt b/karuku/CMakeLists.txt similarity index 100% rename from exdviewer/CMakeLists.txt rename to karuku/CMakeLists.txt diff --git a/exdviewer/README.md b/karuku/README.md similarity index 100% rename from exdviewer/README.md rename to karuku/README.md diff --git a/exdviewer/include/mainwindow.h b/karuku/include/mainwindow.h similarity index 64% rename from exdviewer/include/mainwindow.h rename to karuku/include/mainwindow.h index d0fecbd..e5b6231 100644 --- a/exdviewer/include/mainwindow.h +++ b/karuku/include/mainwindow.h @@ -7,10 +7,11 @@ struct GameData; -class MainWindow : public QMainWindow { +class MainWindow : public QMainWindow +{ public: - MainWindow(GameData* data); + MainWindow(GameData *data); private: - GameData* data = nullptr; + GameData *data = nullptr; }; \ No newline at end of file diff --git a/exdviewer/src/main.cpp b/karuku/src/main.cpp similarity index 94% rename from exdviewer/src/main.cpp rename to karuku/src/main.cpp index 0d5908c..a69333f 100644 --- a/exdviewer/src/main.cpp +++ b/karuku/src/main.cpp @@ -8,7 +8,8 @@ #include "mainwindow.h" #include "settings.h" -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) +{ QApplication app(argc, argv); customizeAboutData(QStringLiteral("karuku"), QStringLiteral("Karuku"), QStringLiteral("Program to view FFXIV Excel files.")); diff --git a/exdviewer/src/mainwindow.cpp b/karuku/src/mainwindow.cpp similarity index 96% rename from exdviewer/src/mainwindow.cpp rename to karuku/src/mainwindow.cpp index c5055ee..87fc2db 100644 --- a/exdviewer/src/mainwindow.cpp +++ b/karuku/src/mainwindow.cpp @@ -17,7 +17,9 @@ #include "exdpart.h" -MainWindow::MainWindow(GameData* data) : data(data) { +MainWindow::MainWindow(GameData *data) + : data(data) +{ setWindowTitle(QStringLiteral("Karuku")); setMinimumSize(1280, 720); @@ -68,7 +70,7 @@ MainWindow::MainWindow(GameData* data) : data(data) { auto exdPart = new EXDPart(data); layout->addWidget(exdPart); - connect(listWidget, &QListWidget::itemClicked, this, [exdPart](QListWidgetItem* item) { + connect(listWidget, &QListWidget::itemClicked, this, [exdPart](QListWidgetItem *item) { auto name = item->text().toStdString(); auto nameLowercase = item->text().toLower().toStdString(); diff --git a/sdklauncher/CMakeLists.txt b/launcher/CMakeLists.txt similarity index 100% rename from sdklauncher/CMakeLists.txt rename to launcher/CMakeLists.txt diff --git a/sdklauncher/README.md b/launcher/README.md similarity index 100% rename from sdklauncher/README.md rename to launcher/README.md diff --git a/sdklauncher/include/mainwindow.h b/launcher/include/mainwindow.h similarity index 81% rename from sdklauncher/include/mainwindow.h rename to launcher/include/mainwindow.h index c09f31d..a060b3d 100644 --- a/sdklauncher/include/mainwindow.h +++ b/launcher/include/mainwindow.h @@ -5,7 +5,8 @@ #include -class MainWindow : public QMainWindow { +class MainWindow : public QMainWindow +{ public: MainWindow(); }; diff --git a/sdklauncher/src/main.cpp b/launcher/src/main.cpp similarity index 97% rename from sdklauncher/src/main.cpp rename to launcher/src/main.cpp index e26236f..03ec35b 100644 --- a/sdklauncher/src/main.cpp +++ b/launcher/src/main.cpp @@ -10,7 +10,8 @@ #include "mainwindow.h" -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) +{ QApplication app(argc, argv); KConfig config(QStringLiteral("novusrc")); diff --git a/sdklauncher/src/mainwindow.cpp b/launcher/src/mainwindow.cpp similarity index 96% rename from sdklauncher/src/mainwindow.cpp rename to launcher/src/mainwindow.cpp index 67a7129..1077aa0 100644 --- a/sdklauncher/src/mainwindow.cpp +++ b/launcher/src/mainwindow.cpp @@ -17,7 +17,8 @@ static QMap applications = {{QStringLiteral("Armoury - View an {QStringLiteral("Sagasu - Explore data archives"), QStringLiteral("novus-sagasu")}, {QStringLiteral("Model Viewer - Preview MDL files"), QStringLiteral("novus-mdlviewer")}}; -MainWindow::MainWindow() { +MainWindow::MainWindow() +{ setWindowTitle(QStringLiteral("Novus SDK")); auto appList = new QListWidget(); @@ -28,7 +29,7 @@ MainWindow::MainWindow() { appList->addItem(applicationHeader); - for(const auto& name : applications.keys()) { + for (const auto &name : applications.keys()) { appList->addItem(name); } diff --git a/explorer/CMakeLists.txt b/sagasu/CMakeLists.txt similarity index 100% rename from explorer/CMakeLists.txt rename to sagasu/CMakeLists.txt diff --git a/explorer/README.md b/sagasu/README.md similarity index 100% rename from explorer/README.md rename to sagasu/README.md diff --git a/explorer/include/filepropertieswindow.h b/sagasu/include/filepropertieswindow.h similarity index 55% rename from explorer/include/filepropertieswindow.h rename to sagasu/include/filepropertieswindow.h index 724f00a..e35c267 100644 --- a/explorer/include/filepropertieswindow.h +++ b/sagasu/include/filepropertieswindow.h @@ -6,11 +6,12 @@ #include #include -class FilePropertiesWindow : public QWidget { +class FilePropertiesWindow : public QWidget +{ Q_OBJECT public: - explicit FilePropertiesWindow(GameData* data, QString path, QWidget* parent = nullptr); + explicit FilePropertiesWindow(GameData *data, QString path, QWidget *parent = nullptr); private: - GameData* data = nullptr; + GameData *data = nullptr; }; \ No newline at end of file diff --git a/explorer/include/filetreewindow.h b/sagasu/include/filetreewindow.h similarity index 63% rename from explorer/include/filetreewindow.h rename to sagasu/include/filetreewindow.h index 6d93870..4aeb30d 100644 --- a/explorer/include/filetreewindow.h +++ b/sagasu/include/filetreewindow.h @@ -11,24 +11,25 @@ struct PathPart { QMap children; }; -class FileTreeWindow : public QWidget { +class FileTreeWindow : public QWidget +{ Q_OBJECT public: - explicit FileTreeWindow(GameData* data, QWidget *parent = nullptr); + explicit FileTreeWindow(GameData *data, QWidget *parent = nullptr); private: - GameData* data = nullptr; + GameData *data = nullptr; void addPath(QString path); void addUnknownPath(QString knownDirectory, uint32_t crcHash); - void traversePart(QList tokens, PathPart& part, QString pathSoFar); - std::tuple traverseUnknownPath(uint32_t crcHash, PathPart& part, QString pathSoFar); + void traversePart(QList tokens, PathPart &part, QString pathSoFar); + std::tuple traverseUnknownPath(uint32_t crcHash, PathPart &part, QString pathSoFar); QMap rootParts; void addPaths(QTreeWidget *pWidget); - QTreeWidgetItem* addPartAndChildren(const QString& qString, const PathPart& part, const QString& pathSoFar); + QTreeWidgetItem *addPartAndChildren(const QString &qString, const PathPart &part, const QString &pathSoFar); Q_SIGNALS: void openFileProperties(QString path); diff --git a/explorer/include/mainwindow.h b/sagasu/include/mainwindow.h similarity index 66% rename from explorer/include/mainwindow.h rename to sagasu/include/mainwindow.h index 552bae4..a93d9e8 100644 --- a/explorer/include/mainwindow.h +++ b/sagasu/include/mainwindow.h @@ -10,14 +10,13 @@ struct GameData; -class MainWindow : public QMainWindow { +class MainWindow : public QMainWindow +{ public: - MainWindow(GameData* data); + MainWindow(GameData *data); private: + QMdiArea *mdiArea = nullptr; - QMdiArea* mdiArea = nullptr; - - - GameData* data; + GameData *data; }; \ No newline at end of file diff --git a/explorer/src/filepropertieswindow.cpp b/sagasu/src/filepropertieswindow.cpp similarity index 86% rename from explorer/src/filepropertieswindow.cpp rename to sagasu/src/filepropertieswindow.cpp index c0b1a31..e3b261d 100644 --- a/explorer/src/filepropertieswindow.cpp +++ b/sagasu/src/filepropertieswindow.cpp @@ -9,8 +9,10 @@ #include "filepropertieswindow.h" -FilePropertiesWindow::FilePropertiesWindow(GameData* data, QString path, QWidget* parent) - : QWidget(parent), data(data) { +FilePropertiesWindow::FilePropertiesWindow(GameData *data, QString path, QWidget *parent) + : QWidget(parent) + , data(data) +{ setWindowTitle(QStringLiteral("Properties for ") + path); auto layout = new QFormLayout(); diff --git a/explorer/src/filetreewindow.cpp b/sagasu/src/filetreewindow.cpp similarity index 84% rename from explorer/src/filetreewindow.cpp rename to sagasu/src/filetreewindow.cpp index 088eef4..544584d 100644 --- a/explorer/src/filetreewindow.cpp +++ b/sagasu/src/filetreewindow.cpp @@ -8,7 +8,10 @@ #include "filetreewindow.h" -FileTreeWindow::FileTreeWindow(GameData* data, QWidget* parent) : QWidget(parent), data(data) { +FileTreeWindow::FileTreeWindow(GameData *data, QWidget *parent) + : QWidget(parent) + , data(data) +{ setWindowTitle(QStringLiteral("File Tree")); auto layout = new QHBoxLayout(); @@ -41,7 +44,7 @@ FileTreeWindow::FileTreeWindow(GameData* data, QWidget* parent) : QWidget(parent }*/ treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); - connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, [this, treeWidget](const QPoint& pos) { + connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, [this, treeWidget](const QPoint &pos) { auto *item = treeWidget->itemAt(pos); if (item != nullptr) { @@ -63,7 +66,8 @@ FileTreeWindow::FileTreeWindow(GameData* data, QWidget* parent) : QWidget(parent addPaths(treeWidget); } -void FileTreeWindow::addPath(QString path) { +void FileTreeWindow::addPath(QString path) +{ auto tokens = path.split(QStringLiteral("/")); auto nextToken = tokens[0]; tokens.pop_front(); @@ -71,8 +75,9 @@ void FileTreeWindow::addPath(QString path) { traversePart(tokens, rootParts[nextToken], nextToken); } -void FileTreeWindow::traversePart(QList tokens, PathPart& part, QString pathSoFar) { - if(tokens.empty()) +void FileTreeWindow::traversePart(QList tokens, PathPart &part, QString pathSoFar) +{ + if (tokens.empty()) return; auto nextToken = tokens[0]; @@ -84,21 +89,23 @@ void FileTreeWindow::traversePart(QList tokens, PathPart& part, QString traversePart(tokens, part.children[nextToken], pathSoFar); } -void FileTreeWindow::addPaths(QTreeWidget *pWidget) { - for(const auto& name : rootParts.keys()) { +void FileTreeWindow::addPaths(QTreeWidget *pWidget) +{ + for (const auto &name : rootParts.keys()) { auto item = addPartAndChildren(name, rootParts.value(name), QStringLiteral("")); pWidget->addTopLevelItem(item); } } -QTreeWidgetItem* FileTreeWindow::addPartAndChildren(const QString& qString, const PathPart& part, const QString& pathSoFar) { +QTreeWidgetItem *FileTreeWindow::addPartAndChildren(const QString &qString, const PathPart &part, const QString &pathSoFar) +{ QString newPath = pathSoFar.isEmpty() ? qString : pathSoFar + QStringLiteral("/") + qString; auto item = new QTreeWidgetItem(); item->setData(0, Qt::UserRole, newPath); item->setText(0, qString); - for(const auto& name : part.children.keys()) { + for (const auto &name : part.children.keys()) { auto childItem = addPartAndChildren(name, part.children.value(name), newPath); item->addChild(childItem); } @@ -106,27 +113,29 @@ QTreeWidgetItem* FileTreeWindow::addPartAndChildren(const QString& qString, cons return item; } -void FileTreeWindow::addUnknownPath(QString knownDirectory, uint32_t crcHash) { +void FileTreeWindow::addUnknownPath(QString knownDirectory, uint32_t crcHash) +{ auto [found, path] = traverseUnknownPath(crcHash, rootParts[knownDirectory], knownDirectory); - if(found) + if (found) addPath(path); else addPath(knownDirectory + QStringLiteral("/Unknown File Hash ") + QString::number(crcHash)); } -std::tuple FileTreeWindow::traverseUnknownPath(uint32_t crcHash, PathPart &part, QString pathSoFar) { - if(part.crcHash == crcHash) +std::tuple FileTreeWindow::traverseUnknownPath(uint32_t crcHash, PathPart &part, QString pathSoFar) +{ + if (part.crcHash == crcHash) return {true, pathSoFar}; bool found = false; QString childPath = pathSoFar; - for(auto path : part.children.keys()) { + for (auto path : part.children.keys()) { if (path.contains(QStringLiteral("Unknown"))) continue; auto [childFound, newPath] = traverseUnknownPath(crcHash, part.children[path], pathSoFar + QStringLiteral("/") + path); found |= childFound; - if(childFound) + if (childFound) childPath = newPath; } diff --git a/explorer/src/main.cpp b/sagasu/src/main.cpp similarity index 95% rename from explorer/src/main.cpp rename to sagasu/src/main.cpp index a59ba2d..9944a9d 100644 --- a/explorer/src/main.cpp +++ b/sagasu/src/main.cpp @@ -10,7 +10,8 @@ #include "mainwindow.h" #include "settings.h" -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) +{ QApplication app(argc, argv); customizeAboutData(QStringLiteral("sagasu"), QStringLiteral("Sagasu"), QStringLiteral("Program to explore FFXIV data archives.")); diff --git a/explorer/src/mainwindow.cpp b/sagasu/src/mainwindow.cpp similarity index 97% rename from explorer/src/mainwindow.cpp rename to sagasu/src/mainwindow.cpp index d8e392c..3c263d8 100644 --- a/explorer/src/mainwindow.cpp +++ b/sagasu/src/mainwindow.cpp @@ -18,7 +18,9 @@ #include "filepropertieswindow.h" #include "filetreewindow.h" -MainWindow::MainWindow(GameData* data) : data(data) { +MainWindow::MainWindow(GameData *data) + : data(data) +{ setWindowTitle(QStringLiteral("Sagasu")); auto fileMenu = menuBar()->addMenu(QStringLiteral("File")); @@ -60,4 +62,3 @@ MainWindow::MainWindow(GameData* data) : data(data) { mdiArea->addSubWindow(tree); } -