2023-08-31 09:09:52 +02:00
|
|
|
// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
2023-08-31 13:57:26 +02:00
|
|
|
#include "mainwindow.h"
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2023-11-29 23:16:18 -05:00
|
|
|
#include <KAboutApplicationDialog>
|
|
|
|
#include <KAboutData>
|
2023-08-31 13:34:34 +02:00
|
|
|
#include <KLocalizedString>
|
2023-09-02 18:04:16 -04:00
|
|
|
#include <QApplication>
|
|
|
|
#include <QDesktopServices>
|
2023-03-27 12:49:53 -04:00
|
|
|
#include <QHeaderView>
|
2024-02-21 17:51:17 -05:00
|
|
|
#include <QInputDialog>
|
2023-06-15 15:19:34 -04:00
|
|
|
#include <QMenuBar>
|
2023-11-29 23:16:18 -05:00
|
|
|
#include <QPointer>
|
2023-08-31 13:34:34 +02:00
|
|
|
#include <QTableView>
|
2024-02-21 17:51:17 -05:00
|
|
|
#include <QToolBar>
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2023-08-31 13:57:26 +02:00
|
|
|
#include "artconfigwindow.h"
|
|
|
|
#include "artdetailwindow.h"
|
|
|
|
#include "artmodel.h"
|
2024-02-21 17:51:17 -05:00
|
|
|
#include "characterdetailwindow.h"
|
|
|
|
#include "charactermodel.h"
|
|
|
|
|
2024-10-01 20:27:48 -04:00
|
|
|
MainWindow::MainWindow(const QDir &definitionDirectory, const QDir &dataDirectory, const QDir &charactersDefinitionDirectory, QWidget *parent)
|
2023-08-31 13:55:17 +02:00
|
|
|
: QMainWindow(parent)
|
2023-08-31 13:39:00 +02:00
|
|
|
{
|
2023-08-31 13:34:34 +02:00
|
|
|
setWindowTitle(i18nc("@title:window", "Redai"));
|
|
|
|
setMinimumSize(1280, 720);
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2024-02-21 17:51:17 -05:00
|
|
|
auto toolbar = new QToolBar();
|
|
|
|
toolbar->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon);
|
|
|
|
addToolBar(toolbar);
|
|
|
|
|
|
|
|
auto newArtworkAction = toolbar->addAction(i18nc("@action", "Add Artwork"));
|
|
|
|
newArtworkAction->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
|
|
|
|
connect(newArtworkAction, &QAction::triggered, this, [this, definitionDirectory] {
|
|
|
|
const QString text = QInputDialog::getText(this, i18n("Identifier"), i18n("Identifier:"));
|
|
|
|
if (!text.isEmpty()) {
|
|
|
|
auto window = new ArtDetailWindow(QStringLiteral("%1/%2.json").arg(definitionDirectory.absolutePath(), text), QStringLiteral(""), this);
|
|
|
|
window->show();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
auto newCharacterAction = toolbar->addAction(i18nc("@action", "Add Character"));
|
|
|
|
newCharacterAction->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
|
|
|
|
connect(newCharacterAction, &QAction::triggered, this, [this, charactersDefinitionDirectory] {
|
|
|
|
const QString text = QInputDialog::getText(this, i18n("Identifier"), i18n("Identifier:"));
|
|
|
|
if (!text.isEmpty()) {
|
|
|
|
auto window = new CharacterDetailWindow(QStringLiteral("%1/%2.json").arg(charactersDefinitionDirectory.absolutePath(), text), this);
|
|
|
|
window->show();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2023-08-31 13:34:34 +02:00
|
|
|
auto menuBar = new QMenuBar();
|
|
|
|
setMenuBar(menuBar);
|
2023-06-15 15:19:34 -04:00
|
|
|
|
2023-09-02 18:04:16 -04:00
|
|
|
auto fileMenu = menuBar->addMenu(i18nc("@title:menu", "File"));
|
2024-02-21 17:51:17 -05:00
|
|
|
fileMenu->addAction(newArtworkAction);
|
|
|
|
fileMenu->addAction(newCharacterAction);
|
|
|
|
fileMenu->addSeparator();
|
2023-09-02 18:04:16 -04:00
|
|
|
|
|
|
|
auto quitAction = fileMenu->addAction(i18nc("@action:inmenu", "Quit"));
|
|
|
|
quitAction->setIcon(QIcon::fromTheme(QStringLiteral("gtk-quit")));
|
|
|
|
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
|
|
|
|
|
2023-08-31 13:34:34 +02:00
|
|
|
auto manageMenu = menuBar->addMenu(i18nc("@title:menu Manage site", "Manage"));
|
2023-06-15 15:19:34 -04:00
|
|
|
|
2023-08-31 13:34:34 +02:00
|
|
|
auto editConfigAction = manageMenu->addAction(i18nc("@action:inmenu", "Edit Config..."));
|
2023-09-02 18:04:16 -04:00
|
|
|
editConfigAction->setIcon(QIcon::fromTheme(QStringLiteral("configure")));
|
2024-10-01 20:27:48 -04:00
|
|
|
connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory, definitionDirectory] {
|
|
|
|
auto window = new ArtConfigWindow(dataDirectory.absoluteFilePath(QStringLiteral("art-config.json")), definitionDirectory.absolutePath(), this);
|
2023-09-02 18:04:16 -04:00
|
|
|
window->show();
|
|
|
|
});
|
|
|
|
|
|
|
|
auto helpMenu = menuBar->addMenu(i18nc("@title:menu", "Help"));
|
|
|
|
|
|
|
|
auto donateAction = helpMenu->addAction(i18nc("@action:inmenu", "Donate"));
|
|
|
|
connect(donateAction, &QAction::triggered, this, [] {
|
|
|
|
QDesktopServices::openUrl(QUrl(QStringLiteral("https://redstrate.com/fund")));
|
|
|
|
});
|
|
|
|
donateAction->setIcon(QIcon::fromTheme(QStringLiteral("help-donate")));
|
|
|
|
|
|
|
|
helpMenu->addSeparator();
|
|
|
|
|
|
|
|
auto aboutNovusAction = helpMenu->addAction(i18nc("@action:inmenu", "About Redai"));
|
|
|
|
aboutNovusAction->setIcon(QIcon::fromTheme(QStringLiteral("help-about")));
|
2024-02-21 17:51:17 -05:00
|
|
|
connect(aboutNovusAction, &QAction::triggered, this, [] {
|
2023-11-29 23:16:18 -05:00
|
|
|
static QPointer<QDialog> dialog;
|
|
|
|
if (!dialog) {
|
|
|
|
dialog = new KAboutApplicationDialog(KAboutData::applicationData(), nullptr);
|
|
|
|
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
|
|
|
}
|
|
|
|
dialog->show();
|
2023-08-31 13:34:34 +02:00
|
|
|
});
|
2023-06-15 15:19:34 -04:00
|
|
|
|
2023-09-02 18:04:16 -04:00
|
|
|
auto aboutQtAction = helpMenu->addAction(i18nc("@action:inmenu", "About Qt"));
|
|
|
|
aboutQtAction->setIcon(QIcon(QStringLiteral(":/qt-project.org/qmessagebox/images/qtlogo-64.png")));
|
|
|
|
connect(aboutQtAction, &QAction::triggered, QApplication::instance(), &QApplication::aboutQt);
|
|
|
|
|
2024-02-21 17:51:17 -05:00
|
|
|
auto tabWidget = new QTabWidget();
|
|
|
|
setCentralWidget(tabWidget);
|
|
|
|
|
2024-10-01 20:27:48 -04:00
|
|
|
auto model = new ArtModel(definitionDirectory);
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2023-08-31 13:34:34 +02:00
|
|
|
auto pieceListView = new QTableView();
|
2023-08-31 13:39:59 +02:00
|
|
|
pieceListView->setModel(model);
|
|
|
|
pieceListView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows);
|
|
|
|
pieceListView->setSelectionMode(QAbstractItemView::SingleSelection);
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2023-08-31 13:39:59 +02:00
|
|
|
QHeaderView *verticalHeader = pieceListView->verticalHeader();
|
|
|
|
verticalHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2023-08-31 13:39:59 +02:00
|
|
|
QHeaderView *horizontalHeader = pieceListView->horizontalHeader();
|
2023-12-01 15:51:20 -05:00
|
|
|
horizontalHeader->setSectionResizeMode(QHeaderView::Stretch);
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2024-10-01 20:27:48 -04:00
|
|
|
connect(pieceListView, &QListView::clicked, this, [this](const QModelIndex index) {
|
2024-02-21 17:51:17 -05:00
|
|
|
const auto &piece = index.data(Qt::UserRole).value<ArtPiece *>();
|
|
|
|
|
|
|
|
auto window = new ArtDetailWindow(piece->jsonFilename, piece->getImagePath(), this);
|
|
|
|
window->show();
|
|
|
|
});
|
|
|
|
|
|
|
|
tabWidget->addTab(pieceListView, QStringLiteral("Pieces"));
|
|
|
|
|
|
|
|
auto charModel = new CharacterModel(charactersDefinitionDirectory);
|
|
|
|
|
|
|
|
auto charView = new QTableView();
|
|
|
|
charView->setModel(charModel);
|
|
|
|
charView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows);
|
|
|
|
charView->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
|
|
|
|
|
|
verticalHeader = charView->verticalHeader();
|
|
|
|
verticalHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
|
|
|
|
|
|
|
|
horizontalHeader = charView->horizontalHeader();
|
|
|
|
horizontalHeader->setSectionResizeMode(QHeaderView::Stretch);
|
|
|
|
|
2024-10-01 20:27:48 -04:00
|
|
|
connect(charView, &QListView::clicked, this, [this](const QModelIndex index) {
|
2024-02-21 17:51:17 -05:00
|
|
|
const auto &piece = index.data(Qt::UserRole).value<Character *>();
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2024-02-21 17:51:17 -05:00
|
|
|
auto window = new CharacterDetailWindow(piece->filename, this);
|
2023-08-31 13:39:59 +02:00
|
|
|
window->show();
|
|
|
|
});
|
2023-03-27 12:49:53 -04:00
|
|
|
|
2024-02-21 17:51:17 -05:00
|
|
|
tabWidget->addTab(charView, QStringLiteral("Characters"));
|
2023-03-27 12:49:53 -04:00
|
|
|
}
|