From a52f8ecc16084612995450ff50244bd4105df2c6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 15 Apr 2025 18:05:10 +0600 Subject: [PATCH] WIP app chooser window --- source/libublsettingsui-gtk3-app-chooser.c | 140 +++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 source/libublsettingsui-gtk3-app-chooser.c diff --git a/source/libublsettingsui-gtk3-app-chooser.c b/source/libublsettingsui-gtk3-app-chooser.c new file mode 100644 index 0000000..6d3a9e3 --- /dev/null +++ b/source/libublsettingsui-gtk3-app-chooser.c @@ -0,0 +1,140 @@ +#include "libublsettingsui-gtk3.h" + +typedef struct { + GtkWidget *MainWindow; + GtkWidget *StatusBox; + GtkWidget *HeadLabel; + GtkWidget *WindowImage; + + GtkWidget *CancelButton; + GtkWidget *AcceptButton; + + GtkWidget *MainTree; + GtkCellRenderer *SelectionCell; + GtkTreeStore *treestore; + + GtkWidget *MainIconView; + GtkListStore *liststore; + + int apps_size; + config_str apps; + + dictionary *apps_convert; + + int multiple; +} yon_app_chooser_window; + +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/shared/applications",&window->apps_size); + return window->apps_size; +} + +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)){ + struct application *app = new(struct application); + app->name = g_key_file_get_string(file,"[Desktop Entry]","Name",NULL); + app->description = g_key_file_get_string(file,"[Desktop Entry]","Comment",NULL); + app->tags = g_key_file_get_string(file,"[Desktop Entry]","Categories",NULL); + app->execute = g_key_file_get_string(file,"[Desktop Entry]","Exec",NULL); + 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); + } + } + 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); + } + } + } +} + +yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise){ + 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"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->WindowImage = yon_gtk_builder_get_widget(builder,"WindowImage"); + + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + + window->MainTree = yon_gtk_builder_get_widget(builder,"MainTree"); + window->SelectionCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"MainWindow")); + window->treestore = GTK_TREE_STORE(gtk_builder_get_object(builder,"MainWindow")); + + window->MainIconView = yon_gtk_builder_get_widget(builder,"MainIconView"); + window->liststore = GTK_LIST_STORE(gtk_builder_get_object(builder,"MainWindow")); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_app_chooser_accept),window); + g_signal_connect(G_OBJECT(window->SelectionCell),"toggled",G_CALLBACK(on_app_selection_toggled),window); + + window->multiple = multiple_choise; + + if (!yon_apps_get(window)) return NULL; + if (!yon_app_chooser_convert_apps(window)) return NULL; + + + + +} \ No newline at end of file