add "update group" buttons to package manager

This commit is contained in:
GenevensiS
2026-05-15 15:37:56 +02:00
parent 8fadb1f099
commit 754ca3bccf
15 changed files with 171 additions and 61 deletions
+2
View File
@@ -898,6 +898,8 @@ button:
upgrade package: 升级 upgrade package: 升级
reinstall package: 重新安装 reinstall package: 重新安装
remove package: 移除 remove package: 移除
#TODO: Localize
keep group: Keep Group As Is
install group: 全部安装 install group: 全部安装
upgrade group: 全部升级 upgrade group: 全部升级
remove group: 全部移除 remove group: 全部移除
+2
View File
@@ -896,6 +896,8 @@ button:
upgrade package: 昇級 upgrade package: 昇級
reinstall package: 重新安裝 reinstall package: 重新安裝
remove package: 移除 remove package: 移除
#TODO: Localize
keep group: Keep Group As Is
install group: 全部安裝 install group: 全部安裝
upgrade group: 全部昇級 upgrade group: 全部昇級
remove group: 全部移除 remove group: 全部移除
+2
View File
@@ -914,6 +914,8 @@ button:
upgrade package: &Opdatér upgrade package: &Opdatér
reinstall package: Gen&installér reinstall package: Gen&installér
remove package: &Fjern remove package: &Fjern
#TODO: Localize
keep group: Keep Group As Is
install group: &Installér Alt install group: &Installér Alt
upgrade group: &Opgradér Alt upgrade group: &Opgradér Alt
remove group: &Fjern Alt remove group: &Fjern Alt
+6 -5
View File
@@ -825,15 +825,16 @@ button:
close: &Beenden close: &Beenden
# packages window # packages window
keep package: &Nicht verändern keep package: &Unverändert beibehalten
don't install package: &Nicht installieren don't install package: &Nicht installieren
install package: &Installieren install package: &Installieren
upgrade package: &Upgraden upgrade package: &Aktualisieren
reinstall package: Neu &installieren reinstall package: Neu &installieren
remove package: &Entfernen remove package: &Entfernen
install group: &Installiere alle keep group: Gruppe unverändert beibehalten
upgrade group: &Upgrade alle install group: Gruppe installieren/aktualisieren
remove group: &Entferne alle upgrade group: Gruppe aktualisieren
remove group: Gruppe entfernen
############################################################## Titles in the GUI ############################################################## Titles in the GUI
title: title:
+6 -5
View File
@@ -826,15 +826,16 @@ button:
close: &Close close: &Close
# packages window # packages window
keep package: &Don't change keep package: Keep As Is
don't install package: &Don't install don't install package: &Don't Install
install package: &Install install package: &Install
upgrade package: &Update upgrade package: &Update
reinstall package: Re&install reinstall package: Re&install
remove package: &Remove remove package: &Remove
install group: &Install All keep group: Keep Group As Is
upgrade group: &Upgrade All install group: &Install/Update Group
remove group: &Remove All upgrade group: &Update Group
remove group: &Remove Group
############################################################## Titles in the GUI ############################################################## Titles in the GUI
title: title:
+2
View File
@@ -899,6 +899,8 @@ button:
upgrade package: &Actualizar upgrade package: &Actualizar
reinstall package: R&einstalar reinstall package: R&einstalar
remove package: &Eliminar remove package: &Eliminar
#TODO: Localize
keep group: Keep Group As Is
install group: Instalar &Todos install group: Instalar &Todos
upgrade group: A&ctualizar Todos upgrade group: A&ctualizar Todos
remove group: Q&uitar Todos remove group: Q&uitar Todos
+5 -4
View File
@@ -828,12 +828,13 @@ button:
keep package: &Ne pas modifier keep package: &Ne pas modifier
don't install package: &Ne pas installer don't install package: &Ne pas installer
install package: &Installer install package: &Installer
upgrade package: &Upgrader upgrade package: &Mettre à jour
reinstall package: Ré&installer reinstall package: Ré&installer
remove package: &Supprimer remove package: &Supprimer
install group: &Installer Tout keep group: &Ne pas modifier le groupe
upgrade group: &Upgrader Tout install group: &Installer/Mettre à jour le groupe
remove group: &Supprimer Tout upgrade group: &Mettre à jour le groupe
remove group: &Supprimer le groupe
############################################################## Titles in the GUI ############################################################## Titles in the GUI
title: title:
+6 -5
View File
@@ -825,15 +825,16 @@ button:
close: &Chiudi close: &Chiudi
# packages window # packages window
keep package: &Non modificare keep package: &Mantieni così com'è
don't install package: &Non installare don't install package: &Non installare
install package: &Installa install package: &Installa
upgrade package: Aggiorna (&U) upgrade package: Aggiorna
reinstall package: Re&installa reinstall package: Re&installa
remove package: &Rimuovi remove package: &Rimuovi
install group: &Installa Tutto keep group: Mantieni il gruppo così com'è
upgrade group: &Upgrade Tutto install group: &Installa/Aggiorna il gruppo
remove group: &Rimuovi Tutto upgrade group: &Aggiorna il gruppo
remove group: &Rimuovi il gruppo
############################################################## Titles in the GUI ############################################################## Titles in the GUI
title: title:
+2
View File
@@ -898,6 +898,8 @@ button:
upgrade package: &アップグレード upgrade package: &アップグレード
reinstall package: 再インストール reinstall package: 再インストール
remove package: &取り外す remove package: &取り外す
#TODO: Localize
keep group: Keep Group As Is
install group: すべてインストールする install group: すべてインストールする
upgrade group: すべてアップグレードする upgrade group: すべてアップグレードする
remove group: すべて削除する remove group: すべて削除する
+2
View File
@@ -904,6 +904,8 @@ button:
upgrade package: 업데이트 upgrade package: 업데이트
reinstall package: 재설치 reinstall package: 재설치
remove package: 제거하다 remove package: 제거하다
#TODO: Localize
keep group: Keep Group As Is
install group: 모두 설치 install group: 모두 설치
upgrade group: 모두 업그레이드 upgrade group: 모두 업그레이드
remove group: 모두 제거 remove group: 모두 제거
+2
View File
@@ -952,6 +952,8 @@ button:
upgrade package: &Uaktualnij upgrade package: &Uaktualnij
reinstall package: Zainstaluj &ponownie reinstall package: Zainstaluj &ponownie
remove package: &Usuń remove package: &Usuń
#TODO: Localize
keep group: Keep Group As Is
install group: &Instaluj wszystkie install group: &Instaluj wszystkie
upgrade group: &Uaktualnij wszystkie upgrade group: &Uaktualnij wszystkie
remove group: &Usuń wszystkie remove group: &Usuń wszystkie
+6 -5
View File
@@ -826,15 +826,16 @@ button:
close: &Fechar close: &Fechar
# packages window # packages window
keep package: Não& alterar keep package: Manter como está
don't install package: Não& instalar don't install package: Não& instalar
install package: &Instalar install package: &Instalar
upgrade package: &Atualizações upgrade package: &Atualizar
reinstall package: Re&instalar reinstall package: Re&instalar
remove package: &Remover remove package: &Remover
install group: &Instalar Tudo keep group: &Manter o grupo como está
upgrade group: &Atualizar tudo install group: &Instalar/Atualizar o grupo
remove group: &Remover tudo upgrade group: &Atualizar o grupo
remove group: &Remover o grupo
############################################################## Titles in the GUI ############################################################## Titles in the GUI
title: title:
+2
View File
@@ -940,6 +940,8 @@ button:
upgrade package: Обновить upgrade package: Обновить
reinstall package: Переустановить reinstall package: Переустановить
remove package: Удалить remove package: Удалить
#TODO: Localize
keep group: Keep Group As Is
install group: Установить все install group: Установить все
upgrade group: Обновить все upgrade group: Обновить все
remove group: Удалить все remove group: Удалить все
+57 -5
View File
@@ -20,12 +20,28 @@ public:
PackageUpdateList(Window* parent, const InstallablePackages& packages, bool show_only_installable, int id = wxID_ANY); PackageUpdateList(Window* parent, const InstallablePackages& packages, bool show_only_installable, int id = wxID_ANY);
~PackageUpdateList(); ~PackageUpdateList();
inline InstallablePackageP getSelection() const { class TreeItem;
return selection == NOTHING ? InstallablePackageP() : get(selection);
inline InstallablePackageP getSelectedPackage() const {
TreeItem* ti = getSelectedItem();
return ti ? ti->package : InstallablePackageP();
} }
inline InstallablePackageP get(size_t item) const { inline bool selectionIsGroup() const {
return static_pointer_cast<TreeItem>(items[item])->package; TreeItem* ti = getSelectedItem();
return ti && !ti->package;
}
inline void forEachSelectedPackage(const std::function<void(const InstallablePackageP&)>& fn) const {
forEachPackage(getSelectedItem(), fn);
}
inline bool anySelectedPackage(const std::function<bool(const InstallablePackageP&)>& predicate) const {
return anyPackage(getSelectedItem(), predicate);
}
inline bool allSelectedPackages(const std::function<bool(const InstallablePackageP&)>& predicate) const {
return allPackages(getSelectedItem(), predicate);
} }
protected: protected:
@@ -38,12 +54,48 @@ protected:
int columnWidth(size_t column) const override; int columnWidth(size_t column) const override;
private: private:
inline TreeItem* getSelectedItem() const {
return selection >= items.size() ? nullptr : static_pointer_cast<TreeItem>(items[selection]).get();
}
inline void forEachPackage(const TreeItem* item, const std::function<void(const InstallablePackageP&)>& 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<bool(const InstallablePackageP&)>& 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<bool(const InstallablePackageP&)>& 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 /// The list of packages we are displaying
const InstallablePackages& packages; const InstallablePackages& packages;
/// Show only packages with an installer? /// Show only packages with an installer?
bool show_only_installable; bool show_only_installable;
class TreeItem;
public: public:
typedef intrusive_ptr<TreeItem> TreeItemP; typedef intrusive_ptr<TreeItem> TreeItemP;
private: private:
+56 -19
View File
@@ -200,6 +200,7 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) {
v2->Add(keep_button, 0, wxEXPAND | wxBOTTOM, 4); v2->Add(keep_button, 0, wxEXPAND | wxBOTTOM, 4);
v2->AddStretchSpacer(); 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); h->Add(v2);
v->Add(h, 0, wxEXPAND | (wxALL & ~wxTOP), 8); v->Add(h, 0, wxEXPAND | (wxALL & ~wxTOP), 8);
wxBoxSizer* h2 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* h2 = new wxBoxSizer(wxHORIZONTAL);
@@ -207,7 +208,7 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) {
h2->AddStretchSpacer(); h2->AddStretchSpacer();
h2->Add(CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND | (wxALL & ~wxTOP), 8); h2->Add(CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND | (wxALL & ~wxTOP), 8);
v->Add(h2, 0, wxEXPAND); v->Add(h2, 0, wxEXPAND);
v->SetMinSize(800,600); v->SetMinSize(820,650);
SetSizerAndFit(v); SetSizerAndFit(v);
wxUpdateUIEvent::SetMode(wxUPDATE_UI_PROCESS_SPECIFIED); wxUpdateUIEvent::SetMode(wxUPDATE_UI_PROCESS_SPECIFIED);
@@ -217,24 +218,27 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) {
PackagesWindow::~PackagesWindow() { PackagesWindow::~PackagesWindow() {
} }
void PackagesWindow::onPackageSelect(wxCommandEvent& ev) { void PackagesWindow::onPackageSelect(wxCommandEvent& ev) {
package_info->setPackage(package = package_list->getSelection()); package_info->setPackage(package = package_list->getSelectedPackage());
UpdateWindowUI(wxUPDATE_UI_RECURSE); UpdateWindowUI(wxUPDATE_UI_RECURSE);
} }
void PackagesWindow::onActionChange(wxCommandEvent& ev) { void PackagesWindow::onActionChange(wxCommandEvent& ev) {
if (package) {
PackageAction act = ev.GetId() == ID_INSTALL ? PACKAGE_ACT_INSTALL PackageAction act = ev.GetId() == ID_INSTALL ? PACKAGE_ACT_INSTALL
: ev.GetId() == ID_UPGRADE ? PACKAGE_ACT_INSTALL : ev.GetId() == ID_UPGRADE ? PACKAGE_ACT_INSTALL
: ev.GetId() == ID_REMOVE ? PACKAGE_ACT_REMOVE : ev.GetId() == ID_REMOVE ? PACKAGE_ACT_REMOVE
: PACKAGE_ACT_NOTHING; : PACKAGE_ACT_NOTHING;
act = act | where; act = act | where;
// set action // set action
set_package_action(installable_packages, package, act); package_list->forEachSelectedPackage(
[&](const InstallablePackageP& p) {
if (p->can(act)) {
set_package_action(installable_packages, p, act);
}
}
);
package_list->Refresh(false); package_list->Refresh(false);
UpdateWindowUI(wxUPDATE_UI_RECURSE); UpdateWindowUI(wxUPDATE_UI_RECURSE);
}
} }
void PackagesWindow::onOk(wxCommandEvent& ev) { void PackagesWindow::onOk(wxCommandEvent& ev) {
@@ -374,27 +378,60 @@ void PackagesWindow::onOk(wxCommandEvent& ev) {
} }
void PackagesWindow::onUpdateUI(wxUpdateUIEvent& ev) { void PackagesWindow::onUpdateUI(wxUpdateUIEvent& ev) {
bool is_group = package_list->selectionIsGroup();
wxToggleButton* w = (wxToggleButton*)ev.GetEventObject(); wxToggleButton* w = (wxToggleButton*)ev.GetEventObject();
switch (ev.GetId()) { switch (ev.GetId()) {
case ID_KEEP: case ID_KEEP:
w->SetValue(package && package->has(PACKAGE_ACT_NOTHING)); w->SetValue(
w->Enable (package && package->can(PACKAGE_ACT_NOTHING | where)); package_list->allSelectedPackages([&](const InstallablePackageP& p) {
w->SetLabel(package && package->installed ? _BUTTON_("keep package") : _BUTTON_("don't install package")); 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; break;
case ID_INSTALL: case ID_INSTALL:
w->SetValue(package && package->has(PACKAGE_ACT_INSTALL | where)); w->SetValue(
w->Enable (package && package->can(PACKAGE_ACT_INSTALL | where)); package_list->allSelectedPackages([&](const InstallablePackageP& p) {
w->SetLabel(!(package && package->installed) ? _BUTTON_("install package") return p->has(PACKAGE_ACT_INSTALL | where) ||
: (package && package->has(PACKAGE_UPDATES)) ? _BUTTON_("upgrade package") (p->has(PACKAGE_INSTALLED) && !p->has(PACKAGE_ACT_REMOVE) && !p->has(PACKAGE_UPDATES));
: _BUTTON_("reinstall package")); }) &&
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; break;
case ID_REMOVE: case ID_REMOVE:
w->SetValue(package && package->has(PACKAGE_ACT_REMOVE | where)); w->SetValue(
w->Enable (package && package->can(PACKAGE_ACT_REMOVE | where)); package_list->allSelectedPackages([&](const InstallablePackageP& p) {
//w->SetLabel(package && package->... ? _BUTTON_("remove group") : _BUTTON_("remove package")); 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; break;
} }
// TODO: change labels to _BUTTON_("install group"), _BUTTON_("remove group"), _BUTTON_("upgrade group")
} }
void PackagesWindow::onIdle(wxIdleEvent& ev) { void PackagesWindow::onIdle(wxIdleEvent& ev) {
@@ -414,7 +451,7 @@ bool PackagesWindow::checkInstallerList(bool refresh) {
// refresh // refresh
if (refresh) { if (refresh) {
package_list->rebuild(); package_list->rebuild();
package_info->setPackage(package = package_list->getSelection()); package_info->setPackage(package = package_list->getSelectedPackage());
UpdateWindowUI(wxUPDATE_UI_RECURSE); UpdateWindowUI(wxUPDATE_UI_RECURSE);
} }
return true; return true;