/* Copyright (C) 2012 Sebastian Herbord. All rights reserved. This file is part of Mod Organizer. Mod Organizer is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Mod Organizer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ #include "settingsdialog.h" #include "settingsdialogdiagnostics.h" #include "settingsdialoggeneral.h" #include "settingsdialogmodlist.h" #include "settingsdialognexus.h" #include "settingsdialogpaths.h" #include "settingsdialogplugins.h" #include "settingsdialogtheme.h" #include "settingsdialogworkarounds.h" #include "ui_settingsdialog.h" using namespace MOBase; SettingsDialog::SettingsDialog(PluginContainer* pluginContainer, Settings& settings, QWidget* parent) : TutorableDialog("SettingsDialog", parent), ui(new Ui::SettingsDialog), m_settings(settings), m_exit(Exit::None), m_pluginContainer(pluginContainer) { ui->setupUi(this); m_tabs.push_back( std::unique_ptr(new GeneralSettingsTab(settings, *this))); m_tabs.push_back(std::unique_ptr(new ThemeSettingsTab(settings, *this))); m_tabs.push_back( std::unique_ptr(new ModListSettingsTab(settings, *this))); m_tabs.push_back(std::unique_ptr(new PathsSettingsTab(settings, *this))); m_tabs.push_back( std::unique_ptr(new DiagnosticsSettingsTab(settings, *this))); m_tabs.push_back(std::unique_ptr(new NexusSettingsTab(settings, *this))); m_tabs.push_back(std::unique_ptr( new PluginsSettingsTab(settings, m_pluginContainer, *this))); m_tabs.push_back( std::unique_ptr(new WorkaroundsSettingsTab(settings, *this))); } PluginContainer* SettingsDialog::pluginContainer() { return m_pluginContainer; } QWidget* SettingsDialog::parentWidgetForDialogs() { if (isVisible()) { return this; } else { return parentWidget(); } } void SettingsDialog::setExitNeeded(ExitFlags e) { m_exit = e; } ExitFlags SettingsDialog::exitNeeded() const { return m_exit; } int SettingsDialog::exec() { GeometrySaver gs(m_settings, this); m_settings.widgets().restoreIndex(ui->tabWidget); auto ret = TutorableDialog::exec(); m_settings.widgets().saveIndex(ui->tabWidget); if (ret == QDialog::Accepted) { for (auto&& tab : m_tabs) { tab->closing(); } // update settings for each tab for (std::unique_ptr const& tab : m_tabs) { tab->update(); } } return ret; } SettingsDialog::~SettingsDialog() { disconnect(this); delete ui; } QString SettingsDialog::getColoredButtonStyleSheet() const { return QString("QPushButton {" "background-color: %1;" "color: %2;" "border: 1px solid;" "padding: 3px;" "}"); } void SettingsDialog::accept() { QString newModPath = ui->modDirEdit->text(); newModPath = PathSettings::resolve(newModPath, ui->baseDirEdit->text()); if ((QDir::fromNativeSeparators(newModPath) != QDir::fromNativeSeparators(Settings::instance().paths().mods(true))) && (QMessageBox::question( parentWidgetForDialogs(), tr("Confirm"), tr("Changing the mod directory affects all your profiles! " "Mods not present (or named differently) in the new location " "will be disabled in all profiles. " "There is no way to undo this unless you backed up your " "profiles manually. Proceed?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)) { return; } TutorableDialog::accept(); } SettingsTab::SettingsTab(Settings& s, SettingsDialog& d) : ui(d.ui), m_settings(s), m_dialog(d) {} SettingsTab::~SettingsTab() = default; Settings& SettingsTab::settings() { return m_settings; } SettingsDialog& SettingsTab::dialog() { return m_dialog; } QWidget* SettingsTab::parentWidget() { return m_dialog.parentWidgetForDialogs(); }