summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp4
-rw-r--r--src/modlist.cpp28
-rw-r--r--src/modlistsortproxy.h1
-rw-r--r--src/organizercore.cpp4
4 files changed, 31 insertions, 6 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 3265981d..952c3178 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -4361,7 +4361,7 @@ void MainWindow::on_bossButton_clicked()
if (loot != INVALID_HANDLE_VALUE) {
bool isJobHandle = true;
ULONG lastProcessID;
- DWORD res = ::MsgWaitForMultipleObjects(1, &loot, false, 1000, QS_KEY | QS_MOUSE);
+ DWORD res = ::MsgWaitForMultipleObjects(1, &loot, false, 100, QS_KEY | QS_MOUSE);
while ((res != WAIT_FAILED) && (res != WAIT_OBJECT_0)) {
if (isJobHandle) {
if (::QueryInformationJobObject(loot, JobObjectBasicProcessIdList, &info, sizeof(info), &retLen) > 0) {
@@ -4401,7 +4401,7 @@ void MainWindow::on_bossButton_clicked()
std::string lootOut = readFromPipe(stdOutRead);
processLOOTOut(lootOut, errorMessages, dialog);
- res = ::MsgWaitForMultipleObjects(1, &loot, false, 1000, QS_KEY | QS_MOUSE);
+ res = ::MsgWaitForMultipleObjects(1, &loot, false, 100, QS_KEY | QS_MOUSE);
}
std::string remainder = readFromPipe(stdOutRead).c_str();
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 74aa542d..a7990132 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -23,6 +23,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "installationtester.h"
#include "qtgroupingproxy.h"
#include "viewmarkingscrollbar.h"
+#include "modlistsortproxy.h"
#include <gameinfo.h>
#include <appconfig.h>
#include <utility.h>
@@ -1091,14 +1092,33 @@ bool ModList::deleteSelection(QAbstractItemView *itemView)
bool ModList::toggleSelection(QAbstractItemView *itemView)
{
QAbstractItemModel *model = itemView->model();
+
+ // having a filter active when dataChanged is called caused a crash
+ // (at least with some Qt versions)
+ ModListSortProxy *filterModel = qobject_cast<ModListSortProxy*>(model);
+ std::vector<int> filter;
+ if (filterModel != nullptr) {
+ filter = filterModel->categoryFilter();
+ filterModel->setCategoryFilter(std::vector<int>());
+ }
+
QItemSelectionModel *selectionModel = itemView->selectionModel();
for (QModelIndex idx : selectionModel->selectedRows()) {
- int oldState = idx.data(Qt::CheckStateRole).toInt();
- model->setData(idx, oldState == Qt::Unchecked ? Qt::Checked
- : Qt::Unchecked,
- Qt::CheckStateRole);
+ int modId = idx.data(Qt::UserRole + 1).toInt();
+ m_Profile->setModEnabled(modId, !m_Profile->modEnabled(modId));
+ emit modlist_changed(idx, 0);
+ }
+
+ m_Modified = true;
+ m_LastCheck.restart();
+
+ emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
+
+ if (filterModel != nullptr) {
+ filterModel->setCategoryFilter(filter);
}
+
return true;
}
diff --git a/src/modlistsortproxy.h b/src/modlistsortproxy.h
index 35c60235..93092ba7 100644
--- a/src/modlistsortproxy.h
+++ b/src/modlistsortproxy.h
@@ -50,6 +50,7 @@ public:
void setProfile(Profile *profile);
void setCategoryFilter(const std::vector<int> &categories);
+ std::vector<int> categoryFilter() const { return m_CategoryFilter; }
void setContentFilter(const std::vector<int> &content);
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index a62c881d..0b4adbc1 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -1188,6 +1188,10 @@ void OrganizerCore::updateModActiveState(int index, bool active)
QStringList esps = dir.entryList(QStringList() << "*.esp", QDir::Files);
for (const QString &esp : esps) {
const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esp));
+ if (file.get() == nullptr) {
+ qWarning("failed to activate %s", qPrintable(esp));
+ continue;
+ }
if (active != m_PluginList.isEnabled(esp)
&& file->getAlternatives().empty()) {