more configuration options

- overwrite path configurable
- one can now set a base directory for all configurable paths
- user can now opt in/out of receiving pre-release updates (not functional yet)
This commit is contained in:
Tannin
2016-03-02 21:28:17 +01:00
parent 0899724d90
commit 9df612c7ca
5 changed files with 258 additions and 54 deletions
+107 -20
View File
@@ -33,6 +33,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QLineEdit>
#include <QMessageBox>
#include <QRegExp>
#include <QDir>
#include <memory>
@@ -179,6 +180,11 @@ QString Settings::getSteamAppID() const
return m_Settings.value("Settings/app_id", m_GamePlugin->steamAPPId()).toString();
}
bool Settings::usePrereleases() const
{
return m_Settings.value("Settings/use_prereleases", false).toBool();
}
void Settings::setDownloadSpeed(const QString &serverName, int bytesPerSecond)
{
m_Settings.beginGroup("Servers");
@@ -213,34 +219,55 @@ std::map<QString, int> Settings::getPreferredServers()
return result;
}
QString Settings::getConfigurablePath(const QString &key, const QString &def) const
QString Settings::getConfigurablePath(const QString &key,
const QString &def,
bool resolve) const
{
return QDir::fromNativeSeparators(m_Settings.value(QString("settings/") + key, qApp->property("dataPath").toString() + "/" + def).toString());
QString result = QDir::fromNativeSeparators(
m_Settings.value(QString("settings/") + key,
qApp->property("dataPath").toString() + "/" + def)
.toString());
if (resolve) {
result.replace("%BASE_DIR%", getBaseDirectory());
}
return result;
}
QString Settings::getDownloadDirectory() const
QString Settings::getBaseDirectory() const
{
return getConfigurablePath("download_directory", ToQString(AppConfig::downloadPath()));
return QDir::fromNativeSeparators(m_Settings.value(
"settings/base_directory", qApp->property("dataPath").toString()).toString());
}
QString Settings::getCacheDirectory() const
QString Settings::getDownloadDirectory(bool resolve) const
{
return getConfigurablePath("cache_directory", ToQString(AppConfig::cachePath()));
return getConfigurablePath("download_directory", ToQString(AppConfig::downloadPath()), resolve);
}
QString Settings::getModDirectory() const
QString Settings::getCacheDirectory(bool resolve) const
{
return getConfigurablePath("mod_directory", ToQString(AppConfig::modsPath()));
return getConfigurablePath("cache_directory", ToQString(AppConfig::cachePath()), resolve);
}
QString Settings::getProfileDirectory() const
QString Settings::getModDirectory(bool resolve) const
{
return getConfigurablePath("profiles_directory", ToQString(AppConfig::profilesPath()));
return getConfigurablePath("mod_directory", ToQString(AppConfig::modsPath()), resolve);
}
QString Settings::getProfileDirectory(bool resolve) const
{
return getConfigurablePath("profiles_directory", ToQString(AppConfig::profilesPath()), resolve);
}
QString Settings::getOverwriteDirectory(bool resolve) const
{
return getConfigurablePath("overwrite_directory",
ToQString(AppConfig::overwritePath()), resolve);
}
QString Settings::getNMMVersion() const
{
static const QString MIN_NMM_VERSION = "0.52.3";
static const QString MIN_NMM_VERSION = "0.61.13";
QString result = m_Settings.value("Settings/nmm_version", MIN_NMM_VERSION).toString();
if (VersionInfo(result) < VersionInfo(MIN_NMM_VERSION)) {
result = MIN_NMM_VERSION;
@@ -508,12 +535,7 @@ void Settings::addLanguages(QComboBox *languageBox)
void Settings::addStyles(QComboBox *styleBox)
{
styleBox->addItem("None", "");
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
styleBox->addItem("Fusion", "Fusion");
#else
styleBox->addItem("Plastique", "Plastique");
styleBox->addItem("Cleanlooks", "Cleanlooks");
#endif
QDirIterator langIter(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::stylesheetsPath()), QStringList("*.qss"), QDir::Files);
while (langIter.hasNext()) {
@@ -575,6 +597,7 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
, m_logLevelBox(m_dialog.findChild<QComboBox *>("logLevelBox"))
, m_compactBox(m_dialog.findChild<QCheckBox *>("compactBox"))
, m_showMetaBox(m_dialog.findChild<QCheckBox *>("showMetaBox"))
, m_usePrereleaseBox(m_dialog.findChild<QCheckBox *>("usePrereleaseBox"))
{
// FIXME I think 'addLanguages' lives in here not in parent
m_parent->addLanguages(m_languageBox);
@@ -606,6 +629,7 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
m_logLevelBox->setCurrentIndex(m_parent->logLevel());
m_compactBox->setChecked(m_parent->compactDownloads());
m_showMetaBox->setChecked(m_parent->metaDownloads());
m_usePrereleaseBox->setChecked(m_parent->usePrereleases());
}
void Settings::GeneralTab::update()
@@ -629,23 +653,53 @@ void Settings::GeneralTab::update()
m_Settings.setValue("Settings/compact_downloads", m_compactBox->isChecked());
m_Settings.setValue("Settings/meta_downloads", m_showMetaBox->isChecked());
m_Settings.setValue("Settings/use_prereleases", m_usePrereleaseBox->isChecked());
}
Settings::PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog)
: SettingsTab(parent, dialog)
, m_baseDirEdit(m_dialog.findChild<QLineEdit *>("baseDirEdit"))
, m_downloadDirEdit(m_dialog.findChild<QLineEdit *>("downloadDirEdit"))
, m_modDirEdit(m_dialog.findChild<QLineEdit *>("modDirEdit"))
, m_cacheDirEdit(m_dialog.findChild<QLineEdit *>("cacheDirEdit"))
, m_profilesDirEdit(m_dialog.findChild<QLineEdit *>("profilesDirEdit"))
, m_overwriteDirEdit(m_dialog.findChild<QLineEdit *>("overwriteDirEdit"))
{
m_downloadDirEdit->setText(m_parent->getDownloadDirectory());
m_modDirEdit->setText(m_parent->getModDirectory());
m_cacheDirEdit->setText(m_parent->getCacheDirectory());
m_profilesDirEdit->setText(m_parent->getProfileDirectory());
m_baseDirEdit->setText(m_parent->getBaseDirectory());
/*
m_downloadDirEdit->setText(m_parent->getDownloadDirectory(false));
m_modDirEdit->setText(m_parent->getModDirectory(false));
m_cacheDirEdit->setText(m_parent->getCacheDirectory(false));
m_profilesDirEdit->setText(m_parent->getProfileDirectory(false));
m_overwriteDirEdit->setText(m_parent->getOverwriteDirectory(false));
*/
QString basePath = parent->getBaseDirectory();
QDir baseDir(basePath);
for (const auto &dir : {
std::make_pair(m_downloadDirEdit, m_parent->getDownloadDirectory(false)),
std::make_pair(m_modDirEdit, m_parent->getModDirectory(false)),
std::make_pair(m_cacheDirEdit, m_parent->getCacheDirectory(false)),
std::make_pair(m_profilesDirEdit, m_parent->getProfileDirectory(false)),
std::make_pair(m_overwriteDirEdit, m_parent->getOverwriteDirectory(false))
}) {
QString storePath = baseDir.relativeFilePath(dir.second);
qDebug("%s -> %s", qPrintable(dir.second), qPrintable(storePath));
if (storePath.startsWith("..") || QDir::isAbsolutePath(storePath)) {
storePath = dir.second;
} else {
storePath = QString("%BASE_DIR%/") + storePath;
}
dir.first->setText(storePath);
}
}
void Settings::PathsTab::update()
{
typedef std::tuple<QString, QString, std::wstring> Directory;
QString basePath = m_parent->getBaseDirectory();
if ((QDir::fromNativeSeparators(m_modDirEdit->text())
!= QDir::fromNativeSeparators(m_parent->getModDirectory()))
&& (QMessageBox::question(
@@ -660,6 +714,38 @@ void Settings::PathsTab::update()
m_modDirEdit->setText(m_parent->getModDirectory());
}
for (const Directory &dir :{
Directory{m_downloadDirEdit->text(), "download_directory", AppConfig::downloadPath()},
Directory{m_cacheDirEdit->text(), "cache_directory", AppConfig::cachePath()},
Directory{m_modDirEdit->text(), "mod_directory", AppConfig::modsPath()},
Directory{m_overwriteDirEdit->text(), "overwrite_directory", AppConfig::overwritePath()},
Directory{m_profilesDirEdit->text(), "profiles_directory", AppConfig::profilesPath()}
}) {
QString path, settingsKey;
std::wstring defaultName;
std::tie(path, settingsKey, defaultName) = dir;
settingsKey = QString("Settings/%1").arg(settingsKey);
QString realPath = path;
realPath.replace("%BASE_DIR%", m_parent->getBaseDirectory());
if (!QDir(realPath).exists()) {
QDir().mkpath(realPath);
}
qDebug("%s -> %s", qPrintable(path), qPrintable(realPath));
if (QFileInfo(realPath)
!= QFileInfo(basePath + "/" + QString::fromStdWString(defaultName))) {
m_Settings.setValue(settingsKey, path);
} else {
m_Settings.remove(settingsKey);
}
}
/*
if (!QDir(m_downloadDirEdit->text()).exists()) {
QDir().mkpath(m_downloadDirEdit->text());
}
@@ -707,6 +793,7 @@ void Settings::PathsTab::update()
} else {
m_Settings.remove("Settings/profiles_directory");
}
*/
}
Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog)
+22 -5
View File
@@ -105,10 +105,16 @@ public:
**/
QString getSteamAppID() const;
/**
* retrieves the base directory under which the other directories usually
* reside
*/
QString getBaseDirectory() const;
/**
* retrieve the directory where downloads are stored (with native separators)
**/
QString getDownloadDirectory() const;
QString getDownloadDirectory(bool resolve = true) const;
/**
* retrieve a sorted list of preferred servers
@@ -118,7 +124,7 @@ public:
/**
* retrieve the directory where mods are stored (with native separators)
**/
QString getModDirectory() const;
QString getModDirectory(bool resolve = true) const;
/**
* returns the version of nmm to impersonate when connecting to nexus
@@ -128,12 +134,18 @@ public:
/**
* retrieve the directory where the web cache is stored (with native separators)
**/
QString getCacheDirectory() const;
QString getCacheDirectory(bool resolve = true) const;
/**
* retrieve the directory where profiles stored (with native separators)
**/
QString getProfileDirectory() const;
QString getProfileDirectory(bool resolve = true) const;
/**
* retrieve the directory were new files are stored that can't be assigned
* to a mod (with native separators)
*/
QString getOverwriteDirectory(bool resolve = true) const;
/**
* @return true if the user has set up automatic login to nexus
@@ -295,6 +307,8 @@ public:
*/
std::vector<MOBase::IPlugin*> plugins() const { return m_Plugins; }
bool usePrereleases() const;
/**
* @brief register MO as the handler for nxm links
* @param force set to true to enforce the registration dialog to show up,
@@ -315,7 +329,7 @@ private:
void addStyles(QComboBox *styleBox);
void readPluginBlacklist();
void writePluginBlacklist();
QString getConfigurablePath(const QString &key, const QString &def) const;
QString getConfigurablePath(const QString &key, const QString &def, bool resolve) const;
class SettingsTab
{
@@ -346,6 +360,7 @@ private:
QComboBox *m_logLevelBox;
QCheckBox *m_compactBox;
QCheckBox *m_showMetaBox;
QCheckBox *m_usePrereleaseBox;
};
class PathsTab : public SettingsTab
@@ -356,10 +371,12 @@ private:
void update();
private:
QLineEdit *m_baseDirEdit;
QLineEdit *m_downloadDirEdit;
QLineEdit *m_modDirEdit;
QLineEdit *m_cacheDirEdit;
QLineEdit *m_profilesDirEdit;
QLineEdit *m_overwriteDirEdit;
};
/** Display/store the configuration in the 'nexus' tab of the settings dialogue */
+17
View File
@@ -100,6 +100,15 @@ void SettingsDialog::on_bsaDateBtn_clicked()
dir.absolutePath().toStdWString());
}
void SettingsDialog::on_browseBaseDirBtn_clicked()
{
QString temp = QFileDialog::getExistingDirectory(
this, tr("Select base directory"), ui->baseDirEdit->text());
if (!temp.isEmpty()) {
ui->baseDirEdit->setText(temp);
}
}
void SettingsDialog::on_browseDownloadDirBtn_clicked()
{
QString temp = QFileDialog::getExistingDirectory(this, tr("Select download directory"), ui->downloadDirEdit->text());
@@ -132,6 +141,14 @@ void SettingsDialog::on_browseProfilesDirBtn_clicked()
}
}
void SettingsDialog::on_browseOverwriteDirBtn_clicked()
{
QString temp = QFileDialog::getExistingDirectory(this, tr("Select overwrite directory"), ui->overwriteDirEdit->text());
if (!temp.isEmpty()) {
ui->overwriteDirEdit->setText(temp);
}
}
void SettingsDialog::on_resetDialogsButton_clicked()
{
if (QMessageBox::question(this, tr("Confirm?"),
+6
View File
@@ -52,6 +52,12 @@ signals:
void resetDialogs();
private slots:
void on_browseBaseDirBtn_clicked();
private slots:
void on_browseOverwriteDirBtn_clicked();
private slots:
void on_browseProfilesDirBtn_clicked();
+106 -29
View File
@@ -107,6 +107,36 @@ p, li { white-space: pre-wrap; }
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="usePrereleaseBox">
<property name="toolTip">
<string>Update to non-stable releases.</string>
</property>
<property name="whatsThis">
<string>If this is enabled, the integrated update mechanism will notify of all releases, including pre-releases (alphas, betas).
Please use this only if you're sufficiently tech-savvy to investigate issues, look for known problems in the issue tracker and create meaningful reports.
If you use pre-releases, never contact me directly by e-mail or via private messages!</string>
</property>
<property name="text">
<string>Install Pre-releases (Betas)</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
@@ -204,54 +234,71 @@ p, li { white-space: pre-wrap; }
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<widget class="QLabel" name="label_25">
<property name="text">
<string>Downloads</string>
<string>Base Directory</string>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="6" column="2">
<widget class="QPushButton" name="browseOverwriteDirBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="overwriteDirEdit"/>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="baseDirEdit"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="browseBaseDirBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>Overwrite</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Caches</string>
</property>
</widget>
</item>
<item row="1" column="2">
<item row="3" column="2">
<widget class="QPushButton" name="browseModDirBtn">
<property name="text">
<string notr="true">...</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="4" column="1">
<widget class="QLineEdit" name="cacheDirEdit"/>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="downloadDirEdit">
<property name="toolTip">
<string>Directory where downloads are stored.</string>
</property>
<property name="whatsThis">
<string>Directory where downloads are stored.</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_8">
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Mods</string>
<string>Downloads</string>
</property>
</widget>
</item>
<item row="2" column="2">
<item row="4" column="2">
<widget class="QPushButton" name="browseCacheDirBtn">
<property name="text">
<string notr="true">...</string>
</property>
</widget>
</item>
<item row="1" column="1">
<item row="3" column="1">
<widget class="QLineEdit" name="modDirEdit">
<property name="toolTip">
<string>Directory where mods are stored.</string>
@@ -261,7 +308,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="0" column="2">
<item row="2" column="2">
<widget class="QPushButton" name="browseDownloadDirBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -274,22 +321,52 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="downloadDirEdit">
<property name="toolTip">
<string>Directory where downloads are stored.</string>
</property>
<property name="whatsThis">
<string>Directory where downloads are stored.</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Mods</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="browseProfilesDirBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="profilesDirEdit"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Profiles</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="profilesDirEdit"/>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="browseProfilesDirBtn">
<property name="text">
<string>...</string>
<item row="1" column="1">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>