From a21a886e502d2ce8d8917044dbb71c23c3d35151 Mon Sep 17 00:00:00 2001 From: Ivan Dmitrievich Yartsev Date: Tue, 7 Apr 2026 11:07:04 +0600 Subject: [PATCH] Added package information to package/modules information windows --- source/ubinstall-gtk-components.c | 11 ++++-- source/ubinstall-gtk-kernel.c | 17 +++++---- source/ubinstall-gtk-packages.c | 18 ++++++++-- source/ubinstall-gtk-startup-apps.c | 2 +- source/ubinstall-gtk-startup-services.c | 2 +- source/ubinstall-gtk-ui-lang.c | 6 ++++ source/ubinstall-gtk.c | 46 +++++++++++++++++++++++++ source/ubinstall-gtk.h | 16 ++++++++- source/ubl-strings.h | 1 + 9 files changed, 103 insertions(+), 16 deletions(-) diff --git a/source/ubinstall-gtk-components.c b/source/ubinstall-gtk-components.c index 9bfe3e0..67fd321 100644 --- a/source/ubinstall-gtk-components.c +++ b/source/ubinstall-gtk-components.c @@ -40,7 +40,6 @@ int yon_kernel_save(main_window *widgets){ if (!main_config.configure_mode){ yon_debug_output("%s\n",yon_config_save_args_simple(main_config.config_load_path,packages_parameter, KERNEL_BOOT_parameter,NULL)); } - return 1; } @@ -181,6 +180,10 @@ int yon_os_components_save(main_window *widgets){ return 1; } +void on_os_components_info(GtkWidget *, char *, os_row *row){ + yon_package_info_window_create(row->modules); +} + os_row *yon_os_row_new(){ os_row *row = new(os_row); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_os_row); @@ -196,6 +199,7 @@ os_row *yon_os_row_new(){ row->modules=NULL; row->version=NULL; + g_signal_connect(G_OBJECT(row->NameLabel),"activate-link",G_CALLBACK(on_os_components_info),row); row->row = yon_gtk_builder_get_widget(builder,"MainRow"); gtk_widget_show(row->row); @@ -242,6 +246,7 @@ void *yon_modules_list_load(main_window *widgets){ void yon_os_row_setup(os_row *row, char *name, char *version,char *tags, char *description,char *source, char *size){ row->name = yon_char_new(name); row->source = yon_char_new(source); + row->modules = yon_char_new(name); char *description_full = yon_char_new(description); if (yon_char_is_empty(source)||yon_char_check_begins_with(source,"(local)/")){ @@ -250,7 +255,8 @@ void yon_os_row_setup(os_row *row, char *name, char *version,char *tags, char *d gtk_label_set_text(GTK_LABEL(row->SourceLabel),source); } - gtk_label_set_label(GTK_LABEL(row->NameLabel),name); + char *label_markup = yon_char_unite("",name,"",NULL); + gtk_label_set_markup(GTK_LABEL(row->NameLabel),label_markup); gtk_label_set_label(GTK_LABEL(row->VersionLabel),version); gtk_label_set_label(GTK_LABEL(row->DescriptionLabel),description_full); gtk_label_set_label(GTK_LABEL(row->SizeLabel),size); @@ -258,6 +264,7 @@ void yon_os_row_setup(os_row *row, char *name, char *version,char *tags, char *d yon_kernel_row_setup_tags((kernel_row*)row,tags); free(size); free(description_full); + free(label_markup); } gboolean yon_os_component_insert(struct row_data *row_input){ diff --git a/source/ubinstall-gtk-kernel.c b/source/ubinstall-gtk-kernel.c index 657f854..1ea1886 100644 --- a/source/ubinstall-gtk-kernel.c +++ b/source/ubinstall-gtk-kernel.c @@ -18,6 +18,10 @@ gboolean on_kernel_enabled_toggled(GtkWidget *self, GdkEventButton *, kernel_row return 0; } +void on_kernel_info(GtkWidget *, char *, kernel_row *row){ + yon_package_info_window_create(row->package); +} + kernel_row *yon_kernel_row_new(){ kernel_row *row = new(kernel_row); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_kernel_row); @@ -37,6 +41,7 @@ kernel_row *yon_kernel_row_new(){ g_signal_connect(G_OBJECT(row->InstallCheck),"toggled",G_CALLBACK(on_kernel_install_enabled),row); g_signal_connect(G_OBJECT(row->EnableRadio),"button-release-event",G_CALLBACK(on_kernel_enabled_toggled),row); + g_signal_connect(G_OBJECT(row->NameLabel),"activate-link",G_CALLBACK(on_kernel_info),row); row->row = gtk_list_box_row_new(); gtk_container_add(GTK_CONTAINER(row->row),row->RowBox); @@ -117,13 +122,15 @@ void yon_kernel_row_setup(kernel_row *row, char *name, char *modules,char *packa yon_char_parsed_free(description_wrapped,size); } char *modules_parsed = yon_char_replace(modules," ","\n"); - gtk_label_set_label(GTK_LABEL(row->NameLabel),name); + char *label_markup = yon_char_unite("",name,"",NULL); + gtk_label_set_markup(GTK_LABEL(row->NameLabel),label_markup); gtk_label_set_label(GTK_LABEL(row->ModulesLabel),modules_parsed); gtk_label_set_label(GTK_LABEL(row->DescriptionLabel),description_full); yon_kernel_row_setup_tags(row,tags); free(description_full); free(modules_parsed); + free(label_markup); } void yon_kernel_resize(main_window *widgets){ @@ -262,7 +269,6 @@ void on_kernel_addon_install_enabled(GtkWidget *, kernel_addon_row *row){ } } -void yon_gtk_label_set_font(GtkLabel *label); void yon_gtk_label_set_font(GtkLabel *label){ g_return_if_fail(GTK_IS_LABEL(label)); PangoAttrList *attributes = pango_attr_list_new(); @@ -273,13 +279,6 @@ void yon_gtk_label_set_font(GtkLabel *label){ gtk_label_set_attributes(GTK_LABEL(label),attributes); } -typedef struct { - GtkWidget *MainBox; - GtkWidget *InfoTree; - GtkListStore *InfoList; -} info_element; - -info_element *yon_package_info_element_new(); info_element *yon_package_info_element_new(){ info_element *element = malloc(sizeof(info_element)); memset(element,0,sizeof(info_element)); diff --git a/source/ubinstall-gtk-packages.c b/source/ubinstall-gtk-packages.c index cb2bfaa..cfc79a7 100644 --- a/source/ubinstall-gtk-packages.c +++ b/source/ubinstall-gtk-packages.c @@ -66,6 +66,20 @@ GtkTreeIter *yon_subcategory_check(GtkTreeStore *target, GtkTreeIter *parent_ite return ret_iter; } +void on_software_info(GtkWidget*, main_window *widgets){ + char *packages; + GtkTreeIter iter; + GtkTreeModel *model; + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->PackagesTree)),&model,&iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->PackagesList),&iter,5,&packages,-1); + int size=0; + config_str parsed = yon_char_parse(packages,&size,","); + for (int i=0;iPackagesList,&subcatiter,category_iter); - gtk_tree_store_set(widgets->PackagesList,&subcatiter,1,parsed[1],2,_(parsed[3]),3,0,-1); + gtk_tree_store_set(widgets->PackagesList,&subcatiter,1,parsed[1],2,_(parsed[1]),3,0,-1); gtk_tree_store_append(widgets->PackagesList,&package_iter,&subcatiter); char *full_string = yon_char_unite("",name_render,"\n",_(parsed[3]),NULL); gtk_tree_store_set(widgets->PackagesList,&package_iter,0,!!yon_char_check_elements(config_packages,parsed[2],",")||yon_char_check_elements(modules,parsed[2],","),1,parsed[2],2,full_string,3,1,4,!yon_char_check_elements(modules,parsed[2],","),5,parsed[2],-1); @@ -150,7 +164,7 @@ void yon_packages_tab_init(main_window *widgets){ gtk_tree_store_set(widgets->PackagesList,&subcategory_iter,1,parsed[1],2,_(parsed[1]),3,0,-1); gtk_tree_store_append(widgets->PackagesList,&package_iter,&subcategory_iter); char *full_string = yon_char_unite("",name_render,"\n",_(parsed[3]),NULL); - gtk_tree_store_set(widgets->PackagesList,&package_iter,0,!!yon_char_check_elements(config_packages,parsed[2],",")||yon_char_check_elements(modules,parsed[2],","),1,parsed[2],2,full_string,3,1,4,!yon_char_check_elements(modules,parsed[2],","),-1); + gtk_tree_store_set(widgets->PackagesList,&package_iter,0,!!yon_char_check_elements(config_packages,parsed[2],",")||yon_char_check_elements(modules,parsed[2],","),1,parsed[2],2,full_string,3,1,4,!yon_char_check_elements(modules,parsed[2],","),5,parsed[2],-1); free(full_string); } else { GtkTreeIter package_iter; diff --git a/source/ubinstall-gtk-startup-apps.c b/source/ubinstall-gtk-startup-apps.c index 9549a1b..4150a6f 100644 --- a/source/ubinstall-gtk-startup-apps.c +++ b/source/ubinstall-gtk-startup-apps.c @@ -51,7 +51,7 @@ void yon_startup_apps_init(main_window *widgets){ config_str apps_ret = yon_resource_open_file(apps_list_path,&size); apps_ret = yon_char_parsed_rip(apps_ret,&size,0); if (!size) return; - qsort(apps_ret,(size_t)size,sizeof(char *),(__compar_fn_t)yon_char_parsed_compare); + // qsort(apps_ret,(size_t)size,sizeof(char *),(__compar_fn_t)yon_char_parsed_compare); for (int i=0;iConfigurationModeMenuItem),"Label")); list = g_slist_append(list,g_object_get_data(G_OBJECT(widgets->EnableVNCMenuItem),"Label")); list = g_slist_append(list,g_object_get_data(G_OBJECT(widgets->EnableRDPMenuItem),"Label")); + dictionary *diter = NULL; + for_dictionaries (diter,widgets->PackagesMenu->buttons){ + GtkWidget *label = g_object_get_data(G_OBJECT(diter->data),"Label"); + list = g_slist_append(list,label); + } GSList *iter; for (iter = list; iter; iter = iter->next){ @@ -380,4 +385,5 @@ void yon_update_translation(main_window *widgets){ g_list_free(list); g_list_free(container); } + } \ No newline at end of file diff --git a/source/ubinstall-gtk.c b/source/ubinstall-gtk.c index bc256c4..ee6d7cf 100644 --- a/source/ubinstall-gtk.c +++ b/source/ubinstall-gtk.c @@ -7,6 +7,46 @@ void yon_license_init(main_window *widgets){ gtk_widget_set_sensitive(widgets->NextButton,0); } +yon_window *yon_package_info_window_create(const char *package_str){ + if (yon_char_is_empty(package_str)) return NULL; + yon_window *window = yon_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),NULL,PACKAGE_INFO_LABEL,icon_path,"info-label"); + int size=0; + char *package = yon_char_new(package_str); + if (strstr(package,",")){ + char *temp = yon_char_replace(package,","," "); + free(package); + package = temp; + } + + GtkWidget *label = NULL; + yon_packages_info *info_struct = yon_packages_get_info_struct(YON_PACKAGES_ALL,package); + if (!info_struct) return NULL; + char* info_string = yon_packages_get_info_string(info_struct); + config_str info = yon_char_parse(info_string,&size,"\n"); + if (size>0){ + info_element *element = yon_package_info_element_new(); + gtk_box_pack_start(GTK_BOX(window->MainBox),element->MainBox,1,1,0); + for (int i=0;iInfoList,&iter); + gtk_list_store_set(element->InfoList,&iter,0,parsed[0],1,!yon_char_is_empty(parsed[1])?_(parsed[1]):"",-1); + + } + } else { + label = gtk_label_new(PACKAGE_NOT_FOUND_LABEL); + yon_gtk_label_set_font(GTK_LABEL(label)); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(window->MainBox),label,0,0,0); + gtk_label_set_xalign(GTK_LABEL(label),0); + } + gtk_widget_show(window->Window); + return window; +} + double yon_password_check_func(yon_password_window *window, const char *password_string){ pwquality_settings_t *settings = pwquality_default_settings(); int strength = pwquality_check(settings,password_string,NULL,NULL,NULL); @@ -904,6 +944,12 @@ void yon_main_window_create(main_window *widgets){ yon_root_button_init(widgets->root_button,GTK_WINDOW(widgets->MainWindow)); } + widgets->PackagesMenu = yon_rmb_menu_setup(widgets->PackagesTree,NULL,NULL,INFO_LABEL,info_icon_path,G_CALLBACK(on_software_info),widgets,NULL); + + dictionary *iter = NULL; + for_dictionaries (iter,widgets->PackagesMenu->buttons){ + yon_gtk_widget_set_translation(g_object_get_data(G_OBJECT(iter->data),"Label")); + } yon_startup_language_init(); yon_locale_init(); yon_main_window_update_locale(widgets); diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h index fbe142a..f106171 100755 --- a/source/ubinstall-gtk.h +++ b/source/ubinstall-gtk.h @@ -49,6 +49,7 @@ #define add_icon_path "com.ublinux.libublsettingsui-gtk3.increase-symbolic" #define active_icon_path "com.ublinux.libublsettingsui-gtk3.active-symbolic" #define inactive_icon_path "com.ublinux.libublsettingsui-gtk3.inactive-symbolic" +#define info_icon_path "com.ublinux.libublsettingsui-gtk3.important-symbolic" #define LocalePath "/usr/share/locale" #define LocaleName "ubinstall-gtk" @@ -826,6 +827,7 @@ typedef struct GtkTreeStore *PackagesList; GtkCellRenderer *PackagesChosenCell; GtkWidget *PackagesTree; + rmb_menu_window *PackagesMenu; // Configuration hub slide section GtkWidget *ConfigHubRebootCombo; @@ -1227,6 +1229,12 @@ typedef struct GtkWidget *TextLabel; } slider_object; +typedef struct { + GtkWidget *MainBox; + GtkWidget *InfoTree; + GtkListStore *InfoList; +} info_element; + void config_init(); main_window *yon_main_window_complete(); ubinstall_language_window *yon_ubinstall_language_new(); @@ -1621,4 +1629,10 @@ gboolean on_kernel_addon_menu_block(GObject *self, GdkEventButton *event); void on_os_components_uncheck_all(GtkWidget *,main_window *widgets); gboolean yon_os_components_load(main_window *widgets); gboolean on_user_autoloin_switch(GtkWidget *, int status, main_window *); -void on_locale_selected(GtkTreeView *self,main_window *widgets); \ No newline at end of file +void on_locale_selected(GtkTreeView *self,main_window *widgets); +yon_window *yon_package_info_window_create(const char *package); +info_element *yon_package_info_element_new(); +void yon_gtk_label_set_font(GtkLabel *label); +void on_kernel_info(GtkWidget *, char *link, kernel_row *row); +void on_os_components_info(GtkWidget *, char *, os_row *row); +void on_software_info(GtkWidget*, main_window *widgets); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 7ab8b9e..eb3aa7f 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -303,6 +303,7 @@ NULL) #define EDIT_USER_LABEL _("Edit user") #define ACCESSED_LABEL _("Accessed") #define UNACCESSED_LABEL _("Unaccessed") +#define INFO_LABEL _("Package information") // #define _LABEL _("Chosen size:") // #define _LABEL _("Overall size:")