mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-06 05:23:56 -07:00
248 lines
10 KiB
C++
248 lines
10 KiB
C++
#include "dlg_settings.h"
|
|
|
|
#include "../../../client/settings/cache_settings.h"
|
|
#include "../main.h"
|
|
#include "../settings_page/appearance_settings_page.h"
|
|
#include "../settings_page/deck_editor_settings_page.h"
|
|
#include "../settings_page/general_settings_page.h"
|
|
#include "../settings_page/messages_settings_page.h"
|
|
#include "../settings_page/shortcut_settings_page.h"
|
|
#include "../settings_page/sound_settings_page.h"
|
|
#include "../settings_page/storage_settings_page.h"
|
|
#include "../settings_page/user_interface_settings_page.h"
|
|
#include "libcockatrice/card/database/card_database_loader.h"
|
|
#include "libcockatrice/card/database/card_database_manager.h"
|
|
|
|
#include <QCloseEvent>
|
|
#include <QDialogButtonBox>
|
|
#include <QDir>
|
|
#include <QGuiApplication>
|
|
#include <QListWidget>
|
|
#include <QMessageBox>
|
|
#include <QScreen>
|
|
#include <QScrollArea>
|
|
#include <QScrollBar>
|
|
#include <QStackedWidget>
|
|
#include <QVBoxLayout>
|
|
|
|
static QScrollArea *makeScrollable(QWidget *widget)
|
|
{
|
|
widget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum);
|
|
|
|
auto *scrollArea = new QScrollArea;
|
|
scrollArea->setWidgetResizable(true);
|
|
scrollArea->setContentsMargins(0, 0, 0, 0);
|
|
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
scrollArea->horizontalScrollBar()->setEnabled(false);
|
|
scrollArea->setWidget(widget);
|
|
return scrollArea;
|
|
}
|
|
|
|
DlgSettings::DlgSettings(QWidget *parent) : QDialog(parent)
|
|
{
|
|
auto rec = QGuiApplication::primaryScreen()->availableGeometry();
|
|
this->setMinimumSize(qMin(700, rec.width()), qMin(700, rec.height()));
|
|
|
|
connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &DlgSettings::updateLanguage);
|
|
|
|
contentsWidget = new QListWidget;
|
|
contentsWidget->setViewMode(QListView::IconMode);
|
|
contentsWidget->setIconSize(QSize(58, 50));
|
|
contentsWidget->setMovement(QListView::Static);
|
|
contentsWidget->setMinimumHeight(85);
|
|
contentsWidget->setMaximumHeight(85);
|
|
contentsWidget->setSpacing(5);
|
|
|
|
pagesWidget = new QStackedWidget;
|
|
pagesWidget->addWidget(makeScrollable(new GeneralSettingsPage));
|
|
pagesWidget->addWidget(makeScrollable(new AppearanceSettingsPage));
|
|
pagesWidget->addWidget(makeScrollable(new UserInterfaceSettingsPage));
|
|
pagesWidget->addWidget(new DeckEditorSettingsPage);
|
|
pagesWidget->addWidget(makeScrollable(new StorageSettingsPage));
|
|
pagesWidget->addWidget(new MessagesSettingsPage);
|
|
pagesWidget->addWidget(new SoundSettingsPage);
|
|
pagesWidget->addWidget(new ShortcutSettingsPage);
|
|
|
|
createIcons();
|
|
contentsWidget->setCurrentRow(0);
|
|
|
|
auto *vboxLayout = new QVBoxLayout;
|
|
vboxLayout->addWidget(contentsWidget);
|
|
vboxLayout->addWidget(pagesWidget);
|
|
|
|
auto *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok);
|
|
connect(buttonBox, &QDialogButtonBox::accepted, this, &DlgSettings::close);
|
|
|
|
auto *mainLayout = new QVBoxLayout;
|
|
mainLayout->addLayout(vboxLayout);
|
|
mainLayout->addSpacing(2);
|
|
mainLayout->addWidget(buttonBox);
|
|
setLayout(mainLayout);
|
|
|
|
connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &DlgSettings::retranslateUi);
|
|
retranslateUi();
|
|
|
|
adjustSize();
|
|
}
|
|
|
|
void DlgSettings::createIcons()
|
|
{
|
|
generalButton = new QListWidgetItem(contentsWidget);
|
|
generalButton->setTextAlignment(Qt::AlignHCenter);
|
|
generalButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
generalButton->setIcon(QPixmap("theme:config/general"));
|
|
|
|
appearanceButton = new QListWidgetItem(contentsWidget);
|
|
appearanceButton->setTextAlignment(Qt::AlignHCenter);
|
|
appearanceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
appearanceButton->setIcon(QPixmap("theme:config/appearance"));
|
|
|
|
userInterfaceButton = new QListWidgetItem(contentsWidget);
|
|
userInterfaceButton->setTextAlignment(Qt::AlignHCenter);
|
|
userInterfaceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
userInterfaceButton->setIcon(QPixmap("theme:config/interface"));
|
|
|
|
deckEditorButton = new QListWidgetItem(contentsWidget);
|
|
deckEditorButton->setTextAlignment(Qt::AlignHCenter);
|
|
deckEditorButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
deckEditorButton->setIcon(QPixmap("theme:config/deckeditor"));
|
|
|
|
storageButton = new QListWidgetItem(contentsWidget);
|
|
storageButton->setTextAlignment(Qt::AlignHCenter);
|
|
storageButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
storageButton->setIcon(QPixmap("theme:config/storage"));
|
|
|
|
messagesButton = new QListWidgetItem(contentsWidget);
|
|
messagesButton->setTextAlignment(Qt::AlignHCenter);
|
|
messagesButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
messagesButton->setIcon(QPixmap("theme:config/messages"));
|
|
|
|
soundButton = new QListWidgetItem(contentsWidget);
|
|
soundButton->setTextAlignment(Qt::AlignHCenter);
|
|
soundButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
soundButton->setIcon(QPixmap("theme:config/sound"));
|
|
|
|
shortcutsButton = new QListWidgetItem(contentsWidget);
|
|
shortcutsButton->setTextAlignment(Qt::AlignHCenter);
|
|
shortcutsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
|
shortcutsButton->setIcon(QPixmap("theme:config/shorcuts"));
|
|
|
|
connect(contentsWidget, &QListWidget::currentItemChanged, this, &DlgSettings::changePage);
|
|
}
|
|
|
|
void DlgSettings::changePage(QListWidgetItem *current, QListWidgetItem *previous)
|
|
{
|
|
if (!current) {
|
|
current = previous;
|
|
}
|
|
|
|
pagesWidget->setCurrentIndex(contentsWidget->row(current));
|
|
}
|
|
|
|
void DlgSettings::setTab(int index)
|
|
{
|
|
if (index <= contentsWidget->count() - 1 && index >= 0) {
|
|
changePage(contentsWidget->item(index), contentsWidget->currentItem());
|
|
contentsWidget->setCurrentRow(index);
|
|
}
|
|
}
|
|
|
|
void DlgSettings::updateLanguage()
|
|
{
|
|
qApp->removeTranslator(translator); // NOLINT(cppcoreguidelines-pro-type-static-cast-downcast)
|
|
installNewTranslator();
|
|
}
|
|
|
|
void DlgSettings::closeEvent(QCloseEvent *event)
|
|
{
|
|
bool showLoadError = true;
|
|
QString loadErrorMessage = tr("Unknown Error loading card database");
|
|
LoadStatus loadStatus = CardDatabaseManager::getInstance()->getLoadStatus();
|
|
qCInfo(DlgSettingsLog) << "Card Database load status: " << loadStatus;
|
|
switch (loadStatus) {
|
|
case Ok:
|
|
showLoadError = false;
|
|
break;
|
|
case Invalid:
|
|
loadErrorMessage = tr("Your card database is invalid.\n\n"
|
|
"Cockatrice may not function correctly with an invalid database\n\n"
|
|
"You may need to rerun oracle to update your card database.\n\n"
|
|
"Would you like to change your database location setting?");
|
|
break;
|
|
case VersionTooOld:
|
|
loadErrorMessage = tr("Your card database version is too old.\n\n"
|
|
"This can cause problems loading card information or images\n\n"
|
|
"Usually this can be fixed by rerunning oracle to to update your card database.\n\n"
|
|
"Would you like to change your database location setting?");
|
|
break;
|
|
case NotLoaded:
|
|
loadErrorMessage = tr("Your card database did not finish loading\n\n"
|
|
"Please file a ticket at https://github.com/Cockatrice/Cockatrice/issues with your "
|
|
"cards.xml attached\n\n"
|
|
"Would you like to change your database location setting?");
|
|
break;
|
|
case FileError:
|
|
loadErrorMessage = tr("File Error loading your card database.\n\n"
|
|
"Would you like to change your database location setting?");
|
|
break;
|
|
case NoCards:
|
|
loadErrorMessage = tr("Your card database was loaded but contains no cards.\n\n"
|
|
"Would you like to change your database location setting?");
|
|
break;
|
|
default:
|
|
loadErrorMessage = tr("Unknown card database load status\n\n"
|
|
"Please file a ticket at https://github.com/Cockatrice/Cockatrice/issues\n\n"
|
|
"Would you like to change your database location setting?");
|
|
|
|
break;
|
|
}
|
|
|
|
if (showLoadError) {
|
|
if (QMessageBox::critical(this, tr("Error"), loadErrorMessage, QMessageBox::Yes | QMessageBox::No) ==
|
|
QMessageBox::Yes) {
|
|
event->ignore();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!QDir(SettingsCache::instance().paths().getDeckPath()).exists() ||
|
|
SettingsCache::instance().paths().getDeckPath().isEmpty()) {
|
|
//! \todo Prompt to create the deck directory.
|
|
if (QMessageBox::critical(
|
|
this, tr("Error"),
|
|
tr("The path to your deck directory is invalid. Would you like to go back and set the correct path?"),
|
|
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
|
|
event->ignore();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!QDir(SettingsCache::instance().paths().getPicsPath()).exists() ||
|
|
SettingsCache::instance().paths().getPicsPath().isEmpty()) {
|
|
//! \todo Prompt to create the pictures directory.
|
|
if (QMessageBox::critical(this, tr("Error"),
|
|
tr("The path to your card pictures directory is invalid. Would you like to go back "
|
|
"and set the correct path?"),
|
|
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
|
|
event->ignore();
|
|
return;
|
|
}
|
|
}
|
|
event->accept();
|
|
}
|
|
|
|
void DlgSettings::retranslateUi()
|
|
{
|
|
setWindowTitle(tr("Settings"));
|
|
|
|
generalButton->setText(tr("General"));
|
|
appearanceButton->setText(tr("Appearance"));
|
|
userInterfaceButton->setText(tr("User Interface"));
|
|
storageButton->setText(tr("Storage"));
|
|
deckEditorButton->setText(tr("Card Sources"));
|
|
messagesButton->setText(tr("Chat"));
|
|
soundButton->setText(tr("Sound"));
|
|
shortcutsButton->setText(tr("Shortcuts"));
|
|
|
|
contentsWidget->reset();
|
|
}
|