Fix loading art/characters under the new site directory layout
This commit is contained in:
parent
9ab54d0b9e
commit
7fbf53a58d
10 changed files with 35 additions and 57 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
10
src/main.cpp
10
src/main.cpp
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue