summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/settings.cpp127
-rw-r--r--src/settings.h27
-rw-r--r--src/settingsdialog.cpp17
-rw-r--r--src/settingsdialog.h6
-rw-r--r--src/settingsdialog.ui131
5 files changed, 256 insertions, 52 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index c99b434d..41d176ea 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -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
+{
+ 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::getBaseDirectory() const
{
- return QDir::fromNativeSeparators(m_Settings.value(QString("settings/") + key, qApp->property("dataPath").toString() + "/" + def).toString());
+ return QDir::fromNativeSeparators(m_Settings.value(
+ "settings/base_directory", qApp->property("dataPath").toString()).toString());
}
-QString Settings::getDownloadDirectory() const
+QString Settings::getDownloadDirectory(bool resolve) const
{
- return getConfigurablePath("download_directory", ToQString(AppConfig::downloadPath()));
+ return getConfigurablePath("download_directory", ToQString(AppConfig::downloadPath()), resolve);
}
-QString Settings::getCacheDirectory() const
+QString Settings::getCacheDirectory(bool resolve) const
{
- return getConfigurablePath("cache_directory", ToQString(AppConfig::cachePath()));
+ return getConfigurablePath("cache_directory", ToQString(AppConfig::cachePath()), resolve);
}
-QString Settings::getModDirectory() const
+QString Settings::getModDirectory(bool resolve) const
{
- return getConfigurablePath("mod_directory", ToQString(AppConfig::modsPath()));
+ return getConfigurablePath("mod_directory", ToQString(AppConfig::modsPath()), resolve);
}
-QString Settings::getProfileDirectory() const
+QString Settings::getProfileDirectory(bool resolve) const
{
- return getConfigurablePath("profiles_directory", ToQString(AppConfig::profilesPath()));
+ 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)
diff --git a/src/settings.h b/src/settings.h
index 85a3dac0..9676df70 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -106,9 +106,15 @@ 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 */
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 5b58c9da..d354b29b 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -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?"),
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index d1a566b1..d266488d 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -53,6 +53,12 @@ signals:
void resetDialogs();
private slots:
+ void on_browseBaseDirBtn_clicked();
+
+private slots:
+ void on_browseOverwriteDirBtn_clicked();
+
+private slots:
void on_browseProfilesDirBtn_clicked();
private slots:
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index f54ab895..808d8296 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -108,6 +108,36 @@ p, li { white-space: pre-wrap; }
</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">
<string>User interface</string>
@@ -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,23 +321,53 @@ 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_22">
+ <widget class="QLabel" name="label_8">
<property name="text">
- <string>Profiles</string>
+ <string>Mods</string>
</property>
</widget>
</item>
- <item row="3" column="1">
- <widget class="QLineEdit" name="profilesDirEdit"/>
- </item>
- <item row="3" column="2">
+ <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="1" column="1">
+ <spacer name="verticalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</item>
<item>