From ebe5448816532c55b9c19ded462b8e65701bd8bb Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Thu, 16 May 2019 00:15:21 +0300 Subject: [PATCH 1/5] Content selector: drop duplicates of the added file (bug #2395) --- CHANGELOG.md | 1 + components/contentselector/model/contentmodel.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5c6a08853..3658b839a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ------ Bug #1515: Opening console masks dialogue, inventory menu + Bug #2395: Duplicated plugins in the launcher when multiple data directories provide the same plugin Bug #2969: Scripted items can stack Bug #2987: Editor: some chance and AI data fields can overflow Bug #3006: 'else if' operator breaks script compilation diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index 7a4558d57a..ef27f938d2 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -408,6 +408,17 @@ bool ContentSelectorModel::ContentModel::dropMimeData(const QMimeData *data, Qt: void ContentSelectorModel::ContentModel::addFile(EsmFile *file) { + for (int row = 0; row < mFiles.size(); row++) + { + if (mFiles.at(row)->fileName() == file->fileName()) + { + beginRemoveRows(QModelIndex(), row, row); + mFiles.removeAt(row); + endRemoveRows(); + emit dataChanged(index(row, 0), index(mFiles.size(), 0)); + break; + } + } beginInsertRows(QModelIndex(), mFiles.count(), mFiles.count()); mFiles.append(file); endInsertRows(); From e14ada8f364ffa77a9e01997ca83b2ffc9ba6173 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Thu, 16 May 2019 14:06:33 +0300 Subject: [PATCH 2/5] Make file name comparison case-insensitive --- components/contentselector/model/contentmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index ef27f938d2..d39df8ce62 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -410,7 +410,7 @@ void ContentSelectorModel::ContentModel::addFile(EsmFile *file) { for (int row = 0; row < mFiles.size(); row++) { - if (mFiles.at(row)->fileName() == file->fileName()) + if (!mFiles.at(row)->fileName().compare(file->fileName(), Qt::CaseInsensitive)) { beginRemoveRows(QModelIndex(), row, row); mFiles.removeAt(row); From 2fbed21f83bc6c3af9f06b07e30ce306f1589111 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sat, 18 May 2019 14:17:18 +0300 Subject: [PATCH 3/5] Avoid a memory leak --- components/contentselector/model/contentmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index d39df8ce62..3e5afc76da 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -413,7 +413,7 @@ void ContentSelectorModel::ContentModel::addFile(EsmFile *file) if (!mFiles.at(row)->fileName().compare(file->fileName(), Qt::CaseInsensitive)) { beginRemoveRows(QModelIndex(), row, row); - mFiles.removeAt(row); + delete mFiles.takeAt(row); endRemoveRows(); emit dataChanged(index(row, 0), index(mFiles.size(), 0)); break; From 5cd781b3ebc462bffbb32c10d437985bcc1d57c8 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sat, 18 May 2019 17:21:27 +0300 Subject: [PATCH 4/5] Experimental folder handling rewrite --- apps/launcher/datafilespage.cpp | 9 ++++----- apps/opencs/editor.cpp | 19 +++---------------- apps/opencs/editor.hpp | 2 -- .../contentselector/model/contentmodel.cpp | 9 ++------- 4 files changed, 9 insertions(+), 30 deletions(-) diff --git a/apps/launcher/datafilespage.cpp b/apps/launcher/datafilespage.cpp index 055426f30f..8554b620bb 100644 --- a/apps/launcher/datafilespage.cpp +++ b/apps/launcher/datafilespage.cpp @@ -109,15 +109,14 @@ void Launcher::DataFilesPage::populateFileViews(const QString& contentModelName) { QStringList paths = mGameSettings.getDataDirs(); - foreach(const QString &path, paths) - mSelector->addFiles(path); - mDataLocal = mGameSettings.getDataLocal(); if (!mDataLocal.isEmpty()) - mSelector->addFiles(mDataLocal); + paths.insert(0, mDataLocal); + + foreach(const QString &path, paths) + mSelector->addFiles(path); - paths.insert(0, mDataLocal); PathIterator pathIterator(paths); mSelector->setProfileContent(filesInProfile(contentModelName, pathIterator)); diff --git a/apps/opencs/editor.cpp b/apps/opencs/editor.cpp index 7b5c3f7ab2..b22f5464d8 100644 --- a/apps/opencs/editor.cpp +++ b/apps/opencs/editor.cpp @@ -28,8 +28,6 @@ CS::Editor::Editor (int argc, char **argv) mViewManager = new CSVDoc::ViewManager(mDocumentManager); - setupDataFiles (config.first); - NifOsg::Loader::setShowMarkers(true); mDocumentManager.setFileData(mFsStrict, config.first, config.second); @@ -79,15 +77,6 @@ CS::Editor::~Editor () remove(mPid.string().c_str())); // ignore any error } -void CS::Editor::setupDataFiles (const Files::PathContainer& dataDirs) -{ - for (Files::PathContainer::const_iterator iter = dataDirs.begin(); iter != dataDirs.end(); ++iter) - { - QString path = QString::fromUtf8 (iter->string().c_str()); - mFileDialog.addFiles(path); - } -} - std::pair > CS::Editor::readConfig(bool quiet) { boost::program_options::variables_map variables; @@ -160,7 +149,7 @@ std::pair > CS::Editor::readConfi dataDirs.insert (dataDirs.end(), dataLocal.begin(), dataLocal.end()); //iterate the data directories and add them to the file dialog for loading - for (Files::PathContainer::const_iterator iter = dataDirs.begin(); iter != dataDirs.end(); ++iter) + for (Files::PathContainer::const_reverse_iterator iter = dataDirs.rbegin(); iter != dataDirs.rend(); ++iter) { QString path = QString::fromUtf8 (iter->string().c_str()); mFileDialog.addFiles(path); @@ -199,8 +188,7 @@ void CS::Editor::createAddon() mStartup.hide(); mFileDialog.clearFiles(); - std::pair > config = readConfig(/*quiet*/true); - setupDataFiles (config.first); + readConfig(/*quiet*/true); mFileDialog.showDialog (CSVDoc::ContentAction_New); } @@ -224,8 +212,7 @@ void CS::Editor::loadDocument() mStartup.hide(); mFileDialog.clearFiles(); - std::pair > config = readConfig(/*quiet*/true); - setupDataFiles (config.first); + readConfig(/*quiet*/true); mFileDialog.showDialog (CSVDoc::ContentAction_Edit); } diff --git a/apps/opencs/editor.hpp b/apps/opencs/editor.hpp index 2c2e88aefc..0c3ece9059 100644 --- a/apps/opencs/editor.hpp +++ b/apps/opencs/editor.hpp @@ -55,8 +55,6 @@ namespace CS CSVTools::Merge mMerge; CSVDoc::ViewManager* mViewManager; - void setupDataFiles (const Files::PathContainer& dataDirs); - std::pair > readConfig(bool quiet=false); ///< \return data paths diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index 3e5afc76da..6ac074b4db 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -411,14 +411,9 @@ void ContentSelectorModel::ContentModel::addFile(EsmFile *file) for (int row = 0; row < mFiles.size(); row++) { if (!mFiles.at(row)->fileName().compare(file->fileName(), Qt::CaseInsensitive)) - { - beginRemoveRows(QModelIndex(), row, row); - delete mFiles.takeAt(row); - endRemoveRows(); - emit dataChanged(index(row, 0), index(mFiles.size(), 0)); - break; - } + return; } + beginInsertRows(QModelIndex(), mFiles.count(), mFiles.count()); mFiles.append(file); endInsertRows(); From 0fcb75fb213f33107271fea26f712a6828d1ac9c Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Wed, 22 May 2019 20:55:30 +0300 Subject: [PATCH 5/5] Achieve CHIM and get rid of the loop --- components/contentselector/model/contentmodel.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index 6ac074b4db..390dde223c 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -408,12 +408,6 @@ bool ContentSelectorModel::ContentModel::dropMimeData(const QMimeData *data, Qt: void ContentSelectorModel::ContentModel::addFile(EsmFile *file) { - for (int row = 0; row < mFiles.size(); row++) - { - if (!mFiles.at(row)->fileName().compare(file->fileName(), Qt::CaseInsensitive)) - return; - } - beginInsertRows(QModelIndex(), mFiles.count(), mFiles.count()); mFiles.append(file); endInsertRows(); @@ -434,7 +428,7 @@ void ContentSelectorModel::ContentModel::addFiles(const QString &path) { QFileInfo info(dir.absoluteFilePath(path2)); - if (item(info.absoluteFilePath()) != 0) + if (item(info.fileName())) continue; try {