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 @@
+
+
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