// SPDX-FileCopyrightText: 2023 Joshua Goins // // SPDX-License-Identifier: GPL-3.0-or-later #include "mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include "artconfigwindow.h" #include "artdetailwindow.h" #include "artmodel.h" #include "characterdetailwindow.h" #include "charactermodel.h" MainWindow::MainWindow(const QDir &definitionDirectory, const QDir &dataDirectory, const QDir &charactersDefinitionDirectory, QWidget *parent) : QMainWindow(parent) { setWindowTitle(i18nc("@title:window", "Redai")); setMinimumSize(1280, 720); 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(); } }); auto menuBar = new QMenuBar(); setMenuBar(menuBar); auto fileMenu = menuBar->addMenu(i18nc("@title:menu", "File")); fileMenu->addAction(newArtworkAction); fileMenu->addAction(newCharacterAction); fileMenu->addSeparator(); auto quitAction = fileMenu->addAction(i18nc("@action:inmenu", "Quit")); quitAction->setIcon(QIcon::fromTheme(QStringLiteral("gtk-quit"))); connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); auto manageMenu = menuBar->addMenu(i18nc("@title:menu Manage site", "Manage")); auto editConfigAction = manageMenu->addAction(i18nc("@action:inmenu", "Edit Config...")); editConfigAction->setIcon(QIcon::fromTheme(QStringLiteral("configure"))); connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory, definitionDirectory] { auto window = new ArtConfigWindow(dataDirectory.absoluteFilePath(QStringLiteral("art-config.json")), definitionDirectory.absolutePath(), this); 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"))); connect(aboutNovusAction, &QAction::triggered, this, [] { static QPointer dialog; if (!dialog) { dialog = new KAboutApplicationDialog(KAboutData::applicationData(), nullptr); dialog->setAttribute(Qt::WA_DeleteOnClose); } dialog->show(); }); 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); auto tabWidget = new QTabWidget(); setCentralWidget(tabWidget); auto model = new ArtModel(definitionDirectory); auto pieceListView = new QTableView(); pieceListView->setModel(model); pieceListView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows); pieceListView->setSelectionMode(QAbstractItemView::SingleSelection); QHeaderView *verticalHeader = pieceListView->verticalHeader(); verticalHeader->setSectionResizeMode(QHeaderView::ResizeToContents); QHeaderView *horizontalHeader = pieceListView->horizontalHeader(); horizontalHeader->setSectionResizeMode(QHeaderView::Stretch); connect(pieceListView, &QListView::clicked, this, [this](const QModelIndex index) { const auto &piece = index.data(Qt::UserRole).value(); 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); connect(charView, &QListView::clicked, this, [this](const QModelIndex index) { const auto &piece = index.data(Qt::UserRole).value(); auto window = new CharacterDetailWindow(piece->filename, this); window->show(); }); tabWidget->addTab(charView, QStringLiteral("Characters")); }