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: 升级
reinstall package: 重新安装
remove package: 移除
#TODO: Localize
keep group: Keep Group As Is
install group: 全部安装
upgrade group: 全部升级
remove group: 全部移除
+2
View File
@@ -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: 全部移除
+2
View File
@@ -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
+6 -5
View File
@@ -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:
+6 -5
View File
@@ -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:
+2
View File
@@ -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
+5 -4
View File
@@ -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:
+6 -5
View File
@@ -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:
+2
View File
@@ -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: すべて削除する
+2
View File
@@ -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: 모두 제거
+2
View File
@@ -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
+6 -5
View File
@@ -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:
+2
View File
@@ -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: Удалить все
+57 -5
View File
@@ -20,12 +20,28 @@ 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<TreeItem>(items[item])->package;
inline bool selectionIsGroup() const {
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:
@@ -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<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
const InstallablePackages& packages;
/// Show only packages with an installer?
bool show_only_installable;
class TreeItem;
public:
typedef intrusive_ptr<TreeItem> TreeItemP;
private:
+64 -27
View File
@@ -200,6 +200,7 @@ void PackagesWindow::init(Window* parent, bool show_only_installable) {
v2->Add(keep_button, 0, wxEXPAND | wxBOTTOM, 4);
v2->AddStretchSpacer();
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) {
@@ -374,27 +378,60 @@ void PackagesWindow::onOk(wxCommandEvent& 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;