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 <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)
{
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);

View file

@ -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);

View file

@ -7,37 +7,31 @@
#include <KLocalizedString>
#include <QCoroNetwork>
#include <QCoroTask>
#include <QDirIterator>
#include <QFile>
#include <QFileInfo>
#include <QIcon>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkReply>
#include <QPixmap>
#include <QtConcurrent>
ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory, QObject *parent)
ArtModel::ArtModel(const QDir &definitionDirectory, QObject *parent)
: QAbstractTableModel(parent)
{
piecesFuture = new QFutureWatcher<ArtPiece *>(this);
connect(piecesFuture, &QFutureWatcher<ArtPiece *>::resultReadyAt, this, &ArtModel::pieceFinished);
connect(piecesFuture, &QFutureWatcher<ArtPiece *>::finished, this, &ArtModel::finished);
struct PieceInformation {
QString definition;
QString asset;
};
QVector<PieceInformation> pieceList;
QVector<QString> 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<int>(m_artPieces.size()), static_cast<int>(m_artPieces.size() + 1));
@ -46,8 +40,8 @@ ArtModel::ArtModel(const QDir &definitionDirectory, const QDir &assetDirectory,
endInsertRows();
}
const std::function<QCoro::Task<ArtPiece *>(const PieceInformation &info)> loadPiece = [](const PieceInformation &info) -> QCoro::Task<ArtPiece *> {
auto p = new ArtPiece(info.definition, info.asset);
const std::function<QCoro::Task<ArtPiece *>(const QString &info)> loadPiece = [](const QString &info) -> QCoro::Task<ArtPiece *> {
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);

View file

@ -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;

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 *>::finished, this, &CharacterModel::finished);
struct CharacterInformation {
QString definition;
};
QVector<CharacterInformation> characterList;
QVector<QString> 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<int>(m_characters.size()), static_cast<int>(m_characters.size() + 1));
@ -41,14 +38,13 @@ CharacterModel::CharacterModel(const QDir &definitionDirectory, QObject *parent)
endInsertRows();
}
const std::function<QCoro::Task<Character *>(const CharacterInformation &info)> loadPiece =
[](const CharacterInformation &info) -> QCoro::Task<Character *> {
auto p = new Character(info.definition);
const std::function<QCoro::Task<Character *>(const QString &info)> loadPiece = [](const QString &info) -> QCoro::Task<Character *> {
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));
}));
}

View file

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

View file

@ -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;

View file

@ -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();

View file

@ -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<ArtPiece *>();
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<Character *>();
auto window = new CharacterDetailWindow(piece->filename, this);

View file

@ -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);
};