From 754ca3bccfdff83eab2d17d3f43884b13470b258 Mon Sep 17 00:00:00 2001 From: GenevensiS <66968533+G-e-n-e-v-e-n-s-i-S@users.noreply.github.com> Date: Fri, 15 May 2026 15:37:56 +0200 Subject: [PATCH] add "update group" buttons to package manager --- data/ch-s.mse-locale/locale | 2 + data/ch-t.mse-locale/locale | 2 + data/da.mse-locale/locale | 2 + data/de.mse-locale/locale | 11 ++-- data/en.mse-locale/locale | 11 ++-- data/es.mse-locale/locale | 2 + data/fr.mse-locale/locale | 9 ++-- data/it.mse-locale/locale | 11 ++-- data/jp.mse-locale/locale | 2 + data/ko.mse-locale/locale | 2 + data/pl.mse-locale/locale | 2 + data/pt-br.mse-locale/locale | 11 ++-- data/ru.mse-locale/locale | 2 + src/gui/package_update_list.hpp | 68 ++++++++++++++++++++--- src/gui/packages_window.cpp | 95 +++++++++++++++++++++++---------- 15 files changed, 171 insertions(+), 61 deletions(-) diff --git a/data/ch-s.mse-locale/locale b/data/ch-s.mse-locale/locale index 56d6b815..498e935e 100644 --- a/data/ch-s.mse-locale/locale +++ b/data/ch-s.mse-locale/locale @@ -898,6 +898,8 @@ button: upgrade package: 升级 reinstall package: 重新安装 remove package: 移除 + #TODO: Localize + keep group: Keep Group As Is install group: 全部安装 upgrade group: 全部升级 remove group: 全部移除 diff --git a/data/ch-t.mse-locale/locale b/data/ch-t.mse-locale/locale index 7cf7359a..67fa6acc 100644 --- a/data/ch-t.mse-locale/locale +++ b/data/ch-t.mse-locale/locale @@ -896,6 +896,8 @@ button: upgrade package: 昇級 reinstall package: 重新安裝 remove package: 移除 + #TODO: Localize + keep group: Keep Group As Is install group: 全部安裝 upgrade group: 全部昇級 remove group: 全部移除 diff --git a/data/da.mse-locale/locale b/data/da.mse-locale/locale index fa772313..55f420f2 100644 --- a/data/da.mse-locale/locale +++ b/data/da.mse-locale/locale @@ -914,6 +914,8 @@ button: upgrade package: &Opdatér reinstall package: Gen&installér remove package: &Fjern + #TODO: Localize + keep group: Keep Group As Is install group: &Installér Alt upgrade group: &Opgradér Alt remove group: &Fjern Alt diff --git a/data/de.mse-locale/locale b/data/de.mse-locale/locale index 65df6895..7ff2e995 100644 --- a/data/de.mse-locale/locale +++ b/data/de.mse-locale/locale @@ -825,15 +825,16 @@ button: close: &Beenden # packages window - keep package: &Nicht verändern + keep package: &Unverändert beibehalten don't install package: &Nicht installieren install package: &Installieren - upgrade package: &Upgraden + upgrade package: &Aktualisieren reinstall package: Neu &installieren remove package: &Entfernen - install group: &Installiere alle - upgrade group: &Upgrade alle - remove group: &Entferne alle + keep group: Gruppe unverändert beibehalten + install group: Gruppe installieren/aktualisieren + upgrade group: Gruppe aktualisieren + remove group: Gruppe entfernen ############################################################## Titles in the GUI title: diff --git a/data/en.mse-locale/locale b/data/en.mse-locale/locale index 0f874031..c20242e8 100644 --- a/data/en.mse-locale/locale +++ b/data/en.mse-locale/locale @@ -826,15 +826,16 @@ button: close: &Close # packages window - keep package: &Don't change - don't install package: &Don't install + keep package: Keep As Is + don't install package: &Don't Install install package: &Install upgrade package: &Update reinstall package: Re&install remove package: &Remove - install group: &Install All - upgrade group: &Upgrade All - remove group: &Remove All + keep group: Keep Group As Is + install group: &Install/Update Group + upgrade group: &Update Group + remove group: &Remove Group ############################################################## Titles in the GUI title: diff --git a/data/es.mse-locale/locale b/data/es.mse-locale/locale index 43d22376..33cddd6f 100644 --- a/data/es.mse-locale/locale +++ b/data/es.mse-locale/locale @@ -899,6 +899,8 @@ button: upgrade package: &Actualizar reinstall package: R&einstalar remove package: &Eliminar + #TODO: Localize + keep group: Keep Group As Is install group: Instalar &Todos upgrade group: A&ctualizar Todos remove group: Q&uitar Todos diff --git a/data/fr.mse-locale/locale b/data/fr.mse-locale/locale index 6f6c009a..d4ae69e5 100644 --- a/data/fr.mse-locale/locale +++ b/data/fr.mse-locale/locale @@ -828,12 +828,13 @@ button: keep package: &Ne pas modifier don't install package: &Ne pas installer install package: &Installer - upgrade package: &Upgrader + upgrade package: &Mettre à jour reinstall package: Ré&installer remove package: &Supprimer - install group: &Installer Tout - upgrade group: &Upgrader Tout - remove group: &Supprimer Tout + keep group: &Ne pas modifier le groupe + install group: &Installer/Mettre à jour le groupe + upgrade group: &Mettre à jour le groupe + remove group: &Supprimer le groupe ############################################################## Titles in the GUI title: diff --git a/data/it.mse-locale/locale b/data/it.mse-locale/locale index 65b7d890..973cd2f5 100644 --- a/data/it.mse-locale/locale +++ b/data/it.mse-locale/locale @@ -825,15 +825,16 @@ button: close: &Chiudi # packages window - keep package: &Non modificare + keep package: &Mantieni così com'è don't install package: &Non installare install package: &Installa - upgrade package: Aggiorna (&U) + upgrade package: Aggiorna reinstall package: Re&installa remove package: &Rimuovi - install group: &Installa Tutto - upgrade group: &Upgrade Tutto - remove group: &Rimuovi Tutto + keep group: Mantieni il gruppo così com'è + install group: &Installa/Aggiorna il gruppo + upgrade group: &Aggiorna il gruppo + remove group: &Rimuovi il gruppo ############################################################## Titles in the GUI title: diff --git a/data/jp.mse-locale/locale b/data/jp.mse-locale/locale index a123137f..142309bb 100644 --- a/data/jp.mse-locale/locale +++ b/data/jp.mse-locale/locale @@ -898,6 +898,8 @@ button: upgrade package: &アップグレード reinstall package: 再インストール remove package: &取り外す + #TODO: Localize + keep group: Keep Group As Is install group: すべてインストールする upgrade group: すべてアップグレードする remove group: すべて削除する diff --git a/data/ko.mse-locale/locale b/data/ko.mse-locale/locale index cc3e5b62..b36302a9 100644 --- a/data/ko.mse-locale/locale +++ b/data/ko.mse-locale/locale @@ -904,6 +904,8 @@ button: upgrade package: 업데이트 reinstall package: 재설치 remove package: 제거하다 + #TODO: Localize + keep group: Keep Group As Is install group: 모두 설치 upgrade group: 모두 업그레이드 remove group: 모두 제거 diff --git a/data/pl.mse-locale/locale b/data/pl.mse-locale/locale index 8cf2e97f..62b4fd53 100644 --- a/data/pl.mse-locale/locale +++ b/data/pl.mse-locale/locale @@ -952,6 +952,8 @@ button: upgrade package: &Uaktualnij reinstall package: Zainstaluj &ponownie remove package: &Usuń + #TODO: Localize + keep group: Keep Group As Is install group: &Instaluj wszystkie upgrade group: &Uaktualnij wszystkie remove group: &Usuń wszystkie diff --git a/data/pt-br.mse-locale/locale b/data/pt-br.mse-locale/locale index bc026106..e424896f 100644 --- a/data/pt-br.mse-locale/locale +++ b/data/pt-br.mse-locale/locale @@ -826,15 +826,16 @@ button: close: &Fechar # packages window - keep package: Não& alterar + keep package: Manter como está don't install package: Não& instalar install package: &Instalar - upgrade package: &Atualizações + upgrade package: &Atualizar reinstall package: Re&instalar remove package: &Remover - install group: &Instalar Tudo - upgrade group: &Atualizar tudo - remove group: &Remover tudo + keep group: &Manter o grupo como está + install group: &Instalar/Atualizar o grupo + upgrade group: &Atualizar o grupo + remove group: &Remover o grupo ############################################################## Titles in the GUI title: diff --git a/data/ru.mse-locale/locale b/data/ru.mse-locale/locale index 8729fd21..6d93250b 100644 --- a/data/ru.mse-locale/locale +++ b/data/ru.mse-locale/locale @@ -940,6 +940,8 @@ button: upgrade package: Обновить reinstall package: Переустановить remove package: Удалить + #TODO: Localize + keep group: Keep Group As Is install group: Установить все upgrade group: Обновить все remove group: Удалить все diff --git a/src/gui/package_update_list.hpp b/src/gui/package_update_list.hpp index cca35977..f0ece486 100644 --- a/src/gui/package_update_list.hpp +++ b/src/gui/package_update_list.hpp @@ -19,15 +19,31 @@ class PackageUpdateList : public TreeList { public: PackageUpdateList(Window* parent, const InstallablePackages& packages, bool show_only_installable, int id = wxID_ANY); ~PackageUpdateList(); - - inline InstallablePackageP getSelection() const { - return selection == NOTHING ? InstallablePackageP() : get(selection); + + class TreeItem; + + inline InstallablePackageP getSelectedPackage() const { + TreeItem* ti = getSelectedItem(); + return ti ? ti->package : InstallablePackageP(); } - - inline InstallablePackageP get(size_t item) const { - return static_pointer_cast(items[item])->package; + + inline bool selectionIsGroup() const { + TreeItem* ti = getSelectedItem(); + return ti && !ti->package; } - + + inline void forEachSelectedPackage(const std::function& fn) const { + forEachPackage(getSelectedItem(), fn); + } + + inline bool anySelectedPackage(const std::function& predicate) const { + return anyPackage(getSelectedItem(), predicate); + } + + inline bool allSelectedPackages(const std::function& predicate) const { + return allPackages(getSelectedItem(), predicate); + } + protected: // overridden methods from TreeList void initItems() override; @@ -38,12 +54,48 @@ protected: int columnWidth(size_t column) const override; private: + inline TreeItem* getSelectedItem() const { + return selection >= items.size() ? nullptr : static_pointer_cast(items[selection]).get(); + } + inline void forEachPackage(const TreeItem* item, const std::function& fn) const { + if (!item) return; + if (item->package) { + fn(item->package); + } + for (const auto& child : item->children) { + forEachPackage(child.get(), fn); + } + } + inline bool anyPackage(const TreeItem* item, const std::function& predicate) const { + if (!item) return false; + if (item->package && predicate(item->package)) { + return true; + } + for (const auto& child : item->children) { + if (anyPackage(child.get(), predicate)) { + return true; + } + } + return false; + } + inline bool allPackages(const TreeItem* item, const std::function& predicate) const { + if (!item) return false; + if (item->package && !predicate(item->package)) { + return false; + } + for (const auto& child : item->children) { + if (!allPackages(child.get(), predicate)) { + return false; + } + } + return true; + } + /// The list of packages we are displaying const InstallablePackages& packages; /// Show only packages with an installer? bool show_only_installable; - class TreeItem; public: typedef intrusive_ptr TreeItemP; private: diff --git a/src/gui/packages_window.cpp b/src/gui/packages_window.cpp index 30358846..90290917 100644 --- a/src/gui/packages_window.cpp +++ b/src/gui/packages_window.cpp @@ -199,7 +199,8 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) { v2->AddStretchSpacer(); v2->Add(keep_button, 0, wxEXPAND | wxBOTTOM, 4); v2->AddStretchSpacer(); - v2->Add(remove_button, 0, wxEXPAND | wxBOTTOM, 0); + v2->Add(remove_button, 0, wxEXPAND | wxBOTTOM, 0); + v2->SetMinSize(wxSize(170, -1)); h->Add(v2); v->Add(h, 0, wxEXPAND | (wxALL & ~wxTOP), 8); wxBoxSizer* h2 = new wxBoxSizer(wxHORIZONTAL); @@ -207,7 +208,7 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) { h2->AddStretchSpacer(); h2->Add(CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND | (wxALL & ~wxTOP), 8); v->Add(h2, 0, wxEXPAND); - v->SetMinSize(800,600); + v->SetMinSize(820,650); SetSizerAndFit(v); wxUpdateUIEvent::SetMode(wxUPDATE_UI_PROCESS_SPECIFIED); @@ -217,24 +218,27 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) { PackagesWindow::~PackagesWindow() { } - void PackagesWindow::onPackageSelect(wxCommandEvent& ev) { - package_info->setPackage(package = package_list->getSelection()); + package_info->setPackage(package = package_list->getSelectedPackage()); UpdateWindowUI(wxUPDATE_UI_RECURSE); } void PackagesWindow::onActionChange(wxCommandEvent& ev) { - if (package) { - PackageAction act = ev.GetId() == ID_INSTALL ? PACKAGE_ACT_INSTALL - : ev.GetId() == ID_UPGRADE ? PACKAGE_ACT_INSTALL - : ev.GetId() == ID_REMOVE ? PACKAGE_ACT_REMOVE - : PACKAGE_ACT_NOTHING; - act = act | where; - // set action - set_package_action(installable_packages, package, act); - package_list->Refresh(false); - UpdateWindowUI(wxUPDATE_UI_RECURSE); - } + PackageAction act = ev.GetId() == ID_INSTALL ? PACKAGE_ACT_INSTALL + : ev.GetId() == ID_UPGRADE ? PACKAGE_ACT_INSTALL + : ev.GetId() == ID_REMOVE ? PACKAGE_ACT_REMOVE + : PACKAGE_ACT_NOTHING; + act = act | where; + // set action + package_list->forEachSelectedPackage( + [&](const InstallablePackageP& p) { + if (p->can(act)) { + set_package_action(installable_packages, p, act); + } + } + ); + package_list->Refresh(false); + UpdateWindowUI(wxUPDATE_UI_RECURSE); } void PackagesWindow::onOk(wxCommandEvent& ev) { @@ -373,28 +377,61 @@ void PackagesWindow::onOk(wxCommandEvent& ev) { //%% NOTE: The above text is for the locale.pl program } -void PackagesWindow::onUpdateUI(wxUpdateUIEvent& ev) { +void PackagesWindow::onUpdateUI(wxUpdateUIEvent& ev) { + bool is_group = package_list->selectionIsGroup(); wxToggleButton* w = (wxToggleButton*)ev.GetEventObject(); switch (ev.GetId()) { case ID_KEEP: - w->SetValue(package && package->has(PACKAGE_ACT_NOTHING)); - w->Enable (package && package->can(PACKAGE_ACT_NOTHING | where)); - w->SetLabel(package && package->installed ? _BUTTON_("keep package") : _BUTTON_("don't install package")); + w->SetValue( + package_list->allSelectedPackages([&](const InstallablePackageP& p) { + return p->has(PACKAGE_ACT_NOTHING); + }) + ); + w->Enable( + package_list->anySelectedPackage([&](const InstallablePackageP& p) { + return p->can(PACKAGE_ACT_NOTHING | where); + }) + ); + w->SetLabel(is_group ? _BUTTON_("keep group") : + package && package->installed ? _BUTTON_("keep package") : + _BUTTON_("don't install package")); break; case ID_INSTALL: - w->SetValue(package && package->has(PACKAGE_ACT_INSTALL | where)); - w->Enable (package && package->can(PACKAGE_ACT_INSTALL | where)); - w->SetLabel(!(package && package->installed) ? _BUTTON_("install package") - : (package && package->has(PACKAGE_UPDATES)) ? _BUTTON_("upgrade package") - : _BUTTON_("reinstall package")); + w->SetValue( + package_list->allSelectedPackages([&](const InstallablePackageP& p) { + return p->has(PACKAGE_ACT_INSTALL | where) || + (p->has(PACKAGE_INSTALLED) && !p->has(PACKAGE_ACT_REMOVE) && !p->has(PACKAGE_UPDATES)); + }) && + package_list->anySelectedPackage([&](const InstallablePackageP& p) { + return p->has(PACKAGE_ACT_INSTALL | where); + }) + ); + w->Enable( + package_list->anySelectedPackage([&](const InstallablePackageP& p) { + return p->can(PACKAGE_ACT_INSTALL | where); + }) + ); + w->SetLabel(is_group ? _BUTTON_("install group") : + !(package && package->installed) ? _BUTTON_("install package") : + (package && package->has(PACKAGE_UPDATES)) ? _BUTTON_("upgrade package") : + _BUTTON_("reinstall package")); break; case ID_REMOVE: - w->SetValue(package && package->has(PACKAGE_ACT_REMOVE | where)); - w->Enable (package && package->can(PACKAGE_ACT_REMOVE | where)); - //w->SetLabel(package && package->... ? _BUTTON_("remove group") : _BUTTON_("remove package")); + w->SetValue( + package_list->allSelectedPackages([&](const InstallablePackageP& p) { + return p->has(PACKAGE_ACT_REMOVE | where) || + (!p->has(PACKAGE_INSTALLED) && !p->has(PACKAGE_ACT_INSTALL)); + }) + ); + w->Enable( + package_list->anySelectedPackage([&](const InstallablePackageP& p) { + return p->can(PACKAGE_ACT_REMOVE | where); + }) + ); + w->SetLabel(is_group ? _BUTTON_("remove group") : + _BUTTON_("remove package")); break; } - // TODO: change labels to _BUTTON_("install group"), _BUTTON_("remove group"), _BUTTON_("upgrade group") } void PackagesWindow::onIdle(wxIdleEvent& ev) { @@ -414,7 +451,7 @@ bool PackagesWindow::checkInstallerList(bool refresh) { // refresh if (refresh) { package_list->rebuild(); - package_info->setPackage(package = package_list->getSelection()); + package_info->setPackage(package = package_list->getSelectedPackage()); UpdateWindowUI(wxUPDATE_UI_RECURSE); } return true;