/*
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 .
*/
#ifndef WORKAROUNDS_H
#define WORKAROUNDS_H
#include "loadmechanism.h"
#include "serverinfo.h"
#include
#include
#include
#include
namespace MOBase {
class IPluginGame;
}
/**
* manages the settings for Mod Organizer. The settings are not cached
* inside the class but read/written directly from/to disc
**/
class Settings : public QObject
{
Q_OBJECT
public:
/**
* @brief constructor
**/
Settings(const QSettings &settingsSource);
virtual ~Settings();
static Settings &instance();
/**
* unregister all plugins from settings
*/
void clearPlugins();
/**
* @brief register plugin to be configurable
* @param plugin the plugin to register
* @return true if the plugin may be registered, false if it is blacklisted
*/
void registerPlugin(MOBase::IPlugin *plugin);
/**
* displays a SettingsDialog that allows the user to change settings. If the
* user accepts the changes, the settings are immediately written
**/
void query(QWidget *parent);
/**
* set up the settings for the specified plugins
**/
void addPluginSettings(const std::vector &plugins);
/**
* @return true if the user wants unchecked plugins (esp, esm) should be hidden from
* the virtual dat adirectory
**/
bool hideUncheckedPlugins() const;
/**
* @return true if files of the core game are forced-enabled so the user can't accidentally disable them
*/
bool forceEnableCoreFiles() const;
/**
* @brief register download speed
* @param url complete download url
* @param bytesPerSecond download size in bytes per second
*/
void setDownloadSpeed(const QString &serverName, int bytesPerSecond);
/**
* the steam appid is assigned by the steam platform to each product sold there.
* The appid may differ between different versions of a game so it may be impossible
* for Mod Organizer to automatically recognize it, though usually it does
* @return the steam appid for the game
**/
QString getSteamAppID() const;
/**
* retrieve the directory where downloads are stored (with native separators)
**/
QString getDownloadDirectory() const;
/**
* retrieve a sorted list of preferred servers
*/
std::map getPreferredServers();
/**
* retrieve the directory where mods are stored (with native separators)
**/
QString getModDirectory() const;
/**
* returns the version of nmm to impersonate when connecting to nexus
**/
QString getNMMVersion() const;
/**
* retrieve the directory where the web cache is stored (with native separators)
**/
QString getCacheDirectory() const;
/**
* @return true if the user has set up automatic login to nexus
**/
bool automaticLoginEnabled() const;
/**
* @brief retrieve the login information for nexus
*
* @param username (out) receives the user name for nexus
* @param password (out) received the password for nexus
* @return true if automatic login is active, false otherwise
**/
bool getNexusLogin(QString &username, QString &password) const;
/**
* @brief retrieve the login information for steam
*
* @param username (out) receives the user name for nexus
* @param password (out) received the password for nexus
* @return true if a username has been specified, false otherwise
**/
bool getSteamLogin(QString &username, QString &password) const;
/**
* @return true if the user disabled internet features
*/
bool offlineMode() const;
/**
* @return true if the user chose compact downloads
*/
bool compactDownloads() const;
/**
* @return true if the user chose meta downloads
*/
bool metaDownloads() const;
/**
* @return the configured log level
*/
int logLevel() const;
/**
* @brief set the nexus login information
*
* @param username username
* @param password password
*/
void setNexusLogin(QString username, QString password);
/**
* @brief set the steam login information
*
* @param username username
* @param password password
*/
void setSteamLogin(QString username, QString password);
/**
* @return the load mechanism to be used
**/
LoadMechanism::EMechanism getLoadMechanism() const;
/**
* @brief activate the load mechanism selected by the user
**/
void setupLoadMechanism();
/**
* @return true if the user configured the use of a network proxy
*/
bool useProxy();
/**
* @return true if the user wants to see non-official plugins installed outside MO in his mod list
*/
bool displayForeign();
/**
* @brief sets the new motd hash
**/
void setMotDHash(uint hash);
/**
* @return hash of the last displayed message of the day
**/
uint getMotDHash() const;
/**
* @brief allows direct access to the wrapped QSettings object
* @return the wrapped QSettings object
*/
QSettings &directInterface() { return m_Settings; }
/**
* @brief retrieve a setting for one of the installed plugins
* @param pluginName name of the plugin
* @param key name of the setting to retrieve
* @return the requested value as a QVariant
* @note an invalid QVariant is returned if the the plugin/setting is not declared
*/
QVariant pluginSetting(const QString &pluginName, const QString &key) const;
/**
* @brief set a setting for one of the installed mods
* @param pluginName name of the plugin
* @param key name of the setting to change
* @param value the new value to set
* @throw an exception is thrown if pluginName is invalid
*/
void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value);
/**
* @brief retrieve a persistent value for a plugin
* @param pluginName name of the plugin to store data for
* @param key id of the value to retrieve
* @param def default value to return if the value is not set
* @return the requested value
*/
QVariant pluginPersistent(const QString &pluginName, const QString &key, const QVariant &def) const;
/**
* @brief set a persistent value for a plugin
* @param pluginName name of the plugin to store data for
* @param key id of the value to retrieve
* @param value value to set
* @throw an exception is thrown if pluginName is invalid
*/
void setPluginPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync);
/**
* @return short code of the configured language (corresponding to the translation files)
*/
QString language();
/**
* @brief updates the list of known servers
* @param list of servers from a recent query
*/
void updateServers(const QList &servers);
/**
* @brief add a plugin that is to be blacklisted
* @param fileName name of the plugin to blacklist
*/
void addBlacklistPlugin(const QString &fileName);
/**
* @brief test if a plugin is blacklisted and shouldn't be loaded
* @param fileName name of the plugin
* @return true if the file is blacklisted
*/
bool pluginBlacklisted(const QString &fileName) const;
/**
* @return all loaded MO plugins
*/
std::vector plugins() const { return m_Plugins; }
/**
* @brief register MO as the handler for nxm links
* @param force set to true to enforce the registration dialog to show up,
* even if the user said earlier not to
*/
void registerAsNXMHandler(bool force);
public slots:
void managedGameChanged(MOBase::IPluginGame *gamePlugin);
private:
QString obfuscate(const QString &password) const;
QString deObfuscate(const QString &password) const;
void addLanguages(QComboBox *languageBox);
void addStyles(QComboBox *styleBox);
void readPluginBlacklist();
void writePluginBlacklist();
QString getConfigurablePath(const QString &key, const QString &def) const;
private slots:
void resetDialogs();
signals:
void languageChanged(const QString &newLanguage);
void styleChanged(const QString &newStyle);
private:
static Settings *s_Instance;
MOBase::IPluginGame *m_GamePlugin;
QSettings m_Settings;
LoadMechanism m_LoadMechanism;
std::vector m_Plugins;
QMap> m_PluginSettings;
QMap> m_PluginDescriptions;
QSet m_PluginBlacklist;
};
#endif // WORKAROUNDS_H