diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 47150e6..8fc5b52 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -6,6 +6,7 @@ target_sources(novus-common PRIVATE include/aboutdata.h include/filecache.h + include/filetypes.h include/novusmainwindow.h include/quaternionedit.h include/settings.h @@ -13,6 +14,7 @@ target_sources(novus-common src/aboutdata.cpp src/filecache.cpp + src/filetypes.cpp src/novusmainwindow.cpp src/quaternionedit.cpp src/settings.cpp diff --git a/common/include/filetypes.h b/common/include/filetypes.h new file mode 100644 index 0000000..45c6ffe --- /dev/null +++ b/common/include/filetypes.h @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +enum class FileType { Unknown, ExcelList, ExcelHeader, ExcelData, Model, Texture, ShaderPackage, CharaMakeParams, Skeleton }; + +class FileTypes +{ +public: + static FileType getFileType(const QString &extension); + + static QString getFiletypeName(FileType fileType); +}; \ No newline at end of file diff --git a/common/src/filetypes.cpp b/common/src/filetypes.cpp new file mode 100644 index 0000000..694f4ea --- /dev/null +++ b/common/src/filetypes.cpp @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "filetypes.h" + +#include +#include + +const static QMap extensionToType{{QStringLiteral("exl"), FileType::ExcelList}, + {QStringLiteral("exh"), FileType::ExcelHeader}, + {QStringLiteral("exd"), FileType::ExcelData}, + {QStringLiteral("mdl"), FileType::Model}, + {QStringLiteral("tex"), FileType::Texture}, + {QStringLiteral("shpk"), FileType::ShaderPackage}, + {QStringLiteral("cmp"), FileType::CharaMakeParams}, + {QStringLiteral("sklb"), FileType::Skeleton}}; + +const static QMap typeToName{{FileType::Unknown, i18n("Unknown")}, + {FileType::ExcelList, i18n("Excel List")}, + {FileType::ExcelHeader, i18n("Excel Header")}, + {FileType::ExcelData, i18n("Excel Data")}, + {FileType::Model, i18n("Model")}, + {FileType::Texture, i18n("Texture")}, + {FileType::ShaderPackage, i18n("Shader Package")}, + {FileType::CharaMakeParams, i18n("Chara Make Params")}, + {FileType::Skeleton, i18n("Skeleton")}}; + +FileType FileTypes::getFileType(const QString &extension) +{ + return extensionToType.value(extension, FileType::Unknown); +} + +QString FileTypes::getFiletypeName(FileType fileType) +{ + return typeToName.value(fileType); +} diff --git a/sagasu/src/filepropertieswindow.cpp b/sagasu/src/filepropertieswindow.cpp index f2dba32..077e57d 100644 --- a/sagasu/src/filepropertieswindow.cpp +++ b/sagasu/src/filepropertieswindow.cpp @@ -2,11 +2,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include +#include #include #include #include #include "filepropertieswindow.h" +#include "filetypes.h" FilePropertiesWindow::FilePropertiesWindow(const QString &path, physis_Buffer buffer, QWidget *parent) : QWidget(parent) @@ -17,13 +19,17 @@ FilePropertiesWindow::FilePropertiesWindow(const QString &path, physis_Buffer bu setLayout(layout); auto pathLabel = new QLabel(path); - layout->addRow(i18nc("@label", "Path"), pathLabel); + layout->addRow(i18nc("@label", "Path:"), pathLabel); - auto typeLabel = new QLabel(i18n("Unknown type")); - layout->addRow(i18nc("@label", "Type"), typeLabel); + QFileInfo info(path); + + const FileType type = FileTypes::getFileType(info.completeSuffix()); + + auto typeLabel = new QLabel(FileTypes::getFiletypeName(type)); + layout->addRow(i18nc("@label", "Type:"), typeLabel); auto sizeLabel = new QLabel(QString::number(buffer.size)); - layout->addRow(i18nc("@label", "Size (in bytes)"), sizeLabel); + layout->addRow(i18nc("@label", "Size (in bytes):"), sizeLabel); } #include "moc_filepropertieswindow.cpp" \ No newline at end of file diff --git a/sagasu/src/mainwindow.cpp b/sagasu/src/mainwindow.cpp index 6504725..0f866e9 100644 --- a/sagasu/src/mainwindow.cpp +++ b/sagasu/src/mainwindow.cpp @@ -20,6 +20,7 @@ #include "exdpart.h" #include "exlpart.h" #include "filepropertieswindow.h" +#include "filetypes.h" #include "hexpart.h" #include "mdlpart.h" #include "shpkpart.h" @@ -83,37 +84,50 @@ void MainWindow::refreshParts(const QString &path) auto file = physis_gamedata_extract_file(data, path.toStdString().c_str()); QFileInfo info(path); - if (info.completeSuffix() == QStringLiteral("exl")) { + + const FileType type = FileTypes::getFileType(info.completeSuffix()); + switch (type) { + case FileType::ExcelList: { auto exlWidget = new EXLPart(data); exlWidget->load(file); partHolder->addTab(exlWidget, i18nc("@title:tab", "Excel List")); - } else if (info.completeSuffix() == QStringLiteral("exh")) { + } break; + case FileType::ExcelHeader: { auto exdWidget = new EXDPart(data); exdWidget->loadSheet(info.baseName(), file); partHolder->addTab(exdWidget, i18nc("@title:tab", "Excel Sheet")); - } else if (info.completeSuffix() == QStringLiteral("exd")) { + } break; + case FileType::ExcelData: { auto exdWidget = new QLabel(i18n("Note: Excel data files cannot be previewed standalone, select the EXH file instead.")); partHolder->addTab(exdWidget, i18nc("@title:tab", "Note")); - } else if (info.completeSuffix() == QStringLiteral("mdl")) { + } break; + case FileType::Model: { auto mdlWidget = new MDLPart(data, fileCache); mdlWidget->addModel(physis_mdl_parse(file), false, glm::vec3(), QStringLiteral("mdl"), {}, 0); partHolder->addTab(mdlWidget, i18nc("@title:tab", "Model")); - } else if (info.completeSuffix() == QStringLiteral("tex") || info.completeSuffix() == QStringLiteral("atex")) { + } break; + case FileType::Texture: { auto texWidget = new TexPart(data); texWidget->load(file); partHolder->addTab(texWidget, i18nc("@title:tab", "Texture")); - } else if (info.completeSuffix() == QStringLiteral("shpk")) { + } break; + case FileType::ShaderPackage: { auto shpkWidget = new SHPKPart(data); shpkWidget->load(file); partHolder->addTab(shpkWidget, i18nc("@title:tab", "Shader Package")); - } else if (info.completeSuffix() == QStringLiteral("cmp")) { + } break; + case FileType::CharaMakeParams: { auto cmpWidget = new CmpPart(data); cmpWidget->load(file); partHolder->addTab(cmpWidget, i18nc("@title:tab", "Chara Make Params")); - } else if (info.completeSuffix() == QStringLiteral("sklb")) { + } break; + case FileType::Skeleton: { auto sklbWidget = new SklbPart(); sklbWidget->load(physis_parse_skeleton(file)); partHolder->addTab(sklbWidget, i18nc("@title:tab", "Skeleton")); + } break; + default: + break; } auto hexWidget = new HexPart();