File indexing completed on 2024-05-05 05:40:58

0001 /*************************************************************************
0002  *     Copyright (C) 2014 by Renaud Guezennec                            *
0003  *                                                                       *
0004  *     https://rolisteam.org/                                         *
0005  *                                                                       *
0006  *   rolisteam is free software; you can redistribute it and/or modify   *
0007  *   it under the terms of the GNU General Public License as published   *
0008  *   by the Free Software Foundation; either version 2 of the License,   *
0009  *   or (at your option) any later version.                              *
0010  *                                                                       *
0011  *   This program is distributed in the hope that it will be useful,     *
0012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of      *
0013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
0014  *   GNU General Public License for more details.                        *
0015  *                                                                       *
0016  *   You should have received a copy of the GNU General Public License   *
0017  *   along with this program; if not, write to the                       *
0018  *   Free Software Foundation, Inc.,                                     *
0019  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.           *
0020  *************************************************************************/
0021 
0022 #include "preferencesdialog.h"
0023 
0024 #include "controller/preferencescontroller.h"
0025 #include "model/palettemodel.h"
0026 
0027 #include <QComboBox>
0028 #include <QDebug>
0029 #include <QDialogButtonBox>
0030 #include <QFileDialog>
0031 #include <QFontDatabase>
0032 #include <QFormLayout>
0033 #include <QHBoxLayout>
0034 #include <QImageReader>
0035 #include <QInputDialog>
0036 #include <QItemEditorCreatorBase>
0037 #include <QJsonDocument>
0038 #include <QPainter>
0039 #include <QPushButton>
0040 #include <QStringListModel>
0041 #include <QStyleFactory>
0042 #include <QVBoxLayout>
0043 
0044 #ifdef HAVE_SOUND
0045 #include <QMediaPlayer>
0046 #endif
0047 
0048 #include "diceparser/diceparser.h"
0049 #include "media/mediatype.h"
0050 #include "model/thememodel.h"
0051 
0052 #include "ui_preferencesdialogbox.h"
0053 
0054 inline uint qHash(PreferencesDialog::PreferenceTab type, uint seed)
0055 {
0056     return ::qHash(static_cast<uint>(type), seed);
0057 }
0058 
0059 /*********************
0060  * PreferencesDialog *
0061  *********************/
0062 
0063 PreferencesDialog::PreferencesDialog(PreferencesController* controller, QWidget* parent, Qt::WindowFlags f)
0064     : QDialog(parent, f), ui(new Ui::PreferencesDialogBox()), m_ctrl(controller)
0065 {
0066     ui->setupUi(this);
0067     m_currentThemeIsEditable= false;
0068 
0069     // create empty directories list
0070     m_musicDirectories.append(new QStringListModel(QStringList()));
0071     m_musicDirectories.append(new QStringListModel(QStringList()));
0072     m_musicDirectories.append(new QStringListModel(QStringList()));
0073 
0074     ui->m_directoriesList1->setModel(m_musicDirectories[0]);
0075     ui->m_directoriesList2->setModel(m_musicDirectories[1]);
0076     ui->m_directoriesList3->setModel(m_musicDirectories[2]);
0077 
0078     // TODO Fix this line
0079     // ui->m_defaultMapModeCombo->addItems();
0080     m_preferences= PreferencesManager::getInstance();
0081 
0082     ui->m_themeComboBox->setModel(m_ctrl->themeModel());
0083     connect(ui->m_themeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
0084             [this](int pos) { m_ctrl->setCurrentThemeIndex(static_cast<std::size_t>(pos)); });
0085     // m_paletteModel->setPalette(palette());
0086     connect(m_ctrl, &PreferencesController::currentThemeIndexChanged, this, [this]() {
0087         if(m_ctrl->currentTheme())
0088             ui->m_paletteTableView->setModel(m_ctrl->currentTheme()->paletteModel());
0089     });
0090 
0091     if(m_ctrl->currentTheme())
0092     {
0093         ui->m_paletteTableView->setModel(m_ctrl->currentTheme()->paletteModel());
0094         auto horizontalHeader= ui->m_paletteTableView->horizontalHeader();
0095         horizontalHeader->setSectionResizeMode(0, QHeaderView::Stretch);
0096     }
0097 
0098     connect(this, &PreferencesDialog::accepted, m_ctrl, &PreferencesController::savePreferences);
0099 
0100     connect(ui->m_startDiag, &QPushButton::clicked, this, &PreferencesDialog::performDiag);
0101     // i18n
0102     connect(ui->m_systemTranslation, &QCheckBox::clicked, this, &PreferencesDialog::updateTranslationPref);
0103     connect(ui->m_customTranslation, &QCheckBox::clicked, this, &PreferencesDialog::updateTranslationPref);
0104 
0105     connect(ui->m_systemTranslation, &QCheckBox::toggled, m_ctrl, &PreferencesController::setSystemLang);
0106     connect(ui->m_customTranslation, &QCheckBox::toggled, m_ctrl, &PreferencesController::setHasCustomFile);
0107     connect(ui->m_translationSelector, QOverload<int>::of(&QComboBox::currentIndexChanged), m_ctrl,
0108             &PreferencesController::setCurrentLangIndex);
0109     connect(ui->m_translationFileEdit, &FileDirChooser::pathChanged, m_ctrl, &PreferencesController::setCustomFile);
0110 
0111     ui->m_translationSelector->setModel(m_ctrl->languageModel());
0112     // set general panel as default.
0113     ui->tabWidget->setCurrentIndex(0);
0114     connect(ui->m_highLightPenWidth, QOverload<int>::of(&QSpinBox::valueChanged), this,
0115             [=]() { m_preferences->registerValue("VMAP::highlightPenWidth", ui->m_highLightPenWidth->value(), true); });
0116     connect(ui->m_mapItemHighlightColor, &ColorButton::colorChanged, this, [=]() {
0117         m_preferences->registerValue("VMAP::highlightColor", ui->m_mapItemHighlightColor->color(), true);
0118     });
0119 
0120     connect(ui->m_hideTipsOfTheDay, &QCheckBox::clicked, this, [this]() {
0121         m_preferences->registerValue("MainWindow::neverDisplayTips", ui->m_hideTipsOfTheDay->isChecked(), false);
0122     });
0123     // Misc
0124     setSizeGripEnabled(true);
0125     setWindowTitle(
0126         QString("%1 - %2").arg(m_preferences->value("Application_Name", "rolisteam").toString(), tr("Preferences")));
0127     setWindowModality(Qt::ApplicationModal);
0128 
0129     connect(ui->m_heartBeat, SIGNAL(clicked(bool)), this, SLOT(manageHeartBeat()));
0130     connect(ui->m_hbFrequency, SIGNAL(valueChanged(int)), this, SLOT(manageHeartBeat()));
0131     connect(ui->m_displayTimePage, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,
0132             [=](int val) { m_preferences->registerValue("waitingTimeBetweenPage", val, true); });
0133     // Messaging
0134     connect(ui->m_showTimeCheckBox, SIGNAL(clicked(bool)), this, SLOT(manageMessagingPref()));
0135     connect(ui->m_timeColorBtn, SIGNAL(clicked(bool)), this, SLOT(manageMessagingPref()));
0136     connect(ui->m_maxLenghtCommand, SIGNAL(valueChanged(int)), this, SLOT(manageMessagingPref()));
0137     connect(ui->m_hideLongCommand, SIGNAL(toggled(bool)), this, SLOT(manageMessagingPref()));
0138 
0139     // background
0140     connect(ui->m_positioningComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(backgroundChanged()));
0141     connect(ui->m_bgColorPush, SIGNAL(colorChanged(QColor)), this, SLOT(backgroundChanged()));
0142     connect(ui->m_backgroundImage, &FileDirChooser::pathChanged, this, &PreferencesDialog::backgroundChanged);
0143     connect(ui->m_diceHighlightColorBtn, &ColorButton::colorChanged, m_ctrl,
0144             &PreferencesController::setDiceHighLightColor);
0145     // connect(ui->m_backgroundImage,รง)
0146 
0147     // themes
0148     connect(ui->m_copyThemeButton, SIGNAL(clicked()), this, SLOT(dupplicateTheme()));
0149     connect(ui->m_themeNameLineEdit, SIGNAL(textEdited(QString)), this, SLOT(setTitleAtCurrentTheme()));
0150 
0151     connect(ui->m_paletteTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editColor(QModelIndex)));
0152 
0153     connect(ui->m_cssEdit, SIGNAL(clicked()), this, SLOT(editCss()));
0154     connect(ui->m_exportBtn, SIGNAL(clicked()), this, SLOT(exportTheme()));
0155     connect(ui->m_importBtn, SIGNAL(clicked()), this, SLOT(importTheme()));
0156     connect(ui->m_deleteTheme, SIGNAL(clicked()), this, SLOT(deleteTheme()));
0157 
0158     connect(m_ctrl, &PreferencesController::currentLangIndexChanged, this,
0159             [this]() { ui->m_translationSelector->setCurrentIndex(m_ctrl->currentLangIndex()); });
0160 
0161     ui->m_ap1Add->setData(PreferencesDialog::First);
0162     ui->m_ap2Add->setData(PreferencesDialog::Second);
0163     ui->m_ap3Add->setData(PreferencesDialog::Third);
0164 
0165     ui->m_ap1Delete->setData(PreferencesDialog::First);
0166     ui->m_ap2Delete->setData(PreferencesDialog::Second);
0167     ui->m_ap3Delete->setData(PreferencesDialog::Third);
0168 
0169     ui->m_ap1upAct->setData(PreferencesDialog::First);
0170     ui->m_ap2upAct->setData(PreferencesDialog::Second);
0171     ui->m_ap3upAct->setData(PreferencesDialog::Third);
0172 
0173     ui->m_ap1downAct->setData(PreferencesDialog::First);
0174     ui->m_ap2downAct->setData(PreferencesDialog::Second);
0175     ui->m_ap3downAct->setData(PreferencesDialog::Third);
0176 
0177     ui->m_add1Btn->setDefaultAction(ui->m_ap1Add);
0178     ui->m_add2Btn->setDefaultAction(ui->m_ap2Add);
0179     ui->m_add3Btn->setDefaultAction(ui->m_ap3Add);
0180 
0181     ui->m_delete1Btn->setDefaultAction(ui->m_ap1Delete);
0182     ui->m_delete2Btn->setDefaultAction(ui->m_ap2Delete);
0183     ui->m_delete3Btn->setDefaultAction(ui->m_ap3Delete);
0184 
0185     ui->m_up1Btn->setDefaultAction(ui->m_ap1upAct);
0186     ui->m_up2Btn->setDefaultAction(ui->m_ap2upAct);
0187     ui->m_up3Btn->setDefaultAction(ui->m_ap3upAct);
0188 
0189     ui->m_down1Btn->setDefaultAction(ui->m_ap1downAct);
0190     ui->m_down2Btn->setDefaultAction(ui->m_ap2downAct);
0191     ui->m_down3Btn->setDefaultAction(ui->m_ap3downAct);
0192 
0193     connect(ui->m_ap1Add, &QAction::triggered, this, &PreferencesDialog::addDirectory);
0194     connect(ui->m_ap2Add, &QAction::triggered, this, &PreferencesDialog::addDirectory);
0195     connect(ui->m_ap3Add, &QAction::triggered, this, &PreferencesDialog::addDirectory);
0196 
0197     connect(ui->m_ap1Delete, &QAction::triggered, this, &PreferencesDialog::removeDirectory);
0198     connect(ui->m_ap2Delete, &QAction::triggered, this, &PreferencesDialog::removeDirectory);
0199     connect(ui->m_ap3Delete, &QAction::triggered, this, &PreferencesDialog::removeDirectory);
0200 
0201     connect(ui->m_ap1upAct, &QAction::triggered, this, &PreferencesDialog::upDirectory);
0202     connect(ui->m_ap2upAct, &QAction::triggered, this, &PreferencesDialog::upDirectory);
0203     connect(ui->m_ap3upAct, &QAction::triggered, this, &PreferencesDialog::upDirectory);
0204 
0205     connect(ui->m_ap1downAct, &QAction::triggered, this, &PreferencesDialog::downDirectory);
0206     connect(ui->m_ap2downAct, &QAction::triggered, this, &PreferencesDialog::downDirectory);
0207     connect(ui->m_ap3downAct, &QAction::triggered, this, &PreferencesDialog::downDirectory);
0208 
0209     connect(ui->m_directoriesList1, &QListView::clicked, this, [this]() {
0210         auto current= ui->m_directoriesList1->currentIndex();
0211 
0212         auto isValid= current.isValid();
0213 
0214         ui->m_ap1Delete->setEnabled(isValid);
0215         ui->m_ap1upAct->setEnabled(isValid);
0216         ui->m_ap1downAct->setEnabled(isValid);
0217     });
0218 
0219     connect(ui->m_directoriesList2, &QListView::clicked, this, [this]() {
0220         auto current= ui->m_directoriesList2->currentIndex();
0221 
0222         auto isValid= current.isValid();
0223 
0224         ui->m_ap2Delete->setEnabled(isValid);
0225         ui->m_ap2upAct->setEnabled(isValid);
0226         ui->m_ap2downAct->setEnabled(isValid);
0227     });
0228 
0229     connect(ui->m_directoriesList3, &QListView::clicked, this, [this]() {
0230         auto current= ui->m_directoriesList3->currentIndex();
0231 
0232         auto isValid= current.isValid();
0233 
0234         ui->m_ap3Delete->setEnabled(isValid);
0235         ui->m_ap3upAct->setEnabled(isValid);
0236         ui->m_ap3downAct->setEnabled(isValid);
0237     });
0238 
0239     updateTranslationPref();
0240 }
0241 
0242 PreferencesDialog::~PreferencesDialog() {}
0243 
0244 void PreferencesDialog::manageHeartBeat()
0245 {
0246     m_preferences->registerValue("HeartBeatStatus", ui->m_heartBeat->isChecked());
0247     m_preferences->registerValue("HbFrequency", ui->m_hbFrequency->value());
0248 }
0249 void PreferencesDialog::manageMessagingPref()
0250 {
0251     m_preferences->registerValue("MessagingShowTime", ui->m_showTimeCheckBox->isChecked());
0252     m_preferences->registerValue("MessagingColorTime", ui->m_timeColorBtn->color());
0253     m_preferences->registerValue("maxSizeForCuttingDiceCmd", ui->m_maxLenghtCommand->value());
0254     m_preferences->registerValue("hideLongCommand", ui->m_hideLongCommand->isChecked());
0255 }
0256 
0257 void PreferencesDialog::updateTranslationPref()
0258 {
0259     auto systemTrans= m_ctrl->systemLang();
0260     auto customTrans= m_ctrl->hasCustomFile();
0261 
0262     ui->m_customTranslation->setEnabled(!systemTrans);
0263 
0264     ui->m_availablesTranslationLbl->setEnabled(!systemTrans && !customTrans);
0265     ui->m_translationSelector->setEnabled(!systemTrans && !customTrans);
0266 
0267     ui->m_translationFileLbl->setEnabled(!systemTrans && customTrans);
0268     ui->m_translationFileEdit->setEnabled(!systemTrans && customTrans);
0269 }
0270 
0271 void PreferencesDialog::show(PreferenceTab tab)
0272 {
0273     static QHash<PreferenceTab, int> tabData{{PreferenceTab::General, 0},
0274                                              {PreferenceTab::Player, 1},
0275                                              {PreferenceTab::Themes, 2},
0276                                              {PreferenceTab::Diagnostic, 3}};
0277     ui->tabWidget->setCurrentIndex(tabData.value(tab));
0278     load();
0279     QDialog::show();
0280 }
0281 void PreferencesDialog::save() const
0282 {
0283     m_preferences->registerValue("MainWindow::MustBeChecked", ui->m_checkUpdate->isChecked());
0284     m_preferences->registerValue("defaultPermissionMap", ui->m_defaultMapModeCombo->currentIndex());
0285 
0286     // messaging
0287     m_preferences->registerValue("MessagingShowTime", ui->m_showTimeCheckBox->isChecked());
0288     m_preferences->registerValue("MessagingColorTime", ui->m_timeColorBtn->color());
0289 
0290     // General
0291     QColor color;
0292     int opacity= ui->m_opacitySlider->value();
0293     color.setRgb(opacity, opacity, opacity);
0294     m_preferences->registerValue("Fog_color", color);
0295     m_preferences->registerValue("Mask_color", ui->m_fogColor->color());
0296     m_preferences->registerValue("PictureAdjust", ui->m_pictureAdjust->isChecked());
0297     m_preferences->registerValue("FullScreenAtStarting", ui->m_fullScreenCheckbox->isChecked());
0298     m_preferences->registerValue("maxSizeForCuttingDiceCmd", ui->m_maxLenghtCommand->value());
0299     m_preferences->registerValue("hideLongCommand", ui->m_hideLongCommand->isChecked());
0300     m_preferences->registerValue("shortNameInTabMode", ui->m_shortNameCb->isChecked());
0301     m_preferences->registerValue("MaxLengthTabName", ui->m_tabTitleLength->value());
0302 
0303     m_preferences->registerValue("waitingTimeBetweenPage", ui->m_displayTimePage->value());
0304 
0305     // theme
0306     m_preferences->registerValue("currentTheme", ui->m_themeComboBox->currentText());
0307 
0308     m_preferences->registerValue(QStringLiteral("LogDebug"), ui->m_debugLogInfo->isChecked());
0309     m_preferences->registerValue(QStringLiteral("LogResearch"), ui->m_logUniversityResearch->isChecked());
0310     m_preferences->registerValue(QStringLiteral("dataCollection"), ui->m_enableDataCollection->isChecked());
0311 
0312     qDebug() << "list" << m_musicDirectories[0]->stringList();
0313     m_preferences->registerValue(Core::preferences::KEY_DIRECTORY_AP1, m_musicDirectories[0]->stringList());
0314     m_preferences->registerValue(Core::preferences::KEY_DIRECTORY_AP2, m_musicDirectories[1]->stringList());
0315     m_preferences->registerValue(Core::preferences::KEY_DIRECTORY_AP3, m_musicDirectories[2]->stringList());
0316 
0317     m_ctrl->savePreferences();
0318 }
0319 void PreferencesDialog::load()
0320 {
0321     // Direcotry PATH
0322     ui->m_translationFileEdit->setMode(false);
0323     ui->m_translationFileEdit->setFilter("Translation File: (*.qm)");
0324 
0325     ui->m_translationFileEdit->setPath(m_preferences->value("currentTranslationFile", "").toString());
0326     ui->m_checkUpdate->setChecked(m_preferences->value("MainWindow::MustBeChecked", true).toBool());
0327 
0328     ui->m_hideTipsOfTheDay->setChecked(m_preferences->value("MainWindow::neverDisplayTips", false).toBool());
0329 
0330     ui->m_heartBeat->setChecked(m_preferences->value("HeartBeatStatus", false).toBool());
0331     ui->m_hbFrequency->setValue(m_preferences->value("HbFrequency", 60).toInt());
0332 
0333     ui->m_shortNameCb->setChecked(m_preferences->value("shortNameInTabMode", false).toBool());
0334     ui->m_tabTitleLength->setValue(m_preferences->value("MaxLengthTabName", 10).toInt());
0335 
0336     ui->m_displayTimePage->setValue(m_preferences->value("waitingTimeBetweenPage", 300).toInt());
0337 
0338     ui->m_highLightPenWidth->setValue(m_preferences->value("VMAP::highlightPenWidth", 6).toInt());
0339     ui->m_mapItemHighlightColor->setColor(
0340         m_preferences->value("VMAP::highlightColor", QColor(Qt::red)).value<QColor>());
0341 
0342     ui->m_systemTranslation->setChecked(m_ctrl->systemLang());
0343     ui->m_customTranslation->setChecked(m_ctrl->hasCustomFile());
0344     ui->m_translationSelector->setCurrentIndex(m_ctrl->currentLangIndex());
0345     ui->m_translationFileEdit->setPath(m_ctrl->customFilePath());
0346 
0347     ////////////////////////
0348     // MAP
0349     ///////////////////////
0350     // Fog of WAR
0351     QColor fog= m_preferences->value("Fog_color", QColor(Qt::black)).value<QColor>();
0352     ui->m_opacitySlider->setValue(m_preferences->value("Fog_opacity", fog.red()).toInt());
0353     ui->m_opacitySpin->setValue(m_preferences->value("Fog_opacity", fog.red()).toInt());
0354     ui->m_fogColor->setColor(m_preferences->value("Mask_color", QColor(Qt::darkMagenta)).value<QColor>());
0355     ui->m_fullScreenCheckbox->setChecked(m_preferences->value("FullScreenAtStarting", true).toBool());
0356     ui->m_maxLenghtCommand->setValue(m_preferences->value("maxSizeForCuttingDiceCmd", 100).toInt());
0357     ui->m_hideLongCommand->setChecked(m_preferences->value("hideLongCommand", false).toBool());
0358 
0359     // Default Permission
0360     ui->m_defaultMapModeCombo->setCurrentIndex(m_preferences->value("defaultPermissionMap", 0).toInt());
0361     ui->m_pictureAdjust->setChecked(m_preferences->value("PictureAdjust", true).toBool());
0362 
0363     // theme
0364     // initializeStyle();
0365     ui->m_backgroundImage->setMode(false);
0366     ui->m_backgroundImage->setFilter(tr("Images (*.png *.xpm *.jpg *.gif *.bmp)"));
0367 
0368     // Messaging
0369     ui->m_showTimeCheckBox->setChecked(m_preferences->value("MessagingShowTime", false).toBool());
0370     ui->m_timeColorBtn->setColor(m_preferences->value("MessagingColorTime", QColor(Qt::darkGreen)).value<QColor>());
0371 
0372     // LOG
0373     ui->m_debugLogInfo->setChecked(m_preferences->value(QStringLiteral("LogDebug"), false).toBool());
0374     ui->m_logUniversityResearch->setChecked(m_preferences->value(QStringLiteral("LogResearch"), false).toBool());
0375     ui->m_enableDataCollection->setChecked(m_preferences->value(QStringLiteral("dataCollection"), false).toBool());
0376 
0377     // music directory
0378     qDebug() << "list " << m_preferences->value(Core::preferences::KEY_DIRECTORY_AP1, {}).toStringList();
0379     m_musicDirectories[0]->setStringList(m_preferences->value(Core::preferences::KEY_DIRECTORY_AP1, {}).toStringList());
0380     m_musicDirectories[1]->setStringList(m_preferences->value(Core::preferences::KEY_DIRECTORY_AP2, {}).toStringList());
0381     m_musicDirectories[2]->setStringList(m_preferences->value(Core::preferences::KEY_DIRECTORY_AP3, {}).toStringList());
0382 
0383     // m_ctrl->loadPreferences();
0384     updateTheme();
0385 }
0386 
0387 void PreferencesDialog::editColor(QModelIndex index)
0388 {
0389     QColor color= QColorDialog::getColor(index.data(Qt::DecorationRole).value<QColor>(), this);
0390     if(!color.isValid())
0391         return;
0392 
0393     m_ctrl->setColorCurrentTheme(color, index.row());
0394 
0395     auto theme= m_ctrl->currentTheme();
0396     if(nullptr == theme)
0397         return;
0398     // TODO
0399 }
0400 
0401 void PreferencesDialog::updateTheme()
0402 {
0403     RolisteamTheme* theme= m_ctrl->currentTheme();
0404 
0405     ui->m_themeNameLineEdit->setText(theme->getName());
0406     ui->m_backgroundImage->setPath(theme->getBackgroundImage());
0407 
0408     ui->m_bgColorPush->blockSignals(true);
0409     ui->m_bgColorPush->setColor(theme->getBackgroundColor());
0410     ui->m_bgColorPush->blockSignals(false);
0411 
0412     ui->m_positioningComboBox->blockSignals(true);
0413     ui->m_positioningComboBox->setCurrentIndex(theme->getBackgroundPosition());
0414     ui->m_positioningComboBox->blockSignals(false);
0415 
0416     QString defaultStyle= theme->getStyleName();
0417 
0418     ui->m_styleCombo->blockSignals(true);
0419     ui->m_styleCombo->setCurrentIndex(ui->m_styleCombo->findText(defaultStyle.toUpper(), Qt::MatchContains));
0420     ui->m_styleCombo->blockSignals(false);
0421 
0422     ui->m_diceHighlightColorBtn->setColor(theme->getDiceHighlightColor());
0423 
0424     // qApp->setStyle(theme->getStyle());
0425     // qApp->setPalette(theme->getPalette());
0426     // applyBackground();
0427     // qApp->setStyleSheet(theme->getCss());
0428 }
0429 void PreferencesDialog::setStyle()
0430 {
0431     auto style= QStyleFactory::create(ui->m_styleCombo->currentText());
0432     m_ctrl->setCurrentThemeStyle(style);
0433     // qApp->setStyle(style);
0434 }
0435 void PreferencesDialog::editCss()
0436 {
0437     auto theme= m_ctrl->currentTheme();
0438 
0439     if(nullptr == theme)
0440         return;
0441 
0442     bool ok= false;
0443     QString text= QInputDialog::getMultiLineText(this, tr("Css Editor"), tr("Css"), theme->getCss(), &ok);
0444     if(ok)
0445     {
0446         m_ctrl->setCurrentThemeCss(text);
0447         // qApp->setStyleSheet(theme->getCss());
0448     }
0449 }
0450 
0451 void PreferencesDialog::dupplicateTheme(bool selectNew)
0452 {
0453     int i= ui->m_themeComboBox->currentIndex();
0454     m_ctrl->dupplicateTheme(i, selectNew);
0455 }
0456 void PreferencesDialog::setTitleAtCurrentTheme()
0457 {
0458     m_ctrl->setCurrentThemeTitle(ui->m_themeNameLineEdit->text());
0459 }
0460 void PreferencesDialog::backgroundChanged()
0461 {
0462     m_ctrl->setCurrentThemeBackground(ui->m_backgroundImage->path(), ui->m_positioningComboBox->currentIndex(),
0463                                       ui->m_bgColorPush->color());
0464     // applyBackground();setCurrentThemeBackground
0465 }
0466 
0467 void PreferencesDialog::performDiag()
0468 {
0469     ui->m_diagDisplay->clear();
0470 
0471     QList<QByteArray> format(QImageReader::supportedImageFormats());
0472 
0473     QString htmlResult;
0474     QString linePattern= tr("<li>Image Format : %1 value %2</li>");
0475     htmlResult= tr("<h2>Supported Image Formats:</h2><ul>");
0476     QString result= "";
0477     for(int i= 0; i < format.size(); ++i)
0478     {
0479         result+= linePattern.arg(i).arg(QString(format.at(i)));
0480     }
0481     htmlResult+= result;
0482     htmlResult+= tr("</ul>End of Image Format");
0483     result= "";
0484     QFontDatabase database;
0485     htmlResult+= tr("<h2>Font families:</h2><ul>");
0486     linePattern= "<li>%1</li>";
0487     for(auto& family : database.families())
0488     {
0489         result+= linePattern.arg(family);
0490     }
0491     htmlResult+= result;
0492     htmlResult+= tr("</ul>End of Font families");
0493 #ifdef HAVE_SOUND
0494     result= "";
0495     htmlResult+= tr("<h2>Audio file formats Support:</h2><ul>");
0496     QStringList commonAudioMimeType;
0497     commonAudioMimeType << "audio/basic"
0498                         << "audio/L24"
0499                         << "audio/mid"
0500                         << "audio/mpeg"
0501                         << "audio/mp4"
0502                         << "audio/x-aiff"
0503                         << "audio/x-mpegurl"
0504                         << "audio/vnd.rn-realaudio"
0505                         << "audio/ogg"
0506                         << "audio/vorbis"
0507                         << "audio/vnd.wav"
0508                         << "audio/x-ms-wma"
0509                         << "audio/x-wav"
0510                         << "audio/wav"
0511                         << "audio/webm"
0512                         << "audio/flac"; //
0513                                          /*  for(const QString &type : commonAudioMimeType)
0514                                            {
0515                                                switch (QMediaPlayer::hasSupport(type))
0516                                                {
0517                                                case QMultimedia::NotSupported:
0518                                                    result+=tr("<li>Unsupported format: %1</li>").arg(type);
0519                                                    break;
0520                                                case QMultimedia::MaybeSupported:
0521                                                    result+=tr("<li>Maybe supported format: %1</li>").arg(type);
0522                                                    break;
0523                                                case QMultimedia::ProbablySupported:
0524                                                case QMultimedia::PreferredService:
0525                                                    result+= tr("<li>Supported format: %1</li>").arg(type);
0526                                                    break;
0527                                                }
0528                                            }*/
0529     htmlResult+= result;
0530     htmlResult+= tr("</ul>End of Supported Audio file formats");
0531 
0532 #endif
0533     ui->m_diagDisplay->setHtml(htmlResult);
0534 }
0535 
0536 void PreferencesDialog::testAliasCommand()
0537 {
0538     // ui->m_convertedCmdEdit->setText(m_ctrl->convertAlias(ui->m_cmdDiceEdit->text()));
0539 }
0540 
0541 void PreferencesDialog::exportTheme()
0542 {
0543     int i= ui->m_themeComboBox->currentIndex();
0544     auto name= m_ctrl->themeName(i);
0545 
0546     QString pathExport= QFileDialog::getSaveFileName(
0547         this, tr("Export Rolisteam Theme"),
0548         m_preferences->value("ThemeDirectory", QDir::homePath()).toString().append("/%1.rskin").arg(name),
0549         tr("Rolisteam Theme: %1").arg("*.rskin"));
0550 
0551     m_ctrl->exportTheme(pathExport, i);
0552 }
0553 
0554 bool PreferencesDialog::importTheme()
0555 {
0556     QString pathImport= QFileDialog::getOpenFileName(
0557         this, tr("Import Rolisteam Theme"), m_preferences->value("ThemeDirectory", QDir::homePath()).toString(),
0558         tr("Rolisteam Theme: %1").arg("*.rskin"));
0559 
0560     updateTheme();
0561     ui->m_themeComboBox->setCurrentIndex(ui->m_themeComboBox->count() - 1);
0562 
0563     return false;
0564 }
0565 
0566 void PreferencesDialog::deleteTheme()
0567 {
0568     m_ctrl->removeTheme(ui->m_themeComboBox->currentIndex());
0569 }
0570 
0571 void PreferencesDialog::addDirectory()
0572 {
0573     auto act= qobject_cast<QAction*>(sender());
0574     if(!act)
0575         return;
0576 
0577     auto id= act->data().toInt();
0578 
0579     auto dir= QFileDialog::getExistingDirectory(this, tr("Add new directory"), QDir::homePath());
0580 
0581     if(dir.isEmpty())
0582         return;
0583 
0584     auto list= m_musicDirectories[id]->stringList();
0585     list.append(dir);
0586     m_musicDirectories[id]->setStringList(list);
0587     save();
0588 }
0589 
0590 QModelIndex PreferencesDialog::currentIndexFromCurrentList(int i)
0591 {
0592     QModelIndex index;
0593     switch(i)
0594     {
0595     case First:
0596         index= ui->m_directoriesList1->currentIndex();
0597         break;
0598     case Second:
0599         index= ui->m_directoriesList2->currentIndex();
0600         break;
0601     case Third:
0602         index= ui->m_directoriesList3->currentIndex();
0603         break;
0604     }
0605     return index;
0606 }
0607 
0608 void PreferencesDialog::removeDirectory()
0609 {
0610     auto act= qobject_cast<QAction*>(sender());
0611     if(!act)
0612         return;
0613 
0614     auto id= act->data().toInt();
0615     auto idx= currentIndexFromCurrentList(id);
0616     if(!idx.isValid())
0617         return;
0618 
0619     m_musicDirectories[id]->removeRows(idx.row(), 1);
0620     save();
0621 }
0622 
0623 void PreferencesDialog::upDirectory()
0624 {
0625     auto act= qobject_cast<QAction*>(sender());
0626     if(!act)
0627         return;
0628 
0629     auto id= act->data().toInt();
0630     auto idx= currentIndexFromCurrentList(id);
0631     if(!idx.isValid())
0632         return;
0633     auto src= idx.row();
0634     auto dest= src - 1;
0635     auto list= m_musicDirectories[id]->stringList();
0636 
0637     if(dest < 0 || src >= list.size())
0638         return;
0639 
0640     list.swapItemsAt(src, dest);
0641     m_musicDirectories[id]->setStringList(list);
0642     save();
0643 }
0644 
0645 void PreferencesDialog::downDirectory()
0646 {
0647     auto act= qobject_cast<QAction*>(sender());
0648     if(!act)
0649         return;
0650 
0651     auto id= act->data().toInt();
0652     auto idx= currentIndexFromCurrentList(id);
0653     if(!idx.isValid())
0654         return;
0655 
0656     auto src= idx.row();
0657     auto dest= src + 1;
0658     auto list= m_musicDirectories[id]->stringList();
0659 
0660     if(src < 0 || dest >= list.size())
0661         return;
0662 
0663     list.swapItemsAt(src, dest);
0664     m_musicDirectories[id]->setStringList(list);
0665     save();
0666 }