From a4a578af69f59a424d83898cb83775d509475775 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Nov 2025 13:35:43 +0600 Subject: [PATCH] App chooser dialog window changes, functions from libublsettings-gtk3 library are integrated --- libublsettingsui-gtk3-app-chooser.glade | 8 +- source/libublsettingsui-gtk3-app-chooser.c | 140 ++++++--------------- source/libublsettingsui-gtk3.h | 8 +- 3 files changed, 45 insertions(+), 111 deletions(-) diff --git a/libublsettingsui-gtk3-app-chooser.glade b/libublsettingsui-gtk3-app-chooser.glade index 4d75105..c508a52 100644 --- a/libublsettingsui-gtk3-app-chooser.glade +++ b/libublsettingsui-gtk3-app-chooser.glade @@ -20,16 +20,10 @@ - - - - - - @@ -115,7 +109,7 @@ 4 - 5 + 3 diff --git a/source/libublsettingsui-gtk3-app-chooser.c b/source/libublsettingsui-gtk3-app-chooser.c index 62d89bd..6f861e5 100644 --- a/source/libublsettingsui-gtk3-app-chooser.c +++ b/source/libublsettingsui-gtk3-app-chooser.c @@ -5,48 +5,7 @@ struct return_struct { int size; }; -struct application { - char *name; - char *path; - char *description; - char *tags; - char *execute; - char *icon; - config_str other; - int other_size; - -}; - -config_str yon_apps_get_from_file(char *file,int *final_size){ - (*final_size)=0; - config_str final = NULL; - int size; - config_str parsed = yon_dir_get_contents(file,&size); - for (int i=0;iapps = NULL; - window->apps_size=0; - int merged_size; - config_str merged = NULL; - - // int temp_size; - // config_str temp = yon_apps_get_from_file("/usr/shared/applications",&temp_size); - - // int local_size; - // config_str local = yon_apps_get_from_file("/usr/local/shared/applications",&temp_size); - - window->apps = yon_apps_get_from_file("/usr/share/applications",&window->apps_size); - return window->apps_size; -} +int yon_apps_already_init=0; void yon_block_visibility_if_unallowed(GtkWidget *self, GParamSpec* pspec,yon_app_chooser_window *window){ if (gtk_widget_get_visible(window->MainWindow)){ @@ -56,65 +15,12 @@ void yon_block_visibility_if_unallowed(GtkWidget *self, GParamSpec* pspec,yon_ap } } -int yon_app_chooser_convert_apps(yon_app_chooser_window *window){ - GKeyFile *file = g_key_file_new(); - window->apps_convert = NULL; - for (int i=0;iapps_size;i++){ - if (g_key_file_load_from_file(file,window->apps[i],G_KEY_FILE_KEEP_TRANSLATIONS,NULL)){ - char *exec_temp = yon_char_new(window->apps[i]); - free(yon_char_divide(exec_temp,yon_char_find_last(exec_temp,'/'))); - struct application *app = new(struct application); - memset(app,0,sizeof(struct application)); - app->name = g_key_file_get_locale_string(file,"Desktop Entry","Name",setlocale(LC_ALL,NULL),NULL); - app->description = g_key_file_get_locale_string(file,"[Desktop Entry","Comment",setlocale(LC_ALL,NULL),NULL); - app->tags = g_key_file_get_string(file,"Desktop Entry","Categories",NULL); - app->execute = yon_char_divide(exec_temp,yon_char_find_last(exec_temp,'.')); - app->icon = g_key_file_get_string(file,"Desktop Entry","Icon",NULL); - app->path = yon_char_new(window->apps[i]); - yon_dictionary_add_or_create_if_exists_with_data(window->apps_convert,app->name,app); - free(exec_temp); - } - } - if (window->apps_convert) return 1; else return 0; -} - -// int yon_tree_store_setup_apps(yon_app_chooser_window *window){ -// GtkTreeIter iter,itar; -// GtkTreeModel *model = GTK_TREE_MODEL(window->treestore); -// for_iter (model,&iter){ -// char *tags; -// gtk_tree_model_get(model,&iter,3,&tags,-1); -// int required_size; -// config_str required_tags = yon_char_parse(tags,&required_size,";"); - -// dictionary *dict; -// for_dictionaries(dict,window->apps_convert){ -// int parsed_size; -// struct application *cur_app = (struct application*)dict->data; -// config_str parsed_tags = yon_char_parse(cur_app->tags,&parsed_size,";"); -// if (yon_char_parsed_includes_char_parsed(required_tags,parsed_tags,required_size,parsed_size)){ -// gtk_tree_store_append(window->treestore,&itar,&iter); -// gtk_tree_store_set(window->treestore,&itar,0,0,1,cur_app->name,2,cur_app->description,3,cur_app->tags,4,0,5,cur_app->icon,6,cur_app->execute,-1); -// } -// } -// } -// } - -int yon_tree_store_setup_apps(yon_app_chooser_window *window){ - GtkTreeIter iter; - dictionary *dict; - for_dictionaries(dict,window->apps_convert){ - int parsed_size; - struct application *cur_app = (struct application*)dict->data; - gtk_tree_store_append(window->treestore,&iter,NULL); - gtk_tree_store_set(window->treestore,&iter,0,0,1,cur_app->name,2,cur_app->description,3,cur_app->tags,4,0,5,cur_app->icon,6,cur_app->execute,-1); - - } -} - config_str yon_app_chooser_window_run(yon_app_chooser_window *window, int *size){ gtk_widget_show(window->MainWindow); gtk_main(); + if (!yon_apps_already_init){ + yon_apps_uninit(); + } config_str final = window->final->chosen_apps; (*size)=window->final->size; free(window); @@ -140,7 +46,7 @@ void on_app_chooser_accept(GtkWidget *, yon_app_chooser_window *window){ for_iter(model,&iter){ int status; char *name; - gtk_tree_model_get(GTK_TREE_MODEL(window->treestore),&iter,0,&status,6,&name,-1); + gtk_tree_model_get(GTK_TREE_MODEL(window->treestore),&iter,0,&status,1,&name,-1); if (status){ yon_char_parsed_add_or_create_if_exists(window->final->chosen_apps,&window->final->size,name); } @@ -168,7 +74,12 @@ int yon_app_chooser_window_select(yon_app_chooser_window *window,config_str sele } } -yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise){ +yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise,...){ + if (yon_apps_check_init()){ + yon_apps_already_init=1; + } else { + yon_apps_init(); + } yon_app_chooser_window *window = new(yon_app_chooser_window); GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_app_chooser); window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); @@ -203,10 +114,33 @@ yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise){ gtk_cell_renderer_set_visible(GTK_CELL_RENDERER(window->SelectionCell),0); } + va_list list; + va_start(list,multiple_choise); + char *cur_section = NULL; + int sections_size; + config_str sections_list = NULL; + int section_titles_size; + config_str section_titles_list = NULL; + while ((cur_section = va_arg(list,char*))){ + if (yon_char_is_empty(cur_section)) break; + yon_char_parsed_add_or_create_if_exists(section_titles_list,§ion_titles_size,cur_section); + cur_section = va_arg(list,char*); + yon_char_parsed_add_or_create_if_exists(sections_list,§ions_size,cur_section); + } - if (!yon_app_chooser_apps_get(window)) return NULL; - if (!yon_app_chooser_convert_apps(window)) return NULL; - yon_tree_store_setup_apps(window); + for (int i=0;itreestore,&parent,NULL); + gtk_tree_store_set(window->treestore,&parent,1,section_titles_list[i],2,1,-1); + for (int k=0;ktreestore,&child,&parent); + gtk_tree_store_set(window->treestore,&child,1,cur_app->Name,3,cur_app->Icon,-1); + } + yon_char_parsed_free(apps_list,apps_size); + } return window; } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index e1901da..3eb074f 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -463,7 +463,13 @@ void yon_service_window_run(service_window *window); int yon_app_chooser_window_select(yon_app_chooser_window *window,config_str selection,int size); config_str yon_app_chooser_window_run(yon_app_chooser_window *window, int *size); -yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise); + + +/// @brief Create new application chooser dialog window; +/// @param multiple_choise Option that determines whether to add checkboxes for selecting multiple applications. +/// @param ... The sequence of categories and the displayed name in the application selection window +/// @return Structure with application selection dialog window +yon_app_chooser_window *yon_app_chooser_window_new(gboolean multiple_choise,...); typedef struct { GtkWidget *Window;