diff --git a/libublsettingsui-gtk3.pot b/libublsettingsui-gtk3.pot index ba54224..5aabfd7 100644 --- a/libublsettingsui-gtk3.pot +++ b/libublsettingsui-gtk3.pot @@ -376,3 +376,11 @@ msgstr "" #: source/libublsettingsui-gtk3.h:492 msgid "service is inactive" msgstr "" + +#: source/libublsettingsui-gtk3.h:492 +msgid "The changes were not saved to either the local or global configuration file. Quit without saving?" +msgstr "" + +#: source/libublsettingsui-gtk3.h:492 +msgid "Exit" +msgstr "" diff --git a/libublsettingsui-gtk3_ru.po b/libublsettingsui-gtk3_ru.po index c46e0e5..865fc18 100644 --- a/libublsettingsui-gtk3_ru.po +++ b/libublsettingsui-gtk3_ru.po @@ -383,3 +383,11 @@ msgstr "служба активна" #: source/libublsettingsui-gtk3.h:492 msgid "service is inactive" msgstr "служба неактивна" + +#: source/libublsettingsui-gtk3.h:492 +msgid "The changes were not saved to either the local or global configuration file. Quit without saving?" +msgstr "Изменения не сохранены ни в локальный, ни в глобальный конфигурационный файл. Выйти без сохранения?" + +#: source/libublsettingsui-gtk3.h:492 +msgid "Exit" +msgstr "Выход" \ No newline at end of file diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 79c60ba..95fde7c 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -600,3 +600,28 @@ 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_exit_window_new(){ + template_saving_window *window = yon_saving_window_new(); + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"remove_status",UNSAVED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + gtk_button_set_label(GTK_BUTTON(window->SaveButton),EXIT_LABEL); + g_signal_handlers_disconnect_by_func(G_OBJECT(window->SaveButton), G_CALLBACK(on_save_parameters),window); + g_signal_handlers_disconnect_by_func(G_OBJECT(window->ToggleCell), G_CALLBACK(on_save_window_parameter_switched),window); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(gtk_main_quit),NULL); + + int current_size=0; + struct loaded_config *config_compare=NULL; + config_str current_config = yon_config_get_all_modified(¤t_size); // get INTERNAL config + + struct loaded_config *current_loaded = yon_config_convert_parameter(current_config,current_size); // convert INTERNAL config into struct + gtk_tree_view_remove_column(GTK_TREE_VIEW(window->ParametersTree),gtk_tree_view_get_column(GTK_TREE_VIEW(window->ParametersTree),0)); + + yon_save_window_loaded_config_init(window,current_loaded,config_compare); + yon_save_window_compared_config_init_unfound(window,current_loaded,config_compare); + if (!yon_save_window_destroy_if_empty(window)) + return NULL; + + return window; +} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index a8147fe..a74de54 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -233,6 +233,15 @@ int yon_ubl_connect_config(_template_config *config){ return replaces; } +gboolean on_window_delete (GtkWidget *, GdkEvent *,template_main_window *widgets){ + template_saving_window *window = yon_exit_window_new(); + if (window){ + gtk_widget_show(window->Window); + return 1; + } + return 0; +} + template_main_window *setup_window(){ /* Widgets getting | Получение виджетов */ template_main_window *widgets = malloc(sizeof(template_main_window)); @@ -305,6 +314,7 @@ template_main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),template_app_information.wiki_link); g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),template_app_information.app_version); + g_signal_connect(G_OBJECT(widgets->Window),"delete-event",G_CALLBACK(on_window_delete),widgets); if (yon_char_is_empty(__yon_config_mode)){ int size; diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index f422d7b..e65e53e 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -18,28 +18,57 @@ #define _(String) gettext(String) +/**Префикс для всех икнок из библиотеки.*/ #define yon_dull_icon_path "com.ublinux.libublsettingsui-gtk3" + +/**Путь до файла основного окна утилит ubl-settings-**/ #define ui_glade_path "/com/ublinux/ui/libublsettingsui-gtk3.glade" + +/**Путь до файла подтверждения открытия документации утилит ubl-settings-**/ #define ui_glade_path_documentation "/com/ublinux/ui/libublsettingsui-gtk3-documentation.glade" + +/**Путь до файла окна "О программе" утилит ubl-settings-**/ #define ui_glade_path_about "/com/ublinux/ui/libublsettingsui-gtk3-about.glade" + +/**Путь до файла окна сохранения утилит ubl-settings-**/ #define ui_glade_path_saving "/com/ublinux/ui/libublsettingsui-gtk3-saving.glade" + +/**Путь до файла окна выбора файлов утилит ubl-settings-**/ #define ui_glade_path_filechooser "/com/ublinux/ui/libublsettingsui-gtk3-filechooser.glade" + +/**Путь до файла окна отладки утилит ubl-settings-**/ #define ui_glade_path_debug "/com/ublinux/ui/libublsettingsui-gtk3-debugger.glade" + +/**Путь до файла окна управления юнитами утилит ubl-settings-**/ #define ui_glade_path_service "/com/ublinux/ui/libublsettingsui-gtk3-service-control.glade" + +/**Путь до файла окна выбора приложений утилит ubl-settings-**/ #define ui_glade_path_app_chooser "/com/ublinux/ui/libublsettingsui-gtk3-app-chooser.glade" + +/**Путь до основного баннера утилит ubl-settings-**/ #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) +/**Команда удаления файла конфигурации утилит*/ #define remove_config_dir_command yon_char_unite("rm -rfd ", yon_ubl_user_get_home_directory(),"/.config/",template_app_information.app_tech_name,"/",NULL) - +/**Шаблон команды сохраненния/удаления/получения параметров из конфигурации*/ #define dull_parameter_get_command "ubconfig --source global get users PARAMETER" +/**Команда получения режима загрузки*/ #define SAVE_MODE_GET_COMMAND "ubconfig --raw --source system get [config] SYSTEMBOOT_STATEMODE" +/**Команда создания файла конфигурации ubconfig + * @target - путь до создаваемого файла +*/ #define ubconfig_file_create(target) yon_char_unite("ubconfig --target \"",target,"\" create",NULL) +/**Типы */ typedef enum SAVE_MODE_TYPE { SAVE_MODE_FULL, SAVE_MODE_MODULE, @@ -49,12 +78,27 @@ typedef enum SAVE_MODE_TYPE { SAVE_MODE_HDD_HOME, } SAVE_MODE_TYPE; +/**Получить локализованную строку из библиотеки +*/ char *yon_char_get_localised_from_lib(char *string); +/**Получить название иконки для режима сохранения +*/ char *yon_ubl_save_mode_get_icon_name(SAVE_MODE_TYPE type); +/**Конввертировать вывод команды SAVE_MODE_GET_COMMAND в SAVE_MODE_TYPE*/ SAVE_MODE_TYPE yon_ubl_save_mode_get_type(char *type); +/**Структура с информацией об утилите, использующей библиотеку. + * @interface - виджет, корень интерфейса запущенной утилиты. Добавляется в окно из библиотеки + * @app_locale - имя файла локализации откуда будет загружаться локализация утилиты + * @css_path - путь до файла css стилей утилиты + * @app_title - Название утилиты для отображения на баннере и на окнах из библиотеки + * @app_description - описание утилиты для отображения на баннере. + * @app_texh_name - техническое название утилиты (ubl-settings-*) + * @app_version - текстовая строка с версией утилиты + * @wiki_link - ссылка на страницу wiki утилиты +*/ typedef struct { GtkWidget *interface; @@ -73,7 +117,8 @@ typedef struct { extern template_app_info template_app_information; - +/**Стандартные поля для конфигурации утилиты. + * template_config_fields ДОЛЖЕН РАСПОЛАГАТЬСЯ ПЕРВЫМ В СТРУКТУРЕ КОНФИГУРАЦИИ*/ #define template_config_fields\ int socket_id;\ int load_socket_id;\ @@ -95,11 +140,13 @@ typedef struct { template_config_fields } _template_config; +/**Указатель на конфиг. В него попадает указатель на основной конфиг утилиты с полями @template_fields*/ extern _template_config *template_config; [[maybe_unused]] extern _template_config *template_config; +/**Поля структуры основного окна утилиты, настраивыемые через бибилотеку. template_window_fields ДОЛЖЕН РАСПОЛАГАТЬСЯ ПЕРВЫМ В СТРУКТУРЕ*/ #define template_window_fields\ GtkWidget *Window;\ GtkWidget *HeadLabel;\ @@ -132,11 +179,12 @@ extern _template_config *template_config; GtkWidget *InterfaceBox;\ //} +/**Структура с основным окном утилиты*/ typedef struct { template_window_fields } template_main_window; - +/**Структура с окном подтверждения перехода к документации*/ typedef struct { GtkWidget *Window; GtkWidget *HeaderLabel; @@ -147,6 +195,7 @@ typedef struct { GtkWidget *AcceptButton; } template_documentation_confirmation_window; +/**Структура с окном режима отладки*/ typedef struct { GtkWidget *Window; GtkWidget *HeaderTopic; @@ -155,6 +204,12 @@ typedef struct { GtkWidget *Vte; } template_debug_window; +/**Структура для диалогового окна подтверждения. + * @void (*function)(void*,void*) - указатель на функцию выполняюзуюся в случае нажатия на кнопку "Принять". Первый параметр - Указатель на окно или виджета, расположенного в этом окне + * @data - параметр, передающийся в функцию + * @action_text - отображаемый в диалоговом окне текст действия, требующего подтверждения + * @title - текст в шапке диалогового окна +*/ typedef struct { void (*function)(void*,void*); void *data; @@ -162,6 +217,14 @@ typedef struct { char *title; } dialog_confirmation_data; +/**Структура для окна выбора файлов. + * @Window - виджет окна + * @StatusBox - виджет для показа статусных сообщений, пустой GtkBox с вертикальной ориентацией + * @HeaderTopic - виджет текста в шапке окна + * @MainFileChooser - виджет выбора файлов. + * @SaveButton - Кнопка принятия выбора. Закрывает окно и устанавливает responce равным GTK_RESPONCE_ACCEPT если был выбран файл + * @CancelButton - кнопка отмены. Закрывает окно и +*/ typedef struct { GtkWidget *Window; GtkWidget *StatusBox; @@ -312,6 +375,7 @@ void yon_ubl_settings_window_init(GtkMenu *menu); void *yon_ubl_settings_window_get(char *id); void yon_configuration_window_add_boolean_parameter(enum CONFIGURATION_PARAMETER_TYPE type, char *id, char *label); void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMETER_TYPE type, char *id, char *label, GCallback func, gpointer data, ...); +template_saving_window *yon_exit_window_new(); char *yon_gtk_entry_check_restricted(GtkEntry *target); @@ -511,4 +575,6 @@ yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise); #define _SERVICE_ACTIVE_STATUS_LABEL(target) yon_char_unite("\"",target,"\" ", yon_char_get_localised_from_lib(_("service is active")),NULL) #define _SERVICE_INACTIVE_STATUS_LABEL(target) yon_char_unite("\"",target,"\" ",yon_char_get_localised_from_lib(_("service is inactive")),NULL) + #define UNSAVED_LABEL yon_char_get_localised_from_lib("The changes were not saved to either the local or global configuration file. Quit without saving?") + #define EXIT_LABEL yon_char_get_localised_from_lib("Exit") #endif \ No newline at end of file