summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/logic/minecraft/MinecraftInstance.cpp12
-rw-r--r--api/logic/minecraft/SimpleModList.cpp39
-rw-r--r--api/logic/minecraft/SimpleModList.h4
-rw-r--r--application/pages/instance/ModFolderPage.cpp28
-rw-r--r--application/pages/instance/ModFolderPage.h8
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<SimpleModList> 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<SimpleModList> 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<SimpleModList> 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<SimpleModList> 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<Mod> 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<SimpleModList>
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<SimpleModList>
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<SimpleModList> 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();