From f9eba9dc15ec655cc16efbb1ddccac3a562741d5 Mon Sep 17 00:00:00 2001 From: Tannin Date: Mon, 17 Feb 2014 21:15:20 +0100 Subject: - ini file changes that would have to overwrite ini tweaks are now stored in a separate file and actually get used. - a warning message advices users to clean out that separate file - slightly improved default main window layout - bugfix: newly created ini tweaks were added to the list with incorrect properties --- src/mainwindow.cpp | 4 ++ src/mainwindow.ui | 4 +- src/modinfo.cpp | 120 +++++++++++++++++++++-------------------------- src/modinfo.h | 6 +++ src/modinfodialog.cpp | 17 +++---- src/profile.cpp | 6 +++ src/profile.h | 5 ++ src/shared/appconfig.inc | 1 + 8 files changed, 85 insertions(+), 78 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 12db5e2b..556c33f3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -217,6 +217,9 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget ui->bsaList->setLocalMoveOnly(true); + ui->splitter->setStretchFactor(0, 3); + ui->splitter->setStretchFactor(1, 2); + resizeLists(initSettings.contains("mod_list_state"), initSettings.contains("plugin_list_state")); QMenu *linkMenu = new QMenu(this); @@ -3158,6 +3161,7 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, dialog->activateWindow(); connect(dialog, SIGNAL(finished(int)), this, SLOT(overwriteClosed(int))); } else { + modInfo->saveMeta(); ModInfoDialog dialog(modInfo, m_DirectoryStructure, this); connect(&dialog, SIGNAL(nexusLinkActivated(QString)), this, SLOT(nexusLinkActivated(QString))); connect(&dialog, SIGNAL(downloadRequest(QString)), this, SLOT(downloadRequestedNXM(QString))); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 110c14c6..26cbbf83 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 868 - 701 + 926 + 710 diff --git a/src/modinfo.cpp b/src/modinfo.cpp index ff44b392..ed13deae 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -300,8 +300,37 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc testValid(); m_CreationTime = QFileInfo(path.absolutePath()).created(); // read out the meta-file for information - QString metaFileName = path.absoluteFilePath("meta.ini"); - QSettings metaFile(metaFileName, QSettings::IniFormat); + readMeta(); + + connect(&m_NexusBridge, SIGNAL(descriptionAvailable(int,QVariant,QVariant)), this, SLOT(nxmDescriptionAvailable(int,QVariant,QVariant))); + connect(&m_NexusBridge, SIGNAL(endorsementToggled(int,QVariant,QVariant)), this, SLOT(nxmEndorsementToggled(int,QVariant,QVariant))); + connect(&m_NexusBridge, SIGNAL(requestFailed(int,int,QVariant,QString)), this, SLOT(nxmRequestFailed(int,int,QVariant,QString))); +} + + +ModInfoRegular::~ModInfoRegular() +{ + try { + saveMeta(); + } catch (const std::exception &e) { + qCritical("failed to save meta information for \"%s\": %s", + m_Name.toUtf8().constData(), e.what()); + } +} + +bool ModInfoRegular::isEmpty() const +{ + QDirIterator iter(m_Path, QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); + if (!iter.hasNext()) return true; + iter.next(); + if ((iter.fileName() == "meta.ini") && !iter.hasNext()) return true; + return false; +} + + +void ModInfoRegular::readMeta() +{ + QSettings metaFile(m_Path + "/meta.ini", QSettings::IniFormat); m_Notes = metaFile.value("notes", "").toString(); m_NexusID = metaFile.value("modid", -1).toInt(); @@ -324,7 +353,6 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc } } - QString categoriesString = metaFile.value("category", "").toString(); QStringList categories = categoriesString.split(',', QString::SkipEmptyParts); @@ -343,77 +371,39 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc } } - connect(&m_NexusBridge, SIGNAL(descriptionAvailable(int,QVariant,QVariant)), this, SLOT(nxmDescriptionAvailable(int,QVariant,QVariant))); - connect(&m_NexusBridge, SIGNAL(endorsementToggled(int,QVariant,QVariant)), this, SLOT(nxmEndorsementToggled(int,QVariant,QVariant))); - connect(&m_NexusBridge, SIGNAL(requestFailed(int,int,QVariant,QString)), this, SLOT(nxmRequestFailed(int,int,QVariant,QString))); -} - - -ModInfoRegular::~ModInfoRegular() -{ - try { - saveMeta(); - } catch (const std::exception &e) { - qCritical("failed to save meta information for \"%s\": %s", - m_Name.toUtf8().constData(), e.what()); - } -} - -bool ModInfoRegular::isEmpty() const -{ - QDirIterator iter(m_Path, QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); - if (!iter.hasNext()) return true; - iter.next(); - if ((iter.fileName() == "meta.ini") && !iter.hasNext()) return true; - return false; + m_MetaInfoChanged = false; } - void ModInfoRegular::saveMeta() { // only write meta data if the mod directory exists if (m_MetaInfoChanged && QFile::exists(absolutePath())) { - bool success = false; - { - QSettings metaFile(absolutePath().append("/meta.ini.new"), QSettings::IniFormat); - if (metaFile.status() == QSettings::NoError) { - std::set temp = m_Categories; - temp.erase(m_PrimaryCategory); - metaFile.setValue("category", QString("%1").arg(m_PrimaryCategory) + "," + SetJoin(temp, ",")); - metaFile.setValue("newestVersion", m_NewestVersion.canonicalString()); - metaFile.setValue("ignoredVersion", m_IgnoredVersion.canonicalString()); - metaFile.setValue("version", m_Version.canonicalString()); - if (m_NexusID != -1) { - metaFile.setValue("modid", m_NexusID); - } - metaFile.setValue("notes", m_Notes); - metaFile.setValue("nexusDescription", m_NexusDescription); - metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); - if (m_EndorsedState != ENDORSED_UNKNOWN) { - metaFile.setValue("endorsed", m_EndorsedState); - } - metaFile.sync(); // sync needs to be called to ensure the file is created - - if (metaFile.status() == QSettings::NoError) { - success = true; - m_MetaInfoChanged = false; - } else { - reportError(tr("failed to write %1/meta.ini: error %2").arg(absolutePath()).arg(metaFile.status())); - } - } else { - reportError(tr("failed to write %1/meta.ini: error %2").arg(absolutePath()).arg(metaFile.status())); + QSettings metaFile(absolutePath().append("/meta.ini"), QSettings::IniFormat); + if (metaFile.status() == QSettings::NoError) { + std::set temp = m_Categories; + temp.erase(m_PrimaryCategory); + metaFile.setValue("category", QString("%1").arg(m_PrimaryCategory) + "," + SetJoin(temp, ",")); + metaFile.setValue("newestVersion", m_NewestVersion.canonicalString()); + metaFile.setValue("ignoredVersion", m_IgnoredVersion.canonicalString()); + metaFile.setValue("version", m_Version.canonicalString()); + if (m_NexusID != -1) { + metaFile.setValue("modid", m_NexusID); } - } - if (success) { - if (!QFile::remove(absolutePath().append("/meta.ini"))) { - qCritical("failed to remove %s", qPrintable(absolutePath().append("/meta.ini"))); - return; + metaFile.setValue("notes", m_Notes); + metaFile.setValue("nexusDescription", m_NexusDescription); + metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); + if (m_EndorsedState != ENDORSED_UNKNOWN) { + metaFile.setValue("endorsed", m_EndorsedState); } - if (QFile::rename(absolutePath().append("/meta.ini.new"), absolutePath().append("/meta.ini"))) { - qDebug("%s written", qPrintable(absolutePath().append("/meta.ini"))); + metaFile.sync(); // sync needs to be called to ensure the file is created + + if (metaFile.status() == QSettings::NoError) { + m_MetaInfoChanged = false; } else { - qCritical("writing %s failed", qPrintable(absolutePath().append("/meta.ini"))); + reportError(tr("failed to write %1/meta.ini: error %2").arg(absolutePath()).arg(metaFile.status())); } + } else { + reportError(tr("failed to write %1/meta.ini: error %2").arg(absolutePath()).arg(metaFile.status())); } } } @@ -717,13 +707,11 @@ QString ModInfoRegular::getNexusDescription() const return m_NexusDescription; } - ModInfoRegular::EEndorsedState ModInfoRegular::endorsedState() const { return m_EndorsedState; } - ModInfoRegular::EConflictType ModInfoRegular::isConflicted() const { // this is costy so cache the result diff --git a/src/modinfo.h b/src/modinfo.h index b7d72584..8b37b915 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -431,6 +431,11 @@ public: */ void testValid(); + /** + * @brief reads meta information from disk + */ + virtual void readMeta() {} + /** * @brief stores meta information back to disk */ @@ -748,6 +753,7 @@ public: */ virtual void saveMeta(); + void readMeta(); private: enum EConflictType { diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 117b2726..dae4cc18 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -158,9 +158,8 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ModInfoDialog::~ModInfoDialog() { m_ModInfo->setNotes(ui->notesEdit->toPlainText()); - saveIniTweaks(); saveCategories(ui->categoriesTree->invisibleRootItem()); - + saveIniTweaks(); // ini tweaks are written to the ini file directly. This is the only information not managed by ModInfo delete ui; delete m_Settings; } @@ -216,7 +215,6 @@ QByteArray ModInfoDialog::saveTabState() const stream << ui->tabWidget->count(); for (int i = 0; i < ui->tabWidget->count(); ++i) { stream << ui->tabWidget->widget(i)->objectName(); - } return result; @@ -475,18 +473,15 @@ void ModInfoDialog::openIniFile(const QString &fileName) void ModInfoDialog::saveIniTweaks() { - QListWidget *iniTweaksList = findChild("iniTweaksList"); - m_Settings->beginWriteArray("INI Tweaks"); int countEnabled = 0; - for (int i = 0; i < iniTweaksList->count(); ++i) { - if (iniTweaksList->item(i)->checkState() == Qt::Checked) { + for (int i = 0; i < ui->iniTweaksList->count(); ++i) { + if (ui->iniTweaksList->item(i)->checkState() == Qt::Checked) { m_Settings->setArrayIndex(countEnabled++); - m_Settings->setValue("name", iniTweaksList->item(i)->text()); + m_Settings->setValue("name", ui->iniTweaksList->item(i)->text()); } } - m_Settings->endArray(); } @@ -1229,8 +1224,10 @@ void ModInfoDialog::createTweak() return; } - QListWidgetItem *newTweak = new QListWidgetItem(name); + QListWidgetItem *newTweak = new QListWidgetItem(name + ".ini"); newTweak->setData(Qt::UserRole, "INI Tweaks/" + name + ".ini"); + newTweak->setFlags(newTweak->flags() | Qt::ItemIsUserCheckable); + newTweak->setCheckState(Qt::Unchecked); ui->iniTweaksList->addItem(newTweak); } diff --git a/src/profile.cpp b/src/profile.cpp index c1f1025e..41a867c5 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -201,6 +201,7 @@ void Profile::createTweakedIniFile() } } + mergeTweak(getProfileTweaks(), tweakedIni); bool error = false; if (!::WritePrivateProfileStringW(L"Archive", L"bInvalidateOlderFiles", L"1", ToWString(tweakedIni).c_str())) { @@ -740,6 +741,11 @@ QString Profile::getIniFileName() const return m_Directory.absoluteFilePath(ToQString(primaryIniFile)); } +QString Profile::getProfileTweaks() const +{ + return QDir::cleanPath(m_Directory.absoluteFilePath(ToQString(AppConfig::profileTweakIni()))); +} + QString Profile::getPath() const { diff --git a/src/profile.h b/src/profile.h index 9c678a23..4960671a 100644 --- a/src/profile.h +++ b/src/profile.h @@ -177,6 +177,11 @@ public: **/ QString getIniFileName() const; + /** + * @return the path of the tweak ini in this profile + */ + QString getProfileTweaks() const; + /** * @return path to this profile **/ diff --git a/src/shared/appconfig.inc b/src/shared/appconfig.inc index 7710925a..080d3655 100644 --- a/src/shared/appconfig.inc +++ b/src/shared/appconfig.inc @@ -1,6 +1,7 @@ APPPARAM(std::wstring, translationPrefix, L"organizer") APPPARAM(std::wstring, pluginPath, L"plugins") APPPARAM(std::wstring, stylesheetsPath, L"stylesheets") +APPPARAM(std::wstring, profileTweakIni, L"profile_tweaks.ini") APPPARAM(std::wstring, logFile, L"ModOrganizer.log") APPPARAM(std::wstring, proxyDLLTarget, L"steam_api.dll") APPPARAM(std::wstring, proxyDLLOrig, L"steam_api_orig.dll") // needs to be identical to the value used in proxydll-project -- cgit v1.3.1