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 <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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}));
|
||||
}
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
|
||||
#include <QFileInfo>
|
||||
|
||||
FeaturedArtModel::FeaturedArtModel(const QString &definitionDirectory, const QString &assetDirectory)
|
||||
: ArtModel(definitionDirectory, assetDirectory)
|
||||
FeaturedArtModel::FeaturedArtModel(const QString &definitionDirectory)
|
||||
: ArtModel(definitionDirectory)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
10
src/main.cpp
10
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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue