diff options
| author | Tannin <devnull@localhost> | 2014-02-02 00:09:03 +0100 |
|---|---|---|
| committer | Tannin <devnull@localhost> | 2014-02-02 00:09:03 +0100 |
| commit | 48704877ca1dc44b9215ec834e93f34fd953b2fb (patch) | |
| tree | db680a70dceb6ac3317eaa32dc6f2a312d8a8665 /src | |
| parent | 48c944c737a0e277c3ac85c10008031f39cbc04c (diff) | |
- bugfix: upon moving files between mods, an attempt was made to access origins
for both, even if one (or both) mods weren't active
- bugfix: plugin-list should now deal with nested "layoutAboutToBeChanged" calls
gracefully. May be the reason of a bug.
Diffstat (limited to 'src')
| -rw-r--r-- | src/mainwindow.cpp | 20 | ||||
| -rw-r--r-- | src/pluginlist.cpp | 17 | ||||
| -rw-r--r-- | src/pluginlist.h | 38 |
3 files changed, 57 insertions, 18 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cc7fbb09..88806cfd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2849,17 +2849,21 @@ void MainWindow::fileMoved(const QString &filePath, const QString &oldOriginName const FileEntry::Ptr filePtr = m_DirectoryStructure->findFile(ToWString(filePath)); if (filePtr.get() != NULL) { try { - FilesOrigin &oldOrigin = m_DirectoryStructure->getOriginByName(ToWString(oldOriginName)); - FilesOrigin &newOrigin = m_DirectoryStructure->getOriginByName(ToWString(newOriginName)); + if (m_DirectoryStructure->originExists(ToWString(newOriginName))) { + FilesOrigin &newOrigin = m_DirectoryStructure->getOriginByName(ToWString(newOriginName)); - QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath; - WIN32_FIND_DATAW findData; - ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData); + QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath; + WIN32_FIND_DATAW findData; + ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData); - filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L""); - filePtr->removeOrigin(oldOrigin.getID()); + filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L""); + } + if (m_DirectoryStructure->originExists(ToWString(oldOriginName))) { + FilesOrigin &oldOrigin = m_DirectoryStructure->getOriginByName(ToWString(oldOriginName)); + filePtr->removeOrigin(oldOrigin.getID()); + } } catch (const std::exception &e) { - reportError(tr("Failed to move \"%1\" from mod \"%2\" to \"%3\": %4").arg(filePath).arg(oldOriginName).arg(newOriginName).arg(e.what())); + reportError(tr("failed to move \"%1\" from mod \"%2\" to \"%3\": %4").arg(filePath).arg(oldOriginName).arg(newOriginName).arg(e.what())); } } else { // this is probably not an error, the specified path is likely a directory diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index e04b8bb0..f5e0f1eb 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -132,7 +132,8 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD const QString &pluginsFile, const QString &loadOrderFile, const QString &lockedOrderFile) { - emit layoutAboutToBeChanged(); + ChangeBracket<PluginList> layoutChange(this); + m_ESPsByName.clear(); m_ESPsByPriority.clear(); m_ESPs.clear(); @@ -213,7 +214,8 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD readLockedOrderFrom(lockedOrderFile); - emit layoutChanged(); + layoutChange.finish(); + refreshLoadOrder(); emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); @@ -557,7 +559,7 @@ void PluginList::syncLoadOrder() void PluginList::refreshLoadOrder() { - emit layoutAboutToBeChanged(); + ChangeBracket<PluginList> layoutChange(this); syncLoadOrder(); // set priorities according to locked load order std::map<int, QString> lockedLoadOrder; @@ -593,7 +595,6 @@ void PluginList::refreshLoadOrder() } } } - emit layoutChanged(); } @@ -748,7 +749,7 @@ void PluginList::bossSort() qDebug("%d sorted, %d unrecognized", sizeSorted, sizeUnrecognized); - emit layoutAboutToBeChanged(); + ChangeBracket<PluginList> layoutChange(this); int priority = 0; applyBOSSSorting(sortedPlugins, sizeSorted, priority, true, "esm"); @@ -758,7 +759,7 @@ void PluginList::bossSort() // inform view of the changed data updateIndices(); - emit layoutChanged(); + layoutChange.finish(); syncLoadOrder(); emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); @@ -1089,7 +1090,7 @@ void PluginList::setPluginPriority(int row, int &newPriority) void PluginList::changePluginPriority(std::vector<int> rows, int newPriority) { - emit layoutAboutToBeChanged(); + ChangeBracket<PluginList> layoutChange(this); // sort rows to insert by their old priority (ascending) and insert them move them in that order const std::vector<ESPInfo> &esp = m_ESPs; std::sort(rows.begin(), rows.end(), @@ -1111,7 +1112,7 @@ void PluginList::changePluginPriority(std::vector<int> rows, int newPriority) setPluginPriority(*iter, newPriority); } - emit layoutChanged(); + layoutChange.finish(); refreshLoadOrder(); startSaveTime(); diff --git a/src/pluginlist.h b/src/pluginlist.h index f8c69e11..95f90e09 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -33,13 +33,46 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <BOSS-API.h> + +template <class C> +class ChangeBracket { +public: + ChangeBracket(C *model) + : m_Model(nullptr) + { + QVariant var = model->property("__aboutToChange"); + bool aboutToChange = var.isValid() && var.toBool(); + if (!aboutToChange) { + model->layoutAboutToBeChanged(); + model->setProperty("__aboutToChange", true); + m_Model = model; + } + } + ~ChangeBracket() { + finish(); + } + + void finish() { + if (m_Model != nullptr) { + m_Model->layoutChanged(); + m_Model->setProperty("__aboutToChange", false); + m_Model = nullptr; + } + } + +private: + C *m_Model; +}; + + + /** * @brief model representing the plugins (.esp/.esm) in the current virtual data folder **/ class PluginList : public QAbstractTableModel, public MOBase::IPluginList { Q_OBJECT - + friend class ChangeBracket<PluginList>; public: enum EColumn { @@ -225,7 +258,6 @@ private: friend bool ByDate(const ESPInfo& LHS, const ESPInfo& RHS); friend bool ByPriority(const ESPInfo& LHS, const ESPInfo& RHS); - class BossDLL : public PDLL { DECLARE_CLASS(BossDLL) @@ -353,4 +385,6 @@ private: }; + + #endif // PLUGINLIST_H |
