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
-
+