From 80b3efff11a34e2df7d1bc4cc3187e6aaf57e687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 15 Jul 2019 01:07:21 +0200 Subject: [PATCH] NOISSUE Do not hide mods list pages when the instance is running. Instead, disable (most of) the controls. --- api/logic/minecraft/MinecraftInstance.cpp | 12 ++++-- api/logic/minecraft/SimpleModList.cpp | 39 +++++++++++++++++--- api/logic/minecraft/SimpleModList.h | 4 ++ application/pages/instance/ModFolderPage.cpp | 28 +++++++++++++- application/pages/instance/ModFolderPage.h | 8 ++-- 5 files changed, 77 insertions(+), 14 deletions(-) diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp index 35f692c4..617d7431 100644 --- a/api/logic/minecraft/MinecraftInstance.cpp +++ b/api/logic/minecraft/MinecraftInstance.cpp @@ -897,8 +897,9 @@ std::shared_ptr MinecraftInstance::loaderModList() const if (!m_loader_mod_list) { m_loader_mod_list.reset(new SimpleModList(loaderModsDir())); + m_loader_mod_list->disableInteraction(isRunning()); + connect(this, &BaseInstance::runningStatusChanged, m_loader_mod_list.get(), &SimpleModList::disableInteraction); } - m_loader_mod_list->update(); return m_loader_mod_list; } @@ -907,8 +908,9 @@ std::shared_ptr MinecraftInstance::coreModList() const if (!m_core_mod_list) { m_core_mod_list.reset(new SimpleModList(coreModsDir())); + m_core_mod_list->disableInteraction(isRunning()); + connect(this, &BaseInstance::runningStatusChanged, m_core_mod_list.get(), &SimpleModList::disableInteraction); } - m_core_mod_list->update(); return m_core_mod_list; } @@ -917,8 +919,9 @@ std::shared_ptr MinecraftInstance::resourcePackList() const if (!m_resource_pack_list) { m_resource_pack_list.reset(new SimpleModList(resourcePacksDir())); + m_resource_pack_list->disableInteraction(isRunning()); + connect(this, &BaseInstance::runningStatusChanged, m_resource_pack_list.get(), &SimpleModList::disableInteraction); } - m_resource_pack_list->update(); return m_resource_pack_list; } @@ -927,8 +930,9 @@ std::shared_ptr MinecraftInstance::texturePackList() const if (!m_texture_pack_list) { m_texture_pack_list.reset(new SimpleModList(texturePacksDir())); + m_texture_pack_list->disableInteraction(isRunning()); + connect(this, &BaseInstance::runningStatusChanged, m_texture_pack_list.get(), &SimpleModList::disableInteraction); } - m_texture_pack_list->update(); return m_texture_pack_list; } diff --git a/api/logic/minecraft/SimpleModList.cpp b/api/logic/minecraft/SimpleModList.cpp index 6f4011a9..bdcf01b7 100644 --- a/api/logic/minecraft/SimpleModList.cpp +++ b/api/logic/minecraft/SimpleModList.cpp @@ -86,6 +86,17 @@ bool SimpleModList::update() return true; } +void SimpleModList::disableInteraction(bool disabled) +{ + if (interaction_disabled == disabled) { + return; + } + interaction_disabled = disabled; + if(size()) { + emit dataChanged(index(0), index(size() - 1)); + } +} + void SimpleModList::directoryChanged(QString path) { update(); @@ -99,6 +110,10 @@ bool SimpleModList::isValid() // FIXME: this does not take disabled mod (with extra .disable extension) into account... bool SimpleModList::installMod(const QString &filename) { + if(interaction_disabled) { + return false; + } + // NOTE: fix for GH-1178: remove trailing slash to avoid issues with using the empty result of QFileInfo::fileName auto originalPath = FS::NormalizePath(filename); QFileInfo fileinfo(originalPath); @@ -177,6 +192,10 @@ bool SimpleModList::installMod(const QString &filename) bool SimpleModList::enableMods(const QModelIndexList& indexes, bool enable) { + if(interaction_disabled) { + return false; + } + if(indexes.isEmpty()) return true; @@ -192,6 +211,10 @@ bool SimpleModList::enableMods(const QModelIndexList& indexes, bool enable) bool SimpleModList::deleteMods(const QModelIndexList& indexes) { + if(interaction_disabled) { + return false; + } + if(indexes.isEmpty()) return true; @@ -313,11 +336,17 @@ QVariant SimpleModList::headerData(int section, Qt::Orientation orientation, int Qt::ItemFlags SimpleModList::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); - if (index.isValid()) - return Qt::ItemIsUserCheckable | Qt::ItemIsDropEnabled | - defaultFlags; - else - return Qt::ItemIsDropEnabled | defaultFlags; + auto flags = defaultFlags; + if(index.isValid()) { + if(interaction_disabled) { + flags &= ~Qt::ItemIsDropEnabled; + flags &= ~Qt::ItemIsUserCheckable; + } else { + flags |= Qt::ItemIsUserCheckable; + flags |= Qt::ItemIsDropEnabled; + } + } + return flags; } Qt::DropActions SimpleModList::supportedDropActions() const diff --git a/api/logic/minecraft/SimpleModList.h b/api/logic/minecraft/SimpleModList.h index 3ed2edfe..8cb57727 100644 --- a/api/logic/minecraft/SimpleModList.h +++ b/api/logic/minecraft/SimpleModList.h @@ -106,6 +106,9 @@ public: return mods; } +public slots: + void disableInteraction(bool disabled); + private slots: void directoryChanged(QString path); @@ -116,6 +119,7 @@ signals: protected: QFileSystemWatcher *m_watcher; bool is_watching = false; + bool interaction_disabled = false; QDir m_dir; QList mods; }; diff --git a/application/pages/instance/ModFolderPage.cpp b/application/pages/instance/ModFolderPage.cpp index 15dd55a2..590a65b1 100644 --- a/application/pages/instance/ModFolderPage.cpp +++ b/application/pages/instance/ModFolderPage.cpp @@ -39,6 +39,7 @@ ModFolderPage::ModFolderPage(BaseInstance *inst, std::shared_ptr ui->setupUi(this); ui->tabWidget->tabBar()->hide(); m_inst = inst; + on_RunningState_changed(m_inst && m_inst->isRunning()); m_mods = mods; m_id = id; m_displayName = displayName; @@ -57,6 +58,7 @@ ModFolderPage::ModFolderPage(BaseInstance *inst, std::shared_ptr auto smodel = ui->modTreeView->selectionModel(); connect(smodel, &QItemSelectionModel::currentChanged, this, &ModFolderPage::modCurrent); connect(ui->filterEdit, &QLineEdit::textChanged, this, &ModFolderPage::on_filterTextChanged ); + connect(m_inst, &BaseInstance::runningStatusChanged, this, &ModFolderPage::on_RunningState_changed); } void ModFolderPage::openedImpl() @@ -89,10 +91,20 @@ ModFolderPage::~ModFolderPage() delete ui; } +void ModFolderPage::on_RunningState_changed(bool running) +{ + if(m_controlsEnabled == !running) { + return; + } + m_controlsEnabled = !running; + ui->addModBtn->setEnabled(m_controlsEnabled); + ui->disableModBtn->setEnabled(m_controlsEnabled); + ui->enableModBtn->setEnabled(m_controlsEnabled); + ui->rmModBtn->setEnabled(m_controlsEnabled); +} + bool ModFolderPage::shouldDisplay() const { - if (m_inst) - return !m_inst->isRunning(); return true; } @@ -152,6 +164,9 @@ bool ModFolderPage::eventFilter(QObject *obj, QEvent *ev) void ModFolderPage::on_addModBtn_clicked() { + if(!m_controlsEnabled) { + return; + } auto list = GuiUtil::BrowseForFiles( m_helpName, tr("Select %1", @@ -170,18 +185,27 @@ void ModFolderPage::on_addModBtn_clicked() void ModFolderPage::on_enableModBtn_clicked() { + if(!m_controlsEnabled) { + return; + } auto selection = m_filterModel->mapSelectionToSource(ui->modTreeView->selectionModel()->selection()); m_mods->enableMods(selection.indexes(), true); } void ModFolderPage::on_disableModBtn_clicked() { + if(!m_controlsEnabled) { + return; + } auto selection = m_filterModel->mapSelectionToSource(ui->modTreeView->selectionModel()->selection()); m_mods->enableMods(selection.indexes(), false); } void ModFolderPage::on_rmModBtn_clicked() { + if(!m_controlsEnabled) { + return; + } auto selection = m_filterModel->mapSelectionToSource(ui->modTreeView->selectionModel()->selection()); m_mods->deleteMods(selection.indexes()); } diff --git a/application/pages/instance/ModFolderPage.h b/application/pages/instance/ModFolderPage.h index 2c9dd2d3..77fe877d 100644 --- a/application/pages/instance/ModFolderPage.h +++ b/application/pages/instance/ModFolderPage.h @@ -67,18 +67,19 @@ protected: bool modListFilter(QKeyEvent *ev); protected: - BaseInstance *m_inst; + BaseInstance *m_inst = nullptr; protected: - Ui::ModFolderPage *ui; + Ui::ModFolderPage *ui = nullptr; std::shared_ptr m_mods; - QSortFilterProxyModel *m_filterModel; + QSortFilterProxyModel *m_filterModel = nullptr; QString m_iconName; QString m_id; QString m_displayName; QString m_helpName; QString m_fileSelectionFilter; QString m_viewFilter; + bool m_controlsEnabled = true; public slots: @@ -87,6 +88,7 @@ slots: private slots: void on_filterTextChanged(const QString & newContents); + void on_RunningState_changed(bool running); void on_addModBtn_clicked(); void on_rmModBtn_clicked(); void on_viewModBtn_clicked();