diff --git a/api/logic/BaseInstance.cpp b/api/logic/BaseInstance.cpp index 3a4d84be..098407dc 100644 --- a/api/logic/BaseInstance.cpp +++ b/api/logic/BaseInstance.cpp @@ -99,8 +99,6 @@ void BaseInstance::iconUpdated(QString key) void BaseInstance::invalidate() { changeStatus(Status::Gone); - m_group = QString(); - emit groupChanged(); qDebug() << "Instance" << id() << "has been invalidated."; } @@ -209,31 +207,6 @@ void BaseInstance::setLastLaunch(qint64 val) emit propertiesChanged(this); } -void BaseInstance::setGroupInitial(QString val) -{ - if(m_group == val) - { - return; - } - m_group = val; - emit propertiesChanged(this); -} - -void BaseInstance::setGroupPost(QString val) -{ - if(m_group == val) - { - return; - } - setGroupInitial(val); - emit groupChanged(); -} - -QString BaseInstance::group() const -{ - return m_group; -} - void BaseInstance::setNotes(QString val) { //FIXME: if no change, do not set. setting involves saving a file. diff --git a/api/logic/BaseInstance.h b/api/logic/BaseInstance.h index 09d21b2e..04788eb7 100644 --- a/api/logic/BaseInstance.h +++ b/api/logic/BaseInstance.h @@ -68,7 +68,6 @@ public: /// virtual destructor to make sure the destruction is COMPLETE virtual ~BaseInstance() {}; - virtual void init() = 0; virtual void saveNow() = 0; /*** @@ -112,10 +111,6 @@ public: QString notes() const; void setNotes(QString val); - QString group() const; - void setGroupInitial(QString val); - void setGroupPost(QString val); - QString getPreLaunchCommand(); QString getPostExitCommand(); QString getWrapperCommand(); @@ -245,10 +240,6 @@ signals: * \brief Signal emitted when properties relevant to the instance view change */ void propertiesChanged(BaseInstance *inst); - /*! - * \brief Signal emitted when groups are affected in any way - */ - void groupChanged(); void launchTaskChanged(std::shared_ptr); @@ -261,7 +252,6 @@ protected slots: protected: /* data */ QString m_rootDir; - QString m_group; SettingsObjectPtr m_settings; // InstanceFlags m_flags; bool m_isRunning = false; diff --git a/api/logic/InstanceCreationTask.cpp b/api/logic/InstanceCreationTask.cpp index 15041845..978d4687 100644 --- a/api/logic/InstanceCreationTask.cpp +++ b/api/logic/InstanceCreationTask.cpp @@ -25,7 +25,6 @@ void InstanceCreationTask::executeTask() components->setComponentVersion("net.minecraft", m_version->descriptor(), true); inst.setName(m_instName); inst.setIconKey(m_instIcon); - inst.init(); instanceSettings->resumeSave(); } emitSucceeded(); diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index 0edbc92e..bbab557a 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -274,7 +274,6 @@ void InstanceImportTask::processFlame() instance.setIconKey("flame"); } } - instance.init(); QString jarmodsPath = FS::PathCombine(m_stagingPath, "minecraft", "jarmods"); QFileInfo jarmodsInfo(jarmodsPath); if(jarmodsInfo.isDir()) diff --git a/api/logic/InstanceList.cpp b/api/logic/InstanceList.cpp index 616d2887..4a209454 100644 --- a/api/logic/InstanceList.cpp +++ b/api/logic/InstanceList.cpp @@ -51,7 +51,6 @@ InstanceList::InstanceList(SettingsObjectPtr settings, const QString & instDir, } connect(this, &InstanceList::instancesChanged, this, &InstanceList::providerUpdated); - connect(this, &InstanceList::groupsChanged, this, &InstanceList::groupsPublished); // NOTE: canonicalPath requires the path to exist. Do not move this above the creation block! m_instDir = QDir(instDir).canonicalPath(); @@ -111,7 +110,7 @@ QVariant InstanceList::data(const QModelIndex &index, int role) const // HACK: see GroupView.h in gui! case GroupRole: { - return pdata->group(); + return getInstanceGroup(pdata->id()); } default: break; @@ -129,6 +128,53 @@ Qt::ItemFlags InstanceList::flags(const QModelIndex &index) const return f; } +GroupId InstanceList::getInstanceGroup(const InstanceId& id) const +{ + auto inst = getInstanceById(id); + if(!inst) + { + return GroupId(); + } + auto iter = m_groupMap.find(inst->id()); + if(iter != m_groupMap.end()) + { + return *iter; + } + return GroupId(); +} + +void InstanceList::setInstanceGroup(const InstanceId& id, const GroupId& name) +{ + auto inst = getInstanceById(id); + if(!inst) + { + qDebug() << "Attempt to set a null instance's group"; + return; + } + + bool changed = false; + auto iter = m_groupMap.find(inst->id()); + if(iter != m_groupMap.end()) + { + if(*iter != name) + { + *iter = name; + changed = true; + } + } + else + { + changed = true; + m_groupMap[id] = name; + } + + if(changed) + { + m_groups.insert(name); + saveGroupList(); + } +} + QStringList InstanceList::getGroups() { return m_groups.toList(); @@ -136,14 +182,28 @@ QStringList InstanceList::getGroups() void InstanceList::deleteGroup(const QString& name) { + bool removed = false; + qDebug() << "Delete group" << name; for(auto & instance: m_instances) { - auto instGroupName = instance->group(); + const auto & instID = instance->id(); + auto instGroupName = getInstanceGroup(instID); if(instGroupName == name) { - instance->setGroupPost(QString()); + m_groupMap.remove(instID); + qDebug() << "Remove" << instID << "from group" << name; + removed = true; + auto idx = getInstIndex(instance.get()); + if(idx > 0) + { + emit dataChanged(index(idx), index(idx), {GroupRole}); + } } } + if(removed) + { + saveGroupList(); + } } void InstanceList::deleteInstance(const InstanceId& id) @@ -155,6 +215,11 @@ void InstanceList::deleteInstance(const InstanceId& id) return; } + if(m_groupMap.remove(id)) + { + saveGroupList(); + } + qDebug() << "Will delete instance" << id; if(!FS::deletePath(inst->instanceRoot())) { @@ -340,11 +405,6 @@ void InstanceList::providerUpdated() } } -void InstanceList::groupsPublished(QSet newGroups) -{ - m_groups.unite(newGroups); -} - InstancePtr InstanceList::getInstanceById(QString instId) const { if(instId.isEmpty()) @@ -413,13 +473,6 @@ InstancePtr InstanceList::loadInstance(const InstanceId& id) { inst.reset(new NullInstance(m_globalSettings, instanceSettings, instanceRoot)); } - inst->init(); - auto iter = groupMap.find(id); - if (iter != groupMap.end()) - { - inst->setGroupInitial((*iter)); - } - connect(inst.get(), &BaseInstance::groupChanged, this, &InstanceList::groupChanged); qDebug() << "Loaded instance " << inst->name() << " from " << inst->instanceRoot(); return inst; } @@ -435,7 +488,7 @@ void InstanceList::saveGroupList() WatchLock foo(m_watcher, m_instDir); QString groupFileName = m_instDir + "/instgroups.json"; QMap> reverseGroupMap; - for (auto iter = groupMap.begin(); iter != groupMap.end(); iter++) + for (auto iter = m_groupMap.begin(); iter != m_groupMap.end(); iter++) { QString id = iter.key(); QString group = iter.value(); @@ -543,7 +596,7 @@ void InstanceList::loadGroupList() return; } - groupMap.clear(); + m_groupMap.clear(); // Iterate through all the groups. QJsonObject groupMapping = rootObj.value("groups").toObject(); @@ -580,25 +633,14 @@ void InstanceList::loadGroupList() for (QJsonArray::iterator iter2 = instancesArray.begin(); iter2 != instancesArray.end(); iter2++) { - groupMap[(*iter2).toString()] = groupName; + m_groupMap[(*iter2).toString()] = groupName; } } m_groupsLoaded = true; - emit groupsChanged(groupSet); + m_groups.unite(groupSet); qDebug() << "Group list loaded."; } -void InstanceList::groupChanged() -{ - // save the groups. save all of them. - auto instance = (BaseInstance *) QObject::sender(); - auto id = instance->id(); - groupMap[id] = instance->group(); - emit groupsChanged({instance->group()}); - saveGroupList(); -} - - void InstanceList::instanceDirContentsChanged(const QString& path) { Q_UNUSED(path); @@ -731,9 +773,9 @@ bool InstanceList::commitStagedInstance(const QString& path, const QString& inst qWarning() << "Failed to move" << path << "to" << destination; return false; } - groupMap[instID] = groupName; + m_groupMap[instID] = groupName; instanceSet.insert(instID); - emit groupsChanged({groupName}); + m_groups.insert(groupName); emit instancesChanged(); } saveGroupList(); diff --git a/api/logic/InstanceList.h b/api/logic/InstanceList.h index a487a7ca..5b966b33 100644 --- a/api/logic/InstanceList.h +++ b/api/logic/InstanceList.h @@ -41,6 +41,13 @@ enum class InstCreateError CantCreateDir }; +enum class GroupsState +{ + NotLoaded, + Steady, + Dirty +}; + class MULTIMC_LOGIC_EXPORT InstanceList : public QAbstractListModel { @@ -90,6 +97,8 @@ public: InstancePtr getInstanceById(QString id) const; QModelIndex getInstanceIndexById(const QString &id) const; QStringList getGroups(); + GroupId getInstanceGroup(const InstanceId & id) const; + void setInstanceGroup(const InstanceId & id, const GroupId& name); void deleteGroup(const GroupId & name); void deleteInstance(const InstanceId & id); @@ -125,10 +134,8 @@ public slots: private slots: void propertiesChanged(BaseInstance *inst); - void groupsPublished(QSet); void providerUpdated(); void instanceDirContentsChanged(const QString &path); - void groupChanged(); private: int getInstIndex(BaseInstance *inst) const; @@ -149,7 +156,7 @@ private: SettingsObjectPtr m_globalSettings; QString m_instDir; QFileSystemWatcher * m_watcher; - QMap groupMap; + QMap m_groupMap; QSet instanceSet; bool m_groupsLoaded = false; bool m_instancesProbed = false; diff --git a/api/logic/NullInstance.h b/api/logic/NullInstance.h index 861a2f57..bef6bc4f 100644 --- a/api/logic/NullInstance.h +++ b/api/logic/NullInstance.h @@ -10,9 +10,6 @@ public: setVersionBroken(true); } virtual ~NullInstance() {}; - virtual void init() override - { - } virtual void saveNow() override { } diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp index 77444bec..7c83b890 100644 --- a/api/logic/minecraft/MinecraftInstance.cpp +++ b/api/logic/minecraft/MinecraftInstance.cpp @@ -112,10 +112,6 @@ MinecraftInstance::MinecraftInstance(SettingsObjectPtr globalSettings, SettingsO m_components->setOldConfigVersion("com.mumfrey.liteloader", m_settings->get("LiteloaderVersion").toString()); } -void MinecraftInstance::init() -{ -} - void MinecraftInstance::saveNow() { m_components->saveNow(); diff --git a/api/logic/minecraft/MinecraftInstance.h b/api/logic/minecraft/MinecraftInstance.h index 880939c1..5f0fa353 100644 --- a/api/logic/minecraft/MinecraftInstance.h +++ b/api/logic/minecraft/MinecraftInstance.h @@ -18,7 +18,6 @@ class MULTIMC_LOGIC_EXPORT MinecraftInstance: public BaseInstance public: MinecraftInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir); virtual ~MinecraftInstance() {}; - virtual void init() override; virtual void saveNow() override; // FIXME: remove diff --git a/api/logic/minecraft/legacy/LegacyInstance.h b/api/logic/minecraft/legacy/LegacyInstance.h index 42a6a5b2..619e2c83 100644 --- a/api/logic/minecraft/legacy/LegacyInstance.h +++ b/api/logic/minecraft/legacy/LegacyInstance.h @@ -34,7 +34,6 @@ public: explicit LegacyInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir); - virtual void init() override {} virtual void saveNow() override {} /// Path to the instance's minecraft.jar diff --git a/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp b/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp index 3f373a9c..9a832a24 100644 --- a/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp +++ b/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp @@ -67,7 +67,6 @@ void LegacyUpgradeTask::copyFinished() { MinecraftInstance inst(m_globalSettings, instanceSettings, m_stagingPath); inst.setName(m_instName); - inst.init(); QString preferredVersionNumber = decideVersion(legacyInst->currentVersionId(), legacyInst->intendedVersionId()); if(preferredVersionNumber.isNull()) diff --git a/api/logic/modplatform/ftb/FtbPackInstallTask.cpp b/api/logic/modplatform/ftb/FtbPackInstallTask.cpp index cf0abea5..2340666d 100644 --- a/api/logic/modplatform/ftb/FtbPackInstallTask.cpp +++ b/api/logic/modplatform/ftb/FtbPackInstallTask.cpp @@ -175,14 +175,12 @@ void FtbPackInstallTask::install() progress(4, 4); - instance.init(); instance.setName(m_instName); if(m_instIcon == "default") { m_instIcon = "ftb_logo"; } instance.setIconKey(m_instIcon); - instance.setGroupInitial(m_instGroup); instanceSettings->resumeSave(); emitSucceeded(); diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 9a1efb2b..883b38f9 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -1446,7 +1446,8 @@ void MainWindow::on_actionChangeInstGroup_triggered() return; bool ok = false; - QString name(m_selectedInstance->group()); + InstanceId instId = m_selectedInstance->id(); + QString name(MMC->instances()->getInstanceGroup(instId)); auto groups = MMC->instances()->getGroups(); groups.insert(0, ""); groups.sort(Qt::CaseInsensitive); @@ -1455,7 +1456,9 @@ void MainWindow::on_actionChangeInstGroup_triggered() name = QInputDialog::getItem(this, tr("Group name"), tr("Enter a new group name."), groups, foo, true, &ok); name = name.simplified(); if (ok) - m_selectedInstance->setGroupPost(name); + { + MMC->instances()->setInstanceGroup(instId, name); + } } void MainWindow::deleteGroup() diff --git a/application/dialogs/CopyInstanceDialog.cpp b/application/dialogs/CopyInstanceDialog.cpp index b16684c6..78f7512e 100644 --- a/application/dialogs/CopyInstanceDialog.cpp +++ b/application/dialogs/CopyInstanceDialog.cpp @@ -45,7 +45,7 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) groupList.removeOne(""); groupList.push_front(""); ui->groupBox->addItems(groupList); - int index = groupList.indexOf(m_original->group()); + int index = groupList.indexOf(MMC->instances()->getInstanceGroup(m_original->id())); if(index == -1) { index = 0; diff --git a/application/pages/instance/LegacyUpgradePage.cpp b/application/pages/instance/LegacyUpgradePage.cpp index 0d2e5996..15fd10cc 100644 --- a/application/pages/instance/LegacyUpgradePage.cpp +++ b/application/pages/instance/LegacyUpgradePage.cpp @@ -38,7 +38,7 @@ void LegacyUpgradePage::on_upgradeButton_clicked() QString newName = tr("%1 (Migrated)").arg(m_inst->name()); auto upgradeTask = new LegacyUpgradeTask(m_inst); upgradeTask->setName(newName); - upgradeTask->setGroup(m_inst->group()); + upgradeTask->setGroup(MMC->instances()->getInstanceGroup(m_inst->id())); upgradeTask->setIcon(m_inst->iconKey()); std::unique_ptr task(MMC->instances()->wrapInstanceTask(upgradeTask)); runModalTask(task.get());