From 03b520c1f518e38c2b7985aada8f6ba9a2ada030 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Feb 2025 15:52:01 +0600 Subject: [PATCH] Added file chooser window functions --- gresource.xml | 1 + libublsettingsui-gtk3-filechooser.glade | 56 ++- source/CMakeLists.txt | 2 + source/libublsettingsui-gtk3-filechooser.c | 108 +++++ source/libublsettingsui-gtk3-save.c | 505 ++++++++++----------- source/libublsettingsui-gtk3-save.h | 27 ++ source/libublsettingsui-gtk3.h | 20 +- 7 files changed, 436 insertions(+), 283 deletions(-) create mode 100644 source/libublsettingsui-gtk3-filechooser.c create mode 100644 source/libublsettingsui-gtk3-save.h diff --git a/gresource.xml b/gresource.xml index 476ac68..9af9d5d 100644 --- a/gresource.xml +++ b/gresource.xml @@ -6,6 +6,7 @@ libublsettingsui-gtk3-documentation.glade libublsettingsui-gtk3-saving.glade libublsettingsui-gtk3-debugger.glade + libublsettingsui-gtk3-filechooser.glade libublsettingsui-gtk3-config-window.glade diff --git a/libublsettingsui-gtk3-filechooser.glade b/libublsettingsui-gtk3-filechooser.glade index c1ebeea..d7ed414 100644 --- a/libublsettingsui-gtk3-filechooser.glade +++ b/libublsettingsui-gtk3-filechooser.glade @@ -2,6 +2,22 @@ + + True + False + com.ublinux.libublsettingsui-gtk3.cancel-symbolic + + + + True + False + com.ublinux.libublsettingsui-gtk3.accept-symbolic + + 450 500 @@ -13,8 +29,8 @@ True False + 5 vertical - 5 True @@ -36,13 +52,10 @@ False 5 5 - 5 - 5 - 5 vertical 5 - + True False False @@ -54,6 +67,22 @@ 0 + + + Choose folder instead of file + True + True + False + end + True + + + False + True + end + 1 + + True @@ -67,7 +96,6 @@ True False - True True @@ -123,20 +151,4 @@ - - True - False - com.ublinux.libublsettingsui-gtk3.cancel-symbolic - - - - True - False - com.ublinux.libublsettingsui-gtk3.accept-symbolic - - diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 294004a..5bce0e2 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -41,6 +41,7 @@ set(DEPENDFILES ../libublsettingsui-gtk3-about.glade ../libublsettingsui-gtk3-documentation.glade ../libublsettingsui-gtk3-saving.glade + ../libublsettingsui-gtk3-filechooser.glade ../libublsettingsui-gtk3-debugger.glade ../libublsettingsui-gtk3-config-window.glade ../gresource.xml @@ -79,6 +80,7 @@ add_library(${PROJECT_NAME} SHARED libublsettingsui-gtk3.c libublsettingsui-gtk3-save.c libublsettingsui-gtk3-config-window.c + libublsettingsui-gtk3-filechooser.c libublsettingsui-gtk3.h ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c new file mode 100644 index 0000000..966031b --- /dev/null +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -0,0 +1,108 @@ +#include "libublsettingsui-gtk3.h" + +void on_file_chooser_accept(GtkWidget *, filechooser_window *window){ + switch (gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->MainFileChooser))){ + case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: + case GTK_FILE_CHOOSER_ACTION_SAVE: + window->responce=GTK_RESPONSE_APPLY; + break; + + case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: + case GTK_FILE_CHOOSER_ACTION_OPEN: + window->responce = GTK_RESPONSE_ACCEPT; + break; + } + gtk_widget_destroy(window->Window); + gtk_main_quit(); +} + +void on_file_chooser_cancel(GtkWidget *, filechooser_window *window){ + window->responce=GTK_RESPONSE_CANCEL; + gtk_widget_destroy(window->Window); + gtk_main_quit(); + +} + +char *yon_get_default_label_with_parameter(char *command){ + int size; + config_str parsed = yon_config_load(command,&size); + if (parsed){ + yon_char_remove_last_symbol(parsed[0],'\n'); + char *default_string = yon_char_unite(DEFAULT_LABEL," ","(",parsed[0],")",NULL); + return default_string; + } +} + +void on_file_chooser_selected(GtkWidget *self, filechooser_window *window){ + if (window->last_any_selection) free(window->last_any_selection); + if (window->last_success_selection) free(window->last_success_selection); + + GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(window->MainFileChooser)); + config_str paths_all = NULL; + config_str paths_success = NULL; + int all_size=0; + int success_size=0; + GtkFileChooserAction action = gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->MainFileChooser)); + for (int i=0;iChooseFolderCheck))&&yon_file_is_directory(data)) || + (action == GTK_FILE_CHOOSER_ACTION_OPEN&&!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck))&&!yon_file_is_directory(data)) || + (action == GTK_FILE_CHOOSER_ACTION_SAVE&&!yon_file_is_directory(data)) || + (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER&&yon_file_is_directory(data)) + ){ + yon_char_parsed_add_or_create_if_exists(paths_success,&success_size,data); + } + + yon_char_parsed_add_or_create_if_exists(paths_all,&all_size,data); + } + char *full_success = yon_char_parsed_to_string(paths_success,success_size,","); + char *full_all = yon_char_parsed_to_string(paths_all,all_size,","); + window->last_any_selection = yon_char_is_empty(full_all)?NULL:full_all; + window->last_success_selection = yon_char_is_empty(full_success)?NULL:full_success; + if (all_size) yon_char_parsed_free(paths_all,all_size); + if (success_size) yon_char_parsed_free(paths_success,success_size); +} + +filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){ + filechooser_window *window = malloc(sizeof(filechooser_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_filechooser); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->MainFileChooser = yon_gtk_builder_get_widget(builder,"MainFileChooser"); + window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->ChooseFolderCheck = yon_gtk_builder_get_widget(builder,"ChooseFolderCheck"); + window->last_any_selection=NULL; + window->last_success_selection=NULL; + g_signal_connect(G_OBJECT(window->MainFileChooser),"selection-changed",G_CALLBACK(on_file_chooser_selected),window); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_file_chooser_cancel),window); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_file_chooser_accept),window); + + gtk_file_chooser_set_action(GTK_FILE_CHOOSER(window->MainFileChooser),action); + switch(action){ + case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: + gtk_widget_hide(window->ChooseFolderCheck); + break; + case GTK_FILE_CHOOSER_ACTION_OPEN: + + break; + case GTK_FILE_CHOOSER_ACTION_SAVE: + gtk_widget_hide(window->ChooseFolderCheck); + break; + case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck),1); + gtk_widget_hide(window->ChooseFolderCheck); + break; + } + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + return window; +} + +GtkResponseType yon_file_chooser_start(filechooser_window *window){ + gtk_widget_show(window->Window); + gtk_main(); + + return window->responce; +} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index cd3d35f..affa0fc 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -1,79 +1,11 @@ #include "libublsettingsui-gtk3.h" +#include "libublsettingsui-gtk3-save.h" -struct loaded_config { - dictionary_fields(loaded_config); - char *section; -}; - -template_saving_window *yon_saving_window_new(); - -struct loaded_config *yon_config_convert_parameter(config_str parsed, int size); - -/**function and argument, which called after successful config saving. - * Example: - * void on_save_done(main_window *widgets, config_str output, int size) +/* + ============== + saving section + ============== */ -void (*save_success_function)(void*,config_str,int)=NULL; -void *save_success_argument=NULL; -void (*save_failure_function)(void*,config_str,int)=NULL; -void *save_failure_argument=NULL; - -void yon_save_window_set_postsave_function(void *function, void *data){ - save_success_function=function; - save_success_argument=data; -} - -void yon_save_window_set_postsave_failure_function(void *function, void *data){ - save_failure_function=function; - save_failure_argument=data; -} - -void on_save_window_parameter_switched(GtkCellRendererToggle *self, gchar *path, template_saving_window *window){ - GtkTreeIter iter,itar; - if (path){ - if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&itar,path)){ - gboolean is_active; - gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&is_active,-1); - gtk_list_store_set(window->list,&itar,0,!is_active,-1); - } - } - int once_active=0; - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){ - int is_active; - gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&is_active,-1); - if (is_active){ - once_active=1; - break; - } - } - if (!once_active) gtk_widget_set_sensitive(window->SaveButton,0); - else gtk_widget_set_sensitive(window->SaveButton,1); - -} - -template_debug_window *template_debugger_window_new(){ - template_debug_window *window = malloc(sizeof(template_debug_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug); - window->Window=yon_gtk_builder_get_widget(builder,"Window"); - window->HeaderTopic=yon_gtk_builder_get_widget(builder,"HeaderTopic"); - window->HeaderImage=yon_gtk_builder_get_widget(builder,"HeaderImage"); - window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox"); - window->Vte=yon_gtk_builder_get_widget(builder,"DebuggerTerminal"); - gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title); - gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title); - gtk_window_set_icon_name(GTK_WINDOW(window->Window),yon_char_append("com.ublinux.",template_app_information.app_tech_name)); - gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL)); - - yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DebugWindow"); - return window; -} - -struct save_return { - void *save_success_argument; - config_str file_return; - int file_save; -}; gboolean _yon_postsave_function_start(struct save_return *data){ save_success_function(data->save_success_argument,data->file_return,data->file_save); @@ -200,6 +132,202 @@ config_str yon_loaded_config_convert_to_save_command(struct loaded_config *targe } } +void yon_save_window_set_postsave_function(void *function, void *data){ + save_success_function=function; + save_success_argument=data; +} + +void yon_save_window_set_postsave_failure_function(void *function, void *data){ + save_failure_function=function; + save_failure_argument=data; +} + + +/* + ============== + window section + ============== +*/ +void yon_save_window_set_status(template_saving_window *window,char *path,YON_CONFIG_TYPE type){ + textdomain(template_ui_LocaleName); + window->type=type; + window->custom_save_path=path; + if (type==YON_CONFIG_BOTH){ + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); + } else if (type==YON_CONFIG_GLOBAL){ + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); + + } else if (type==YON_CONFIG_LOCAL){ + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); + } else if (type==YON_CONFIG_CUSTOM){ + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_CUSTOM_STATE_LABEL(path),BACKGROUND_IMAGE_INFO_TYPE); + } + textdomain(template_app_information.app_locale); +} + +gboolean yon_save_window_destroy_if_empty(template_saving_window *window){ + GtkTreeIter iter; + if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter)){ + gtk_widget_destroy(window->Window); + textdomain(template_ui_LocaleName); + yon_ubl_status_box_render(NOTHING_TO_SAVE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + textdomain(template_app_information.app_locale); + if (save_failure_function){ + + struct save_return *data = malloc(sizeof(struct save_return)); + data->save_success_argument = save_failure_argument; + data->file_return = NULL; + data->file_save = 0; + gdk_threads_add_idle((GSourceFunc)_yon_postsave_failure_function_start,data); + } + return 0; + } + return 1; +} + +void on_save_window_parameter_switched(GtkCellRendererToggle *self, gchar *path, template_saving_window *window){ + GtkTreeIter iter,itar; + if (path){ + if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&itar,path)){ + gboolean is_active; + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&is_active,-1); + gtk_list_store_set(window->list,&itar,0,!is_active,-1); + } + } + int once_active=0; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){ + int is_active; + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&is_active,-1); + if (is_active){ + once_active=1; + break; + } + } + if (!once_active) gtk_widget_set_sensitive(window->SaveButton,0); + else gtk_widget_set_sensitive(window->SaveButton,1); + +} + +template_saving_window *yon_saving_window_new(){ + GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_saving); + template_saving_window *window = malloc(sizeof(template_saving_window)); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage"); + window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->ParametersTree = yon_gtk_builder_get_widget(builder,"ParametersTree"); + window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ToggleCell")); + window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + window->OldValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"OldValueColumn")); + window->OldValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"OldValueCell")); + window->NewValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"NewValueColumn")); + window->NewValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"NewValueCell")); + window->filteredModel = GTK_TREE_MODEL(gtk_builder_get_object(builder,"listfilter1")); + yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"SaveWindow"); + char *icon_name = yon_char_append("com.ublinux.",template_app_information.app_tech_name); + gtk_window_set_icon_name(GTK_WINDOW(window->Window),icon_name); + gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title); + gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title); + gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL)); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_save_parameters),window); + g_signal_connect(G_OBJECT(window->ToggleCell),"toggled", G_CALLBACK(on_save_window_parameter_switched),window); + return window; +} + +/* + ====================== + config getting section + ====================== +*/ +char *yon_get_compare_config_command(va_list args,char *path,YON_CONFIG_TYPE type){ + char *cur_command; + char *compare_command=""; + while ((cur_command=va_arg(args,char*))){ + char *temp=cur_command; + cur_command = yon_config_parameter_prepare_command(cur_command,type!=YON_CONFIG_CUSTOM?yon_config_get_type_path(type):path,NULL,NULL); + char *temp_command = yon_char_unite(compare_command,!yon_char_is_empty(compare_command)?";":"",cur_command,NULL); + if (!yon_char_is_empty(compare_command)) free(compare_command); + compare_command = temp_command; + } + return yon_char_is_empty(compare_command)?NULL:compare_command; +} + +void yon_save_window_loaded_config_init(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){ + if (current_loaded){ + struct loaded_config *current = NULL; + for_dictionaries(current,current_loaded){ + if (!yon_config_check_ignore(current->key)){ + dictionary *dict = NULL; + if (!yon_config_compare_ignore_get(current->key)){ + dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value + } + gboolean status=0; + status = yon_config_get_status(current->key); + if (dict&&!yon_char_is_empty((char*)dict->data)&&status!=-2){ + if (strcmp((char*)dict->data,(char*)current->data)){ + GtkTreeIter iter; + if (status==0||status==-2) status = 0; + else status=1; + char *old_val = yon_char_new(current->data); + char *new_val = yon_char_new(dict->data); + if (strstr(old_val,"&")) {old_val = yon_char_replace(old_val,"&","\003");old_val = yon_char_replace(old_val,"\003","&");} + if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<"); + if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">"); + if (strstr(new_val,"&")) {int sz = 0; config_str new_val_parsed = yon_char_parse(new_val,&sz,"&");new_val = yon_char_parsed_to_string(new_val_parsed,sz,"&"); yon_char_parsed_free(new_val_parsed,sz);} + if (strstr(new_val,">")) new_val = yon_char_replace(new_val,">","<"); + if (strstr(new_val,"<")) new_val = yon_char_replace(new_val,"<",">"); + char *compare_string = yon_char_unite("",(char*)new_val,"\n",(char*)old_val,NULL); + gtk_list_store_append(window->list,&iter); + gtk_list_store_set(window->list,&iter,0,status,1,current->key,2,(char*)dict->data,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1); + free(compare_string); + } + } else if ((strcmp((char*)current->data,""))&&status!=-2){ + GtkTreeIter iter; + if (status==0||status==-2) status = 0; + else status=1; + char *old_val = yon_char_new(current->data); + if (strstr(old_val,"&")) {int sz = 0; config_str old_val_parsed = yon_char_parse(old_val,&sz,"&");old_val = yon_char_parsed_to_string(old_val_parsed,sz,"&"); yon_char_parsed_free(old_val_parsed,sz);} + if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<"); + if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">"); + char *compare_string = yon_char_unite("\n",(char*)old_val,NULL); + gtk_list_store_append(window->list,&iter); + gtk_list_store_set(window->list,&iter,0,status,1,current->key,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1); + free(compare_string); + } + } + } + } +} + +void yon_save_window_compared_config_init_unfound(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){ + if (config_compare){ + struct loaded_config *current = NULL; + for_dictionaries(current,config_compare){ + if (!yon_config_check_ignore(current->key)){ + GtkTreeIter iter; + dictionary *dict = yon_dictionary_get((dictionary**)¤t_loaded,current->key); + if (!dict){ + GdkRGBA rgba; + rgba.alpha=0.8; + rgba.red=1; + rgba.blue=0.3; + rgba.green=0.65; + char *rgba_string = gdk_rgba_to_string(&rgba); + int status=0; + char *compare_string = yon_char_unite((char*)current->data,"\n",NULL); + gtk_list_store_append(window->list,&iter); + gtk_list_store_set(window->list,&iter,0,0,1,current->key,2,(char*)current->data,4,compare_string,5,rgba_string,6,1,7,current->section,-1); + free(compare_string); + } + } + } + } +} + int yon_config_parameter_prepare_elements(config_str target, int *size){ int success = 0; for (int i=0;i<(*size);i++){ @@ -210,26 +338,6 @@ int yon_config_parameter_prepare_elements(config_str target, int *size){ return success; } -void on_save_parameters(GtkWidget *self, template_saving_window *window){ - textdomain(template_ui_LocaleName); - yon_ubl_status_box_render(SAVE_PROCESS_LABEL,BACKGROUND_IMAGE_INFO_TYPE); - textdomain(template_app_information.app_locale); - - int saved_size; - struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window); - - int size=0; - config_str commands = yon_loaded_config_convert_to_save_command(saved_parameters,&size,window->type!=YON_CONFIG_CUSTOM? yon_config_get_type_path(window->type):window->custom_save_path); - yon_config_parameter_prepare_elements(commands,&size); - - char *final_command = yon_char_parsed_to_string(commands,size,";"); - pthread_t thread_id; - pthread_create(&thread_id, NULL, (void *)_yon_saving_threaded,final_command); - - yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"SaveWindow"); - on_subwindow_close(self); -} - struct loaded_config *yon_config_convert_parameter(config_str parsed, int size){ struct loaded_config *loaded=NULL; for (int i=0;iWindow),NULL,template_app_information.app_title,yon_char_unite("com.ublinux.",template_app_information.app_tech_name,NULL),"ConfigFilechooserWindow"); GtkFileFilter *filter = gtk_file_filter_new(); - gtk_window_set_icon_name(GTK_WINDOW(dialog),yon_char_append("com.ublinux.",template_app_information.app_tech_name)); 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_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ - int response = gtk_dialog_run(GTK_DIALOG(dialog)); - if (response == GTK_RESPONSE_ACCEPT){ - char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + char *file = dialog->last_success_selection; if (!yon_char_is_empty(file)){ if (!strstr(file,".ini")) file = yon_char_append(file,".ini"); if (access(file,0)!=F_OK){ @@ -372,138 +478,56 @@ char *yon_custom_config_init(){ } } } - char *path = yon_char_unite("'",file,"'",NULL); free(file); - gtk_widget_destroy(dialog); + gtk_widget_destroy(dialog->Window); return path; - - } else { - gtk_widget_destroy(dialog); } - return NULL; -} -char *yon_get_compare_config_command(va_list args,char *path,YON_CONFIG_TYPE type){ - char *cur_command; - char *compare_command=""; - while ((cur_command=va_arg(args,char*))){ - char *temp=cur_command; - cur_command = yon_config_parameter_prepare_command(cur_command,type!=YON_CONFIG_CUSTOM?yon_config_get_type_path(type):path,NULL,NULL); - char *temp_command = yon_char_unite(compare_command,!yon_char_is_empty(compare_command)?";":"",cur_command,NULL); - if (!yon_char_is_empty(compare_command)) free(compare_command); - compare_command = temp_command; - } - return yon_char_is_empty(compare_command)?NULL:compare_command; + return NULL; } -void yon_save_window_loaded_config_init(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){ - if (current_loaded){ - struct loaded_config *current = NULL; - for_dictionaries(current,current_loaded){ - if (!yon_config_check_ignore(current->key)){ - dictionary *dict = NULL; - if (!yon_config_compare_ignore_get(current->key)){ - dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value - } - gboolean status=0; - status = yon_config_get_status(current->key); - if (dict&&!yon_char_is_empty((char*)dict->data)&&status!=-2){ - if (strcmp((char*)dict->data,(char*)current->data)){ - GtkTreeIter iter; - if (status==0||status==-2) status = 0; - else status=1; - char *old_val = yon_char_new(current->data); - char *new_val = yon_char_new(dict->data); - if (strstr(old_val,"&")) {old_val = yon_char_replace(old_val,"&","\003");old_val = yon_char_replace(old_val,"\003","&");} - if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<"); - if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">"); - if (strstr(new_val,"&")) {int sz = 0; config_str new_val_parsed = yon_char_parse(new_val,&sz,"&");new_val = yon_char_parsed_to_string(new_val_parsed,sz,"&"); yon_char_parsed_free(new_val_parsed,sz);} - if (strstr(new_val,">")) new_val = yon_char_replace(new_val,">","<"); - if (strstr(new_val,"<")) new_val = yon_char_replace(new_val,"<",">"); - char *compare_string = yon_char_unite("",(char*)new_val,"\n",(char*)old_val,NULL); - gtk_list_store_append(window->list,&iter); - gtk_list_store_set(window->list,&iter,0,status,1,current->key,2,(char*)dict->data,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1); - free(compare_string); - } - } else if ((strcmp((char*)current->data,""))&&status!=-2){ - GtkTreeIter iter; - if (status==0||status==-2) status = 0; - else status=1; - char *old_val = yon_char_new(current->data); - if (strstr(old_val,"&")) {int sz = 0; config_str old_val_parsed = yon_char_parse(old_val,&sz,"&");old_val = yon_char_parsed_to_string(old_val_parsed,sz,"&"); yon_char_parsed_free(old_val_parsed,sz);} - if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<"); - if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">"); - char *compare_string = yon_char_unite("\n",(char*)old_val,NULL); - gtk_list_store_append(window->list,&iter); - gtk_list_store_set(window->list,&iter,0,status,1,current->key,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1); - free(compare_string); - } - } - } - } -} +/* + ============ + init section + ============ +*/ -void yon_save_window_compared_config_init_unfound(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){ - if (config_compare){ - struct loaded_config *current = NULL; - for_dictionaries(current,config_compare){ - if (!yon_config_check_ignore(current->key)){ - GtkTreeIter iter; - dictionary *dict = yon_dictionary_get((dictionary**)¤t_loaded,current->key); - if (!dict){ - GdkRGBA rgba; - rgba.alpha=0.8; - rgba.red=1; - rgba.blue=0.3; - rgba.green=0.65; - char *rgba_string = gdk_rgba_to_string(&rgba); - int status=0; - char *compare_string = yon_char_unite((char*)current->data,"\n",NULL); - gtk_list_store_append(window->list,&iter); - gtk_list_store_set(window->list,&iter,0,0,1,current->key,2,(char*)current->data,4,compare_string,5,rgba_string,6,1,7,current->section,-1); - free(compare_string); - } - } - } - } -} +void on_save_parameters(GtkWidget *self, template_saving_window *window){ + textdomain(template_ui_LocaleName); + yon_ubl_status_box_render(SAVE_PROCESS_LABEL,BACKGROUND_IMAGE_INFO_TYPE); + textdomain(template_app_information.app_locale); -gboolean yon_save_window_destroy_if_empty(template_saving_window *window){ - GtkTreeIter iter; - if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter)){ - gtk_widget_destroy(window->Window); - textdomain(template_ui_LocaleName); - yon_ubl_status_box_render(NOTHING_TO_SAVE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - textdomain(template_app_information.app_locale); - if (save_failure_function){ + int saved_size; + struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window); + + int size=0; + config_str commands = yon_loaded_config_convert_to_save_command(saved_parameters,&size,window->type!=YON_CONFIG_CUSTOM? yon_config_get_type_path(window->type):window->custom_save_path); + yon_config_parameter_prepare_elements(commands,&size); + + char *final_command = yon_char_parsed_to_string(commands,size,";"); + pthread_t thread_id; + pthread_create(&thread_id, NULL, (void *)_yon_saving_threaded,final_command); - struct save_return *data = malloc(sizeof(struct save_return)); - data->save_success_argument = save_failure_argument; - data->file_return = NULL; - data->file_save = 0; - gdk_threads_add_idle((GSourceFunc)_yon_postsave_failure_function_start,data); - } - return 0; - } - return 1; + yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"SaveWindow"); + on_subwindow_close(self); } -void yon_save_window_set_status(template_saving_window *window,char *path,YON_CONFIG_TYPE type){ - textdomain(template_ui_LocaleName); - window->type=type; - window->custom_save_path=path; - if (type==YON_CONFIG_BOTH){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); - } else if (type==YON_CONFIG_GLOBAL){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); - - } else if (type==YON_CONFIG_LOCAL){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); - } else if (type==YON_CONFIG_CUSTOM){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_CUSTOM_STATE_LABEL(path),BACKGROUND_IMAGE_INFO_TYPE); - } - textdomain(template_app_information.app_locale); +template_debug_window *template_debugger_window_new(){ + template_debug_window *window = malloc(sizeof(template_debug_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug); + window->Window=yon_gtk_builder_get_widget(builder,"Window"); + window->HeaderTopic=yon_gtk_builder_get_widget(builder,"HeaderTopic"); + window->HeaderImage=yon_gtk_builder_get_widget(builder,"HeaderImage"); + window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox"); + window->Vte=yon_gtk_builder_get_widget(builder,"DebuggerTerminal"); + gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title); + gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title); + gtk_window_set_icon_name(GTK_WINDOW(window->Window),yon_char_append("com.ublinux.",template_app_information.app_tech_name)); + gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL)); + + yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DebugWindow"); + return window; } template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){ @@ -542,42 +566,3 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){ on_save_window_parameter_switched(NULL,NULL,window); return window; } - -template_saving_window *yon_saving_window_new(){ - GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_saving); - template_saving_window *window = malloc(sizeof(template_saving_window)); - window->Window = yon_gtk_builder_get_widget(builder,"Window"); - window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage"); - window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic"); - window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); - window->ParametersTree = yon_gtk_builder_get_widget(builder,"ParametersTree"); - window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton"); - window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); - window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ToggleCell")); - window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); - window->OldValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"OldValueColumn")); - window->OldValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"OldValueCell")); - window->NewValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"NewValueColumn")); - window->NewValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"NewValueCell")); - window->filteredModel = GTK_TREE_MODEL(gtk_builder_get_object(builder,"listfilter1")); - yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"SaveWindow"); - char *icon_name = yon_char_append("com.ublinux.",template_app_information.app_tech_name); - gtk_window_set_icon_name(GTK_WINDOW(window->Window),icon_name); - gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title); - gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title); - gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL)); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_save_parameters),window); - g_signal_connect(G_OBJECT(window->ToggleCell),"toggled", G_CALLBACK(on_save_window_parameter_switched),window); - return window; -} -#define default_config_command(target, data) yon_char_unite("ubconfig --source default --raw get ",target," ",data,NULL) -char *yon_get_default_label_with_parameter(char *section, char *parameter){ - int size; - config_str parsed = yon_config_load(default_config_command(section,parameter),&size); - if (parsed){ - yon_char_remove_last_symbol(parsed[0],'\n'); - char *default_string = yon_char_unite(DEFAULT_LABEL," ","(",parsed[0],")",NULL); - return default_string; - } -} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3-save.h b/source/libublsettingsui-gtk3-save.h new file mode 100644 index 0000000..c380028 --- /dev/null +++ b/source/libublsettingsui-gtk3-save.h @@ -0,0 +1,27 @@ + +struct loaded_config { + dictionary_fields(loaded_config); + char *section; +}; + +template_saving_window *yon_saving_window_new(); + +struct loaded_config *yon_config_convert_parameter(config_str parsed, int size); + +struct save_return { + void *save_success_argument; + config_str file_return; + int file_save; +}; + +/**function and argument, which called after successful config saving. + * Example: + * void on_save_done(main_window *widgets, config_str output, int size) +*/ +void (*save_success_function)(void*,config_str,int)=NULL; +void *save_success_argument=NULL; +void (*save_failure_function)(void*,config_str,int)=NULL; +void *save_failure_argument=NULL; + +#define default_config_command(target, data) yon_char_unite("ubconfig --source default --raw get ",target," ",data,NULL) +void on_save_parameters(GtkWidget *self, template_saving_window *window); \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 5f9f340..48cb0d5 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -23,6 +23,7 @@ #define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade" #define ui_glade_path_about "/com/ublinux/ui/libublsettingsui-gtk3-about.glade" #define ui_glade_path_saving "/com/ublinux/ui/libublsettingsui-gtk3-saving.glade" +#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_banner_path "/com/ublinux/images/libublsettingsui-gtk3-banner.png" #define ui_CssPath "/com/ublinux/css/libublsettingsui-gtk3.css" @@ -155,6 +156,20 @@ typedef struct { char *action_text; } dialog_confirmation_data; +typedef struct { + GtkWidget *Window; + GtkWidget *StatusBox; + GtkWidget *MainFileChooser; + GtkWidget *SaveButton; + GtkWidget *CancelButton; + GtkWidget *ChooseFolderCheck; + char *last_success_selection; + char *last_any_selection; + GtkResponseType responce; +} filechooser_window; +filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action); +GtkResponseType yon_file_chooser_start(filechooser_window *window); + int yon_confirmation_dialog_call(GtkWidget *self,dialog_confirmation_data *data); /**yon_open_browser(GtkWidget *self, char *link) @@ -250,7 +265,7 @@ void yon_save_window_set_postsave_function(void *function, void *data); void yon_save_window_set_postsave_failure_function(void *function, void *data); -char *yon_get_default_label_with_parameter(char *section, char *parameter); +char *yon_get_default_label_with_parameter(char *command); template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); @@ -279,6 +294,7 @@ typedef struct { } ubl_settings_window; char *yon_settings_configuration_get(char *id); +char *yon_custom_config_init(); #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",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n\t--clear-config\t\t\t",_("Reset application settings"),"\n",!yon_char_is_empty(rest)?rest:NULL,NULL) @@ -356,4 +372,6 @@ char *yon_settings_configuration_get(char *id); #define EMAIL_INVALID_LABEL _("Invalid email adress") #define PATH_INVALID_LABEL _("Invalid path") + #define CHOOSE_FILE_LABEL _("Choose path") + #endif \ No newline at end of file