From 498385c852e90222e73e0d6501dfe8d75d645acd Mon Sep 17 00:00:00 2001 From: Ivan Dmitrievich Yartsev Date: Tue, 16 Dec 2025 18:02:36 +0000 Subject: [PATCH] WIP task 45. Added packages tree --- gresource.xml | 1 + groups-list.csv | 4 +- source/CMakeLists.txt | 3 +- source/ubinstall-gtk-packages.c | 97 ++++++++++++++++++++---------- source/ubinstall-gtk-page-switch.c | 6 +- source/ubinstall-gtk.c | 5 ++ source/ubinstall-gtk.h | 5 +- ubinstall-gtk.glade | 39 +++++++++++- 8 files changed, 121 insertions(+), 39 deletions(-) diff --git a/gresource.xml b/gresource.xml index cfb8b35..758b5dc 100644 --- a/gresource.xml +++ b/gresource.xml @@ -60,6 +60,7 @@ services-list.csv network-list.csv filesystems-format-list.csv + groups-list.csv vfs-list.csv \ No newline at end of file diff --git a/groups-list.csv b/groups-list.csv index e683605..1c0afbd 100644 --- a/groups-list.csv +++ b/groups-list.csv @@ -1,6 +1,6 @@ GROUP_NAME;SUBGROUP_NAME;PACKAGES;DESCRIPTION -Containerization;ubm-docker;Docker and webmanager and utils -Containerization;ubm-podman;Podman and webmanager and utils +Containerization;;ubm-docker;Docker and webmanager and utils +Containerization;;ubm-podman;Podman and webmanager and utils Drivers;Printer;ubm-drv-brother;Brother printer drivers Drivers;Printer;ubm-drv-canon-capt;Canon CAPT Printer Driver Drivers;Printer;ubm-drv-canon-ufrii;Canon UFR II LIPSLX CARPS2 printer driver diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 91569dc..b775731 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -82,6 +82,7 @@ set(DEPENDFILES ../services-list.csv ../network-list.csv ../filesystems-format-list.csv + ../groups-list.csv ../vfs-list.csv ../icons-builtin/install_type_custom_normal.png ../icons-builtin/install_type_data_only_normal.png @@ -143,7 +144,7 @@ set(SOURCE_FILES ubinstall-gtk-configuration-mode.c ubinstall-gtk-decorations.c ubinstall-gtk-log.c - # ubinstall-gtk-password.c + ubinstall-gtk-packages.c ubinstall-gtk-saving.c ubinstall-gtk-standard.c ubinstall-gtk-install-start.c diff --git a/source/ubinstall-gtk-packages.c b/source/ubinstall-gtk-packages.c index 5390f1a..7026b25 100644 --- a/source/ubinstall-gtk-packages.c +++ b/source/ubinstall-gtk-packages.c @@ -1,11 +1,12 @@ #include "ubinstall-gtk.h" +GtkTreeIter *yon_category_check(GtkTreeStore *target,char *category); GtkTreeIter *yon_category_check(GtkTreeStore *target,char *category){ GtkTreeIter iter; GtkTreeIter *ret_iter = NULL; for_iter(target,&iter){ char *cur_category; - gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,0,&cur_category,-1); + gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,1,&cur_category,-1); if (!strcmp(cur_category,category)){ ret_iter = gtk_tree_iter_copy(&iter); } @@ -13,14 +14,15 @@ GtkTreeIter *yon_category_check(GtkTreeStore *target,char *category){ return ret_iter; } +GtkTreeIter *yon_subcategory_check(GtkTreeStore *target, GtkTreeIter *parent_iter, char *category); GtkTreeIter *yon_subcategory_check(GtkTreeStore *target, GtkTreeIter *parent_iter, char *category){ GtkTreeIter iter; GtkTreeIter *ret_iter = NULL; - gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,parent_iter); - for(int valid = 1; valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,parent_iter); + for(; valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ char *cur_category; - gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,0,&cur_category,-1); - if (!strcmp(cur_category,category)){ + gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,1,&cur_category,-1); + if ((yon_char_is_empty(cur_category)&&yon_char_is_empty(category))||!strcmp(cur_category,category)){ ret_iter = gtk_tree_iter_copy(&iter); } } @@ -28,44 +30,75 @@ GtkTreeIter *yon_subcategory_check(GtkTreeStore *target, GtkTreeIter *parent_ite } void yon_packages_tab_init(main_window *widgets){ - GHashTable *category = g_hash_table_new(g_str_hash,g_str_equal); - GHashTable *subcategory = g_hash_table_new(g_str_hash,g_str_equal); + // GHashTable *category = g_hash_table_new(g_str_hash,g_str_equal); + // GHashTable *subcategory = g_hash_table_new(g_str_hash,g_str_equal); int size; config_str packages = yon_resource_open_file(groups_list_path,&size); - for (int i=0;iPackagesList,parsed[0]); if (category_iter){ - GtkTreeIter *subcategory_iter = yon_subcategory_check(widgets->PackagesList,category_iter,parsed[0]); - if (subcategory_iter){ - GtkTreeIter package_iter; - gtk_tree_store_append(widgets->PackagesList,&package_iter,subcategory_iter); - gtk_tree_store_set(widgets->PackagesList,&package_iter,0,packages[2],1,packages[3],-1); - gtk_tree_iter_free(subcategory_iter); + if (!yon_char_is_empty(parsed[1])){ + GtkTreeIter *subcategory_iter = yon_subcategory_check(widgets->PackagesList,category_iter,parsed[1]); + if (subcategory_iter){ + GtkTreeIter package_iter; + gtk_tree_store_append(widgets->PackagesList,&package_iter,subcategory_iter); + gtk_tree_store_set(widgets->PackagesList,&package_iter,0,0,1,parsed[2],2,parsed[3],3,1,-1); + gtk_tree_iter_free(subcategory_iter); + } else { + GtkTreeIter subcatiter; + GtkTreeIter package_iter; + gtk_tree_store_append(widgets->PackagesList,&subcatiter,category_iter); + gtk_tree_store_set(widgets->PackagesList,&subcatiter,1,parsed[1],2,parsed[3],3,0,-1); + gtk_tree_store_append(widgets->PackagesList,&package_iter,&subcatiter); + gtk_tree_store_set(widgets->PackagesList,&package_iter,0,0,1,parsed[2],2,parsed[3],3,1,-1); + } + } else { + GtkTreeIter package_iter; + gtk_tree_store_append(widgets->PackagesList,&package_iter,category_iter); + gtk_tree_store_set(widgets->PackagesList,&package_iter,0,0,1,parsed[2],2,parsed[3],3,1,-1); } gtk_tree_iter_free(category_iter); + } else { + if (!yon_char_is_empty(parsed[1])){ + GtkTreeIter subcategory_iter; + GtkTreeIter catiter; + GtkTreeIter package_iter; + gtk_tree_store_append(widgets->PackagesList,&catiter,NULL); + gtk_tree_store_set(widgets->PackagesList,&catiter,1,parsed[0],2,parsed[3],3,0,-1); + gtk_tree_store_append(widgets->PackagesList,&subcategory_iter,&catiter); + gtk_tree_store_set(widgets->PackagesList,&subcategory_iter,1,parsed[1],2,parsed[3],3,0,-1); + gtk_tree_store_append(widgets->PackagesList,&package_iter,&subcategory_iter); + gtk_tree_store_set(widgets->PackagesList,&package_iter,1,parsed[2],2,parsed[3],3,1,-1); + } else { + GtkTreeIter package_iter; + GtkTreeIter catiter; + gtk_tree_store_append(widgets->PackagesList,&catiter,NULL); + gtk_tree_store_set(widgets->PackagesList,&catiter,1,parsed[0],2,parsed[3],3,0,-1); + gtk_tree_store_append(widgets->PackagesList,&package_iter,&catiter); + gtk_tree_store_set(widgets->PackagesList,&package_iter,0,0,1,parsed[2],2,parsed[3],3,1,-1); + } } } + gtk_tree_view_expand_all(GTK_TREE_VIEW(widgets->PackagesTree)); } -void yon_on_packages_chosen(GtkTreeStore *, char *path, main_window *widgets){ - GtkTreeIter iter, chiter; - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->PackagesList),&iter,path); - GtkTreePath *cur_path = gtk_tree_model_get_path(GTK_TREE_MODEL(widgets->PackagesList),&iter); - int depth = gtk_tree_path_get_depth(cur_path); - if (depth<2){ - GtkTreeIter *cur_parent, *cur_iter; - cur_parent = gtk_tree_iter_copy(&iter); - cur_iter = gtk_tree_iter_copy(&chiter); - switch(depth){ - case 0: - gtk_tree_model_iter_children(GTK_TREE_MODEL(widgets->PackagesList),cur_iter,&iter); - __attribute__((fallthrough)); - case 1: - gtk_tree_model_iter_children(GTK_TREE_MODEL(widgets->PackagesList),cur_iter,cur_parent); - - } - +void yon_on_packages_chosen(GtkWidget *, main_window *widgets){ + GtkTreeIter iter; + GtkTreeModel *model; + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->PackagesTree)),&model,&iter); + GtkTreeIter cur_parent, cur_iter; + int status; + gtk_tree_model_get(model,&iter,3,&status,-1); + if (status) + return; + gtk_tree_model_iter_children(model,&cur_parent,&iter); + gtk_tree_model_get(model,&cur_parent,3,&status,-1); + if (status){ + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->PackagesTree)),&cur_parent); + return; } + gtk_tree_model_iter_children(model,&cur_iter,&cur_parent); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->PackagesTree)),&cur_iter); } \ No newline at end of file diff --git a/source/ubinstall-gtk-page-switch.c b/source/ubinstall-gtk-page-switch.c index bedf2a1..83a8a7f 100644 --- a/source/ubinstall-gtk-page-switch.c +++ b/source/ubinstall-gtk-page-switch.c @@ -20,7 +20,7 @@ enum YON_PAGES yon_page_get_next(main_window *widgets, enum YON_PAGES page){ case YON_PAGE_USERS: return YON_PAGE_STARTUP; break; case YON_PAGE_STARTUP: return YON_PAGE_BOOTLOADER; break; case YON_PAGE_BOOTLOADER: return YON_PAGE_NETWORK; break; - case YON_PAGE_NETWORK: return YON_PAGE_KERNEL; break; + case YON_PAGE_NETWORK: return YON_PAGE_PACKAGES_HUB; break; case YON_PAGE_PACKAGES_HUB: return main_config.configure_mode? YON_PAGE_CONFIGURE_END : YON_PAGE_INSTALLATION; case YON_PAGE_INSTALL_COMMON: return YON_PAGE_OS_COMPONENTS; break; case YON_PAGE_INSTALL_SEPARATE: return YON_PAGE_OS_COMPONENTS; break; @@ -63,6 +63,7 @@ enum YON_PAGES yon_page_get_prev(enum YON_PAGES page){ case YON_PAGE_STARTUP: return YON_PAGE_USERS; break; case YON_PAGE_BOOTLOADER: return YON_PAGE_STARTUP; break; case YON_PAGE_NETWORK: return YON_PAGE_BOOTLOADER; break; + case YON_PAGE_PACKAGES_HUB: return YON_PAGE_NETWORK; case YON_PAGE_INSTALLATION: return YON_PAGE_INSTALLATION; break; case YON_PAGE_CONFIGURE_END: return YON_PAGE_CONFIGURE_END; break; case YON_PAGE_INSTALL_COMMON: return YON_PAGE_SECTIONS; break; @@ -384,6 +385,9 @@ void yon_page_init(main_window *widgets, enum YON_PAGES page){ case YON_PAGE_NETWORK: yon_network_init(widgets); break; + case YON_PAGE_PACKAGES_HUB: + yon_packages_tab_init(widgets); + break; case YON_PAGE_INSTALL_ADVANCED: yon_install_advanced_init(widgets); __attribute__((fallthrough)); diff --git a/source/ubinstall-gtk.c b/source/ubinstall-gtk.c index b0bd584..a4d05c2 100644 --- a/source/ubinstall-gtk.c +++ b/source/ubinstall-gtk.c @@ -1082,6 +1082,10 @@ void yon_main_window_create(main_window *widgets){ widgets->HostnameSensitiveSwitch = yon_gtk_builder_get_widget(builder,"HostnameSensitiveSwitch"); widgets->AutoHostnameCheck=yon_gtk_builder_get_widget(builder,"AutoHostnameCheck"); widgets->AdvancedVirtualDeviceLabel = yon_gtk_builder_get_widget(builder,"AdvancedVirtualDeviceLabel"); + + widgets->PackagesTree = yon_gtk_builder_get_widget(builder,"PackagesTree"); + widgets->PackagesList = GTK_TREE_STORE(gtk_builder_get_object(builder,"Packages")); + widgets->network_connections = NULL; widgets->pacmanchosen = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); @@ -1211,6 +1215,7 @@ void yon_main_window_create(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->AdvancedAddButton),"clicked",G_CALLBACK(on_advanced_partition_create),widgets); g_signal_connect(G_OBJECT(widgets->AdvancedPartChosenCell),"toggled",G_CALLBACK(on_install_advanced_partition_chosen),widgets); g_signal_connect(G_OBJECT(widgets->AdvancedVirtualDeviceCombo),"changed",G_CALLBACK(on_advanced_virtual_device_changed),widgets); + g_signal_connect(G_OBJECT(widgets->PackagesTree),"cursor-changed",G_CALLBACK(yon_on_packages_chosen),widgets); g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),widgets); g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h index a464ab1..1f393b6 100755 --- a/source/ubinstall-gtk.h +++ b/source/ubinstall-gtk.h @@ -728,6 +728,7 @@ typedef struct { GSequence *advanced_partition_order; GtkTreeStore *PackagesList; + GtkWidget *PackagesTree; GFile *install_progress_file; @@ -1340,4 +1341,6 @@ void on_layout_default_toggled(GtkWidget *, int status, main_window *widgets); void on_layout_selection_changed(GtkTreeView *self,main_window *widgets); void on_num_lock_changed(GtkComboBox *self, main_window *); void on_model_changed(GtkComboBoxText *self, main_window *widgets); -void on_options_save(GtkWidget *,main_window *widgets); \ No newline at end of file +void on_options_save(GtkWidget *,main_window *widgets); +void yon_packages_tab_init(main_window *widgets); +void yon_on_packages_chosen(GtkWidget *, main_window *widgets); \ No newline at end of file diff --git a/ubinstall-gtk.glade b/ubinstall-gtk.glade index 33e8e88..818bb51 100644 --- a/ubinstall-gtk.glade +++ b/ubinstall-gtk.glade @@ -153,7 +153,18 @@ True False - + + + + + + + + + + + + @@ -6342,13 +6353,37 @@ agreement True True - + True True Packages + False + + + column + + + + 3 + 0 + + + + + + + column + + + + 1 + + + +