2015-12-20 16:36:39 -07:00
|
|
|
// Copyright 2015 Dolphin Emulator Project
|
|
|
|
// Licensed under GPLv2+
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
2017-05-09 10:49:10 -06:00
|
|
|
#include <QDir>
|
2017-07-05 18:35:47 -06:00
|
|
|
#include <QSettings>
|
2015-12-20 16:36:39 -07:00
|
|
|
#include <QSize>
|
|
|
|
|
2017-06-21 02:26:06 -06:00
|
|
|
#include "AudioCommon/AudioCommon.h"
|
2017-09-20 10:29:32 -06:00
|
|
|
#include "Common/Config/Config.h"
|
2015-12-20 16:36:39 -07:00
|
|
|
#include "Common/FileUtil.h"
|
2017-05-20 09:53:17 -06:00
|
|
|
#include "Common/StringUtil.h"
|
2015-12-20 16:36:39 -07:00
|
|
|
#include "Core/ConfigManager.h"
|
2017-09-04 12:12:13 -06:00
|
|
|
#include "Core/Core.h"
|
2017-08-01 04:55:21 -06:00
|
|
|
#include "DolphinQt2/GameList/GameListModel.h"
|
2017-09-20 10:29:32 -06:00
|
|
|
#include "DolphinQt2/QtUtils/QueueOnObject.h"
|
2015-12-20 16:36:39 -07:00
|
|
|
#include "DolphinQt2/Settings.h"
|
2017-05-20 09:53:17 -06:00
|
|
|
#include "InputCommon/InputConfig.h"
|
2015-12-20 16:36:39 -07:00
|
|
|
|
2017-09-04 12:12:13 -06:00
|
|
|
Settings::Settings()
|
|
|
|
{
|
2017-09-15 11:33:22 -06:00
|
|
|
qRegisterMetaType<Core::State>();
|
2017-09-04 12:12:13 -06:00
|
|
|
Core::SetOnStateChangedCallback(
|
|
|
|
[this](Core::State new_state) { emit EmulationStateChanged(new_state); });
|
2017-09-20 10:29:32 -06:00
|
|
|
|
|
|
|
Config::AddConfigChangedCallback(
|
|
|
|
[this] { QueueOnObject(this, [this] { emit ConfigChanged(); }); });
|
2017-09-04 12:12:13 -06:00
|
|
|
}
|
2015-12-20 16:36:39 -07:00
|
|
|
|
2017-05-31 01:17:39 -06:00
|
|
|
Settings& Settings::Instance()
|
|
|
|
{
|
|
|
|
static Settings settings;
|
|
|
|
return settings;
|
|
|
|
}
|
|
|
|
|
2018-03-23 05:10:53 -06:00
|
|
|
QSettings& Settings::GetQSettings()
|
|
|
|
{
|
|
|
|
static QSettings settings(
|
|
|
|
QStringLiteral("%1/Qt.ini").arg(QString::fromStdString(File::GetUserPath(D_CONFIG_IDX))),
|
|
|
|
QSettings::IniFormat);
|
|
|
|
return settings;
|
|
|
|
}
|
|
|
|
|
2017-05-31 17:15:48 -06:00
|
|
|
void Settings::SetThemeName(const QString& theme_name)
|
|
|
|
{
|
|
|
|
SConfig::GetInstance().theme_name = theme_name.toStdString();
|
|
|
|
emit ThemeChanged();
|
|
|
|
}
|
|
|
|
|
2015-12-20 16:36:39 -07:00
|
|
|
QStringList Settings::GetPaths() const
|
|
|
|
{
|
2017-06-22 16:11:53 -06:00
|
|
|
QStringList list;
|
|
|
|
for (const auto& path : SConfig::GetInstance().m_ISOFolder)
|
|
|
|
list << QString::fromStdString(path);
|
|
|
|
return list;
|
2017-05-31 01:42:15 -06:00
|
|
|
}
|
|
|
|
|
2017-06-22 16:11:53 -06:00
|
|
|
void Settings::AddPath(const QString& qpath)
|
2015-12-20 16:36:39 -07:00
|
|
|
{
|
2017-06-22 16:11:53 -06:00
|
|
|
std::string path = qpath.toStdString();
|
2015-12-20 16:36:39 -07:00
|
|
|
|
2017-06-22 16:11:53 -06:00
|
|
|
std::vector<std::string>& paths = SConfig::GetInstance().m_ISOFolder;
|
|
|
|
if (std::find(paths.begin(), paths.end(), path) != paths.end())
|
2017-05-31 01:42:15 -06:00
|
|
|
return;
|
|
|
|
|
2017-06-22 16:11:53 -06:00
|
|
|
paths.emplace_back(path);
|
|
|
|
emit PathAdded(qpath);
|
2017-05-03 22:19:51 -06:00
|
|
|
}
|
|
|
|
|
2017-06-22 16:11:53 -06:00
|
|
|
void Settings::RemovePath(const QString& qpath)
|
2017-05-03 22:19:51 -06:00
|
|
|
{
|
2017-06-22 16:11:53 -06:00
|
|
|
std::string path = qpath.toStdString();
|
|
|
|
std::vector<std::string>& paths = SConfig::GetInstance().m_ISOFolder;
|
2017-05-03 22:19:51 -06:00
|
|
|
|
2017-06-22 16:11:53 -06:00
|
|
|
auto new_end = std::remove(paths.begin(), paths.end(), path);
|
|
|
|
if (new_end == paths.end())
|
|
|
|
return;
|
2015-12-20 16:36:39 -07:00
|
|
|
|
2017-06-22 16:11:53 -06:00
|
|
|
paths.erase(new_end, paths.end());
|
|
|
|
emit PathRemoved(qpath);
|
2015-12-20 16:36:39 -07:00
|
|
|
}
|
|
|
|
|
2018-04-19 15:07:36 -06:00
|
|
|
void Settings::ReloadPath(const QString& qpath)
|
|
|
|
{
|
|
|
|
emit PathReloadRequested(qpath);
|
|
|
|
}
|
|
|
|
|
2018-01-31 11:58:02 -07:00
|
|
|
QString Settings::GetDefaultGame() const
|
|
|
|
{
|
|
|
|
return QString::fromStdString(SConfig::GetInstance().m_strDefaultISO);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetDefaultGame(QString path)
|
|
|
|
{
|
|
|
|
if (GetDefaultGame() != path)
|
|
|
|
{
|
|
|
|
SConfig::GetInstance().m_strDefaultISO = path.toStdString();
|
|
|
|
emit DefaultGameChanged(path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-01 03:29:39 -07:00
|
|
|
bool Settings::GetPreferredView() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("PreferredView"), true).toBool();
|
2016-01-01 03:29:39 -07:00
|
|
|
}
|
|
|
|
|
2017-08-05 02:28:53 -06:00
|
|
|
void Settings::SetPreferredView(bool list)
|
2016-01-01 03:29:39 -07:00
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("PreferredView"), list);
|
2015-12-20 16:36:39 -07:00
|
|
|
}
|
|
|
|
|
2016-02-14 18:56:40 -07:00
|
|
|
int Settings::GetStateSlot() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("Emulation/StateSlot"), 1).toInt();
|
2016-02-14 18:56:40 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetStateSlot(int slot)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("Emulation/StateSlot"), slot);
|
2015-12-20 16:36:39 -07:00
|
|
|
}
|
2017-05-08 11:03:59 -06:00
|
|
|
|
2017-06-01 00:49:06 -06:00
|
|
|
void Settings::SetHideCursor(bool hide_cursor)
|
|
|
|
{
|
|
|
|
SConfig::GetInstance().bHideCursor = hide_cursor;
|
|
|
|
emit HideCursorChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::GetHideCursor() const
|
|
|
|
{
|
|
|
|
return SConfig::GetInstance().bHideCursor;
|
|
|
|
}
|
|
|
|
|
2017-06-21 02:26:06 -06:00
|
|
|
int Settings::GetVolume() const
|
|
|
|
{
|
|
|
|
return SConfig::GetInstance().m_Volume;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetVolume(int volume)
|
|
|
|
{
|
|
|
|
if (GetVolume() != volume)
|
|
|
|
{
|
|
|
|
SConfig::GetInstance().m_Volume = volume;
|
|
|
|
emit VolumeChanged(volume);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::IncreaseVolume(int volume)
|
|
|
|
{
|
|
|
|
AudioCommon::IncreaseVolume(volume);
|
|
|
|
emit VolumeChanged(GetVolume());
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::DecreaseVolume(int volume)
|
|
|
|
{
|
|
|
|
AudioCommon::DecreaseVolume(volume);
|
|
|
|
emit VolumeChanged(GetVolume());
|
|
|
|
}
|
|
|
|
|
2017-07-04 07:21:33 -06:00
|
|
|
bool Settings::IsLogVisible() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("logging/logvisible")).toBool();
|
2017-07-04 07:21:33 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetLogVisible(bool visible)
|
|
|
|
{
|
|
|
|
if (IsLogVisible() != visible)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("logging/logvisible"), visible);
|
2017-07-04 07:21:33 -06:00
|
|
|
emit LogVisibilityChanged(visible);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsLogConfigVisible() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("logging/logconfigvisible")).toBool();
|
2017-07-04 07:21:33 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetLogConfigVisible(bool visible)
|
|
|
|
{
|
|
|
|
if (IsLogConfigVisible() != visible)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("logging/logconfigvisible"), visible);
|
2017-07-04 07:21:33 -06:00
|
|
|
emit LogConfigVisibilityChanged(visible);
|
|
|
|
}
|
|
|
|
}
|
2017-08-01 04:55:21 -06:00
|
|
|
|
|
|
|
GameListModel* Settings::GetGameListModel() const
|
|
|
|
{
|
|
|
|
static GameListModel* model = new GameListModel;
|
|
|
|
return model;
|
|
|
|
}
|
|
|
|
|
|
|
|
NetPlayClient* Settings::GetNetPlayClient()
|
|
|
|
{
|
|
|
|
return m_client.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::ResetNetPlayClient(NetPlayClient* client)
|
|
|
|
{
|
|
|
|
m_client.reset(client);
|
|
|
|
}
|
|
|
|
|
|
|
|
NetPlayServer* Settings::GetNetPlayServer()
|
|
|
|
{
|
|
|
|
return m_server.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::ResetNetPlayServer(NetPlayServer* server)
|
|
|
|
{
|
|
|
|
m_server.reset(server);
|
|
|
|
}
|
2017-08-30 13:00:59 -06:00
|
|
|
|
|
|
|
bool Settings::GetCheatsEnabled() const
|
|
|
|
{
|
|
|
|
return SConfig::GetInstance().bEnableCheats;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetCheatsEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
if (SConfig::GetInstance().bEnableCheats != enabled)
|
|
|
|
{
|
|
|
|
SConfig::GetInstance().bEnableCheats = enabled;
|
|
|
|
emit EnableCheatsChanged(enabled);
|
|
|
|
}
|
|
|
|
}
|
2017-09-19 06:14:45 -06:00
|
|
|
|
|
|
|
void Settings::SetDebugModeEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
if (IsDebugModeEnabled() != enabled)
|
|
|
|
{
|
|
|
|
SConfig::GetInstance().bEnableDebugging = enabled;
|
|
|
|
emit DebugModeToggled(enabled);
|
|
|
|
}
|
2018-03-24 10:50:47 -06:00
|
|
|
if (enabled)
|
|
|
|
SetCodeVisible(true);
|
2017-09-19 06:14:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsDebugModeEnabled() const
|
|
|
|
{
|
|
|
|
return SConfig::GetInstance().bEnableDebugging;
|
|
|
|
}
|
2017-09-13 11:33:45 -06:00
|
|
|
|
|
|
|
void Settings::SetRegistersVisible(bool enabled)
|
|
|
|
{
|
|
|
|
if (IsRegistersVisible() != enabled)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("debugger/showregisters"), enabled);
|
2017-09-13 11:33:45 -06:00
|
|
|
|
|
|
|
emit RegistersVisibilityChanged(enabled);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsRegistersVisible() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("debugger/showregisters")).toBool();
|
2017-09-13 11:33:45 -06:00
|
|
|
}
|
2017-09-27 00:53:05 -06:00
|
|
|
|
|
|
|
void Settings::SetWatchVisible(bool enabled)
|
|
|
|
{
|
|
|
|
if (IsWatchVisible() != enabled)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("debugger/showwatch"), enabled);
|
2017-09-27 00:53:05 -06:00
|
|
|
|
|
|
|
emit WatchVisibilityChanged(enabled);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsWatchVisible() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("debugger/showwatch")).toBool();
|
2017-09-27 00:53:05 -06:00
|
|
|
}
|
2017-10-03 10:43:44 -06:00
|
|
|
|
|
|
|
void Settings::SetBreakpointsVisible(bool enabled)
|
|
|
|
{
|
|
|
|
if (IsBreakpointsVisible() != enabled)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("debugger/showbreakpoints"), enabled);
|
2017-10-03 10:43:44 -06:00
|
|
|
|
|
|
|
emit BreakpointsVisibilityChanged(enabled);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsBreakpointsVisible() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("debugger/showbreakpoints")).toBool();
|
2017-10-03 10:43:44 -06:00
|
|
|
}
|
2018-02-06 15:12:17 -07:00
|
|
|
|
|
|
|
bool Settings::IsControllerStateNeeded() const
|
|
|
|
{
|
|
|
|
return m_controller_state_needed;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetControllerStateNeeded(bool needed)
|
|
|
|
{
|
|
|
|
m_controller_state_needed = needed;
|
|
|
|
}
|
2018-02-14 15:25:01 -07:00
|
|
|
|
|
|
|
void Settings::SetCodeVisible(bool enabled)
|
|
|
|
{
|
|
|
|
if (IsCodeVisible() != enabled)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("debugger/showcode"), enabled);
|
2018-02-14 15:25:01 -07:00
|
|
|
|
|
|
|
emit CodeVisibilityChanged(enabled);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsCodeVisible() const
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("debugger/showcode")).toBool();
|
2018-02-14 15:25:01 -07:00
|
|
|
}
|
|
|
|
|
2018-03-16 05:39:53 -06:00
|
|
|
void Settings::SetMemoryVisible(bool enabled)
|
|
|
|
{
|
|
|
|
if (IsMemoryVisible() == enabled)
|
|
|
|
return;
|
|
|
|
QSettings().setValue(QStringLiteral("debugger/showmemory"), enabled);
|
|
|
|
|
|
|
|
emit MemoryVisibilityChanged(enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsMemoryVisible() const
|
|
|
|
{
|
|
|
|
return QSettings().value(QStringLiteral("debugger/showmemory")).toBool();
|
|
|
|
}
|
|
|
|
|
2018-02-14 15:25:01 -07:00
|
|
|
void Settings::SetDebugFont(QFont font)
|
|
|
|
{
|
|
|
|
if (GetDebugFont() != font)
|
|
|
|
{
|
2018-03-23 05:10:53 -06:00
|
|
|
GetQSettings().setValue(QStringLiteral("debugger/font"), font);
|
2018-02-14 15:25:01 -07:00
|
|
|
|
|
|
|
emit DebugFontChanged(font);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QFont Settings::GetDebugFont() const
|
|
|
|
{
|
|
|
|
QFont default_font = QFont(QStringLiteral("Monospace"));
|
|
|
|
default_font.setStyleHint(QFont::TypeWriter);
|
|
|
|
|
2018-03-23 05:10:53 -06:00
|
|
|
return GetQSettings().value(QStringLiteral("debugger/font"), default_font).value<QFont>();
|
2018-02-14 15:25:01 -07:00
|
|
|
}
|
2018-03-22 05:20:15 -06:00
|
|
|
|
|
|
|
void Settings::SetAutoUpdateTrack(const QString& mode)
|
|
|
|
{
|
|
|
|
if (mode == GetAutoUpdateTrack())
|
|
|
|
return;
|
|
|
|
|
|
|
|
SConfig::GetInstance().m_auto_update_track = mode.toStdString();
|
|
|
|
|
|
|
|
emit AutoUpdateTrackChanged(mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Settings::GetAutoUpdateTrack() const
|
|
|
|
{
|
|
|
|
return QString::fromStdString(SConfig::GetInstance().m_auto_update_track);
|
|
|
|
}
|
2018-03-23 16:25:17 -06:00
|
|
|
|
|
|
|
void Settings::SetAnalyticsEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
if (enabled == IsAnalyticsEnabled())
|
|
|
|
return;
|
|
|
|
|
|
|
|
SConfig::GetInstance().m_analytics_enabled = enabled;
|
|
|
|
|
|
|
|
emit AnalyticsToggled(enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsAnalyticsEnabled() const
|
|
|
|
{
|
|
|
|
return SConfig::GetInstance().m_analytics_enabled;
|
|
|
|
}
|
2018-04-19 03:32:00 -06:00
|
|
|
|
|
|
|
void Settings::SetToolBarVisible(bool visible)
|
|
|
|
{
|
|
|
|
if (IsToolBarVisible() == visible)
|
|
|
|
return;
|
|
|
|
|
|
|
|
GetQSettings().setValue(QStringLiteral("toolbar/visible"), visible);
|
|
|
|
|
|
|
|
emit ToolBarVisibilityChanged(visible);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::IsToolBarVisible() const
|
|
|
|
{
|
|
|
|
return GetQSettings().value(QStringLiteral("toolbar/visible")).toBool();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Settings::SetWidgetsLocked(bool locked)
|
|
|
|
{
|
|
|
|
if (AreWidgetsLocked() == locked)
|
|
|
|
return;
|
|
|
|
|
|
|
|
GetQSettings().setValue(QStringLiteral("widgets/locked"), locked);
|
|
|
|
|
|
|
|
emit WidgetLockChanged(locked);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Settings::AreWidgetsLocked() const
|
|
|
|
{
|
|
|
|
return GetQSettings().value(QStringLiteral("widgets/locked"), true).toBool();
|
|
|
|
}
|