diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp
index 2068fa6b1..a3b58f4df 100644
--- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp
+++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp
@@ -81,15 +81,28 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared
connect(ui->treeView, &ModListView::activated, this, &ExternalResourcesPage::itemActivated);
auto selection_model = ui->treeView->selectionModel();
- connect(selection_model, &QItemSelectionModel::currentChanged, this, &ExternalResourcesPage::current);
+
+ connect(selection_model, &QItemSelectionModel::currentChanged, this, [this](const QModelIndex& current, const QModelIndex& previous) {
+ if (!current.isValid()) {
+ ui->frame->clear();
+ return;
+ }
+
+ updateFrame(current, previous);
+ });
+
auto updateExtra = [this]() {
if (updateExtraInfo)
updateExtraInfo(id(), extraHeaderInfoString());
};
+
connect(selection_model, &QItemSelectionModel::selectionChanged, this, updateExtra);
connect(model.get(), &ResourceFolderModel::updateFinished, this, updateExtra);
- connect(ui->filterEdit, &QLineEdit::textChanged, this, &ExternalResourcesPage::filterTextChanged);
+ connect(selection_model, &QItemSelectionModel::selectionChanged, this, [this] { updateActions(); });
+ connect(m_model.get(), &ResourceFolderModel::rowsInserted, this, [this] { updateActions(); });
+ connect(m_model.get(), &ResourceFolderModel::rowsRemoved, this, [this] { updateActions(); });
+ connect(m_model.get(), &ResourceFolderModel::updateFinished, this, [this] { updateActions(); });
auto viewHeader = ui->treeView->header();
viewHeader->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -298,23 +311,22 @@ void ExternalResourcesPage::viewFolder()
DesktopServices::openPath(m_model->dir().absolutePath(), true);
}
-bool ExternalResourcesPage::current(const QModelIndex& current, const QModelIndex& previous)
+void ExternalResourcesPage::updateActions()
{
- if (!current.isValid()) {
- ui->frame->clear();
- return false;
- }
-
- return onSelectionChanged(current, previous);
+ const bool hasSelection = ui->treeView->selectionModel()->hasSelection();
+ ui->actionUpdateItem->setEnabled(!m_model->empty());
+ ui->actionResetItemMetadata->setEnabled(hasSelection);
+ ui->actionRemoveItem->setEnabled(hasSelection);
+ ui->actionEnableItem->setEnabled(hasSelection);
+ ui->actionDisableItem->setEnabled(hasSelection);
}
-bool ExternalResourcesPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
+void ExternalResourcesPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
{
auto sourceCurrent = m_filterModel->mapToSource(current);
int row = sourceCurrent.row();
Resource const& resource = m_model->at(row);
ui->frame->updateWithResource(resource);
- return true;
}
QString ExternalResourcesPage::extraHeaderInfoString()
diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.h b/launcher/ui/pages/instance/ExternalResourcesPage.h
index d29be0fc3..9bbd13984 100644
--- a/launcher/ui/pages/instance/ExternalResourcesPage.h
+++ b/launcher/ui/pages/instance/ExternalResourcesPage.h
@@ -42,9 +42,8 @@ class ExternalResourcesPage : public QMainWindow, public BasePage {
QMenu* createPopupMenu() override;
public slots:
- bool current(const QModelIndex& current, const QModelIndex& previous);
-
- virtual bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous);
+ virtual void updateActions();
+ virtual void updateFrame(const QModelIndex& current, const QModelIndex& previous);
protected slots:
void itemActivated(const QModelIndex& index);
diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui
index 2b4a47b9d..c671efaf8 100644
--- a/launcher/ui/pages/instance/ExternalResourcesPage.ui
+++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui
@@ -102,6 +102,9 @@
+
+ false
+
&Remove
@@ -110,6 +113,9 @@
+
+ false
+
&Enable
@@ -118,6 +124,9 @@
+
+ false
+
&Disable
@@ -154,7 +163,7 @@
- true
+ false
Check for &Updates
diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp
index 5b10a38df..e647120c2 100644
--- a/launcher/ui/pages/instance/ModFolderPage.cpp
+++ b/launcher/ui/pages/instance/ModFolderPage.cpp
@@ -106,14 +106,12 @@ bool ModFolderPage::shouldDisplay() const
return true;
}
-bool ModFolderPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
+void ModFolderPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
{
auto sourceCurrent = m_filterModel->mapToSource(current);
int row = sourceCurrent.row();
const Mod& mod = m_model->at(row);
ui->frame->updateWithMod(mod);
-
- return true;
}
void ModFolderPage::removeItems(const QItemSelection& selection)
diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h
index 455db33cb..4fac80141 100644
--- a/launcher/ui/pages/instance/ModFolderPage.h
+++ b/launcher/ui/pages/instance/ModFolderPage.h
@@ -57,7 +57,7 @@ class ModFolderPage : public ExternalResourcesPage {
virtual bool shouldDisplay() const override;
public slots:
- bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override;
+ void updateFrame(const QModelIndex& current, const QModelIndex& previous) override;
private slots:
void removeItems(const QItemSelection& selection) override;
diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp
index e51ebafac..d03511ca4 100644
--- a/launcher/ui/pages/instance/ResourcePackPage.cpp
+++ b/launcher/ui/pages/instance/ResourcePackPage.cpp
@@ -69,14 +69,12 @@ ResourcePackPage::ResourcePackPage(MinecraftInstance* instance, std::shared_ptr<
ui->actionUpdateItem->setMenu(updateMenu);
}
-bool ResourcePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
+void ResourcePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
{
auto sourceCurrent = m_filterModel->mapToSource(current);
int row = sourceCurrent.row();
auto& rp = static_cast(m_model->at(row));
ui->frame->updateWithResourcePack(rp);
-
- return true;
}
void ResourcePackPage::downloadResourcePacks()
@@ -127,13 +125,13 @@ void ResourcePackPage::updateResourcePacks()
return;
}
if (m_instance != nullptr && m_instance->isRunning()) {
- auto response =
- CustomMessageBox::selectable(this, tr("Confirm Update"),
- tr("Updating resource packs while the game is running may cause pack duplication and game crashes.\n"
- "The old files may not be deleted as they are in use.\n"
- "Are you sure you want to do this?"),
- QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
- ->exec();
+ auto response = CustomMessageBox::selectable(
+ this, tr("Confirm Update"),
+ tr("Updating resource packs while the game is running may cause pack duplication and game crashes.\n"
+ "The old files may not be deleted as they are in use.\n"
+ "Are you sure you want to do this?"),
+ QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
+ ->exec();
if (response != QMessageBox::Yes)
return;
@@ -166,7 +164,8 @@ void ResourcePackPage::updateResourcePacks()
}
if (update_dialog.exec()) {
- auto tasks = new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
+ auto tasks =
+ new ConcurrentTask(this, "Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
tasks->deleteLater();
diff --git a/launcher/ui/pages/instance/ResourcePackPage.h b/launcher/ui/pages/instance/ResourcePackPage.h
index c2d36cea1..e95809cf8 100644
--- a/launcher/ui/pages/instance/ResourcePackPage.h
+++ b/launcher/ui/pages/instance/ResourcePackPage.h
@@ -58,7 +58,7 @@ class ResourcePackPage : public ExternalResourcesPage {
}
public slots:
- bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override;
+ void updateFrame(const QModelIndex& current, const QModelIndex& previous) override;
private slots:
void downloadResourcePacks();
diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp
index 75f8410bc..cdd2b0964 100644
--- a/launcher/ui/pages/instance/TexturePackPage.cpp
+++ b/launcher/ui/pages/instance/TexturePackPage.cpp
@@ -71,14 +71,12 @@ TexturePackPage::TexturePackPage(MinecraftInstance* instance, std::shared_ptractionUpdateItem->setMenu(updateMenu);
}
-bool TexturePackPage::onSelectionChanged(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
+void TexturePackPage::updateFrame(const QModelIndex& current, [[maybe_unused]] const QModelIndex& previous)
{
auto sourceCurrent = m_filterModel->mapToSource(current);
int row = sourceCurrent.row();
auto& rp = static_cast(m_model->at(row));
ui->frame->updateWithTexturePack(rp);
-
- return true;
}
void TexturePackPage::downloadTexturePacks()
@@ -129,13 +127,13 @@ void TexturePackPage::updateTexturePacks()
return;
}
if (m_instance != nullptr && m_instance->isRunning()) {
- auto response =
- CustomMessageBox::selectable(this, tr("Confirm Update"),
- tr("Updating texture packs while the game is running may cause pack duplication and game crashes.\n"
- "The old files may not be deleted as they are in use.\n"
- "Are you sure you want to do this?"),
- QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
- ->exec();
+ auto response = CustomMessageBox::selectable(
+ this, tr("Confirm Update"),
+ tr("Updating texture packs while the game is running may cause pack duplication and game crashes.\n"
+ "The old files may not be deleted as they are in use.\n"
+ "Are you sure you want to do this?"),
+ QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
+ ->exec();
if (response != QMessageBox::Yes)
return;
@@ -168,7 +166,8 @@ void TexturePackPage::updateTexturePacks()
}
if (update_dialog.exec()) {
- auto tasks = new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
+ auto tasks =
+ new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
tasks->deleteLater();
diff --git a/launcher/ui/pages/instance/TexturePackPage.h b/launcher/ui/pages/instance/TexturePackPage.h
index e42613568..4dc2c16c2 100644
--- a/launcher/ui/pages/instance/TexturePackPage.h
+++ b/launcher/ui/pages/instance/TexturePackPage.h
@@ -55,7 +55,7 @@ class TexturePackPage : public ExternalResourcesPage {
virtual bool shouldDisplay() const override { return m_instance->traits().contains("texturepacks"); }
public slots:
- bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override;
+ void updateFrame(const QModelIndex& current, const QModelIndex& previous) override;
void downloadTexturePacks();
void updateTexturePacks();
void deleteTexturePackMetadata();