diff options
| -rw-r--r-- | launcher/minecraft/mod/Mod.cpp | 18 | ||||
| -rw-r--r-- | launcher/minecraft/mod/Mod.h | 2 | ||||
| -rw-r--r-- | launcher/minecraft/mod/ModFolderModel.cpp | 19 | ||||
| -rw-r--r-- | launcher/minecraft/mod/ModFolderModel.h | 1 | ||||
| -rw-r--r-- | launcher/ui/pages/instance/ExternalResourcesPage.ui | 11 | ||||
| -rw-r--r-- | launcher/ui/pages/instance/ModFolderPage.cpp | 30 | ||||
| -rw-r--r-- | launcher/ui/pages/instance/ModFolderPage.h | 1 | 
7 files changed, 76 insertions, 6 deletions
| diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index ae3dea8d..c9952998 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -132,17 +132,23 @@ auto Mod::destroy(QDir& index_dir, bool preserve_metadata, bool attempt_trash) -      if (!preserve_metadata) {          qDebug() << QString("Destroying metadata for '%1' on purpose").arg(name()); -        if (metadata()) { -            Metadata::remove(index_dir, metadata()->slug); -        } else { -            auto n = name(); -            Metadata::remove(index_dir, n); -        } +        destroyMetadata(index_dir);      }      return Resource::destroy(attempt_trash);  } +void Mod::destroyMetadata(QDir& index_dir) +{ +    if (metadata()) { +        Metadata::remove(index_dir, metadata()->slug); +    } else { +        auto n = name(); +        Metadata::remove(index_dir, n); +    } +    m_local_details.metadata = nullptr; +} +  auto Mod::details() const -> const ModDetails&  {      return m_local_details; diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index 6dafecfc..e97ee9d3 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -93,6 +93,8 @@ class Mod : public Resource {      // Delete all the files of this mod      auto destroy(QDir& index_dir, bool preserve_metadata = false, bool attempt_trash = true) -> bool; +    // Delete the metadata only +    void destroyMetadata(QDir& index_dir);      void finishResolvingWithDetails(ModDetails&& details); diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index eed35615..a5f1489d 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -233,6 +233,25 @@ bool ModFolderModel::deleteMods(const QModelIndexList& indexes)      return true;  } +bool ModFolderModel::deleteModsMetadata(const QModelIndexList& indexes) +{ +    if (indexes.isEmpty()) +        return true; + +    for (auto i : indexes) { +        if (i.column() != 0) { +            continue; +        } +        auto m = at(i.row()); +        auto index_dir = indexDir(); +        m->destroyMetadata(index_dir); +    } + +    update(); + +    return true; +} +  bool ModFolderModel::isValid()  {      return m_dir.exists() && m_dir.isReadable(); diff --git a/launcher/minecraft/mod/ModFolderModel.h b/launcher/minecraft/mod/ModFolderModel.h index f1890e87..61d840f9 100644 --- a/launcher/minecraft/mod/ModFolderModel.h +++ b/launcher/minecraft/mod/ModFolderModel.h @@ -81,6 +81,7 @@ class ModFolderModel : public ResourceFolderModel {      /// Deletes all the selected mods      bool deleteMods(const QModelIndexList& indexes); +    bool deleteModsMetadata(const QModelIndexList& indexes);      bool isValid(); diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index 3c836691..ba703f77 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -168,6 +168,17 @@      <string>Go to mods home page</string>     </property>    </action> +  <action name="actionRemoveItemMetadata"> +   <property name="enabled"> +    <bool>false</bool> +   </property> +   <property name="text"> +    <string>Remove metadata</string> +   </property> +   <property name="toolTip"> +    <string>Remove mod's metadata</string> +   </property> +  </action>   </widget>   <customwidgets>    <customwidget> diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 0f5e29cb..b42bbf46 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -92,6 +92,10 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr<ModFolderModel>          ui->actionsToolbar->addAction(ui->actionVisitItemPage);          connect(ui->actionVisitItemPage, &QAction::triggered, this, &ModFolderPage::visitModPages); +        ui->actionRemoveItemMetadata->setToolTip(tr("Remove mod's metadata")); +        ui->actionsToolbar->insertActionAfter(ui->actionRemoveItem, ui->actionRemoveItemMetadata); +        connect(ui->actionRemoveItemMetadata, &QAction::triggered, this, &ModFolderPage::deleteModMetadata); +          auto check_allow_update = [this] { return ui->treeView->selectionModel()->hasSelection() || !m_model->empty(); };          connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this, check_allow_update] { @@ -104,11 +108,16 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr<ModFolderModel>              if (selected <= 1) {                  ui->actionVisitItemPage->setText(tr("Visit mod's page"));                  ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page")); + +                ui->actionRemoveItemMetadata->setToolTip(tr("Remove mod's metadata"));              } else {                  ui->actionVisitItemPage->setText(tr("Visit mods' pages"));                  ui->actionVisitItemPage->setToolTip(tr("Go to the pages of the selected mods")); + +                ui->actionRemoveItemMetadata->setToolTip(tr("Remove mods' metadata"));              }              ui->actionVisitItemPage->setEnabled(selected != 0); +            ui->actionRemoveItemMetadata->setEnabled(selected != 0);          });          connect(mods.get(), &ModFolderModel::rowsInserted, this, @@ -297,3 +306,24 @@ void ModFolderPage::visitModPages()              DesktopServices::openUrl(url);      }  } + +void ModFolderPage::deleteModMetadata() +{ +    auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); +    auto selectionCount = m_model->selectedMods(selection).length(); +    if (selectionCount == 0) +        return; +    if (selectionCount > 1) { +        auto response = CustomMessageBox::selectable(this, tr("Confirm Removal"), +                                                     tr("You are about to remove the metadata for %1 mods.\n" +                                                        "Are you sure?") +                                                         .arg(selectionCount), +                                                     QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) +                            ->exec(); + +        if (response != QMessageBox::Yes) +            return; +    } + +    m_model->deleteModsMetadata(selection); +} diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index a23dcae1..0c654d0d 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -61,6 +61,7 @@ class ModFolderPage : public ExternalResourcesPage {     private slots:      void removeItems(const QItemSelection& selection) override; +    void deleteModMetadata();      void installMods();      void updateMods(); | 
