Fix loading art/characters under the new site directory layout

This commit is contained in:
Joshua Goins 2024-10-01 20:27:48 -04:00
parent 9ab54d0b9e
commit 7fbf53a58d
10 changed files with 35 additions and 57 deletions

View file

@ -14,7 +14,7 @@
#include <QLineEdit> #include <QLineEdit>
#include <QPushButton> #include <QPushButton>
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) : QDialog(parent)
{ {
setWindowModality(Qt::WindowModality::WindowModal); setWindowModality(Qt::WindowModality::WindowModal);
@ -28,7 +28,7 @@ ArtConfigWindow::ArtConfigWindow(const QString &filename, const QString &definit
formLayoutWidget->setLayout(formLayout); formLayoutWidget->setLayout(formLayout);
mainLayout->addWidget(formLayoutWidget); mainLayout->addWidget(formLayoutWidget);
model = new FeaturedArtModel(definitionDirectory, assetDirectory); model = new FeaturedArtModel(definitionDirectory);
auto galleryListView = new QListView(); auto galleryListView = new QListView();
galleryListView->setModel(model); galleryListView->setModel(model);

View file

@ -19,7 +19,7 @@ class ArtConfigWindow : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: 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: private:
void loadData(const QString &filename); void loadData(const QString &filename);

View file

@ -7,37 +7,31 @@
#include <KLocalizedString> #include <KLocalizedString>
#include <QCoroNetwork> #include <QCoroNetwork>
#include <QCoroTask> #include <QCoroTask>
#include <QDirIterator>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QIcon> #include <QIcon>
#include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QNetworkReply> #include <QNetworkReply>
#include <QPixmap> #include <QPixmap>
#include <QtConcurrent> #include <QtConcurrent>
ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory, QObject *parent) ArtModel::ArtModel(const QDir &definitionDirectory, QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)
{ {
piecesFuture = new QFutureWatcher<ArtPiece *>(this); piecesFuture = new QFutureWatcher<ArtPiece *>(this);
connect(piecesFuture, &QFutureWatcher<ArtPiece *>::resultReadyAt, this, &ArtModel::pieceFinished); connect(piecesFuture, &QFutureWatcher<ArtPiece *>::resultReadyAt, this, &ArtModel::pieceFinished);
connect(piecesFuture, &QFutureWatcher<ArtPiece *>::finished, this, &ArtModel::finished); connect(piecesFuture, &QFutureWatcher<ArtPiece *>::finished, this, &ArtModel::finished);
struct PieceInformation { QVector<QString> pieceList;
QString definition;
QString asset;
};
QVector<PieceInformation> pieceList;
QDirIterator it(definitionDirectory); QDirIterator it(definitionDirectory, QDirIterator::Subdirectories);
while (it.hasNext()) { while (it.hasNext()) {
QFileInfo info(it.next()); QFileInfo info(it.next());
if (!info.isFile()) { if (!info.isFile()) {
continue; continue;
} }
pieceList.push_back(PieceInformation{definitionDirectory.absoluteFilePath(info.baseName()), assetDirectory.absoluteFilePath(info.baseName())}); pieceList.push_back(info.absoluteFilePath());
beginInsertRows(QModelIndex(), static_cast<int>(m_artPieces.size()), static_cast<int>(m_artPieces.size() + 1)); beginInsertRows(QModelIndex(), static_cast<int>(m_artPieces.size()), static_cast<int>(m_artPieces.size() + 1));
@ -46,8 +40,8 @@ ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory,
endInsertRows(); endInsertRows();
} }
const std::function<QCoro::Task<ArtPiece *>(const PieceInformation &info)> loadPiece = [](const PieceInformation &info) -> QCoro::Task<ArtPiece *> { const std::function<QCoro::Task<ArtPiece *>(const QString &info)> loadPiece = [](const QString &info) -> QCoro::Task<ArtPiece *> {
auto p = new ArtPiece(info.definition, info.asset); auto p = new ArtPiece(info);
// load thumbnail // load thumbnail
if (!p->getThumbnailPath().isLocalFile()) { if (!p->getThumbnailPath().isLocalFile()) {
@ -65,7 +59,7 @@ ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory,
co_return p; 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)); return QCoro::waitFor(loadPiece(info));
})); }));
} }
@ -157,10 +151,11 @@ void ArtModel::finished()
Q_EMIT loadingFinished(); Q_EMIT loadingFinished();
} }
ArtPiece::ArtPiece(const QString &filename, const QString &assetFilename) ArtPiece::ArtPiece(const QString &path)
{ {
jsonFilename = filename + ".json"; QFileInfo info(path);
this->filename = assetFilename; jsonFilename = path;
this->filename = info.baseName();
QFile artFile(jsonFilename); QFile artFile(jsonFilename);
artFile.open(QFile::ReadOnly); artFile.open(QFile::ReadOnly);

View file

@ -16,7 +16,7 @@ class ArtPiece : public QObject
Q_OBJECT Q_OBJECT
public: public:
ArtPiece() = default; ArtPiece() = default;
ArtPiece(const QString &filename, const QString &assetFilename); ArtPiece(const QString &path);
QString filename, jsonFilename; QString filename, jsonFilename;
QString title; QString title;
@ -35,7 +35,7 @@ class ArtModel : public QAbstractTableModel
{ {
Q_OBJECT Q_OBJECT
public: 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 rowCount(const QModelIndex &parent) const override;
[[nodiscard]] int columnCount(const QModelIndex &parent) const override; [[nodiscard]] int columnCount(const QModelIndex &parent) const override;

View file

@ -20,10 +20,7 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent)
connect(charactersFuture, &QFutureWatcher<Character *>::resultReadyAt, this, &CharacterModel::characterFinished); connect(charactersFuture, &QFutureWatcher<Character *>::resultReadyAt, this, &CharacterModel::characterFinished);
connect(charactersFuture, &QFutureWatcher<Character *>::finished, this, &CharacterModel::finished); connect(charactersFuture, &QFutureWatcher<Character *>::finished, this, &CharacterModel::finished);
struct CharacterInformation { QVector<QString> characterList;
QString definition;
};
QVector<CharacterInformation> characterList;
QDirIterator it(definitionDirectory); QDirIterator it(definitionDirectory);
while (it.hasNext()) { while (it.hasNext()) {
@ -32,7 +29,7 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent)
continue; continue;
} }
characterList.push_back(CharacterInformation{definitionDirectory.absoluteFilePath(info.baseName())}); characterList.push_back(definitionDirectory.absoluteFilePath(info.baseName()));
beginInsertRows(QModelIndex(), static_cast<int>(m_characters.size()), static_cast<int>(m_characters.size() + 1)); beginInsertRows(QModelIndex(), static_cast<int>(m_characters.size()), static_cast<int>(m_characters.size() + 1));
@ -41,14 +38,13 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent)
endInsertRows(); endInsertRows();
} }
const std::function<QCoro::Task<Character *>(const CharacterInformation &info)> loadPiece = const std::function<QCoro::Task<Character *>(const QString &info)> loadPiece = [](const QString &info) -> QCoro::Task<Character *> {
[](const CharacterInformation &info) -> QCoro::Task<Character *> { auto p = new Character(info);
auto p = new Character(info.definition);
co_return p; 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)); return QCoro::waitFor(loadPiece(info));
})); }));
} }

View file

@ -6,8 +6,8 @@
#include <QFileInfo> #include <QFileInfo>
FeaturedArtModel::FeaturedArtModel(const QString &definitionDirectory, const QString &assetDirectory) FeaturedArtModel::FeaturedArtModel(const QString &definitionDirectory)
: ArtModel(definitionDirectory, assetDirectory) : ArtModel(definitionDirectory)
{ {
} }

View file

@ -9,7 +9,7 @@
class FeaturedArtModel : public ArtModel class FeaturedArtModel : public ArtModel
{ {
public: public:
FeaturedArtModel(const QString &definitionDirectory, const QString &assetDirectory); FeaturedArtModel(const QString &definitionDirectory);
[[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override;

View file

@ -37,13 +37,11 @@ int main(int argc, char *argv[])
} }
const QDir sitePath = args[0]; const QDir sitePath = args[0];
const QString defPath = sitePath.absoluteFilePath(QStringLiteral("art")); const QDir dataPath = sitePath.absoluteFilePath(QStringLiteral("data"));
const QDir assetPath = sitePath.absoluteFilePath(QStringLiteral("assets")); const QString defPath = dataPath.absoluteFilePath(QStringLiteral("art"));
const QString artAssetPath = assetPath.absoluteFilePath(QStringLiteral("art")); const QString charaDefPath = dataPath.absoluteFilePath(QStringLiteral("characters"));
const QString dataPath = sitePath.absoluteFilePath(QStringLiteral("data"));
const QString charaDefPath = sitePath.absoluteFilePath(QStringLiteral("characters"));
MainWindow window(defPath, artAssetPath, dataPath, charaDefPath); MainWindow window(defPath, dataPath, charaDefPath);
window.show(); window.show();
return QApplication::exec(); return QApplication::exec();

View file

@ -22,11 +22,7 @@
#include "characterdetailwindow.h" #include "characterdetailwindow.h"
#include "charactermodel.h" #include "charactermodel.h"
MainWindow::MainWindow(const QDir &definitionDirectory, MainWindow::MainWindow(const QDir &definitionDirectory, const QDir &dataDirectory, const QDir &charactersDefinitionDirectory, QWidget *parent)
const QDir &assetDirectory,
const QDir &dataDirectory,
const QDir &charactersDefinitionDirectory,
QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
{ {
setWindowTitle(i18nc("@title:window", "Redai")); setWindowTitle(i18nc("@title:window", "Redai"));
@ -72,11 +68,8 @@ MainWindow::MainWindow(const QDir &definitionDirectory,
auto editConfigAction = manageMenu->addAction(i18nc("@action:inmenu", "Edit Config...")); auto editConfigAction = manageMenu->addAction(i18nc("@action:inmenu", "Edit Config..."));
editConfigAction->setIcon(QIcon::fromTheme(QStringLiteral("configure"))); editConfigAction->setIcon(QIcon::fromTheme(QStringLiteral("configure")));
connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory, definitionDirectory, assetDirectory] { connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory, definitionDirectory] {
auto window = new ArtConfigWindow(dataDirectory.absoluteFilePath(QStringLiteral("art-config.json")), auto window = new ArtConfigWindow(dataDirectory.absoluteFilePath(QStringLiteral("art-config.json")), definitionDirectory.absolutePath(), this);
definitionDirectory.absolutePath(),
assetDirectory.absolutePath(),
this);
window->show(); window->show();
}); });
@ -108,7 +101,7 @@ MainWindow::MainWindow(const QDir &definitionDirectory,
auto tabWidget = new QTabWidget(); auto tabWidget = new QTabWidget();
setCentralWidget(tabWidget); setCentralWidget(tabWidget);
auto model = new ArtModel(definitionDirectory, assetDirectory); auto model = new ArtModel(definitionDirectory);
auto pieceListView = new QTableView(); auto pieceListView = new QTableView();
pieceListView->setModel(model); pieceListView->setModel(model);
@ -121,7 +114,7 @@ MainWindow::MainWindow(const QDir &definitionDirectory,
QHeaderView *horizontalHeader = pieceListView->horizontalHeader(); QHeaderView *horizontalHeader = pieceListView->horizontalHeader();
horizontalHeader->setSectionResizeMode(QHeaderView::Stretch); 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<ArtPiece *>(); const auto &piece = index.data(Qt::UserRole).value<ArtPiece *>();
auto window = new ArtDetailWindow(piece->jsonFilename, piece->getImagePath(), this); auto window = new ArtDetailWindow(piece->jsonFilename, piece->getImagePath(), this);
@ -143,7 +136,7 @@ MainWindow::MainWindow(const QDir &definitionDirectory,
horizontalHeader = charView->horizontalHeader(); horizontalHeader = charView->horizontalHeader();
horizontalHeader->setSectionResizeMode(QHeaderView::Stretch); 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<Character *>(); const auto &piece = index.data(Qt::UserRole).value<Character *>();
auto window = new CharacterDetailWindow(piece->filename, this); auto window = new CharacterDetailWindow(piece->filename, this);

View file

@ -11,9 +11,5 @@ class MainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit MainWindow(const QDir &definitionDirectory, explicit MainWindow(const QDir &definitionDirectory, const QDir &dataDirectory, const QDir &charactersDefinitionDirectory, QWidget *parent = nullptr);
const QDir &assetDirectory,
const QDir &dataDirectory,
const QDir &charactersDefinitionDirectory,
QWidget *parent = nullptr);
}; };