/*
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 "ui_settingsdialog.h"
#include "settingsdialogdiagnostics.h"
#include "settingsdialoggeneral.h"
#include "settingsdialognexus.h"
#include "settingsdialogpaths.h"
#include "settingsdialogplugins.h"
#include "settingsdialogsteam.h"
#include "settingsdialogworkarounds.h"
using namespace MOBase;
SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings& settings, QWidget *parent)
: TutorableDialog("SettingsDialog", parent)
, ui(new Ui::SettingsDialog)
, m_settings(settings)
, m_pluginContainer(pluginContainer)
, m_restartNeeded(false)
{
ui->setupUi(this);
m_tabs.push_back(std::unique_ptr(new GeneralSettingsTab(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 SteamSettingsTab(settings, *this)));
m_tabs.push_back(std::unique_ptr(new PluginsSettingsTab(settings, *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::setRestartNeeded()
{
m_restartNeeded = true;
}
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();
}
}
if (m_restartNeeded) {
if (QMessageBox::question(parentWidgetForDialogs(),
tr("Restart Mod Organizer?"),
tr("In order to finish configuration changes, MO must be restarted.\n"
"Restart it now?"),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
qApp->exit(INT_MAX);
}
}
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.replace("%BASE_DIR%", 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();
}