diff --git a/gresource.xml b/gresource.xml index a0718a8..db00251 100644 --- a/gresource.xml +++ b/gresource.xml @@ -2,6 +2,7 @@ libublsettingsui-gtk3.glade + libublsettingsui-gtk3-window.glade libublsettingsui-gtk3-about.glade libublsettingsui-gtk3-documentation.glade libublsettingsui-gtk3-saving.glade diff --git a/libublsettingsui-gtk3-window.glade b/libublsettingsui-gtk3-window.glade new file mode 100644 index 0000000..8e24bc6 --- /dev/null +++ b/libublsettingsui-gtk3-window.glade @@ -0,0 +1,81 @@ + + + + + + 450 + 350 + False + com.ublinux.libublsettingsui-gtk3 + dialog + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + vertical + + + + + + True + True + 1 + + + + + + + True + False + 5 + True + + + True + False + TEMPLATE Manager + + + + + + + + True + False + 32 + com.ublinux.libublsettingsui-gtk3 + + + + + + + diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 8578725..190acd1 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -38,6 +38,7 @@ add_custom_target(GLADE libublsettingsui-gtk3.glade) set(DEPENDFILES ../libublsettingsui-gtk3.glade + ../libublsettingsui-gtk3-window.glade ../libublsettingsui-gtk3-about.glade ../libublsettingsui-gtk3-documentation.glade ../libublsettingsui-gtk3-saving.glade @@ -83,6 +84,7 @@ add_library(${PROJECT_NAME} SHARED libublsettingsui-gtk3-save.c libublsettingsui-gtk3-config-window.c libublsettingsui-gtk3-filechooser.c + libublsettingsui-gtk3-config-chooser.c libublsettingsui-gtk3-service.c libublsettingsui-gtk3-app-chooser.c libublsettingsui-gtk3-standard-callbacks.c diff --git a/source/libublsettingsui-gtk3-config-chooser.c b/source/libublsettingsui-gtk3-config-chooser.c new file mode 100644 index 0000000..6b97dbe --- /dev/null +++ b/source/libublsettingsui-gtk3-config-chooser.c @@ -0,0 +1,65 @@ +#include "libublsettingsui-gtk3.h" + +typedef struct { + filechooser_window *file_chooser_window; + GtkFileFilter *ini_filter; + GtkFileFilter *yaml_filter; + GtkFileFilter *json_filter; +} config_file_chooser_window; + +void on_config_file_chooser_destroy(GtkWidget*, config_file_chooser_window *window){ + printf("fewrgege\n"); +} + +void on_config_file_chooser_accept(GtkWidget *, config_file_chooser_window *window){ + switch (gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->file_chooser_window->MainFileChooser))){ + case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: + case GTK_FILE_CHOOSER_ACTION_SAVE: + if (yon_char_is_empty(window->file_chooser_window->last_success_selection)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->file_chooser_window->StatusBox),yon_char_get_localised_from_lib(NOTHING_CHOSEN_LABEL),5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + window->file_chooser_window->responce=GTK_RESPONSE_APPLY; + break; + + case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: + case GTK_FILE_CHOOSER_ACTION_OPEN: + window->file_chooser_window->responce = GTK_RESPONSE_ACCEPT; + break; + } + + char *path = NULL; + const char *filter_name = gtk_file_filter_get_name(gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(window->file_chooser_window->MainFileChooser))); + if (window->file_chooser_window->last_success_selection){ + int ext_pos = yon_char_find_last(window->file_chooser_window->last_success_selection,'.'); + if (ext_pos==-1||strcmp(window->file_chooser_window->last_success_selection+ext_pos,filter_name)){ + path = yon_char_unite(window->file_chooser_window->last_success_selection,filter_name,NULL); + free(window->file_chooser_window->last_success_selection); + window->file_chooser_window->last_success_selection = path; + } + } + + + gtk_widget_destroy(window->file_chooser_window->Window); + gtk_main_quit(); +} + +filechooser_window *yon_config_file_chooser_window_new(GtkFileChooserAction action){ + config_file_chooser_window *window = malloc(sizeof(config_file_chooser_window)); + window->file_chooser_window = yon_file_chooser_window_new(action); + window->ini_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(window->ini_filter,"*.ini"); + gtk_file_filter_set_name(window->ini_filter,".ini"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(window->file_chooser_window->MainFileChooser),window->ini_filter); + window->yaml_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(window->yaml_filter,"*.yaml"); + gtk_file_filter_set_name(window->yaml_filter,".yaml"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(window->file_chooser_window->MainFileChooser),window->yaml_filter); + window->json_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(window->json_filter,"*.json"); + gtk_file_filter_set_name(window->json_filter,".json"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(window->file_chooser_window->MainFileChooser),window->json_filter); + yon_file_chooser_remove_accept_function(window->file_chooser_window); + g_signal_connect(G_OBJECT(window->file_chooser_window->SaveButton),"clicked",G_CALLBACK(on_config_file_chooser_accept),window); + return window->file_chooser_window; +} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index 5c9fc3b..5223108 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -114,7 +114,7 @@ char *yon_settings_configuration_get(char *id){ // init section void __yon_on_ubl_settings_window_open(); -void yon_on_settings_window_accept(GtkWidget*,GdkEvent *,ubl_settings_window *window); +gboolean yon_on_settings_window_accept(GtkWidget*,GdkEvent *,ubl_settings_window *window); void yon_ubl_settings_window_init(GtkMenu *menu){ if (!yon_window_config_check_init()) return; @@ -167,12 +167,13 @@ void __yon_on_ubl_settings_window_open(){ gtk_widget_show(window->window); } -void yon_on_settings_window_accept(GtkWidget*,GdkEvent *,ubl_settings_window *window){ +gboolean yon_on_settings_window_accept(GtkWidget*,GdkEvent *,ubl_settings_window *window){ dictionary *current; for_dictionaries(current,__yon_configuration_custom_parameters){ struct yon_configuration_custom_parameter *parameter = ((struct yon_configuration_custom_parameter*)current->data); parameter->custom_callbacks->custom_parameter_save_value_func(parameter->custom_parameter_root); } + return 0; } void yon_configuration_window_add_custom_parameter(const char *id, struct yon_configuration_window_custom_parameter *custom_parameter_data){ diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c index d287a79..b94a6da 100644 --- a/source/libublsettingsui-gtk3-filechooser.c +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -87,7 +87,7 @@ void yon_file_chooser_set_root(filechooser_window *window, char *root_path){ g_signal_connect(G_OBJECT(window->MainFileChooser),"current-folder-changed",G_CALLBACK(on_file_chooser_check_root),window); } -void yon_file_chooser_remove_root(filechooser_window *window, char *root_path){ +void yon_file_chooser_remove_root(filechooser_window *window){ if (!yon_char_is_empty(window->root)) free(window->root); window->root=NULL; g_signal_handlers_disconnect_by_func(G_OBJECT(window->MainFileChooser),G_CALLBACK(on_file_chooser_check_root),window); @@ -151,4 +151,9 @@ GtkResponseType yon_file_chooser_start(filechooser_window *window){ gtk_main(); return window->responce; +} + +void yon_file_chooser_remove_accept_function(filechooser_window *window){ + g_signal_handlers_disconnect_by_func(G_OBJECT(window->SaveButton),G_CALLBACK(on_file_chooser_accept),window); + } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 12548e6..8adf85c 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -510,7 +510,7 @@ void on_root_access(GtkWidget *, GtkWidget *window){ if (getuid()){ char *argline = template_app_information.app_tech_name; for (int i=1;iWindow = yon_gtk_builder_get_widget(builder,"Window"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->MainBox = yon_gtk_builder_get_widget(builder,"MainBox"); + + return window; } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index bc7d345..c243acf 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -24,6 +24,9 @@ /**Путь до файла основного окна утилит ubl-settings-**/ #define ui_glade_path "/com/ublinux/ui/libublsettingsui-gtk3.glade" +#define ui_glade_path_window "/com/ublinux/ui/libublsettingsui-gtk3-window.glade" + + /**Путь до файла подтверждения открытия документации утилит ubl-settings-**/ #define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade" @@ -245,11 +248,36 @@ typedef struct { char *root; } filechooser_window; +/// @brief Create a file chooser window for specific action +/// @param action File chooser's action, a mode for window to work at +/// @return A newly allocated file chooser window; filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action); + +/// @brief Start file chooser window as dialog window +/// @param window File chooser window to start +/// @return GtkResponceType of pressed button GtkResponseType yon_file_chooser_start(filechooser_window *window); + +/// @brief Sets a a new label for "Accept" button +/// @param label void yon_file_chooser_set_button_label(char *label); + +/// @brief Set a root for file chooser. File chooser cannot escape root folder +/// @param window +/// @param root_path void yon_file_chooser_set_root(filechooser_window *window, char *root_path); -void yon_file_chooser_remove_root(filechooser_window *window, char *root_path); + +/// @brief Remove root from file chooser. +/// @param window +/// @param root_path +void yon_file_chooser_remove_root(filechooser_window *window); + + +/// @brief Create file chooser window, configured to select supported configuration files. +/// @return A newly allocated file chooser window; +filechooser_window *yon_config_file_chooser_window_new(GtkFileChooserAction action); + +void yon_file_chooser_remove_accept_function(filechooser_window *window); dialog_confirmation_data *yon_confirmation_dialog_data_new(); @@ -534,6 +562,16 @@ void yon_password_hash_list_set(yon_password_window *window, config_str hashes, yon_password_window *yon_password_open(GtkEntry *target); +typedef struct { + GtkWidget *Window; + GtkWidget *StatusBox; + GtkWidget *MainBox; +} yon_window; + +/// @brief Create empty window +/// @return A newly allocated empty window; +yon_window *yon_window_new(); + #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",\