summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2014-02-02 00:09:03 +0100
committerTannin <devnull@localhost>2014-02-02 00:09:03 +0100
commit48704877ca1dc44b9215ec834e93f34fd953b2fb (patch)
treedb680a70dceb6ac3317eaa32dc6f2a312d8a8665 /src
parent48c944c737a0e277c3ac85c10008031f39cbc04c (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.cpp20
-rw-r--r--src/pluginlist.cpp17
-rw-r--r--src/pluginlist.h38
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