diff --git a/gresource.xml b/gresource.xml index c8eccd6..6f92e06 100644 --- a/gresource.xml +++ b/gresource.xml @@ -9,6 +9,7 @@ libublsettingsui-gtk3-filechooser.glade libublsettingsui-gtk3-config-window.glade libublsettingsui-gtk3-service-control.glade + libublsettingsui-gtk3-app-chooser.glade libublsettingsui-gtk3.css diff --git a/libublsettingsui-gtk3-app-chooser.glade b/libublsettingsui-gtk3-app-chooser.glade new file mode 100644 index 0000000..db0a67c --- /dev/null +++ b/libublsettingsui-gtk3-app-chooser.glade @@ -0,0 +1,223 @@ + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.accept-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic + + + + + + + + + + + + + + + + + + + + + + 225 + 450 + False + True + com.ublinux.ubl-settings-video + + + True + False + vertical + 5 + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + vertical + 5 + + + checkbutton + True + False + True + + + False + True + 0 + + + + + True + False + + + True + True + in + + + True + True + treestore1 + False + 1 + 2 + True + + + + + + + + + 0 + + + + + 4 + + + 5 + + + + + + 1 + + + + + + + + + True + True + 0 + + + + + True + in + + + True + True + 6 + liststore1 + + + + + True + True + 1 + + + + + True + True + 1 + + + + + True + True + 1 + + + + + + + True + False + True + + + True + False + Choose application + + + + + + + + True + False + 32 + com.ublinux.libublsettingsui-gtk3 + + + + + Cancel + True + True + True + image2 + + + 1 + + + + + Accept + True + True + True + image1 + + + end + 2 + + + + + + diff --git a/libublsettingsui-gtk3-saving.glade b/libublsettingsui-gtk3-saving.glade index a8d5098..24def50 100644 --- a/libublsettingsui-gtk3-saving.glade +++ b/libublsettingsui-gtk3-saving.glade @@ -63,6 +63,7 @@ True False + 5 vertical diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 90da64b..b933e92 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -45,6 +45,7 @@ set(DEPENDFILES ../libublsettingsui-gtk3-debugger.glade ../libublsettingsui-gtk3-config-window.glade ../libublsettingsui-gtk3-service-control.glade + ../libublsettingsui-gtk3-app-chooser.glade ../gresource.xml ../libublsettingsui-gtk3-banner.png ../libublsettingsui-gtk3.css @@ -83,6 +84,7 @@ add_library(${PROJECT_NAME} SHARED libublsettingsui-gtk3-config-window.c libublsettingsui-gtk3-filechooser.c libublsettingsui-gtk3-service.c + libublsettingsui-gtk3-app-chooser.c libublsettingsui-gtk3.h ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/libublsettingsui-gtk3-app-chooser.c b/source/libublsettingsui-gtk3-app-chooser.c index 6d3a9e3..edf7789 100644 --- a/source/libublsettingsui-gtk3-app-chooser.c +++ b/source/libublsettingsui-gtk3-app-chooser.c @@ -1,28 +1,9 @@ #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 return_struct { + config_str chosen_apps; + int size; +}; struct application { char *name; @@ -43,8 +24,8 @@ config_str yon_apps_get_from_file(char *file,int *final_size){ config_str parsed = yon_dir_get_contents(file,&size); for (int i=0;iapps = yon_apps_get_from_file("/usr/shared/applications",&window->apps_size); + window->apps = yon_apps_get_from_file("/usr/share/applications",&window->apps_size); return window->apps_size; } +void yon_block_visibility_if_unallowed(GtkWidget *self, GParamSpec* pspec,yon_app_chooser_window *window){ + if (gtk_widget_get_visible(window->MainWindow)){ + if (!window->visible_allowed) + gtk_widget_set_visible(window->MainWindow,0); + else g_signal_handlers_block_by_func(G_OBJECT(window->MainWindow),yon_block_visibility_if_unallowed,window); + } +} + 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); + 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 = 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); } @@ -85,26 +75,81 @@ int yon_app_chooser_convert_apps(yon_app_chooser_window *window){ 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,itar; + 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(); + config_str final = window->final->chosen_apps; + (*size)=window->final->size; + free(window); + return final; +} + +void on_app_selection_toggled(GtkWidget *, char *path, yon_app_chooser_window *window){ + GtkTreeIter iter; + int status; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->treestore),&iter,path); + gtk_tree_model_get(GTK_TREE_MODEL(window->treestore),&iter,0,&status,-1); + gtk_tree_store_set(window->treestore,&iter,0,!status,-1); +} + +void on_app_chooser_window_closed(GtkWidget *, yon_app_chooser_window *window){ + gtk_main_quit(); +} + +void on_app_chooser_accept(GtkWidget *, yon_app_chooser_window *window){ + GtkTreeIter iter; 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); + if (window->multiple){ + for_iter(model,&iter){ + int status; + char *name; + 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); } } + } else { + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){ + char *name; + gtk_tree_model_get(GTK_TREE_MODEL(window->treestore),&iter,1,&name,-1); + yon_char_parsed_add_or_create_if_exists(window->final->chosen_apps,&window->final->size,name); + } } + gtk_widget_destroy(window->MainWindow); } yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise){ @@ -119,22 +164,32 @@ yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise){ 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->SelectionCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"SelectionCell")); + window->treestore = GTK_TREE_STORE(gtk_builder_get_object(builder,"treestore1")); window->MainIconView = yon_gtk_builder_get_widget(builder,"MainIconView"); - window->liststore = GTK_LIST_STORE(gtk_builder_get_object(builder,"MainWindow")); + window->liststore = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + window->visible_allowed=0; + window->final = new(struct return_struct); + + memset(window->final,0,sizeof(struct return_struct)); + + g_signal_connect(G_OBJECT(window->MainWindow),"notify::visibile",G_CALLBACK(yon_block_visibility_if_unallowed),window); + g_signal_connect(G_OBJECT(window->MainWindow),"destroy",G_CALLBACK(on_app_chooser_window_closed),window); 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); + + if (!window->multiple){ + gtk_cell_renderer_set_visible(GTK_CELL_RENDERER(window->SelectionCell),0); + } window->multiple = multiple_choise; if (!yon_apps_get(window)) return NULL; if (!yon_app_chooser_convert_apps(window)) return NULL; + yon_tree_store_setup_apps(window); - - - + return window; } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3-standard-callbacks.c b/source/libublsettingsui-gtk3-standard-callbacks.c new file mode 100644 index 0000000..f687004 --- /dev/null +++ b/source/libublsettingsui-gtk3-standard-callbacks.c @@ -0,0 +1,57 @@ +#include "libublsettingsui-gtk3.h" + +char *config_get_default_command = NULL; +char *config_get_global_command = NULL; +char *config_get_local_command = NULL; + +void yon_load_proceed(YON_CONFIG_TYPE type){ + yon_config_clean(); + if (!yon_char_is_empty(config_get_default_command)) + yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); + if (type==YON_CONFIG_GLOBAL){ + yon_config_load_config(type,config_get_global_command,NULL); + } else if (type==YON_CONFIG_LOCAL){ + yon_config_load_config(type,config_get_local_command,NULL); + } else if (type==YON_CONFIG_CUSTOM){ + char *path=""; + GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE, + yon_char_get_localised_from_lib(CANCEL_LABEL),GTK_RESPONSE_CANCEL, + yon_char_get_localised_from_lib(OPEN_LABEL),GTK_RESPONSE_ACCEPT,NULL); + yon_gtk_window_setup(GTK_WINDOW(dialog),NULL,template_app_information.app_title,yon_char_append("com.ublinux.",template_app_information.app_tech_name),"FileChooserWindow"); + gtk_window_set_icon_name(GTK_WINDOW(dialog),"com.ublinux.ubl-settings-video"); + gtk_window_set_title(GTK_WINDOW(dialog),template_app_information.app_title); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.ini"); + gtk_file_filter_set_name(filter, "*.ini"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); + gtk_widget_show(dialog); + int response = gtk_dialog_run(GTK_DIALOG(dialog)); + if (response == GTK_RESPONSE_ACCEPT){ + char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(file)){ + path=yon_char_unite("'",file,"'",NULL); + free(file); + } + gtk_widget_destroy(dialog); + } else { + gtk_widget_destroy(dialog); + } + yon_config_load_config(type,yon_config_get_custom_command(path),NULL); + } +} + +void on_config_local_load(){ + yon_load_proceed(YON_CONFIG_LOCAL); +} + +void on_config_global_load(){ + yon_load_proceed(YON_CONFIG_GLOBAL); +} + +void on_config_custom_load(){ + yon_load_proceed(YON_CONFIG_CUSTOM); +} + +void on_config_global_local_save(){ + yon_save_proceed(NULL,YON_CONFIG_BOTH,config_get_global_command,NULL); +} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index cb961e0..2c71354 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -27,6 +27,7 @@ #define ui_glade_path_filechooser "/com/ublinux/ui/libublsettingsui-gtk3-filechooser.glade" #define ui_glade_path_debug "/com/ublinux/ui/libublsettingsui-gtk3-debugger.glade" #define ui_glade_path_service "/com/ublinux/ui/libublsettingsui-gtk3-service-control.glade" +#define ui_glade_path_app_chooser "/com/ublinux/ui/libublsettingsui-gtk3-app-chooser.glade" #define ui_banner_path "/com/ublinux/images/libublsettingsui-gtk3-banner.png" #define ui_CssPath "/com/ublinux/css/libublsettingsui-gtk3.css" #define ui_config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",template_app_information.app_tech_name,"/",template_app_information.app_tech_name,".conf",NULL) @@ -331,12 +332,42 @@ typedef struct { char *check_enable_command; } service_window; +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; + + struct return_struct *final; + + int multiple; + int visible_allowed; +} yon_app_chooser_window; + service_window *yon_service_window_new(char *name, char *start_command, char *stop_command, char *enable_command, char *disable_command, char *info_command, char *check_active_command, char *check_enable_command); void yon_service_window_run(service_window *window); +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); + #define VERSION_LABEL yon_char_unite(_("Version:")," ",!yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",NULL) #define HELP_LABEL(rest) yon_char_unite(template_app_information.app_tech_name,_(" version:")," ", !yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",\ template_app_information.app_title,"\n",_("Usage:"), " ",template_app_information.app_tech_name," ",_("[OPTIONS]"),"\n",\