From 7fbf53a58dc4f3b0ac5676a0b4b6374b6612c7e4 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Tue, 1 Oct 2024 20:27:48 -0400 Subject: [PATCH] Fix loading art/characters under the new site directory layout --- src/artconfigwindow.cpp | 4 ++-- src/artconfigwindow.h | 2 +- src/artmodel.cpp | 27 +++++++++++---------------- src/artmodel.h | 4 ++-- src/charactermodel.cpp | 14 +++++--------- src/featuredartmodel.cpp | 4 ++-- src/featuredartmodel.h | 2 +- src/main.cpp | 10 ++++------ src/mainwindow.cpp | 19 ++++++------------- src/mainwindow.h | 6 +----- 10 files changed, 35 insertions(+), 57 deletions(-) diff --git a/src/artconfigwindow.cpp b/src/artconfigwindow.cpp index 40b982e..855e893 100644 --- a/src/artconfigwindow.cpp +++ b/src/artconfigwindow.cpp @@ -14,7 +14,7 @@ #include #include -ArtConfigWindow::ArtConfigWindow(const QString &filename, const QString &definitionDirectory, const QString &assetDirectory, QWidget *parent) +ArtConfigWindow::ArtConfigWindow(const QString &filename, const QString &definitionDirectory, QWidget *parent) : QDialog(parent) { setWindowModality(Qt::WindowModality::WindowModal); @@ -28,7 +28,7 @@ ArtConfigWindow::ArtConfigWindow(const QString &filename, const QString &definit formLayoutWidget->setLayout(formLayout); mainLayout->addWidget(formLayoutWidget); - model = new FeaturedArtModel(definitionDirectory, assetDirectory); + model = new FeaturedArtModel(definitionDirectory); auto galleryListView = new QListView(); galleryListView->setModel(model); diff --git a/src/artconfigwindow.h b/src/artconfigwindow.h index 3c9d2d9..0a0562c 100644 --- a/src/artconfigwindow.h +++ b/src/artconfigwindow.h @@ -19,7 +19,7 @@ class ArtConfigWindow : public QDialog { Q_OBJECT public: - explicit ArtConfigWindow(const QString &filename, const QString &definitionDirectory, const QString &assetDirectory, QWidget *parent = nullptr); + explicit ArtConfigWindow(const QString &filename, const QString &definitionDirectory, QWidget *parent = nullptr); private: void loadData(const QString &filename); diff --git a/src/artmodel.cpp b/src/artmodel.cpp index 0f2d136..b704e1d 100644 --- a/src/artmodel.cpp +++ b/src/artmodel.cpp @@ -7,37 +7,31 @@ #include #include #include -#include #include #include #include -#include #include #include #include #include -ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory, QObject *parent) +ArtModel::ArtModel(const QDir &definitionDirectory, QObject *parent) : QAbstractTableModel(parent) { piecesFuture = new QFutureWatcher(this); connect(piecesFuture, &QFutureWatcher::resultReadyAt, this, &ArtModel::pieceFinished); connect(piecesFuture, &QFutureWatcher::finished, this, &ArtModel::finished); - struct PieceInformation { - QString definition; - QString asset; - }; - QVector pieceList; + QVector pieceList; - QDirIterator it(definitionDirectory); + QDirIterator it(definitionDirectory, QDirIterator::Subdirectories); while (it.hasNext()) { QFileInfo info(it.next()); if (!info.isFile()) { continue; } - pieceList.push_back(PieceInformation{definitionDirectory.absoluteFilePath(info.baseName()), assetDirectory.absoluteFilePath(info.baseName())}); + pieceList.push_back(info.absoluteFilePath()); beginInsertRows(QModelIndex(), static_cast(m_artPieces.size()), static_cast(m_artPieces.size() + 1)); @@ -46,8 +40,8 @@ ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory, endInsertRows(); } - const std::function(const PieceInformation &info)> loadPiece = [](const PieceInformation &info) -> QCoro::Task { - auto p = new ArtPiece(info.definition, info.asset); + const std::function(const QString &info)> loadPiece = [](const QString &info) -> QCoro::Task { + auto p = new ArtPiece(info); // load thumbnail if (!p->getThumbnailPath().isLocalFile()) { @@ -65,7 +59,7 @@ ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory, co_return p; }; - piecesFuture->setFuture(QtConcurrent::mapped(pieceList, [loadPiece](const PieceInformation &info) -> ArtPiece * { + piecesFuture->setFuture(QtConcurrent::mapped(pieceList, [loadPiece](const QString &info) -> ArtPiece * { return QCoro::waitFor(loadPiece(info)); })); } @@ -157,10 +151,11 @@ void ArtModel::finished() Q_EMIT loadingFinished(); } -ArtPiece::ArtPiece(const QString &filename, const QString &assetFilename) +ArtPiece::ArtPiece(const QString &path) { - jsonFilename = filename + ".json"; - this->filename = assetFilename; + QFileInfo info(path); + jsonFilename = path; + this->filename = info.baseName(); QFile artFile(jsonFilename); artFile.open(QFile::ReadOnly); diff --git a/src/artmodel.h b/src/artmodel.h index 61b4451..3c14942 100644 --- a/src/artmodel.h +++ b/src/artmodel.h @@ -16,7 +16,7 @@ class ArtPiece : public QObject Q_OBJECT public: ArtPiece() = default; - ArtPiece(const QString &filename, const QString &assetFilename); + ArtPiece(const QString &path); QString filename, jsonFilename; QString title; @@ -35,7 +35,7 @@ class ArtModel : public QAbstractTableModel { Q_OBJECT public: - explicit ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory, QObject *parent = nullptr); + explicit ArtModel(const QDir &definitionDirectory, QObject *parent = nullptr); [[nodiscard]] int rowCount(const QModelIndex &parent) const override; [[nodiscard]] int columnCount(const QModelIndex &parent) const override; diff --git a/src/charactermodel.cpp b/src/charactermodel.cpp index 312ebd6..ddfcbaf 100644 --- a/src/charactermodel.cpp +++ b/src/charactermodel.cpp @@ -20,10 +20,7 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent) connect(charactersFuture, &QFutureWatcher::resultReadyAt, this, &CharacterModel::characterFinished); connect(charactersFuture, &QFutureWatcher::finished, this, &CharacterModel::finished); - struct CharacterInformation { - QString definition; - }; - QVector characterList; + QVector characterList; QDirIterator it(definitionDirectory); while (it.hasNext()) { @@ -32,7 +29,7 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent) continue; } - characterList.push_back(CharacterInformation{definitionDirectory.absoluteFilePath(info.baseName())}); + characterList.push_back(definitionDirectory.absoluteFilePath(info.baseName())); beginInsertRows(QModelIndex(), static_cast(m_characters.size()), static_cast(m_characters.size() + 1)); @@ -41,14 +38,13 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent) endInsertRows(); } - const std::function(const CharacterInformation &info)> loadPiece = - [](const CharacterInformation &info) -> QCoro::Task { - auto p = new Character(info.definition); + const std::function(const QString &info)> loadPiece = [](const QString &info) -> QCoro::Task { + auto p = new Character(info); co_return p; }; - charactersFuture->setFuture(QtConcurrent::mapped(characterList, [loadPiece](const CharacterInformation &info) -> Character * { + charactersFuture->setFuture(QtConcurrent::mapped(characterList, [loadPiece](const QString &info) -> Character * { return QCoro::waitFor(loadPiece(info)); })); } diff --git a/src/featuredartmodel.cpp b/src/featuredartmodel.cpp index 82c6beb..d633789 100644 --- a/src/featuredartmodel.cpp +++ b/src/featuredartmodel.cpp @@ -6,8 +6,8 @@ #include -FeaturedArtModel::FeaturedArtModel(const QString &definitionDirectory, const QString &assetDirectory) - : ArtModel(definitionDirectory, assetDirectory) +FeaturedArtModel::FeaturedArtModel(const QString &definitionDirectory) + : ArtModel(definitionDirectory) { } diff --git a/src/featuredartmodel.h b/src/featuredartmodel.h index 69c33d2..15a2817 100644 --- a/src/featuredartmodel.h +++ b/src/featuredartmodel.h @@ -9,7 +9,7 @@ class FeaturedArtModel : public ArtModel { public: - FeaturedArtModel(const QString &definitionDirectory, const QString &assetDirectory); + FeaturedArtModel(const QString &definitionDirectory); [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; diff --git a/src/main.cpp b/src/main.cpp index cda577a..c86a9e5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,13 +37,11 @@ int main(int argc, char *argv[]) } const QDir sitePath = args[0]; - const QString defPath = sitePath.absoluteFilePath(QStringLiteral("art")); - const QDir assetPath = sitePath.absoluteFilePath(QStringLiteral("assets")); - const QString artAssetPath = assetPath.absoluteFilePath(QStringLiteral("art")); - const QString dataPath = sitePath.absoluteFilePath(QStringLiteral("data")); - const QString charaDefPath = sitePath.absoluteFilePath(QStringLiteral("characters")); + const QDir dataPath = sitePath.absoluteFilePath(QStringLiteral("data")); + const QString defPath = dataPath.absoluteFilePath(QStringLiteral("art")); + const QString charaDefPath = dataPath.absoluteFilePath(QStringLiteral("characters")); - MainWindow window(defPath, artAssetPath, dataPath, charaDefPath); + MainWindow window(defPath, dataPath, charaDefPath); window.show(); return QApplication::exec(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 50ada7c..c41eb2f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -22,11 +22,7 @@ #include "characterdetailwindow.h" #include "charactermodel.h" -MainWindow::MainWindow(const QDir &definitionDirectory, - const QDir &assetDirectory, - const QDir &dataDirectory, - const QDir &charactersDefinitionDirectory, - QWidget *parent) +MainWindow::MainWindow(const QDir &definitionDirectory, const QDir &dataDirectory, const QDir &charactersDefinitionDirectory, QWidget *parent) : QMainWindow(parent) { setWindowTitle(i18nc("@title:window", "Redai")); @@ -72,11 +68,8 @@ MainWindow::MainWindow(const QDir &definitionDirectory, auto editConfigAction = manageMenu->addAction(i18nc("@action:inmenu", "Edit Config...")); editConfigAction->setIcon(QIcon::fromTheme(QStringLiteral("configure"))); - connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory, definitionDirectory, assetDirectory] { - auto window = new ArtConfigWindow(dataDirectory.absoluteFilePath(QStringLiteral("art-config.json")), - definitionDirectory.absolutePath(), - assetDirectory.absolutePath(), - this); + connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory, definitionDirectory] { + auto window = new ArtConfigWindow(dataDirectory.absoluteFilePath(QStringLiteral("art-config.json")), definitionDirectory.absolutePath(), this); window->show(); }); @@ -108,7 +101,7 @@ MainWindow::MainWindow(const QDir &definitionDirectory, auto tabWidget = new QTabWidget(); setCentralWidget(tabWidget); - auto model = new ArtModel(definitionDirectory, assetDirectory); + auto model = new ArtModel(definitionDirectory); auto pieceListView = new QTableView(); pieceListView->setModel(model); @@ -121,7 +114,7 @@ MainWindow::MainWindow(const QDir &definitionDirectory, QHeaderView *horizontalHeader = pieceListView->horizontalHeader(); horizontalHeader->setSectionResizeMode(QHeaderView::Stretch); - connect(pieceListView, &QListView::clicked, this, [this, assetDirectory](const QModelIndex index) { + connect(pieceListView, &QListView::clicked, this, [this](const QModelIndex index) { const auto &piece = index.data(Qt::UserRole).value(); auto window = new ArtDetailWindow(piece->jsonFilename, piece->getImagePath(), this); @@ -143,7 +136,7 @@ MainWindow::MainWindow(const QDir &definitionDirectory, horizontalHeader = charView->horizontalHeader(); horizontalHeader->setSectionResizeMode(QHeaderView::Stretch); - connect(charView, &QListView::clicked, this, [this, assetDirectory](const QModelIndex index) { + connect(charView, &QListView::clicked, this, [this](const QModelIndex index) { const auto &piece = index.data(Qt::UserRole).value(); auto window = new CharacterDetailWindow(piece->filename, this); diff --git a/src/mainwindow.h b/src/mainwindow.h index 0a9288e..c4e4042 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -11,9 +11,5 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - explicit MainWindow(const QDir &definitionDirectory, - const QDir &assetDirectory, - const QDir &dataDirectory, - const QDir &charactersDefinitionDirectory, - QWidget *parent = nullptr); + explicit MainWindow(const QDir &definitionDirectory, const QDir &dataDirectory, const QDir &charactersDefinitionDirectory, QWidget *parent = nullptr); };