From 352ec6acd9af37c4f20ce6ba887c67abfc45a013 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 10 Jan 2025 09:44:52 +0600 Subject: [PATCH 01/40] Fixed removing of parameters from configuration --- source/libublsettingsui-gtk3-save.c | 120 +++++++++++++++++++++------- 1 file changed, 90 insertions(+), 30 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index f187763..37bed72 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -134,48 +134,108 @@ struct loaded_config *yon_save_window_get_saved_parameters(template_saving_windo config_str yon_loaded_config_convert_to_save_command(struct loaded_config *target, int *size,char *path){ (*size)=0; - dictionary *sections = NULL; + + config_str final_commands = NULL; + { + struct yon_temp_command_sections { + dictionary_fields(yon_temp_command_sections); + int status; + }; + + struct yon_temp_command_sections *sections = NULL; struct loaded_config *current; for_dictionaries(current,target){ - dictionary *cur_section=NULL; - if (sections&&(cur_section=yon_dictionary_get(§ions,current->section))){ - char *temp = yon_char_unite((char*)cur_section->data," ", current->key,"=\'",(char*)current->data,"\'",NULL); + struct yon_temp_command_sections *cur_section=NULL, *found = NULL; + if (sections){ + for_dictionaries(cur_section,sections){ + if (!strcmp(current->section,cur_section->key)){ + int status = yon_config_get_status(current->key); + if ((status==-1&&cur_section->status==-1)||(status>-1)&&cur_section->status>-1){ + found = cur_section; + } + } + } + cur_section = found; + } + if (cur_section){ + char *parameters_for_current_command = NULL; + if (yon_config_get_status(current->key)==-1){ + parameters_for_current_command = yon_char_unite((char*)cur_section->data," ", current->key,NULL); + } else { + parameters_for_current_command = yon_char_unite((char*)cur_section->data," ", current->key,"=\'",(char*)current->data,"\'",NULL); + } free(current->data); - cur_section->data = temp; + cur_section->data = parameters_for_current_command; } else { - char *parameters = yon_char_unite(current->key,"=\'",(char*)current->data,"\'",NULL); - yon_dictionary_add_or_create_if_exists_with_data(sections,current->section,parameters); + char *parameters_for_current_command = NULL; + if (yon_config_get_status(current->key)==-1){ + parameters_for_current_command = current->key; + } else { + parameters_for_current_command = yon_char_unite(current->key,"=\'",(char*)current->data,"\'",NULL); + } + dictionary *sections_dict = (dictionary*)sections; + yon_dictionary_add_or_create_if_exists_with_data(sections_dict,current->section,parameters_for_current_command); + sections = realloc(sections_dict,sizeof(struct yon_temp_command_sections)); + sections->status=yon_config_get_status(current->key); } + } - } - config_str commands = NULL; - { - dictionary *current; - for_dictionaries(current,sections){ - char *dull_command = ubconfig_set_command_full(path,current->key,(char*)current->data); - char *command = yon_config_parameter_prepare_command(dull_command,NULL,current->key,NULL); - yon_char_parsed_add_or_create_if_exists(commands,size,command); - free(command); + config_str commands = NULL; + { + struct yon_temp_command_sections *current; + for_dictionaries(current,sections){ + char *dull_command = NULL; + if (current->status>=0){ + dull_command = ubconfig_set_command_full(path,current->key,(char*)current->data); + } else { + dull_command = ubconfig_remove_command_full(path,current->key,(char*)current->data); + } + yon_char_parsed_add_or_create_if_exists(commands,size,dull_command); + free(dull_command); + } } + return commands; } - return commands; + // dictionary *sections = NULL; + // { + // struct loaded_config *current; + // for_dictionaries(current,target){ + // dictionary *cur_section=NULL; + // if (sections&&(cur_section=yon_dictionary_get(§ions,current->section))){ + // if (yon_config_get_status(current->key)==-1){ + + // } else { + // char *temp = yon_char_unite((char*)cur_section->data," ", current->key,"=\'",(char*)current->data,"\'",NULL); + // free(current->data); + // cur_section->data = temp; + // } + // } else { + // char *parameters = yon_char_unite(current->key,"=\'",(char*)current->data,"\'",NULL); + // yon_dictionary_add_or_create_if_exists_with_data(sections,current->section,parameters); + + // } + // } + // } + // config_str commands = NULL; + // { + // dictionary *current; + // for_dictionaries(current,sections){ + // char *dull_command = ubconfig_set_command_full(path,current->key,(char*)current->data); + // char *command = yon_config_parameter_prepare_command(dull_command,NULL,current->key,NULL); + // yon_char_parsed_add_or_create_if_exists(commands,size,command); + // free(command); + // } + // } } -int yon_config_parameter_prepare_elements(struct loaded_config *target){ +int yon_config_parameter_prepare_elements(config_str target, int *size){ int success = 0; - struct loaded_config *current = NULL; - for_dictionaries(current,target){ - char *parameter = current->key; - if (strstr(parameter,"[")){ - char *param = yon_char_divide_search(parameter,"[",-1); - char *param_key = yon_char_divide_search(parameter,"]",-1); - free(parameter); - parameter = yon_char_unite(param,"[\"",param_key,"\"]",NULL); - current->key = parameter; - success=1; - } + for (int i=0;i<(*size);i++){ + char *start_bracket_replaced_string = yon_char_replace(target[i],"[","[\""); + char *end_bracket_replaced_string = yon_char_replace(start_bracket_replaced_string,"]","\"]"); + target[i] = end_bracket_replaced_string; } return success; } @@ -187,10 +247,10 @@ void on_save_parameters(GtkWidget *self, template_saving_window *window){ int saved_size; struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window); - yon_config_parameter_prepare_elements(saved_parameters); 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; -- 2.35.1 From 98a84ef5cfd6f21909895e672eb33721271494d4 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 20 Jan 2025 13:33:54 +0600 Subject: [PATCH 02/40] Compare ignore added --- source/libublsettingsui-gtk3-save.c | 35 ++++------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 37bed72..ea4e035 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -198,36 +198,6 @@ config_str yon_loaded_config_convert_to_save_command(struct loaded_config *targe } return commands; } - // dictionary *sections = NULL; - // { - // struct loaded_config *current; - // for_dictionaries(current,target){ - // dictionary *cur_section=NULL; - // if (sections&&(cur_section=yon_dictionary_get(§ions,current->section))){ - // if (yon_config_get_status(current->key)==-1){ - - // } else { - // char *temp = yon_char_unite((char*)cur_section->data," ", current->key,"=\'",(char*)current->data,"\'",NULL); - // free(current->data); - // cur_section->data = temp; - // } - // } else { - // char *parameters = yon_char_unite(current->key,"=\'",(char*)current->data,"\'",NULL); - // yon_dictionary_add_or_create_if_exists_with_data(sections,current->section,parameters); - - // } - // } - // } - // config_str commands = NULL; - // { - // dictionary *current; - // for_dictionaries(current,sections){ - // char *dull_command = ubconfig_set_command_full(path,current->key,(char*)current->data); - // char *command = yon_config_parameter_prepare_command(dull_command,NULL,current->key,NULL); - // yon_char_parsed_add_or_create_if_exists(commands,size,command); - // free(command); - // } - // } } int yon_config_parameter_prepare_elements(config_str target, int *size){ @@ -432,7 +402,10 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l struct loaded_config *current = NULL; for_dictionaries(current,current_loaded){ if (!yon_config_check_ignore(current->key)){ - dictionary *dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value + 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){ -- 2.35.1 From dbd6370246ec201f0015a36262ee567d8cabbf7d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 23 Jan 2025 13:09:22 +0600 Subject: [PATCH 03/40] Fixes, new functions --- libublsettingsui-gtk3.glade | 1 - libublsettingsui-gtk3.pot | 132 +++++++++++++++------------- libublsettingsui-gtk3_ru.po | 132 +++++++++++++++------------- source/libublsettingsui-gtk3-save.c | 10 +++ source/libublsettingsui-gtk3.h | 4 + 5 files changed, 158 insertions(+), 121 deletions(-) diff --git a/libublsettingsui-gtk3.glade b/libublsettingsui-gtk3.glade index 2e204d8..9285bbb 100644 --- a/libublsettingsui-gtk3.glade +++ b/libublsettingsui-gtk3.glade @@ -231,7 +231,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 440 False 1024 - 720 com.ublinux.libublsettingsui-gtk3 diff --git a/libublsettingsui-gtk3.pot b/libublsettingsui-gtk3.pot index 9bad71f..b59e95f 100644 --- a/libublsettingsui-gtk3.pot +++ b/libublsettingsui-gtk3.pot @@ -17,248 +17,260 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/libublsettingsui-gtk3.h:34 +#: source/libublsettingsui-gtk3.h:253 msgid "Version:" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid " version:" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Usage:" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "[OPTIONS]" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Options:" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Show this help" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Show package version" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock this help menu" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock configuration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock local configration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock global configration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock global configration loading" msgstr "" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Reset application settings" msgstr "" -#: source/libublsettingsui-gtk3.h:40 +#: source/libublsettingsui-gtk3.h:259 msgid "Operation succeeded" msgstr "" -#: source/libublsettingsui-gtk3.h:41 +#: source/libublsettingsui-gtk3.h:260 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" msgstr "" -#: source/libublsettingsui-gtk3.h:43 +#: source/libublsettingsui-gtk3.h:262 +msgid "Default" +msgstr "" + +#: source/libublsettingsui-gtk3.h:263 msgid "About" msgstr "" -#: source/libublsettingsui-gtk3.h:44 +#: source/libublsettingsui-gtk3.h:264 msgid "Documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:46 +#: source/libublsettingsui-gtk3.h:266 msgid "Save to specific file" msgstr "" -#: source/libublsettingsui-gtk3.h:47 +#: source/libublsettingsui-gtk3.h:267 msgid "Save to local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:48 +#: source/libublsettingsui-gtk3.h:268 msgid "Save to global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:49 +#: source/libublsettingsui-gtk3.h:269 msgid "Save configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:50 +#: source/libublsettingsui-gtk3.h:270 msgid "Save" msgstr "" -#: source/libublsettingsui-gtk3.h:51 +#: source/libublsettingsui-gtk3.h:271 msgid "Saving..." msgstr "" -#: source/libublsettingsui-gtk3.h:53 +#: source/libublsettingsui-gtk3.h:273 msgid "Load from specific file" msgstr "" -#: source/libublsettingsui-gtk3.h:54 +#: source/libublsettingsui-gtk3.h:274 msgid "Load local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:55 +#: source/libublsettingsui-gtk3.h:275 msgid "Load global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:56 +#: source/libublsettingsui-gtk3.h:276 msgid "Load" msgstr "" -#: source/libublsettingsui-gtk3.h:58 +#: source/libublsettingsui-gtk3.h:278 msgid "Cancel" msgstr "" -#: source/libublsettingsui-gtk3.h:59 +#: source/libublsettingsui-gtk3.h:279 msgid "Accept" msgstr "" -#: source/libublsettingsui-gtk3.h:60 +#: source/libublsettingsui-gtk3.h:280 msgid "Open" msgstr "" -#: source/libublsettingsui-gtk3.h:62 +#: source/libublsettingsui-gtk3.h:282 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/libublsettingsui-gtk3.h:63 +#: source/libublsettingsui-gtk3.h:283 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/libublsettingsui-gtk3.h:64 +#: source/libublsettingsui-gtk3.h:284 msgid "Always redirect to online documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:65 +#: source/libublsettingsui-gtk3.h:285 msgid "Open documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:66 +#: source/libublsettingsui-gtk3.h:286 msgid "Project Home Page" msgstr "" -#: source/libublsettingsui-gtk3.h:67 +#: source/libublsettingsui-gtk3.h:287 msgid "Nothing were chosen" msgstr "" -#: source/libublsettingsui-gtk3.h:68 +#: source/libublsettingsui-gtk3.h:288 msgid "Copyright © 2022 - 2023, UBSoft LLC" msgstr "" -#: source/libublsettingsui-gtk3.h:71 +#: source/libublsettingsui-gtk3.h:291 msgid "Global configuration loading succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:72 +#: source/libublsettingsui-gtk3.h:292 msgid "Local configuration loading succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:73 +#: source/libublsettingsui-gtk3.h:293 msgid "Config loading failed" msgstr "" -#: source/libublsettingsui-gtk3.h:75 +#: source/libublsettingsui-gtk3.h:295 msgid "Local and global configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:76 +#: source/libublsettingsui-gtk3.h:296 msgid "Global configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:77 +#: source/libublsettingsui-gtk3.h:297 msgid "Local configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:79 +#: source/libublsettingsui-gtk3.h:298 +msgid "Configuration saving succeeded." +msgstr "" + +#: source/libublsettingsui-gtk3.h:300 msgid "Parameter" msgstr "" -#: source/libublsettingsui-gtk3.h:80 +#: source/libublsettingsui-gtk3.h:301 msgid "Old value" msgstr "" -#: source/libublsettingsui-gtk3.h:81 +#: source/libublsettingsui-gtk3.h:302 msgid "New value" msgstr "" -#: source/libublsettingsui-gtk3.h:82 +#: source/libublsettingsui-gtk3.h:303 msgid "" "Value\n" "(Old/New)" msgstr "" -#: source/libublsettingsui-gtk3.h:84 +#: source/libublsettingsui-gtk3.h:305 msgid "Nothing to save" msgstr "" -#: source/libublsettingsui-gtk3.h:85 +#: source/libublsettingsui-gtk3.h:306 msgid "Saving into local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:86 +#: source/libublsettingsui-gtk3.h:307 msgid "Saving into global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:87 +#: source/libublsettingsui-gtk3.h:308 msgid "Saving into global and local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:88 +#: source/libublsettingsui-gtk3.h:309 msgid "Saving into custom configuration at" msgstr "" -#: source/libublsettingsui-gtk3.h:93 +#: source/libublsettingsui-gtk3.h:314 msgid "Full saving mode" msgstr "" -#: source/libublsettingsui-gtk3.h:94 +#: source/libublsettingsui-gtk3.h:315 msgid "Saving into module" msgstr "" -#: source/libublsettingsui-gtk3.h:95 +#: source/libublsettingsui-gtk3.h:316 msgid "Sandbox mode" msgstr "" -#: source/libublsettingsui-gtk3.h:96 +#: source/libublsettingsui-gtk3.h:317 msgid "Sandbox with profile saving" msgstr "" -#: source/libublsettingsui-gtk3.h:97 +#: source/libublsettingsui-gtk3.h:318 msgid "HDD sandbox" msgstr "" -#: source/libublsettingsui-gtk3.h:98 +#: source/libublsettingsui-gtk3.h:319 msgid "HDD sandbox with profile saving" msgstr "" -#: source/libublsettingsui-gtk3.h:99 +#: source/libublsettingsui-gtk3.h:320 msgid "New configuration file creation failed" msgstr "" -#: source/libublsettingsui-gtk3.h:100 +#: source/libublsettingsui-gtk3.h:321 msgid "Upgrade to root" msgstr "" + +#: source/libublsettingsui-gtk3.h:322 +msgid "Settings" +msgstr "" diff --git a/libublsettingsui-gtk3_ru.po b/libublsettingsui-gtk3_ru.po index 59ce55b..3ee7d2e 100644 --- a/libublsettingsui-gtk3_ru.po +++ b/libublsettingsui-gtk3_ru.po @@ -17,63 +17,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/libublsettingsui-gtk3.h:34 +#: source/libublsettingsui-gtk3.h:253 msgid "Version:" msgstr "Версия:" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid " version:" msgstr " версия:" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Usage:" msgstr "Использование:" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "[OPTIONS]" msgstr "[АРГУМЕНТЫ]" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Options:" msgstr "Аргументы:" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Show this help" msgstr "Показать эту подсказку" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Show package version" msgstr "Показать версию пакета" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock this help menu" msgstr "Заблокировать это меню помощи" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock configuration saving" msgstr "Успешно записана локальная конфигурация" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock local configration saving" msgstr "Заблокировать сохранение локальной конфигурации" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock global configration saving" msgstr "Заблокировать сохранение глобальной конфигурации" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Lock global configration loading" msgstr "Заблокировать загрузку глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:35 +#: source/libublsettingsui-gtk3.h:254 msgid "Reset application settings" msgstr "Сбросить настройки программы" -#: source/libublsettingsui-gtk3.h:40 +#: source/libublsettingsui-gtk3.h:259 msgid "Operation succeeded" msgstr "Операция завершена" -#: source/libublsettingsui-gtk3.h:41 +#: source/libublsettingsui-gtk3.h:260 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" @@ -81,71 +81,75 @@ msgstr "" "Внимание! Приложение было запущено без прав суперпользователя - действия, " "требующие их наличия заблокированы" -#: source/libublsettingsui-gtk3.h:43 +#: source/libublsettingsui-gtk3.h:262 +msgid "Default" +msgstr "По умолчанию" + +#: source/libublsettingsui-gtk3.h:263 msgid "About" msgstr "О программе" -#: source/libublsettingsui-gtk3.h:44 +#: source/libublsettingsui-gtk3.h:264 msgid "Documentation" msgstr "Справка" -#: source/libublsettingsui-gtk3.h:46 +#: source/libublsettingsui-gtk3.h:266 msgid "Save to specific file" msgstr "Сохранить в файл" -#: source/libublsettingsui-gtk3.h:47 +#: source/libublsettingsui-gtk3.h:267 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/libublsettingsui-gtk3.h:48 +#: source/libublsettingsui-gtk3.h:268 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:49 +#: source/libublsettingsui-gtk3.h:269 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/libublsettingsui-gtk3.h:50 +#: source/libublsettingsui-gtk3.h:270 msgid "Save" msgstr "Сохранить" -#: source/libublsettingsui-gtk3.h:51 +#: source/libublsettingsui-gtk3.h:271 msgid "Saving..." msgstr "Сохранение..." -#: source/libublsettingsui-gtk3.h:53 +#: source/libublsettingsui-gtk3.h:273 msgid "Load from specific file" msgstr "Загрузить из файла" -#: source/libublsettingsui-gtk3.h:54 +#: source/libublsettingsui-gtk3.h:274 msgid "Load local configuration" msgstr "Загрузить локальную конфигурацию" -#: source/libublsettingsui-gtk3.h:55 +#: source/libublsettingsui-gtk3.h:275 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:56 +#: source/libublsettingsui-gtk3.h:276 msgid "Load" msgstr "Загрузить" -#: source/libublsettingsui-gtk3.h:58 +#: source/libublsettingsui-gtk3.h:278 msgid "Cancel" msgstr "Отмена" -#: source/libublsettingsui-gtk3.h:59 +#: source/libublsettingsui-gtk3.h:279 msgid "Accept" msgstr "Принять" -#: source/libublsettingsui-gtk3.h:60 +#: source/libublsettingsui-gtk3.h:280 msgid "Open" msgstr "Открыть" -#: source/libublsettingsui-gtk3.h:62 +#: source/libublsettingsui-gtk3.h:282 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/libublsettingsui-gtk3.h:63 +#: source/libublsettingsui-gtk3.h:283 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -153,63 +157,67 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией, где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/libublsettingsui-gtk3.h:64 +#: source/libublsettingsui-gtk3.h:284 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/libublsettingsui-gtk3.h:65 +#: source/libublsettingsui-gtk3.h:285 msgid "Open documentation" msgstr "Прочитать справку" -#: source/libublsettingsui-gtk3.h:66 +#: source/libublsettingsui-gtk3.h:286 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/libublsettingsui-gtk3.h:67 +#: source/libublsettingsui-gtk3.h:287 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/libublsettingsui-gtk3.h:68 +#: source/libublsettingsui-gtk3.h:288 msgid "Copyright © 2022 - 2023, UBSoft LLC" msgstr "Copyright © 2022 - 2023, ООО «Юбисофт»" -#: source/libublsettingsui-gtk3.h:71 +#: source/libublsettingsui-gtk3.h:291 msgid "Global configuration loading succeeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:72 +#: source/libublsettingsui-gtk3.h:292 msgid "Local configuration loading succeeded." msgstr "Успешно загружена локальная конфигурация" -#: source/libublsettingsui-gtk3.h:73 +#: source/libublsettingsui-gtk3.h:293 msgid "Config loading failed" msgstr "Ошибка загрузки конфига" -#: source/libublsettingsui-gtk3.h:75 +#: source/libublsettingsui-gtk3.h:295 msgid "Local and global configuration saving succeeded." msgstr "Успешно записаны локальная и глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:76 +#: source/libublsettingsui-gtk3.h:296 msgid "Global configuration saving succeeded." msgstr "Успешно записана глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:77 +#: source/libublsettingsui-gtk3.h:297 msgid "Local configuration saving succeeded." msgstr "Успешно записана локальная конфигурация" -#: source/libublsettingsui-gtk3.h:79 +#: source/libublsettingsui-gtk3.h:298 +msgid "Configuration saving succeeded." +msgstr "Успешно записана конфигурация" + +#: source/libublsettingsui-gtk3.h:300 msgid "Parameter" msgstr "Параметр" -#: source/libublsettingsui-gtk3.h:80 +#: source/libublsettingsui-gtk3.h:301 msgid "Old value" msgstr "Старое значение" -#: source/libublsettingsui-gtk3.h:81 +#: source/libublsettingsui-gtk3.h:302 msgid "New value" msgstr "Новое значение" -#: source/libublsettingsui-gtk3.h:82 +#: source/libublsettingsui-gtk3.h:303 msgid "" "Value\n" "(Old/New)" @@ -217,54 +225,58 @@ msgstr "" "Значение\n" "(Старое/Новое)" -#: source/libublsettingsui-gtk3.h:84 +#: source/libublsettingsui-gtk3.h:305 msgid "Nothing to save" msgstr "Нечего сохранять" -#: source/libublsettingsui-gtk3.h:85 +#: source/libublsettingsui-gtk3.h:306 msgid "Saving into local configuration" msgstr "Сохранение в локальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:86 +#: source/libublsettingsui-gtk3.h:307 msgid "Saving into global configuration" msgstr "Сохранение в глобальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:87 +#: source/libublsettingsui-gtk3.h:308 msgid "Saving into global and local configuration" msgstr "Сохранение в глобальный и локальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:88 +#: source/libublsettingsui-gtk3.h:309 msgid "Saving into custom configuration at" msgstr "Сохранение в конфигурационный файл по пути" -#: source/libublsettingsui-gtk3.h:93 +#: source/libublsettingsui-gtk3.h:314 msgid "Full saving mode" msgstr "Полное сохранение" -#: source/libublsettingsui-gtk3.h:94 +#: source/libublsettingsui-gtk3.h:315 msgid "Saving into module" msgstr "Сохранение в модуль" -#: source/libublsettingsui-gtk3.h:95 +#: source/libublsettingsui-gtk3.h:316 msgid "Sandbox mode" msgstr "Полная песочница в ОЗУ" -#: source/libublsettingsui-gtk3.h:96 +#: source/libublsettingsui-gtk3.h:317 msgid "Sandbox with profile saving" msgstr "Песочница с сохранением профиля пользователя" -#: source/libublsettingsui-gtk3.h:97 +#: source/libublsettingsui-gtk3.h:318 msgid "HDD sandbox" msgstr "Полная песочница на HDD" -#: source/libublsettingsui-gtk3.h:98 +#: source/libublsettingsui-gtk3.h:319 msgid "HDD sandbox with profile saving" msgstr "Полная песочница на HDD с сохранением профиля пользователя" -#: source/libublsettingsui-gtk3.h:99 +#: source/libublsettingsui-gtk3.h:320 msgid "New configuration file creation failed" msgstr "Ошибка создания нового файла конфигурации" -#: source/libublsettingsui-gtk3.h:100 +#: source/libublsettingsui-gtk3.h:321 msgid "Upgrade to root" msgstr "Повысить права до root" + +#: source/libublsettingsui-gtk3.h:322 +msgid "Settings" +msgstr "" diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index ea4e035..bc396f3 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -557,4 +557,14 @@ template_saving_window *yon_saving_window_new(){ 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.h b/source/libublsettingsui-gtk3.h index 65acbd2..cc6c15d 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -245,6 +245,8 @@ 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); + template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); @@ -257,6 +259,7 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); #define SUCCESS_LABEL _("Operation succeeded") #define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") + #define DEFAULT_LABEL _("Default") #define ABOUT_LABEL _("About") #define DOCUMENTATION_LABEL _("Documentation") @@ -292,6 +295,7 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); #define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succeeded.") #define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succeeded.") #define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succeeded.") + #define SAVE_SUCCESS_LABEL _("Configuration saving succeeded.") #define PARAMETER_LABEL _("Parameter") #define OLD_VALUE_LABEL _("Old value") -- 2.35.1 From 14b8c32f57132d575c31a41819db19d032acc483 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 23 Jan 2025 18:29:07 +0600 Subject: [PATCH 04/40] Settings window functions WIP --- libublsettingsui-gtk3.glade | 1 - source/libublsettingsui-gtk3-config-window.c | 32 ++++++++++++++++++++ source/libublsettingsui-gtk3.h | 7 +++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 source/libublsettingsui-gtk3-config-window.c diff --git a/libublsettingsui-gtk3.glade b/libublsettingsui-gtk3.glade index 9285bbb..bd0e65e 100644 --- a/libublsettingsui-gtk3.glade +++ b/libublsettingsui-gtk3.glade @@ -228,7 +228,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 640 - 440 False 1024 com.ublinux.libublsettingsui-gtk3 diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c new file mode 100644 index 0000000..dbfcef1 --- /dev/null +++ b/source/libublsettingsui-gtk3-config-window.c @@ -0,0 +1,32 @@ +#include "libublsettingsui-gtk3.h" + +typedef struct { + dictionary_fields + +} yon_configuration_parameters; + +ubl_settings_window *yon_ubl_settings_window_new(){ + ubl_settings_window *window = malloc(sizeof(ubl_settings_window)); + GtkBuilder *builder = gtk_builder_new_from_resource("/com/ublinux/libublsettingsui-gtk3-config-window.glade"); + window->window = yon_gtk_builder_get_widget(builder,"Window"); + window->WorkZoneBox = yon_gtk_builder_get_widget(builder,"WorkZoneBox"); + return window; +} + +yon_configuration_parameters *__yon_settings_parameters = NULL; + +void __yon_on_ubl_settings_window_open(){ + +} + +void yon_ubl_settings_window_init(){ + GtkMenuItem *menu_item = gtk_menu_item_new(); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + GtkWidget *label = gtk_label_new(CONFIG_WINDOW_MENU_LABEL); + GtkWidget *image = gtk_image_new_from_icon_name("com.ublinux.libublsettingsui-gtk3.settings-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_box_pack_start(GTK_BOX(box),image,0,0,0); + gtk_box_pack_start(GTK_BOX(box),label,0,0,0); + gtk_widget_show_all(menu_item); + g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(__yon_on_ubl_settings_window_open),NULL); +} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index cc6c15d..806592a 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -250,6 +250,11 @@ char *yon_get_default_label_with_parameter(char *section, char *parameter); template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); +typedef struct { + GtkWidget *window; + GtkWidget *WorkZoneBox; +} ubl_settings_window; + #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) @@ -320,4 +325,6 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); #define CUSTOM_CONFIG_CREATION_ERROR_LABEL _("New configuration file creation failed") #define ROOT_CHECK_LABEL _("Upgrade to root") #define SETTINGS_TITLE_LABEL _("Settings") + + #define CONFIG_WINDOW_MENU_LABEL _("Application settigs") #endif \ No newline at end of file -- 2.35.1 From cbd3f42bc8c5df63581ec108231cb4366d355a56 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 24 Jan 2025 18:04:43 +0600 Subject: [PATCH 05/40] System for application settings WIP --- gresource.xml | 1 + libublsettingsui-gtk3-config-window.glade | 201 +++++++++++++++++++ source/CMakeLists.txt | 2 + source/libublsettingsui-gtk3-config-window.c | 193 +++++++++++++++++- source/libublsettingsui-gtk3.h | 14 ++ 5 files changed, 406 insertions(+), 5 deletions(-) create mode 100644 libublsettingsui-gtk3-config-window.glade diff --git a/gresource.xml b/gresource.xml index 5a3a1a3..476ac68 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-config-window.glade libublsettingsui-gtk3.css diff --git a/libublsettingsui-gtk3-config-window.glade b/libublsettingsui-gtk3-config-window.glade new file mode 100644 index 0000000..0d8f160 --- /dev/null +++ b/libublsettingsui-gtk3-config-window.glade @@ -0,0 +1,201 @@ + + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.cancel-symbolic + + + + True + False + com.ublinux.libublsettingsui-gtk3.accept-symbolic + + + + 450 + 200 + False + True + com.ublinux.libublsettingsui-gtk3 + dialog + + + True + False + vertical + 5 + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + vertical + + + True + True + in + + + True + False + + + True + False + vertical + 5 + + + + + + + + + + + + + + + + True + True + 1 + + + + + True + True + 2 + + + + + + + True + False + + + True + False + Configuration settings + + + + + + + + True + False + 32 + com.ublinux.libublsettingsui-gtk3 + + + + + Cancel + True + True + True + image1 + + + + 1 + + + + + Apply + True + True + True + image2 + + + + end + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index d87dbcd..294004a 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -42,6 +42,7 @@ set(DEPENDFILES ../libublsettingsui-gtk3-documentation.glade ../libublsettingsui-gtk3-saving.glade ../libublsettingsui-gtk3-debugger.glade + ../libublsettingsui-gtk3-config-window.glade ../gresource.xml ../libublsettingsui-gtk3-banner.png ../libublsettingsui-gtk3.css @@ -77,6 +78,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin add_library(${PROJECT_NAME} SHARED libublsettingsui-gtk3.c libublsettingsui-gtk3-save.c + libublsettingsui-gtk3-config-window.c libublsettingsui-gtk3.h ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index dbfcef1..5ba92a4 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -1,32 +1,215 @@ #include "libublsettingsui-gtk3.h" typedef struct { - dictionary_fields - + char *id; + GtkWidget *Box; + GtkWidget *CheckButton; +} yon_configuration_boolean_parameter; + +typedef struct { + char *id; + GtkWidget *Box; + GtkWidget *Label; + GtkWidget *Entry; +} yon_configuration_entry_parameter; + +typedef struct { + char *id; + GtkWidget *Box; + GtkWidget *Label; + GtkWidget *ComboBox; +} yon_configuration_combo_parameter; + +// typedef struct { +// char *id; +// GtkWidget *Label; +// GtkWidget *GtkTreeView; +// GtkListStore *list; +// } yon_configuration_list_parameter; + +yon_configuration_entry_parameter *yon_configuration_entry_parameter_new(char *id, char *label_text){ + yon_configuration_entry_parameter *parameter = malloc(sizeof(yon_configuration_entry_parameter)); + parameter->Box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + parameter->Label = gtk_label_new(label_text); + parameter->Entry = gtk_entry_new(); + parameter->id = yon_char_new(id); + gtk_box_pack_start(GTK_BOX(parameter->Box),parameter->Label,1,1,0); + gtk_box_pack_start(GTK_BOX(parameter->Box),parameter->Entry,1,1,0); + gtk_widget_show_all(parameter->Box); + return parameter; +} + +yon_configuration_combo_parameter *yon_configuration_combo_box_parameter_new(char *id, char *label_text, config_str parameters){ + yon_configuration_combo_parameter *parameter = malloc(sizeof(yon_configuration_combo_parameter)); + parameter->Box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + parameter->Label = gtk_label_new(label_text); + parameter->ComboBox = gtk_combo_box_text_new(); + parameter->id = yon_char_new(id); + gtk_box_pack_start(GTK_BOX(parameter->Box),parameter->Label,0,0,0); + gtk_box_pack_start(GTK_BOX(parameter->Box),parameter->ComboBox,0,0,0); + for (int i=0;parameters[i]&¶meters[i+1];i+=2){ + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(parameter->ComboBox),parameters[i],parameters[i+1]); + } + gtk_combo_box_set_active(GTK_COMBO_BOX(parameter->ComboBox),0); + gtk_widget_show_all(parameter->Box); + return parameter; +} + +typedef struct yon_configuration_parameters { + dictionary_fields(yon_configuration_parameters); + char *label; + enum CONFIGURATION_PARAMETER_TYPE type; } yon_configuration_parameters; ubl_settings_window *yon_ubl_settings_window_new(){ ubl_settings_window *window = malloc(sizeof(ubl_settings_window)); - GtkBuilder *builder = gtk_builder_new_from_resource("/com/ublinux/libublsettingsui-gtk3-config-window.glade"); + GtkBuilder *builder = gtk_builder_new_from_resource("/com/ublinux/ui/libublsettingsui-gtk3-config-window.glade"); window->window = yon_gtk_builder_get_widget(builder,"Window"); window->WorkZoneBox = yon_gtk_builder_get_widget(builder,"WorkZoneBox"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); return window; } yon_configuration_parameters *__yon_settings_parameters = NULL; +void __yon_on_boolean_parameter_toggled(GtkToggleButton *self ,char *id){ + yon_configuration_parameters *current = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (current){ + current->data= gtk_toggle_button_get_active(self)?(void*)1:(void*)0; + } +} + +yon_configuration_boolean_parameter *__yon_configuration_boolean_parameter_new(char *id, char *label_text){ + yon_configuration_boolean_parameter *parameter = malloc(sizeof(yon_configuration_boolean_parameter)); + parameter->Box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + parameter->CheckButton = gtk_check_button_new_with_label(label_text); + parameter->id = yon_char_new(id); + + g_signal_connect(G_OBJECT(parameter->CheckButton),"toggled",G_CALLBACK(__yon_on_boolean_parameter_toggled),parameter->id); + gtk_box_pack_start(GTK_BOX(parameter->Box),parameter->CheckButton,0,0,0); + return parameter; +} + void __yon_on_ubl_settings_window_open(){ + if (!__yon_settings_parameters) return; + ubl_settings_window *window = yon_ubl_settings_window_new(); + dictionary *current = NULL; + for_dictionaries(current,(dictionary*)__yon_settings_parameters){ + switch(((yon_configuration_parameters*)current)->type){ + case CONFIGURATION_PARAMETER_BOOL:{ + yon_configuration_boolean_parameter *cur = __yon_configuration_boolean_parameter_new(((yon_configuration_parameters*)current)->key,((yon_configuration_parameters*)current)->label); + gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); + gtk_widget_show_all(window->WorkZoneBox); + } break; + case CONFIGURATION_PARAMETER_ENTRY:{ + // yon_configuration_entry_parameter *cur = __yon_configuration_entry_parameter_new(current->key,current->label); + // gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); + + } break; + case CONFIGURATION_PARAMETER_COMBO_BOX:{ + yon_configuration_combo_parameter *cur = yon_configuration_combo_box_parameter_new(((yon_configuration_parameters*)current)->key,((yon_configuration_parameters*)current)->label,(config_str)((yon_configuration_parameters*)current)->data); + gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); + gtk_widget_show_all(window->WorkZoneBox); + } break; + case CONFIGURATION_PARAMETER_LIST_MULTIPLE:{ + } break; + } + } + gtk_widget_show(window->window); } -void yon_ubl_settings_window_init(){ - GtkMenuItem *menu_item = gtk_menu_item_new(); +void yon_ubl_settings_window_init(GtkMenu *menu){ + GtkWidget *menu_item = gtk_menu_item_new(); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); GtkWidget *label = gtk_label_new(CONFIG_WINDOW_MENU_LABEL); GtkWidget *image = gtk_image_new_from_icon_name("com.ublinux.libublsettingsui-gtk3.settings-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu),menu_item); gtk_container_add(GTK_CONTAINER(menu_item),box); gtk_box_pack_start(GTK_BOX(box),image,0,0,0); gtk_box_pack_start(GTK_BOX(box),label,0,0,0); gtk_widget_show_all(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(__yon_on_ubl_settings_window_open),NULL); +} + +void *yon_ubl_settings_window_get(char *id){ + yon_configuration_parameters *current = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (current){ + return current->data; + } else { + return NULL; + } +} + +yon_configuration_parameters *yon_configuration_parameter_new() +{ + yon_configuration_parameters *dict = malloc(sizeof(yon_configuration_parameters)); + dict->data = NULL; + dict->key = NULL; + dict->next = NULL; + dict->prev = NULL; + dict->first = (struct yon_configuration_parameters*)dict; + dict->data_type = DICTIONARY_OTHER_TYPE; + return dict; +} + +yon_configuration_parameters *yon_configuration_parameter_append(yon_configuration_parameters *targetdict) +{ + targetdict = (yon_configuration_parameters*)yon_dictionary_get_last((dictionary*)targetdict); + targetdict->next = (struct yon_configuration_parameters*)yon_configuration_parameter_new(); + targetdict->next->prev = (struct yon_configuration_parameters*)targetdict; + targetdict->next->first = targetdict->first; + targetdict->next->data_type = DICTIONARY_OTHER_TYPE; + return targetdict->next; +} + +yon_configuration_parameters *yon_configuration_parameter_new_with_label(char *key, void *data) +{ + yon_configuration_parameters *dct = yon_configuration_parameter_new(); + dct->key = yon_char_new(key); + dct->label = data; + dct->data_type = DICTIONARY_OTHER_TYPE; + return dct; +} + +yon_configuration_parameters *yon_configuration_parameter_append_with_label(yon_configuration_parameters *dict, char *key, void *data) +{ + yon_configuration_parameters *dct = yon_configuration_parameter_append(dict); + dct->key = yon_char_new(key); + dct->label = data; + dct->data_type = DICTIONARY_OTHER_TYPE; + return dct; +} + +#define yon_configuration_parameter_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_configuration_parameter_new_with_label(key,data); \ + else dict=yon_configuration_parameter_append_with_label(dict,key,data);} + +void yon_configuration_window_add_boolean_parameter(enum CONFIGURATION_PARAMETER_TYPE type, char *id, char *label){ + yon_configuration_parameter_add_or_create_if_exists_with_data(__yon_settings_parameters,id,label); + yon_configuration_parameters *parameter = (yon_configuration_parameters*)yon_dictionary_get_last((dictionary*)__yon_settings_parameters); + if (parameter){ + parameter->type = CONFIGURATION_PARAMETER_BOOL; + } +} + +void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMETER_TYPE type, char *id, char *label,...){ + yon_configuration_parameter_add_or_create_if_exists_with_data(__yon_settings_parameters,id,label); + va_list args; + va_start(args,label); + char *cur=NULL; + int size=0; + config_str variants = NULL; + while ((cur=va_arg(args,char*))){ + yon_char_parsed_add_or_create_if_exists(variants,&size,cur); + } + yon_char_parsed_add_or_create_if_exists(variants,&size,NULL); + yon_configuration_parameters *parameter = (yon_configuration_parameters*)yon_dictionary_get_last((dictionary*)__yon_settings_parameters); + if (parameter){ + + parameter->data = (void*)variants; + parameter->type = CONFIGURATION_PARAMETER_COMBO_BOX; + } + } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 806592a..3e978e3 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -250,9 +250,23 @@ char *yon_get_default_label_with_parameter(char *section, char *parameter); template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); +enum CONFIGURATION_PARAMETER_TYPE{ + CONFIGURATION_PARAMETER_BOOL, + CONFIGURATION_PARAMETER_ENTRY, + CONFIGURATION_PARAMETER_COMBO_BOX, + CONFIGURATION_PARAMETER_LIST_MULTIPLE +}; + +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,...); + typedef struct { GtkWidget *window; GtkWidget *WorkZoneBox; + GtkWidget *AcceptButton; + GtkWidget *CancelButton; } ubl_settings_window; #define VERSION_LABEL yon_char_unite(_("Version:")," ",!yon_char_is_empty(template_app_information.app_version)?template_app_information.app_version:"","\n",NULL) -- 2.35.1 From bd91820abc403a1fc39e3b762ce8539c3f971a52 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 Jan 2025 12:16:12 +0600 Subject: [PATCH 06/40] Added combo box parameter for settings window --- libublsettingsui-gtk3-config-window.glade | 52 ++------------------ source/libublsettingsui-gtk3-config-window.c | 44 ++++++++++++----- source/libublsettingsui-gtk3.h | 2 + 3 files changed, 40 insertions(+), 58 deletions(-) diff --git a/libublsettingsui-gtk3-config-window.glade b/libublsettingsui-gtk3-config-window.glade index 0d8f160..d9300b5 100644 --- a/libublsettingsui-gtk3-config-window.glade +++ b/libublsettingsui-gtk3-config-window.glade @@ -3,22 +3,6 @@ - - True - False - com.ublinux.libublsettingsui-gtk3.cancel-symbolic - - - - True - False - com.ublinux.libublsettingsui-gtk3.accept-symbolic - - 450 200 @@ -68,6 +52,10 @@ True False + 5 + 5 + 5 + 5 vertical 5 @@ -103,6 +91,7 @@ True False + True True @@ -121,37 +110,6 @@ com.ublinux.libublsettingsui-gtk3 - - - Cancel - True - True - True - image1 - - - - 1 - - - - - Apply - True - True - True - image2 - - - - end - 2 - - diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index 5ba92a4..0c40b22 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -1,5 +1,7 @@ #include "libublsettingsui-gtk3.h" +void on_confuguration_combo_box_changed(GtkComboBox *self, char *id); + typedef struct { char *id; GtkWidget *Box; @@ -50,7 +52,14 @@ yon_configuration_combo_parameter *yon_configuration_combo_box_parameter_new(cha for (int i=0;parameters[i]&¶meters[i+1];i+=2){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(parameter->ComboBox),parameters[i],parameters[i+1]); } - gtk_combo_box_set_active(GTK_COMBO_BOX(parameter->ComboBox),0); + char *value = NULL; + yon_window_config_get_parameter("settings",id,&value,YON_TYPE_STRING); + if (!yon_char_is_empty(value)){ + gtk_combo_box_set_active_id(GTK_COMBO_BOX(parameter->ComboBox),value); + } else { + gtk_combo_box_set_active(GTK_COMBO_BOX(parameter->ComboBox),0); + } + g_signal_connect(G_OBJECT(parameter->ComboBox),"changed",G_CALLBACK(on_confuguration_combo_box_changed),id); gtk_widget_show_all(parameter->Box); return parameter; } @@ -58,6 +67,7 @@ yon_configuration_combo_parameter *yon_configuration_combo_box_parameter_new(cha typedef struct yon_configuration_parameters { dictionary_fields(yon_configuration_parameters); char *label; + char *value; enum CONFIGURATION_PARAMETER_TYPE type; } yon_configuration_parameters; @@ -68,7 +78,6 @@ ubl_settings_window *yon_ubl_settings_window_new(){ window->WorkZoneBox = yon_gtk_builder_get_widget(builder,"WorkZoneBox"); window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); return window; } @@ -134,15 +143,6 @@ void yon_ubl_settings_window_init(GtkMenu *menu){ g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(__yon_on_ubl_settings_window_open),NULL); } -void *yon_ubl_settings_window_get(char *id){ - yon_configuration_parameters *current = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); - if (current){ - return current->data; - } else { - return NULL; - } -} - yon_configuration_parameters *yon_configuration_parameter_new() { yon_configuration_parameters *dict = malloc(sizeof(yon_configuration_parameters)); @@ -150,6 +150,8 @@ yon_configuration_parameters *yon_configuration_parameter_new() dict->key = NULL; dict->next = NULL; dict->prev = NULL; + dict->data = NULL; + dict->value = NULL; dict->first = (struct yon_configuration_parameters*)dict; dict->data_type = DICTIONARY_OTHER_TYPE; return dict; @@ -162,6 +164,8 @@ yon_configuration_parameters *yon_configuration_parameter_append(yon_configurati targetdict->next->prev = (struct yon_configuration_parameters*)targetdict; targetdict->next->first = targetdict->first; targetdict->next->data_type = DICTIONARY_OTHER_TYPE; + targetdict->next->data = NULL; + targetdict->next->value = NULL; return targetdict->next; } @@ -212,4 +216,22 @@ void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMET parameter->type = CONFIGURATION_PARAMETER_COMBO_BOX; } +} + +char *yon_settings_configuration_get(char *id){ + yon_configuration_parameters *cur = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (cur){ + return cur->value; + } + return NULL; +} + +void on_confuguration_combo_box_changed(GtkComboBox *self, char *id){ + yon_configuration_parameters *cur = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (cur){ + cur->value = yon_char_new((char*)gtk_combo_box_get_active_id(self)); + if (yon_window_config_check_init()){ + yon_window_config_add_instant_parameter(id,"settings",cur->value,YON_TYPE_STRING); + } + } } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 3e978e3..3537e80 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -269,6 +269,8 @@ typedef struct { GtkWidget *CancelButton; } ubl_settings_window; +char *yon_settings_configuration_get(char *id); + #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) -- 2.35.1 From f1dcb02112b89e32f28e1ccf56a3444f49c5d5f5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 Jan 2025 12:40:04 +0600 Subject: [PATCH 07/40] Fixes --- libublsettingsui-gtk3-config-window.glade | 2 +- libublsettingsui-gtk3.pot | 130 ++++++++++--------- libublsettingsui-gtk3_ru.po | 130 ++++++++++--------- source/libublsettingsui-gtk3-config-window.c | 3 + 4 files changed, 138 insertions(+), 127 deletions(-) diff --git a/libublsettingsui-gtk3-config-window.glade b/libublsettingsui-gtk3-config-window.glade index d9300b5..df65feb 100644 --- a/libublsettingsui-gtk3-config-window.glade +++ b/libublsettingsui-gtk3-config-window.glade @@ -96,7 +96,7 @@ True False - Configuration settings + Application settigs diff --git a/libublsettingsui-gtk3.pot b/libublsettingsui-gtk3.pot index b59e95f..271277f 100644 --- a/libublsettingsui-gtk3.pot +++ b/libublsettingsui-gtk3.pot @@ -17,260 +17,264 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/libublsettingsui-gtk3.h:253 +#: source/libublsettingsui-gtk3.h:274 msgid "Version:" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid " version:" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Usage:" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "[OPTIONS]" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Options:" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Show this help" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Show package version" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock this help menu" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock configuration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock local configration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock global configration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock global configration loading" msgstr "" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Reset application settings" msgstr "" -#: source/libublsettingsui-gtk3.h:259 +#: source/libublsettingsui-gtk3.h:280 msgid "Operation succeeded" msgstr "" -#: source/libublsettingsui-gtk3.h:260 +#: source/libublsettingsui-gtk3.h:281 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" msgstr "" -#: source/libublsettingsui-gtk3.h:262 +#: source/libublsettingsui-gtk3.h:283 msgid "Default" msgstr "" -#: source/libublsettingsui-gtk3.h:263 +#: source/libublsettingsui-gtk3.h:284 msgid "About" msgstr "" -#: source/libublsettingsui-gtk3.h:264 +#: source/libublsettingsui-gtk3.h:285 msgid "Documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:266 +#: source/libublsettingsui-gtk3.h:287 msgid "Save to specific file" msgstr "" -#: source/libublsettingsui-gtk3.h:267 +#: source/libublsettingsui-gtk3.h:288 msgid "Save to local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:268 +#: source/libublsettingsui-gtk3.h:289 msgid "Save to global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:269 +#: source/libublsettingsui-gtk3.h:290 msgid "Save configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:270 +#: source/libublsettingsui-gtk3.h:291 msgid "Save" msgstr "" -#: source/libublsettingsui-gtk3.h:271 +#: source/libublsettingsui-gtk3.h:292 msgid "Saving..." msgstr "" -#: source/libublsettingsui-gtk3.h:273 +#: source/libublsettingsui-gtk3.h:294 msgid "Load from specific file" msgstr "" -#: source/libublsettingsui-gtk3.h:274 +#: source/libublsettingsui-gtk3.h:295 msgid "Load local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:296 msgid "Load global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:276 +#: source/libublsettingsui-gtk3.h:297 msgid "Load" msgstr "" -#: source/libublsettingsui-gtk3.h:278 +#: source/libublsettingsui-gtk3.h:299 msgid "Cancel" msgstr "" -#: source/libublsettingsui-gtk3.h:279 +#: source/libublsettingsui-gtk3.h:300 msgid "Accept" msgstr "" -#: source/libublsettingsui-gtk3.h:280 +#: source/libublsettingsui-gtk3.h:301 msgid "Open" msgstr "" -#: source/libublsettingsui-gtk3.h:282 +#: source/libublsettingsui-gtk3.h:303 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/libublsettingsui-gtk3.h:283 +#: source/libublsettingsui-gtk3.h:304 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/libublsettingsui-gtk3.h:284 +#: source/libublsettingsui-gtk3.h:305 msgid "Always redirect to online documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:285 +#: source/libublsettingsui-gtk3.h:306 msgid "Open documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:286 +#: source/libublsettingsui-gtk3.h:307 msgid "Project Home Page" msgstr "" -#: source/libublsettingsui-gtk3.h:287 +#: source/libublsettingsui-gtk3.h:308 msgid "Nothing were chosen" msgstr "" -#: source/libublsettingsui-gtk3.h:288 +#: source/libublsettingsui-gtk3.h:309 msgid "Copyright © 2022 - 2023, UBSoft LLC" msgstr "" -#: source/libublsettingsui-gtk3.h:291 +#: source/libublsettingsui-gtk3.h:312 msgid "Global configuration loading succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:292 +#: source/libublsettingsui-gtk3.h:313 msgid "Local configuration loading succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:293 +#: source/libublsettingsui-gtk3.h:314 msgid "Config loading failed" msgstr "" -#: source/libublsettingsui-gtk3.h:295 +#: source/libublsettingsui-gtk3.h:316 msgid "Local and global configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:296 +#: source/libublsettingsui-gtk3.h:317 msgid "Global configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:297 +#: source/libublsettingsui-gtk3.h:318 msgid "Local configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:298 +#: source/libublsettingsui-gtk3.h:319 msgid "Configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:300 +#: source/libublsettingsui-gtk3.h:321 msgid "Parameter" msgstr "" -#: source/libublsettingsui-gtk3.h:301 +#: source/libublsettingsui-gtk3.h:322 msgid "Old value" msgstr "" -#: source/libublsettingsui-gtk3.h:302 +#: source/libublsettingsui-gtk3.h:323 msgid "New value" msgstr "" -#: source/libublsettingsui-gtk3.h:303 +#: source/libublsettingsui-gtk3.h:324 msgid "" "Value\n" "(Old/New)" msgstr "" -#: source/libublsettingsui-gtk3.h:305 +#: source/libublsettingsui-gtk3.h:326 msgid "Nothing to save" msgstr "" -#: source/libublsettingsui-gtk3.h:306 +#: source/libublsettingsui-gtk3.h:327 msgid "Saving into local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:307 +#: source/libublsettingsui-gtk3.h:328 msgid "Saving into global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:308 +#: source/libublsettingsui-gtk3.h:329 msgid "Saving into global and local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:309 +#: source/libublsettingsui-gtk3.h:330 msgid "Saving into custom configuration at" msgstr "" -#: source/libublsettingsui-gtk3.h:314 +#: source/libublsettingsui-gtk3.h:335 msgid "Full saving mode" msgstr "" -#: source/libublsettingsui-gtk3.h:315 +#: source/libublsettingsui-gtk3.h:336 msgid "Saving into module" msgstr "" -#: source/libublsettingsui-gtk3.h:316 +#: source/libublsettingsui-gtk3.h:337 msgid "Sandbox mode" msgstr "" -#: source/libublsettingsui-gtk3.h:317 +#: source/libublsettingsui-gtk3.h:338 msgid "Sandbox with profile saving" msgstr "" -#: source/libublsettingsui-gtk3.h:318 +#: source/libublsettingsui-gtk3.h:339 msgid "HDD sandbox" msgstr "" -#: source/libublsettingsui-gtk3.h:319 +#: source/libublsettingsui-gtk3.h:340 msgid "HDD sandbox with profile saving" msgstr "" -#: source/libublsettingsui-gtk3.h:320 +#: source/libublsettingsui-gtk3.h:341 msgid "New configuration file creation failed" msgstr "" -#: source/libublsettingsui-gtk3.h:321 +#: source/libublsettingsui-gtk3.h:342 msgid "Upgrade to root" msgstr "" -#: source/libublsettingsui-gtk3.h:322 +#: source/libublsettingsui-gtk3.h:343 msgid "Settings" msgstr "" + +#: source/libublsettingsui-gtk3.h:345 +msgid "Application settigs" +msgstr "" diff --git a/libublsettingsui-gtk3_ru.po b/libublsettingsui-gtk3_ru.po index 3ee7d2e..34dfe91 100644 --- a/libublsettingsui-gtk3_ru.po +++ b/libublsettingsui-gtk3_ru.po @@ -17,63 +17,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/libublsettingsui-gtk3.h:253 +#: source/libublsettingsui-gtk3.h:274 msgid "Version:" msgstr "Версия:" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid " version:" msgstr " версия:" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Usage:" msgstr "Использование:" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "[OPTIONS]" msgstr "[АРГУМЕНТЫ]" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Options:" msgstr "Аргументы:" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Show this help" msgstr "Показать эту подсказку" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Show package version" msgstr "Показать версию пакета" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock this help menu" msgstr "Заблокировать это меню помощи" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock configuration saving" msgstr "Успешно записана локальная конфигурация" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock local configration saving" msgstr "Заблокировать сохранение локальной конфигурации" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock global configration saving" msgstr "Заблокировать сохранение глобальной конфигурации" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Lock global configration loading" msgstr "Заблокировать загрузку глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:254 +#: source/libublsettingsui-gtk3.h:275 msgid "Reset application settings" msgstr "Сбросить настройки программы" -#: source/libublsettingsui-gtk3.h:259 +#: source/libublsettingsui-gtk3.h:280 msgid "Operation succeeded" msgstr "Операция завершена" -#: source/libublsettingsui-gtk3.h:260 +#: source/libublsettingsui-gtk3.h:281 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" @@ -81,75 +81,75 @@ msgstr "" "Внимание! Приложение было запущено без прав суперпользователя - действия, " "требующие их наличия заблокированы" -#: source/libublsettingsui-gtk3.h:262 +#: source/libublsettingsui-gtk3.h:283 msgid "Default" msgstr "По умолчанию" -#: source/libublsettingsui-gtk3.h:263 +#: source/libublsettingsui-gtk3.h:284 msgid "About" msgstr "О программе" -#: source/libublsettingsui-gtk3.h:264 +#: source/libublsettingsui-gtk3.h:285 msgid "Documentation" msgstr "Справка" -#: source/libublsettingsui-gtk3.h:266 +#: source/libublsettingsui-gtk3.h:287 msgid "Save to specific file" msgstr "Сохранить в файл" -#: source/libublsettingsui-gtk3.h:267 +#: source/libublsettingsui-gtk3.h:288 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/libublsettingsui-gtk3.h:268 +#: source/libublsettingsui-gtk3.h:289 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:269 +#: source/libublsettingsui-gtk3.h:290 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/libublsettingsui-gtk3.h:270 +#: source/libublsettingsui-gtk3.h:291 msgid "Save" msgstr "Сохранить" -#: source/libublsettingsui-gtk3.h:271 +#: source/libublsettingsui-gtk3.h:292 msgid "Saving..." msgstr "Сохранение..." -#: source/libublsettingsui-gtk3.h:273 +#: source/libublsettingsui-gtk3.h:294 msgid "Load from specific file" msgstr "Загрузить из файла" -#: source/libublsettingsui-gtk3.h:274 +#: source/libublsettingsui-gtk3.h:295 msgid "Load local configuration" msgstr "Загрузить локальную конфигурацию" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:296 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:276 +#: source/libublsettingsui-gtk3.h:297 msgid "Load" msgstr "Загрузить" -#: source/libublsettingsui-gtk3.h:278 +#: source/libublsettingsui-gtk3.h:299 msgid "Cancel" msgstr "Отмена" -#: source/libublsettingsui-gtk3.h:279 +#: source/libublsettingsui-gtk3.h:300 msgid "Accept" msgstr "Принять" -#: source/libublsettingsui-gtk3.h:280 +#: source/libublsettingsui-gtk3.h:301 msgid "Open" msgstr "Открыть" -#: source/libublsettingsui-gtk3.h:282 +#: source/libublsettingsui-gtk3.h:303 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/libublsettingsui-gtk3.h:283 +#: source/libublsettingsui-gtk3.h:304 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -157,67 +157,67 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией, где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/libublsettingsui-gtk3.h:284 +#: source/libublsettingsui-gtk3.h:305 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/libublsettingsui-gtk3.h:285 +#: source/libublsettingsui-gtk3.h:306 msgid "Open documentation" msgstr "Прочитать справку" -#: source/libublsettingsui-gtk3.h:286 +#: source/libublsettingsui-gtk3.h:307 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/libublsettingsui-gtk3.h:287 +#: source/libublsettingsui-gtk3.h:308 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/libublsettingsui-gtk3.h:288 +#: source/libublsettingsui-gtk3.h:309 msgid "Copyright © 2022 - 2023, UBSoft LLC" msgstr "Copyright © 2022 - 2023, ООО «Юбисофт»" -#: source/libublsettingsui-gtk3.h:291 +#: source/libublsettingsui-gtk3.h:312 msgid "Global configuration loading succeeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:292 +#: source/libublsettingsui-gtk3.h:313 msgid "Local configuration loading succeeded." msgstr "Успешно загружена локальная конфигурация" -#: source/libublsettingsui-gtk3.h:293 +#: source/libublsettingsui-gtk3.h:314 msgid "Config loading failed" msgstr "Ошибка загрузки конфига" -#: source/libublsettingsui-gtk3.h:295 +#: source/libublsettingsui-gtk3.h:316 msgid "Local and global configuration saving succeeded." msgstr "Успешно записаны локальная и глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:296 +#: source/libublsettingsui-gtk3.h:317 msgid "Global configuration saving succeeded." msgstr "Успешно записана глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:297 +#: source/libublsettingsui-gtk3.h:318 msgid "Local configuration saving succeeded." msgstr "Успешно записана локальная конфигурация" -#: source/libublsettingsui-gtk3.h:298 +#: source/libublsettingsui-gtk3.h:319 msgid "Configuration saving succeeded." msgstr "Успешно записана конфигурация" -#: source/libublsettingsui-gtk3.h:300 +#: source/libublsettingsui-gtk3.h:321 msgid "Parameter" msgstr "Параметр" -#: source/libublsettingsui-gtk3.h:301 +#: source/libublsettingsui-gtk3.h:322 msgid "Old value" msgstr "Старое значение" -#: source/libublsettingsui-gtk3.h:302 +#: source/libublsettingsui-gtk3.h:323 msgid "New value" msgstr "Новое значение" -#: source/libublsettingsui-gtk3.h:303 +#: source/libublsettingsui-gtk3.h:324 msgid "" "Value\n" "(Old/New)" @@ -225,58 +225,62 @@ msgstr "" "Значение\n" "(Старое/Новое)" -#: source/libublsettingsui-gtk3.h:305 +#: source/libublsettingsui-gtk3.h:326 msgid "Nothing to save" msgstr "Нечего сохранять" -#: source/libublsettingsui-gtk3.h:306 +#: source/libublsettingsui-gtk3.h:327 msgid "Saving into local configuration" msgstr "Сохранение в локальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:307 +#: source/libublsettingsui-gtk3.h:328 msgid "Saving into global configuration" msgstr "Сохранение в глобальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:308 +#: source/libublsettingsui-gtk3.h:329 msgid "Saving into global and local configuration" msgstr "Сохранение в глобальный и локальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:309 +#: source/libublsettingsui-gtk3.h:330 msgid "Saving into custom configuration at" msgstr "Сохранение в конфигурационный файл по пути" -#: source/libublsettingsui-gtk3.h:314 +#: source/libublsettingsui-gtk3.h:335 msgid "Full saving mode" msgstr "Полное сохранение" -#: source/libublsettingsui-gtk3.h:315 +#: source/libublsettingsui-gtk3.h:336 msgid "Saving into module" msgstr "Сохранение в модуль" -#: source/libublsettingsui-gtk3.h:316 +#: source/libublsettingsui-gtk3.h:337 msgid "Sandbox mode" msgstr "Полная песочница в ОЗУ" -#: source/libublsettingsui-gtk3.h:317 +#: source/libublsettingsui-gtk3.h:338 msgid "Sandbox with profile saving" msgstr "Песочница с сохранением профиля пользователя" -#: source/libublsettingsui-gtk3.h:318 +#: source/libublsettingsui-gtk3.h:339 msgid "HDD sandbox" msgstr "Полная песочница на HDD" -#: source/libublsettingsui-gtk3.h:319 +#: source/libublsettingsui-gtk3.h:340 msgid "HDD sandbox with profile saving" msgstr "Полная песочница на HDD с сохранением профиля пользователя" -#: source/libublsettingsui-gtk3.h:320 +#: source/libublsettingsui-gtk3.h:341 msgid "New configuration file creation failed" msgstr "Ошибка создания нового файла конфигурации" -#: source/libublsettingsui-gtk3.h:321 +#: source/libublsettingsui-gtk3.h:342 msgid "Upgrade to root" msgstr "Повысить права до root" -#: source/libublsettingsui-gtk3.h:322 +#: source/libublsettingsui-gtk3.h:343 msgid "Settings" msgstr "" + +#: source/libublsettingsui-gtk3.h:345 +msgid "Application settigs" +msgstr "Настройки" diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index 0c40b22..e48eed8 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -133,7 +133,10 @@ void __yon_on_ubl_settings_window_open(){ void yon_ubl_settings_window_init(GtkMenu *menu){ GtkWidget *menu_item = gtk_menu_item_new(); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + textdomain(template_ui_LocaleName); GtkWidget *label = gtk_label_new(CONFIG_WINDOW_MENU_LABEL); + textdomain(template_app_information.app_locale); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); GtkWidget *image = gtk_image_new_from_icon_name("com.ublinux.libublsettingsui-gtk3.settings-symbolic",GTK_ICON_SIZE_BUTTON); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu),menu_item); gtk_container_add(GTK_CONTAINER(menu_item),box); -- 2.35.1 From a39c9469f25919d21f924f01c6720a439756908e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 Jan 2025 15:03:39 +0600 Subject: [PATCH 08/40] Fixes --- source/libublsettingsui-gtk3-config-window.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index e48eed8..897445f 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -210,6 +210,13 @@ void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMET config_str variants = NULL; while ((cur=va_arg(args,char*))){ yon_char_parsed_add_or_create_if_exists(variants,&size,cur); + } + { + char *target=NULL; + yon_window_config_get_parameter("settings",id,&target,YON_TYPE_STRING); + if (yon_char_is_empty(target)){ + yon_window_config_add_instant_parameter(id,"settings",variants[0],YON_TYPE_STRING); + } } yon_char_parsed_add_or_create_if_exists(variants,&size,NULL); yon_configuration_parameters *parameter = (yon_configuration_parameters*)yon_dictionary_get_last((dictionary*)__yon_settings_parameters); @@ -222,11 +229,9 @@ void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMET } char *yon_settings_configuration_get(char *id){ - yon_configuration_parameters *cur = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); - if (cur){ - return cur->value; - } - return NULL; + char *return_val = NULL; + yon_window_config_get_parameter("settings",id,&return_val,YON_TYPE_STRING); + return return_val; } void on_confuguration_combo_box_changed(GtkComboBox *self, char *id){ -- 2.35.1 From 455dac66e3e3e33f823f8dab541d3711d4a91c36 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 Jan 2025 16:50:26 +0600 Subject: [PATCH 09/40] Fixes --- source/libublsettingsui-gtk3-config-window.c | 152 ++++++++++--------- source/libublsettingsui-gtk3.c | 3 + source/libublsettingsui-gtk3.h | 5 +- 3 files changed, 87 insertions(+), 73 deletions(-) diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index 897445f..2ca27a6 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -1,6 +1,7 @@ #include "libublsettingsui-gtk3.h" void on_confuguration_combo_box_changed(GtkComboBox *self, char *id); +void __yon_on_boolean_parameter_toggled(GtkToggleButton *self ,char *id); typedef struct { char *id; @@ -29,6 +30,15 @@ typedef struct { // GtkListStore *list; // } yon_configuration_list_parameter; + + +typedef struct yon_configuration_parameters { + dictionary_fields(yon_configuration_parameters); + char *label; + char *value; + enum CONFIGURATION_PARAMETER_TYPE type; +} yon_configuration_parameters; + yon_configuration_entry_parameter *yon_configuration_entry_parameter_new(char *id, char *label_text){ yon_configuration_entry_parameter *parameter = malloc(sizeof(yon_configuration_entry_parameter)); parameter->Box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); @@ -64,13 +74,6 @@ yon_configuration_combo_parameter *yon_configuration_combo_box_parameter_new(cha return parameter; } -typedef struct yon_configuration_parameters { - dictionary_fields(yon_configuration_parameters); - char *label; - char *value; - enum CONFIGURATION_PARAMETER_TYPE type; -} yon_configuration_parameters; - ubl_settings_window *yon_ubl_settings_window_new(){ ubl_settings_window *window = malloc(sizeof(ubl_settings_window)); GtkBuilder *builder = gtk_builder_new_from_resource("/com/ublinux/ui/libublsettingsui-gtk3-config-window.glade"); @@ -83,12 +86,6 @@ ubl_settings_window *yon_ubl_settings_window_new(){ yon_configuration_parameters *__yon_settings_parameters = NULL; -void __yon_on_boolean_parameter_toggled(GtkToggleButton *self ,char *id){ - yon_configuration_parameters *current = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); - if (current){ - current->data= gtk_toggle_button_get_active(self)?(void*)1:(void*)0; - } -} yon_configuration_boolean_parameter *__yon_configuration_boolean_parameter_new(char *id, char *label_text){ yon_configuration_boolean_parameter *parameter = malloc(sizeof(yon_configuration_boolean_parameter)); @@ -101,50 +98,7 @@ yon_configuration_boolean_parameter *__yon_configuration_boolean_parameter_new(c return parameter; } -void __yon_on_ubl_settings_window_open(){ - if (!__yon_settings_parameters) return; - ubl_settings_window *window = yon_ubl_settings_window_new(); - dictionary *current = NULL; - for_dictionaries(current,(dictionary*)__yon_settings_parameters){ - switch(((yon_configuration_parameters*)current)->type){ - case CONFIGURATION_PARAMETER_BOOL:{ - yon_configuration_boolean_parameter *cur = __yon_configuration_boolean_parameter_new(((yon_configuration_parameters*)current)->key,((yon_configuration_parameters*)current)->label); - gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); - gtk_widget_show_all(window->WorkZoneBox); - - } break; - case CONFIGURATION_PARAMETER_ENTRY:{ - // yon_configuration_entry_parameter *cur = __yon_configuration_entry_parameter_new(current->key,current->label); - // gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); - - } break; - case CONFIGURATION_PARAMETER_COMBO_BOX:{ - yon_configuration_combo_parameter *cur = yon_configuration_combo_box_parameter_new(((yon_configuration_parameters*)current)->key,((yon_configuration_parameters*)current)->label,(config_str)((yon_configuration_parameters*)current)->data); - gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); - gtk_widget_show_all(window->WorkZoneBox); - } break; - case CONFIGURATION_PARAMETER_LIST_MULTIPLE:{ - } break; - } - } - gtk_widget_show(window->window); -} - -void yon_ubl_settings_window_init(GtkMenu *menu){ - GtkWidget *menu_item = gtk_menu_item_new(); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - textdomain(template_ui_LocaleName); - GtkWidget *label = gtk_label_new(CONFIG_WINDOW_MENU_LABEL); - textdomain(template_app_information.app_locale); - gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); - GtkWidget *image = gtk_image_new_from_icon_name("com.ublinux.libublsettingsui-gtk3.settings-symbolic",GTK_ICON_SIZE_BUTTON); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu),menu_item); - gtk_container_add(GTK_CONTAINER(menu_item),box); - gtk_box_pack_start(GTK_BOX(box),image,0,0,0); - gtk_box_pack_start(GTK_BOX(box),label,0,0,0); - gtk_widget_show_all(menu_item); - g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(__yon_on_ubl_settings_window_open),NULL); -} +//parameter section yon_configuration_parameters *yon_configuration_parameter_new() { @@ -201,6 +155,62 @@ void yon_configuration_window_add_boolean_parameter(enum CONFIGURATION_PARAMETER } } +char *yon_settings_configuration_get(char *id){ + char *return_val = NULL; + yon_window_config_get_parameter("settings",id,&return_val,YON_TYPE_STRING); + return return_val; +} + +//signnals section + +void __yon_on_ubl_settings_window_open(){ + if (!__yon_settings_parameters) return; + ubl_settings_window *window = yon_ubl_settings_window_new(); + dictionary *current = NULL; + for_dictionaries(current,(dictionary*)__yon_settings_parameters){ + switch(((yon_configuration_parameters*)current)->type){ + case CONFIGURATION_PARAMETER_BOOL:{ + yon_configuration_boolean_parameter *cur = __yon_configuration_boolean_parameter_new(((yon_configuration_parameters*)current)->key,((yon_configuration_parameters*)current)->label); + gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); + gtk_widget_show_all(window->WorkZoneBox); + + } break; + case CONFIGURATION_PARAMETER_ENTRY:{ + // yon_configuration_entry_parameter *cur = __yon_configuration_entry_parameter_new(current->key,current->label); + // gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); + + } break; + case CONFIGURATION_PARAMETER_COMBO_BOX:{ + yon_configuration_combo_parameter *cur = yon_configuration_combo_box_parameter_new(((yon_configuration_parameters*)current)->key,((yon_configuration_parameters*)current)->label,(config_str)((yon_configuration_parameters*)current)->data); + gtk_box_pack_start(GTK_BOX(window->WorkZoneBox),cur->Box,0,0,0); + gtk_widget_show_all(window->WorkZoneBox); + } break; + case CONFIGURATION_PARAMETER_LIST_MULTIPLE:{ + } break; + } + } + gtk_widget_show(window->window); +} + +void __yon_on_boolean_parameter_toggled(GtkToggleButton *self ,char *id){ + yon_configuration_parameters *current = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (current){ + current->data= gtk_toggle_button_get_active(self)?(void*)1:(void*)0; + } +} + +void on_confuguration_combo_box_changed(GtkComboBox *self, char *id){ + yon_configuration_parameters *cur = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (cur){ + cur->value = yon_char_new((char*)gtk_combo_box_get_active_id(self)); + if (yon_window_config_check_init()){ + yon_window_config_add_instant_parameter(id,"settings",cur->value,YON_TYPE_STRING); + } + } +} + +//init section + void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMETER_TYPE type, char *id, char *label,...){ yon_configuration_parameter_add_or_create_if_exists_with_data(__yon_settings_parameters,id,label); va_list args; @@ -228,18 +238,18 @@ void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMET } -char *yon_settings_configuration_get(char *id){ - char *return_val = NULL; - yon_window_config_get_parameter("settings",id,&return_val,YON_TYPE_STRING); - return return_val; -} - -void on_confuguration_combo_box_changed(GtkComboBox *self, char *id){ - yon_configuration_parameters *cur = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); - if (cur){ - cur->value = yon_char_new((char*)gtk_combo_box_get_active_id(self)); - if (yon_window_config_check_init()){ - yon_window_config_add_instant_parameter(id,"settings",cur->value,YON_TYPE_STRING); - } - } +void yon_ubl_settings_window_init(GtkMenu *menu){ + GtkWidget *menu_item = gtk_menu_item_new(); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + textdomain(template_ui_LocaleName); + GtkWidget *label = gtk_label_new(CONFIG_WINDOW_MENU_LABEL); + textdomain(template_app_information.app_locale); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); + GtkWidget *image = gtk_image_new_from_icon_name("com.ublinux.libublsettingsui-gtk3.settings-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu),menu_item); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_box_pack_start(GTK_BOX(box),image,0,0,0); + gtk_box_pack_start(GTK_BOX(box),label,0,0,0); + gtk_widget_show_all(menu_item); + g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(__yon_on_ubl_settings_window_open),NULL); } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 90dcbc4..7463973 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -1,5 +1,8 @@ #include "libublsettingsui-gtk3.h" +_template_config *template_config = NULL; +template_app_info template_app_information; + static char *__yon_config_mode=NULL; char *yon_ubl_save_mode_get_icon_name(SAVE_MODE_TYPE type){ diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 3537e80..ac56b3d 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -66,7 +66,7 @@ typedef struct { gboolean always_open_documentation; } template_app_info; -static template_app_info template_app_information; +extern template_app_info template_app_information; #define template_config_fields\ @@ -89,8 +89,9 @@ static template_app_info template_app_information; typedef struct { template_config_fields } _template_config; + [[maybe_unused]] -static _template_config *template_config; +extern _template_config *template_config; #define template_window_fields\ GtkWidget *Window;\ -- 2.35.1 From 2617110609e92f96a100a20217c18fa852935bcd Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 Jan 2025 17:57:51 +0600 Subject: [PATCH 10/40] Fixes; Added custom callback function to settings window comboboxes --- libublsettingsui-gtk3-config-window.glade | 1 - source/libublsettingsui-gtk3-config-window.c | 23 +++++++++++++++----- source/libublsettingsui-gtk3.h | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/libublsettingsui-gtk3-config-window.glade b/libublsettingsui-gtk3-config-window.glade index df65feb..1adaf1f 100644 --- a/libublsettingsui-gtk3-config-window.glade +++ b/libublsettingsui-gtk3-config-window.glade @@ -7,7 +7,6 @@ 450 200 False - True com.ublinux.libublsettingsui-gtk3 dialog diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index 2ca27a6..ae12e42 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -36,6 +36,7 @@ typedef struct yon_configuration_parameters { dictionary_fields(yon_configuration_parameters); char *label; char *value; + GCallback func; enum CONFIGURATION_PARAMETER_TYPE type; } yon_configuration_parameters; @@ -51,6 +52,8 @@ yon_configuration_entry_parameter *yon_configuration_entry_parameter_new(char *i return parameter; } +yon_configuration_parameters *__yon_settings_parameters = NULL; + yon_configuration_combo_parameter *yon_configuration_combo_box_parameter_new(char *id, char *label_text, config_str parameters){ yon_configuration_combo_parameter *parameter = malloc(sizeof(yon_configuration_combo_parameter)); parameter->Box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); @@ -70,6 +73,12 @@ yon_configuration_combo_parameter *yon_configuration_combo_box_parameter_new(cha gtk_combo_box_set_active(GTK_COMBO_BOX(parameter->ComboBox),0); } g_signal_connect(G_OBJECT(parameter->ComboBox),"changed",G_CALLBACK(on_confuguration_combo_box_changed),id); + yon_configuration_parameters *target = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); + if (target){ + if (target->func){ + g_signal_connect(G_OBJECT(parameter->ComboBox),"changed",G_CALLBACK(target->func),target->value); + } + } gtk_widget_show_all(parameter->Box); return parameter; } @@ -84,8 +93,6 @@ ubl_settings_window *yon_ubl_settings_window_new(){ return window; } -yon_configuration_parameters *__yon_settings_parameters = NULL; - yon_configuration_boolean_parameter *__yon_configuration_boolean_parameter_new(char *id, char *label_text){ yon_configuration_boolean_parameter *parameter = malloc(sizeof(yon_configuration_boolean_parameter)); @@ -109,6 +116,7 @@ yon_configuration_parameters *yon_configuration_parameter_new() dict->prev = NULL; dict->data = NULL; dict->value = NULL; + dict->func = NULL; dict->first = (struct yon_configuration_parameters*)dict; dict->data_type = DICTIONARY_OTHER_TYPE; return dict; @@ -123,6 +131,7 @@ yon_configuration_parameters *yon_configuration_parameter_append(yon_configurati targetdict->next->data_type = DICTIONARY_OTHER_TYPE; targetdict->next->data = NULL; targetdict->next->value = NULL; + targetdict->next->func = NULL; return targetdict->next; } @@ -202,19 +211,19 @@ void __yon_on_boolean_parameter_toggled(GtkToggleButton *self ,char *id){ void on_confuguration_combo_box_changed(GtkComboBox *self, char *id){ yon_configuration_parameters *cur = (yon_configuration_parameters*)yon_dictionary_get((dictionary**)&__yon_settings_parameters,id); if (cur){ - cur->value = yon_char_new((char*)gtk_combo_box_get_active_id(self)); + char *cur_value = yon_char_new((char*)gtk_combo_box_get_active_id(self)); if (yon_window_config_check_init()){ - yon_window_config_add_instant_parameter(id,"settings",cur->value,YON_TYPE_STRING); + yon_window_config_add_instant_parameter(id,"settings",cur_value,YON_TYPE_STRING); } } } //init section -void yon_configuration_window_add_combo_box_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,...){ yon_configuration_parameter_add_or_create_if_exists_with_data(__yon_settings_parameters,id,label); va_list args; - va_start(args,label); + va_start(args,data); char *cur=NULL; int size=0; config_str variants = NULL; @@ -234,6 +243,8 @@ void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMET parameter->data = (void*)variants; parameter->type = CONFIGURATION_PARAMETER_COMBO_BOX; + parameter->func = func; + parameter->value = data; } } diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index ac56b3d..76609a0 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -261,7 +261,7 @@ enum CONFIGURATION_PARAMETER_TYPE{ 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,...); +void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMETER_TYPE type, char *id, char *label, GCallback func, gpointer data, ...); typedef struct { GtkWidget *window; -- 2.35.1 From 399e5e43cf45527015151831764c094d42ac5bc7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 Jan 2025 10:57:54 +0600 Subject: [PATCH 11/40] Fixed custom config saving status messages --- source/libublsettingsui-gtk3-save.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index bc396f3..45382a6 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -501,6 +501,7 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){ if (!path&&type == YON_CONFIG_CUSTOM){ path = yon_custom_config_init(); + if (!path) return NULL; } va_list args; -- 2.35.1 From 5136a8a6524d12326db0ae133e08a454dd1b4f2b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 Jan 2025 15:07:04 +0600 Subject: [PATCH 12/40] Changed default window size --- libublsettingsui-gtk3.glade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libublsettingsui-gtk3.glade b/libublsettingsui-gtk3.glade index bd0e65e..a70d977 100644 --- a/libublsettingsui-gtk3.glade +++ b/libublsettingsui-gtk3.glade @@ -229,7 +229,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 640 False - 1024 + 800 + 500 com.ublinux.libublsettingsui-gtk3 -- 2.35.1 From 66bfec1d4499300a298c1964af9c582d3e82261c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 Jan 2025 18:05:13 +0600 Subject: [PATCH 13/40] Added entry function for blocking --- source/libublsettingsui-gtk3.c | 66 ++++++++++++++++++++++++++++++++++ source/libublsettingsui-gtk3.h | 6 ++++ 2 files changed, 72 insertions(+) diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 7463973..85317b5 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -508,3 +508,69 @@ template_main_window *yon_ubl_window_setup(){ return widgets; } + +void yon_on_email_check(GtkEntry *self,GdkEventFocus *event,GtkContainer *status){ + char *text = (char*)gtk_entry_get_text(self); + if (!strstr(text,"@")){ + yon_ubl_status_box_spawn_infinite(status,"invalid_email",EMAIL_INVALID_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else { + yon_ubl_status_box_despawn_infinite(status); + } +} + +void yon_on_digit_only_changed(GtkEditable *editable, const gchar *text, gint length, gint *position){ + gchar *new_text = g_new(gchar, length + 1); + gint i, j = 0; + + for (i = 0; i < length; i++) { + if (text[i]>'0'&&text[i]<'9') { + new_text[j] = text[i]; + j++; + } + }if (j < length) { + g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_digit_only_changed), NULL); + gtk_editable_insert_text(editable, new_text, j, position); + g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_digit_only_changed), NULL); + g_signal_stop_emission_by_name(editable, "insert-text"); + } + + g_free(new_text); +} + +void yon_on_path_check(GtkEntry *self,GdkEventFocus *event,GtkContainer *status){ + char *text = (char*)gtk_entry_get_text(self); + if (text[0]=='~'){ + text = yon_char_new(text); + free(yon_char_divide(text,0)); + char *new_text = yon_char_unite(yon_ubl_user_get_home_directory(),"/",text,NULL); + free(text); + gtk_entry_set_text(GTK_ENTRY(self),new_text); + text = new_text; + } + if (!strstr(text,"/")){ + yon_ubl_status_box_spawn_infinite(status,"invalid_path",PATH_INVALID_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else { + yon_ubl_status_box_despawn_infinite(status); + } + +} + +void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ + GtkInputPurpose purpose = gtk_entry_get_input_purpose(target); + switch(purpose){ + case GTK_INPUT_PURPOSE_EMAIL: + g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); + break; + case GTK_INPUT_PURPOSE_DIGITS: + g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); + + break; + case GTK_INPUT_PURPOSE_URL: + + g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); + break; + default: break; + + + } +} \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 76609a0..49b9aaf 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -215,6 +215,8 @@ void on_about(GtkWidget *self, char *version_application); */ void on_open_documentation_confirmation(GtkWidget *self, char *link); +void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status); + int yon_ubl_setup_arguments(int argc, char *argv[],config_str *unfound_arguments, int *arguments_size, char *additional_options_output); void yon_gtk_scrolled_window_set_horizontal_at_desired_size(GtkWidget *window, GtkScrolledWindow *target); @@ -344,4 +346,8 @@ char *yon_settings_configuration_get(char *id); #define SETTINGS_TITLE_LABEL _("Settings") #define CONFIG_WINDOW_MENU_LABEL _("Application settigs") + + #define EMAIL_INVALID_LABEL _("Invalid email adress") + #define PATH_INVALID_LABEL _("Invalid path") + #endif \ No newline at end of file -- 2.35.1 From fb29d11cdf38235fa273978e841b5e044f2301d2 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 31 Jan 2025 10:19:54 +0600 Subject: [PATCH 14/40] Added entry restrictions checking functions --- source/libublsettingsui-gtk3.c | 34 ++++++++++++++++++++++++++++++++-- source/libublsettingsui-gtk3.h | 4 ++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 85317b5..a750990 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -5,6 +5,13 @@ template_app_info template_app_information; static char *__yon_config_mode=NULL; +char *yon_char_get_localised_from_lib(char *string){ + textdomain(template_ui_LocaleName); + char *ret = _(string); + textdomain(template_app_information.app_locale); + return ret; +} + char *yon_ubl_save_mode_get_icon_name(SAVE_MODE_TYPE type){ switch (type){ case SAVE_MODE_FULL: @@ -555,19 +562,42 @@ void yon_on_path_check(GtkEntry *self,GdkEventFocus *event,GtkContainer *status) } +char *yon_gtk_entry_check_restricted(GtkEntry *target){ + GtkInputPurpose purpose = gtk_entry_get_input_purpose(target); + const char *text = gtk_entry_get_text(target); + char *error=NULL; + switch(purpose){ + case GTK_INPUT_PURPOSE_EMAIL:{ + if (!strstr(text,"@")){ + error = yon_char_get_localised_from_lib(EMAIL_INVALID_LABEL); + } + } + break; + case GTK_INPUT_PURPOSE_URL:{ + if (!strstr(text,"/")){ + error = yon_char_get_localised_from_lib(PATH_INVALID_LABEL); + } + } + break; + default: break; + } + return error; +} + void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ GtkInputPurpose purpose = gtk_entry_get_input_purpose(target); switch(purpose){ case GTK_INPUT_PURPOSE_EMAIL: - g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); + yon_gtk_entry_block_restricted_symbols(target); + break; case GTK_INPUT_PURPOSE_DIGITS: g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); break; case GTK_INPUT_PURPOSE_URL: + yon_gtk_entry_block_restricted_symbols(target); - g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); break; default: break; diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 49b9aaf..a1b8fee 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -46,6 +46,8 @@ 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_TYPE yon_ubl_save_mode_get_type(char *type); @@ -265,6 +267,8 @@ 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, ...); +char *yon_gtk_entry_check_restricted(GtkEntry *target); + typedef struct { GtkWidget *window; GtkWidget *WorkZoneBox; -- 2.35.1 From eb344116c21268a58bd632d2471647b1a9e6fa29 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 31 Jan 2025 15:02:11 +0600 Subject: [PATCH 15/40] Fixed align --- source/libublsettingsui-gtk3-config-window.c | 4 ++-- source/libublsettingsui-gtk3.c | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index ae12e42..5dcbe12 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -259,8 +259,8 @@ void yon_ubl_settings_window_init(GtkMenu *menu){ GtkWidget *image = gtk_image_new_from_icon_name("com.ublinux.libublsettingsui-gtk3.settings-symbolic",GTK_ICON_SIZE_BUTTON); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu),menu_item); gtk_container_add(GTK_CONTAINER(menu_item),box); - gtk_box_pack_start(GTK_BOX(box),image,0,0,0); - gtk_box_pack_start(GTK_BOX(box),label,0,0,0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); gtk_widget_show_all(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(__yon_on_ubl_settings_window_open),NULL); } \ No newline at end of file diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index a750990..f78bb85 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -587,14 +587,13 @@ char *yon_gtk_entry_check_restricted(GtkEntry *target){ void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ GtkInputPurpose purpose = gtk_entry_get_input_purpose(target); switch(purpose){ - case GTK_INPUT_PURPOSE_EMAIL: - yon_gtk_entry_block_restricted_symbols(target); - break; case GTK_INPUT_PURPOSE_DIGITS: g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); break; + case GTK_INPUT_PURPOSE_NAME: + case GTK_INPUT_PURPOSE_EMAIL: case GTK_INPUT_PURPOSE_URL: yon_gtk_entry_block_restricted_symbols(target); -- 2.35.1 From f3ba99037135ab5a25e16b4666e0b3de674af578 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 31 Jan 2025 17:50:57 +0600 Subject: [PATCH 16/40] Settings window menu label align fix --- source/libublsettingsui-gtk3-config-window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libublsettingsui-gtk3-config-window.c b/source/libublsettingsui-gtk3-config-window.c index 5dcbe12..72a8501 100644 --- a/source/libublsettingsui-gtk3-config-window.c +++ b/source/libublsettingsui-gtk3-config-window.c @@ -251,7 +251,7 @@ void yon_configuration_window_add_combo_box_parameter(enum CONFIGURATION_PARAMET void yon_ubl_settings_window_init(GtkMenu *menu){ GtkWidget *menu_item = gtk_menu_item_new(); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); textdomain(template_ui_LocaleName); GtkWidget *label = gtk_label_new(CONFIG_WINDOW_MENU_LABEL); textdomain(template_app_information.app_locale); -- 2.35.1 From b4e740ff8f91b532847363b9e4d83cb3f60187fc Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 31 Jan 2025 17:53:12 +0600 Subject: [PATCH 17/40] Localisation fix --- libublsettingsui-gtk3.pot | 8 ++++++++ libublsettingsui-gtk3_ru.po | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/libublsettingsui-gtk3.pot b/libublsettingsui-gtk3.pot index 271277f..384607b 100644 --- a/libublsettingsui-gtk3.pot +++ b/libublsettingsui-gtk3.pot @@ -278,3 +278,11 @@ msgstr "" #: source/libublsettingsui-gtk3.h:345 msgid "Application settigs" msgstr "" + +#: source/libublsettingsui-gtk3.h:345 +msgid "Invalid email adress" +msgstr "" + +#: source/libublsettingsui-gtk3.h:345 +msgid "Invalid path" +msgstr "" diff --git a/libublsettingsui-gtk3_ru.po b/libublsettingsui-gtk3_ru.po index 34dfe91..f7edb5d 100644 --- a/libublsettingsui-gtk3_ru.po +++ b/libublsettingsui-gtk3_ru.po @@ -284,3 +284,11 @@ msgstr "" #: source/libublsettingsui-gtk3.h:345 msgid "Application settigs" msgstr "Настройки" + +#: source/libublsettingsui-gtk3.h:345 +msgid "Invalid email adress" +msgstr "Неверный email-адрес" + +#: source/libublsettingsui-gtk3.h:345 +msgid "Invalid path" +msgstr "Неправильный путь" \ No newline at end of file -- 2.35.1 From ace3342c37343c8c955df1276d72e96f3af24c96 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 10:21:35 +0600 Subject: [PATCH 18/40] fixed < and > symbols saving --- source/libublsettingsui-gtk3-save.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 45382a6..27a8fcc 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -413,6 +413,10 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l GtkTreeIter iter; if (status==0||status==-2) status = 0; else status=1; + if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","<"); + if (strstr(current->data,"<")) current->data = yon_char_replace(current->data,"<",">"); + if (strstr(dict->data,">")) dict->data = yon_char_replace(dict->data,">","<"); + if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<",">"); char *compare_string = yon_char_unite("",(char*)dict->data,"\n",(char*)current->data,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); -- 2.35.1 From 93c5aff55e0f46d71033453092e99c9d2e7a3580 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 11:16:37 +0600 Subject: [PATCH 19/40] fixed & symbol saving --- source/libublsettingsui-gtk3-save.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 27a8fcc..b1dcdde 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -415,8 +415,10 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l else status=1; if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","<"); if (strstr(current->data,"<")) current->data = yon_char_replace(current->data,"<",">"); + if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","&"); if (strstr(dict->data,">")) dict->data = yon_char_replace(dict->data,">","<"); if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<",">"); + if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<","&"); char *compare_string = yon_char_unite("",(char*)dict->data,"\n",(char*)current->data,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); -- 2.35.1 From eed87df82c919970505d6b8ee3205ba0cb410301 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 11:19:03 +0600 Subject: [PATCH 20/40] fixed & symbol saving --- source/libublsettingsui-gtk3-save.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index b1dcdde..973182d 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -415,10 +415,10 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l else status=1; if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","<"); if (strstr(current->data,"<")) current->data = yon_char_replace(current->data,"<",">"); - if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","&"); + if (strstr(current->data,"&")) current->data = yon_char_replace(current->data,"&","&"); if (strstr(dict->data,">")) dict->data = yon_char_replace(dict->data,">","<"); if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<",">"); - if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<","&"); + if (strstr(dict->data,"&")) dict->data = yon_char_replace(dict->data,"&","&"); char *compare_string = yon_char_unite("",(char*)dict->data,"\n",(char*)current->data,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); -- 2.35.1 From 218ae1c61ae256f89e9f0fb8c482e86d2187e705 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 11:45:32 +0600 Subject: [PATCH 21/40] Fixed saving of & symbol; fixed email pattern checking --- source/libublsettingsui-gtk3-save.c | 4 ++-- source/libublsettingsui-gtk3.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 973182d..f0a6094 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -413,12 +413,12 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l GtkTreeIter iter; if (status==0||status==-2) status = 0; else status=1; + if (strstr(current->data,"&")) {current->data = yon_char_replace(current->data,"&","\003");current->data = yon_char_replace(current->data,"\003","&");} if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","<"); if (strstr(current->data,"<")) current->data = yon_char_replace(current->data,"<",">"); - if (strstr(current->data,"&")) current->data = yon_char_replace(current->data,"&","&"); + if (strstr(dict->data,"&")) {dict->data = yon_char_replace(dict->data,"&","\003");dict->data = yon_char_replace(dict->data,"\003","&");} if (strstr(dict->data,">")) dict->data = yon_char_replace(dict->data,">","<"); if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<",">"); - if (strstr(dict->data,"&")) dict->data = yon_char_replace(dict->data,"&","&"); char *compare_string = yon_char_unite("",(char*)dict->data,"\n",(char*)current->data,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); diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index f78bb85..494b4cf 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -568,7 +568,8 @@ char *yon_gtk_entry_check_restricted(GtkEntry *target){ char *error=NULL; switch(purpose){ case GTK_INPUT_PURPOSE_EMAIL:{ - if (!strstr(text,"@")){ + char *temp = NULL; + if (!((temp = strstr(text,"@"))&&strstr(temp,"."))){ error = yon_char_get_localised_from_lib(EMAIL_INVALID_LABEL); } } -- 2.35.1 From 82b83d13f11fb7b979d41cd79d2d7927d5925e0e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 12:12:10 +0600 Subject: [PATCH 22/40] Email cheking extend --- source/libublsettingsui-gtk3.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 494b4cf..a72143b 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -569,7 +569,11 @@ char *yon_gtk_entry_check_restricted(GtkEntry *target){ switch(purpose){ case GTK_INPUT_PURPOSE_EMAIL:{ char *temp = NULL; - if (!((temp = strstr(text,"@"))&&strstr(temp,"."))){ + if (!((temp = strstr(text,"@"))&& + strstr(temp,".")&& + strlen(temp)!=strlen(text)&& + temp[1]!='.'&& + strstr(temp,".")[1]!='\0')){ error = yon_char_get_localised_from_lib(EMAIL_INVALID_LABEL); } } -- 2.35.1 From 74ef1b827236aa8c7a3148ca1b1b515f1febe3da Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 17:13:02 +0600 Subject: [PATCH 23/40] Fixes --- source/libublsettingsui-gtk3-save.c | 16 +++++++------ source/libublsettingsui-gtk3.c | 37 +++++++++++++++-------------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index f0a6094..a6752a3 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -413,13 +413,15 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l GtkTreeIter iter; if (status==0||status==-2) status = 0; else status=1; - if (strstr(current->data,"&")) {current->data = yon_char_replace(current->data,"&","\003");current->data = yon_char_replace(current->data,"\003","&");} - if (strstr(current->data,">")) current->data = yon_char_replace(current->data,">","<"); - if (strstr(current->data,"<")) current->data = yon_char_replace(current->data,"<",">"); - if (strstr(dict->data,"&")) {dict->data = yon_char_replace(dict->data,"&","\003");dict->data = yon_char_replace(dict->data,"\003","&");} - if (strstr(dict->data,">")) dict->data = yon_char_replace(dict->data,">","<"); - if (strstr(dict->data,"<")) dict->data = yon_char_replace(dict->data,"<",">"); - char *compare_string = yon_char_unite("",(char*)dict->data,"\n",(char*)current->data,NULL); + 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,"&")) {new_val = yon_char_replace(new_val,"&","\003");new_val = yon_char_replace(new_val,"\003","&");} + 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); diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index a72143b..db82ca4 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -566,27 +566,30 @@ char *yon_gtk_entry_check_restricted(GtkEntry *target){ GtkInputPurpose purpose = gtk_entry_get_input_purpose(target); const char *text = gtk_entry_get_text(target); char *error=NULL; - switch(purpose){ - case GTK_INPUT_PURPOSE_EMAIL:{ - char *temp = NULL; - if (!((temp = strstr(text,"@"))&& - strstr(temp,".")&& - strlen(temp)!=strlen(text)&& - temp[1]!='.'&& - strstr(temp,".")[1]!='\0')){ - error = yon_char_get_localised_from_lib(EMAIL_INVALID_LABEL); + if (!yon_char_is_empty(text)){ + switch(purpose){ + case GTK_INPUT_PURPOSE_EMAIL:{ + char *temp = NULL; + if (!((temp = strstr(text,"@"))&& + strstr(temp,".")&& + strlen(temp)!=strlen(text)&& + temp[1]!='.'&& + strstr(temp,".")[1]!='\0')){ + error = yon_char_get_localised_from_lib(EMAIL_INVALID_LABEL); + } } - } - break; - case GTK_INPUT_PURPOSE_URL:{ - if (!strstr(text,"/")){ - error = yon_char_get_localised_from_lib(PATH_INVALID_LABEL); + break; + case GTK_INPUT_PURPOSE_URL:{ + if (!strstr(text,"/")){ + error = yon_char_get_localised_from_lib(PATH_INVALID_LABEL); + } } + break; + default: break; } - break; - default: break; } return error; + } void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ @@ -604,7 +607,5 @@ void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ break; default: break; - - } } \ No newline at end of file -- 2.35.1 From 78efb441c0425565ad4f9c947fa58665a7243e40 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Feb 2025 18:04:39 +0600 Subject: [PATCH 24/40] Added languages blocking function, added language blocking for email entries --- source/libublsettingsui-gtk3-save.c | 6 +++++- source/libublsettingsui-gtk3.c | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index a6752a3..41cbc8c 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -430,7 +430,11 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l GtkTreeIter iter; if (status==0||status==-2) status = 0; else status=1; - char *compare_string = yon_char_unite("\n",(char*)current->data,NULL); + char *old_val = yon_char_new(current->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,"<",">"); + 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); diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index db82ca4..5be9e88 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -600,8 +600,11 @@ void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_digit_only_changed),NULL); break; - case GTK_INPUT_PURPOSE_NAME: case GTK_INPUT_PURPOSE_EMAIL: + yon_gtk_entry_block_restricted_symbols(target); + yon_gtk_entry_block_languages(target); + break; + case GTK_INPUT_PURPOSE_NAME: case GTK_INPUT_PURPOSE_URL: yon_gtk_entry_block_restricted_symbols(target); -- 2.35.1 From c521a925f837df1a9ee1f8214643274686b8212b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 5 Feb 2025 15:10:49 +0600 Subject: [PATCH 25/40] Fixed email entering --- source/libublsettingsui-gtk3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 5be9e88..661c26d 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -601,7 +601,7 @@ void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ break; case GTK_INPUT_PURPOSE_EMAIL: - yon_gtk_entry_block_restricted_symbols(target); + yon_gtk_entry_block_symbols(target,"/'\"\\+=)(*&>?<^%$#!:;?,)"); yon_gtk_entry_block_languages(target); break; case GTK_INPUT_PURPOSE_NAME: -- 2.35.1 From 7748442c9d3d3798d5d0214e12e7f00a9f786cc8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Feb 2025 11:00:31 +0600 Subject: [PATCH 26/40] Test fix for memory leak --- source/libublsettingsui-gtk3-save.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 41cbc8c..cd3d35f 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -418,7 +418,7 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l 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,"&")) {new_val = yon_char_replace(new_val,"&","\003");new_val = yon_char_replace(new_val,"\003","&");} + 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); @@ -431,7 +431,7 @@ void yon_save_window_loaded_config_init(template_saving_window *window, struct l if (status==0||status==-2) status = 0; else status=1; char *old_val = yon_char_new(current->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,"&")) {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); -- 2.35.1 From 2bb05506f3ae083c7bd1459a9c6306ebc89d5072 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Feb 2025 16:34:12 +0600 Subject: [PATCH 27/40] Added entry blocking for removing space at first entry position --- source/libublsettingsui-gtk3.c | 19 ++++++++++++++++++- source/libublsettingsui-gtk3.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 661c26d..635450b 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -525,6 +525,21 @@ void yon_on_email_check(GtkEntry *self,GdkEventFocus *event,GtkContainer *status } } +void yon_on_space_first_changed(GtkEntry *editable){ + const char *text = gtk_entry_get_text(editable); + gchar *new_text = yon_char_new(text); + if (new_text[0]==' ') free(yon_char_divide(new_text,0)); + + if (strlen(new_text) < strlen(text)) { + g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_space_first_changed), NULL); + gtk_entry_set_text(editable, new_text); + g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_space_first_changed), NULL); + g_signal_stop_emission_by_name(editable, "changed"); + } + + g_free(new_text); +} + void yon_on_digit_only_changed(GtkEditable *editable, const gchar *text, gint length, gint *position){ gchar *new_text = g_new(gchar, length + 1); gint i, j = 0; @@ -534,7 +549,8 @@ void yon_on_digit_only_changed(GtkEditable *editable, const gchar *text, gint le new_text[j] = text[i]; j++; } - }if (j < length) { + } + if (j < length) { g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_digit_only_changed), NULL); gtk_editable_insert_text(editable, new_text, j, position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_digit_only_changed), NULL); @@ -594,6 +610,7 @@ char *yon_gtk_entry_check_restricted(GtkEntry *target){ void yon_entry_set_entry_type(GtkEntry *target,GtkBox *status){ GtkInputPurpose purpose = gtk_entry_get_input_purpose(target); + g_signal_connect(G_OBJECT(target),"changed",G_CALLBACK(yon_on_space_first_changed),NULL); switch(purpose){ case GTK_INPUT_PURPOSE_DIGITS: diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index a1b8fee..5f9f340 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -254,6 +254,8 @@ char *yon_get_default_label_with_parameter(char *section, char *parameter); template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...); +void yon_on_space_first_changed(GtkEntry *editable); + enum CONFIGURATION_PARAMETER_TYPE{ CONFIGURATION_PARAMETER_BOOL, -- 2.35.1 From 03b520c1f518e38c2b7985aada8f6ba9a2ada030 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Feb 2025 15:52:01 +0600 Subject: [PATCH 28/40] 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 -- 2.35.1 From 6e1462598ba0cad6e0701db6d2f0ae851a5f65a1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Feb 2025 16:26:34 +0600 Subject: [PATCH 29/40] Filechooser fixes --- libublsettingsui-gtk3-filechooser.glade | 4 +- libublsettingsui-gtk3.pot | 140 ++++++++++---------- libublsettingsui-gtk3_ru.po | 142 +++++++++++---------- source/libublsettingsui-gtk3-filechooser.c | 1 + source/libublsettingsui-gtk3-save.c | 3 +- source/libublsettingsui-gtk3.h | 3 + 6 files changed, 156 insertions(+), 137 deletions(-) diff --git a/libublsettingsui-gtk3-filechooser.glade b/libublsettingsui-gtk3-filechooser.glade index d7ed414..6520776 100644 --- a/libublsettingsui-gtk3-filechooser.glade +++ b/libublsettingsui-gtk3-filechooser.glade @@ -50,8 +50,6 @@ True False - 5 - 5 vertical 5 @@ -69,7 +67,7 @@ - Choose folder instead of file + Choose directory instead of file True True False diff --git a/libublsettingsui-gtk3.pot b/libublsettingsui-gtk3.pot index 384607b..191d72a 100644 --- a/libublsettingsui-gtk3.pot +++ b/libublsettingsui-gtk3.pot @@ -17,272 +17,280 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/libublsettingsui-gtk3.h:274 +#: source/libublsettingsui-gtk3.h:299 msgid "Version:" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid " version:" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Usage:" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "[OPTIONS]" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Options:" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Show this help" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Show package version" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock this help menu" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock configuration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock local configration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock global configration saving" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock global configration loading" msgstr "" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Reset application settings" msgstr "" -#: source/libublsettingsui-gtk3.h:280 +#: source/libublsettingsui-gtk3.h:305 msgid "Operation succeeded" msgstr "" -#: source/libublsettingsui-gtk3.h:281 +#: source/libublsettingsui-gtk3.h:306 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" msgstr "" -#: source/libublsettingsui-gtk3.h:283 +#: source/libublsettingsui-gtk3.h:308 msgid "Default" msgstr "" -#: source/libublsettingsui-gtk3.h:284 +#: source/libublsettingsui-gtk3.h:309 msgid "About" msgstr "" -#: source/libublsettingsui-gtk3.h:285 +#: source/libublsettingsui-gtk3.h:310 msgid "Documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:287 +#: source/libublsettingsui-gtk3.h:312 msgid "Save to specific file" msgstr "" -#: source/libublsettingsui-gtk3.h:288 +#: source/libublsettingsui-gtk3.h:313 msgid "Save to local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:289 +#: source/libublsettingsui-gtk3.h:314 msgid "Save to global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:290 +#: source/libublsettingsui-gtk3.h:315 msgid "Save configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:291 +#: source/libublsettingsui-gtk3.h:316 msgid "Save" msgstr "" -#: source/libublsettingsui-gtk3.h:292 +#: source/libublsettingsui-gtk3.h:317 msgid "Saving..." msgstr "" -#: source/libublsettingsui-gtk3.h:294 +#: source/libublsettingsui-gtk3.h:319 msgid "Load from specific file" msgstr "" -#: source/libublsettingsui-gtk3.h:295 +#: source/libublsettingsui-gtk3.h:320 msgid "Load local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:296 +#: source/libublsettingsui-gtk3.h:321 msgid "Load global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:297 +#: source/libublsettingsui-gtk3.h:322 msgid "Load" msgstr "" -#: source/libublsettingsui-gtk3.h:299 +#: source/libublsettingsui-gtk3.h:324 msgid "Cancel" msgstr "" -#: source/libublsettingsui-gtk3.h:300 +#: source/libublsettingsui-gtk3.h:325 msgid "Accept" msgstr "" -#: source/libublsettingsui-gtk3.h:301 +#: source/libublsettingsui-gtk3.h:326 msgid "Open" msgstr "" -#: source/libublsettingsui-gtk3.h:303 +#: source/libublsettingsui-gtk3.h:328 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/libublsettingsui-gtk3.h:304 +#: source/libublsettingsui-gtk3.h:329 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/libublsettingsui-gtk3.h:305 +#: source/libublsettingsui-gtk3.h:330 msgid "Always redirect to online documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:306 +#: source/libublsettingsui-gtk3.h:331 msgid "Open documentation" msgstr "" -#: source/libublsettingsui-gtk3.h:307 +#: source/libublsettingsui-gtk3.h:332 msgid "Project Home Page" msgstr "" -#: source/libublsettingsui-gtk3.h:308 +#: source/libublsettingsui-gtk3.h:333 msgid "Nothing were chosen" msgstr "" -#: source/libublsettingsui-gtk3.h:309 +#: source/libublsettingsui-gtk3.h:334 msgid "Copyright © 2022 - 2023, UBSoft LLC" msgstr "" -#: source/libublsettingsui-gtk3.h:312 +#: source/libublsettingsui-gtk3.h:337 msgid "Global configuration loading succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:313 +#: source/libublsettingsui-gtk3.h:338 msgid "Local configuration loading succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:314 +#: source/libublsettingsui-gtk3.h:339 msgid "Config loading failed" msgstr "" -#: source/libublsettingsui-gtk3.h:316 +#: source/libublsettingsui-gtk3.h:341 msgid "Local and global configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:317 +#: source/libublsettingsui-gtk3.h:342 msgid "Global configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:318 +#: source/libublsettingsui-gtk3.h:343 msgid "Local configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:319 +#: source/libublsettingsui-gtk3.h:344 msgid "Configuration saving succeeded." msgstr "" -#: source/libublsettingsui-gtk3.h:321 +#: source/libublsettingsui-gtk3.h:346 msgid "Parameter" msgstr "" -#: source/libublsettingsui-gtk3.h:322 +#: source/libublsettingsui-gtk3.h:347 msgid "Old value" msgstr "" -#: source/libublsettingsui-gtk3.h:323 +#: source/libublsettingsui-gtk3.h:348 msgid "New value" msgstr "" -#: source/libublsettingsui-gtk3.h:324 +#: source/libublsettingsui-gtk3.h:349 msgid "" "Value\n" "(Old/New)" msgstr "" -#: source/libublsettingsui-gtk3.h:326 +#: source/libublsettingsui-gtk3.h:351 msgid "Nothing to save" msgstr "" -#: source/libublsettingsui-gtk3.h:327 +#: source/libublsettingsui-gtk3.h:352 msgid "Saving into local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:328 +#: source/libublsettingsui-gtk3.h:353 msgid "Saving into global configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:329 +#: source/libublsettingsui-gtk3.h:354 msgid "Saving into global and local configuration" msgstr "" -#: source/libublsettingsui-gtk3.h:330 +#: source/libublsettingsui-gtk3.h:355 msgid "Saving into custom configuration at" msgstr "" -#: source/libublsettingsui-gtk3.h:335 +#: source/libublsettingsui-gtk3.h:360 msgid "Full saving mode" msgstr "" -#: source/libublsettingsui-gtk3.h:336 +#: source/libublsettingsui-gtk3.h:361 msgid "Saving into module" msgstr "" -#: source/libublsettingsui-gtk3.h:337 +#: source/libublsettingsui-gtk3.h:362 msgid "Sandbox mode" msgstr "" -#: source/libublsettingsui-gtk3.h:338 +#: source/libublsettingsui-gtk3.h:363 msgid "Sandbox with profile saving" msgstr "" -#: source/libublsettingsui-gtk3.h:339 +#: source/libublsettingsui-gtk3.h:364 msgid "HDD sandbox" msgstr "" -#: source/libublsettingsui-gtk3.h:340 +#: source/libublsettingsui-gtk3.h:365 msgid "HDD sandbox with profile saving" msgstr "" -#: source/libublsettingsui-gtk3.h:341 +#: source/libublsettingsui-gtk3.h:366 msgid "New configuration file creation failed" msgstr "" -#: source/libublsettingsui-gtk3.h:342 +#: source/libublsettingsui-gtk3.h:367 msgid "Upgrade to root" msgstr "" -#: source/libublsettingsui-gtk3.h:343 +#: source/libublsettingsui-gtk3.h:368 msgid "Settings" msgstr "" -#: source/libublsettingsui-gtk3.h:345 +#: source/libublsettingsui-gtk3.h:370 msgid "Application settigs" msgstr "" -#: source/libublsettingsui-gtk3.h:345 +#: source/libublsettingsui-gtk3.h:372 msgid "Invalid email adress" msgstr "" -#: source/libublsettingsui-gtk3.h:345 +#: source/libublsettingsui-gtk3.h:373 msgid "Invalid path" msgstr "" + +#: source/libublsettingsui-gtk3.h:375 +msgid "Choose path" +msgstr "" + +#: source/libublsettingsui-gtk3.h:377 +msgid "Choose directory instead of file" +msgstr "" diff --git a/libublsettingsui-gtk3_ru.po b/libublsettingsui-gtk3_ru.po index f7edb5d..fb3e7c7 100644 --- a/libublsettingsui-gtk3_ru.po +++ b/libublsettingsui-gtk3_ru.po @@ -17,63 +17,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/libublsettingsui-gtk3.h:274 +#: source/libublsettingsui-gtk3.h:299 msgid "Version:" msgstr "Версия:" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid " version:" msgstr " версия:" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Usage:" msgstr "Использование:" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "[OPTIONS]" msgstr "[АРГУМЕНТЫ]" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Options:" msgstr "Аргументы:" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Show this help" msgstr "Показать эту подсказку" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Show package version" msgstr "Показать версию пакета" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock this help menu" msgstr "Заблокировать это меню помощи" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock configuration saving" msgstr "Успешно записана локальная конфигурация" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock local configration saving" msgstr "Заблокировать сохранение локальной конфигурации" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock global configration saving" msgstr "Заблокировать сохранение глобальной конфигурации" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Lock global configration loading" msgstr "Заблокировать загрузку глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:275 +#: source/libublsettingsui-gtk3.h:300 msgid "Reset application settings" msgstr "Сбросить настройки программы" -#: source/libublsettingsui-gtk3.h:280 +#: source/libublsettingsui-gtk3.h:305 msgid "Operation succeeded" msgstr "Операция завершена" -#: source/libublsettingsui-gtk3.h:281 +#: source/libublsettingsui-gtk3.h:306 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" @@ -81,75 +81,75 @@ msgstr "" "Внимание! Приложение было запущено без прав суперпользователя - действия, " "требующие их наличия заблокированы" -#: source/libublsettingsui-gtk3.h:283 +#: source/libublsettingsui-gtk3.h:308 msgid "Default" msgstr "По умолчанию" -#: source/libublsettingsui-gtk3.h:284 +#: source/libublsettingsui-gtk3.h:309 msgid "About" msgstr "О программе" -#: source/libublsettingsui-gtk3.h:285 +#: source/libublsettingsui-gtk3.h:310 msgid "Documentation" msgstr "Справка" -#: source/libublsettingsui-gtk3.h:287 +#: source/libublsettingsui-gtk3.h:312 msgid "Save to specific file" msgstr "Сохранить в файл" -#: source/libublsettingsui-gtk3.h:288 +#: source/libublsettingsui-gtk3.h:313 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/libublsettingsui-gtk3.h:289 +#: source/libublsettingsui-gtk3.h:314 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:290 +#: source/libublsettingsui-gtk3.h:315 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/libublsettingsui-gtk3.h:291 +#: source/libublsettingsui-gtk3.h:316 msgid "Save" msgstr "Сохранить" -#: source/libublsettingsui-gtk3.h:292 +#: source/libublsettingsui-gtk3.h:317 msgid "Saving..." msgstr "Сохранение..." -#: source/libublsettingsui-gtk3.h:294 +#: source/libublsettingsui-gtk3.h:319 msgid "Load from specific file" msgstr "Загрузить из файла" -#: source/libublsettingsui-gtk3.h:295 +#: source/libublsettingsui-gtk3.h:320 msgid "Load local configuration" msgstr "Загрузить локальную конфигурацию" -#: source/libublsettingsui-gtk3.h:296 +#: source/libublsettingsui-gtk3.h:321 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/libublsettingsui-gtk3.h:297 +#: source/libublsettingsui-gtk3.h:322 msgid "Load" msgstr "Загрузить" -#: source/libublsettingsui-gtk3.h:299 +#: source/libublsettingsui-gtk3.h:324 msgid "Cancel" msgstr "Отмена" -#: source/libublsettingsui-gtk3.h:300 +#: source/libublsettingsui-gtk3.h:325 msgid "Accept" msgstr "Принять" -#: source/libublsettingsui-gtk3.h:301 +#: source/libublsettingsui-gtk3.h:326 msgid "Open" msgstr "Открыть" -#: source/libublsettingsui-gtk3.h:303 +#: source/libublsettingsui-gtk3.h:328 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/libublsettingsui-gtk3.h:304 +#: source/libublsettingsui-gtk3.h:329 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -157,67 +157,67 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией, где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/libublsettingsui-gtk3.h:305 +#: source/libublsettingsui-gtk3.h:330 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/libublsettingsui-gtk3.h:306 +#: source/libublsettingsui-gtk3.h:331 msgid "Open documentation" msgstr "Прочитать справку" -#: source/libublsettingsui-gtk3.h:307 +#: source/libublsettingsui-gtk3.h:332 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/libublsettingsui-gtk3.h:308 +#: source/libublsettingsui-gtk3.h:333 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/libublsettingsui-gtk3.h:309 +#: source/libublsettingsui-gtk3.h:334 msgid "Copyright © 2022 - 2023, UBSoft LLC" msgstr "Copyright © 2022 - 2023, ООО «Юбисофт»" -#: source/libublsettingsui-gtk3.h:312 +#: source/libublsettingsui-gtk3.h:337 msgid "Global configuration loading succeeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:313 +#: source/libublsettingsui-gtk3.h:338 msgid "Local configuration loading succeeded." msgstr "Успешно загружена локальная конфигурация" -#: source/libublsettingsui-gtk3.h:314 +#: source/libublsettingsui-gtk3.h:339 msgid "Config loading failed" msgstr "Ошибка загрузки конфига" -#: source/libublsettingsui-gtk3.h:316 +#: source/libublsettingsui-gtk3.h:341 msgid "Local and global configuration saving succeeded." msgstr "Успешно записаны локальная и глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:317 +#: source/libublsettingsui-gtk3.h:342 msgid "Global configuration saving succeeded." msgstr "Успешно записана глобальная конфигурация" -#: source/libublsettingsui-gtk3.h:318 +#: source/libublsettingsui-gtk3.h:343 msgid "Local configuration saving succeeded." msgstr "Успешно записана локальная конфигурация" -#: source/libublsettingsui-gtk3.h:319 +#: source/libublsettingsui-gtk3.h:344 msgid "Configuration saving succeeded." msgstr "Успешно записана конфигурация" -#: source/libublsettingsui-gtk3.h:321 +#: source/libublsettingsui-gtk3.h:346 msgid "Parameter" msgstr "Параметр" -#: source/libublsettingsui-gtk3.h:322 +#: source/libublsettingsui-gtk3.h:347 msgid "Old value" msgstr "Старое значение" -#: source/libublsettingsui-gtk3.h:323 +#: source/libublsettingsui-gtk3.h:348 msgid "New value" msgstr "Новое значение" -#: source/libublsettingsui-gtk3.h:324 +#: source/libublsettingsui-gtk3.h:349 msgid "" "Value\n" "(Old/New)" @@ -225,70 +225,78 @@ msgstr "" "Значение\n" "(Старое/Новое)" -#: source/libublsettingsui-gtk3.h:326 +#: source/libublsettingsui-gtk3.h:351 msgid "Nothing to save" msgstr "Нечего сохранять" -#: source/libublsettingsui-gtk3.h:327 +#: source/libublsettingsui-gtk3.h:352 msgid "Saving into local configuration" msgstr "Сохранение в локальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:328 +#: source/libublsettingsui-gtk3.h:353 msgid "Saving into global configuration" msgstr "Сохранение в глобальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:329 +#: source/libublsettingsui-gtk3.h:354 msgid "Saving into global and local configuration" msgstr "Сохранение в глобальный и локальный конфигурационный файл" -#: source/libublsettingsui-gtk3.h:330 +#: source/libublsettingsui-gtk3.h:355 msgid "Saving into custom configuration at" msgstr "Сохранение в конфигурационный файл по пути" -#: source/libublsettingsui-gtk3.h:335 +#: source/libublsettingsui-gtk3.h:360 msgid "Full saving mode" msgstr "Полное сохранение" -#: source/libublsettingsui-gtk3.h:336 +#: source/libublsettingsui-gtk3.h:361 msgid "Saving into module" msgstr "Сохранение в модуль" -#: source/libublsettingsui-gtk3.h:337 +#: source/libublsettingsui-gtk3.h:362 msgid "Sandbox mode" msgstr "Полная песочница в ОЗУ" -#: source/libublsettingsui-gtk3.h:338 +#: source/libublsettingsui-gtk3.h:363 msgid "Sandbox with profile saving" msgstr "Песочница с сохранением профиля пользователя" -#: source/libublsettingsui-gtk3.h:339 +#: source/libublsettingsui-gtk3.h:364 msgid "HDD sandbox" msgstr "Полная песочница на HDD" -#: source/libublsettingsui-gtk3.h:340 +#: source/libublsettingsui-gtk3.h:365 msgid "HDD sandbox with profile saving" msgstr "Полная песочница на HDD с сохранением профиля пользователя" -#: source/libublsettingsui-gtk3.h:341 +#: source/libublsettingsui-gtk3.h:366 msgid "New configuration file creation failed" msgstr "Ошибка создания нового файла конфигурации" -#: source/libublsettingsui-gtk3.h:342 +#: source/libublsettingsui-gtk3.h:367 msgid "Upgrade to root" msgstr "Повысить права до root" -#: source/libublsettingsui-gtk3.h:343 +#: source/libublsettingsui-gtk3.h:368 msgid "Settings" msgstr "" -#: source/libublsettingsui-gtk3.h:345 +#: source/libublsettingsui-gtk3.h:370 msgid "Application settigs" msgstr "Настройки" -#: source/libublsettingsui-gtk3.h:345 +#: source/libublsettingsui-gtk3.h:372 msgid "Invalid email adress" msgstr "Неверный email-адрес" -#: source/libublsettingsui-gtk3.h:345 +#: source/libublsettingsui-gtk3.h:373 msgid "Invalid path" -msgstr "Неправильный путь" \ No newline at end of file +msgstr "Неправильный путь" + +#: source/libublsettingsui-gtk3.h:375 +msgid "Choose path" +msgstr "Выбор пути" + +#: source/libublsettingsui-gtk3.h:377 +msgid "Choose directory instead of file" +msgstr "Выбрать папку вместо вайла" diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c index 966031b..2e19d7b 100644 --- a/source/libublsettingsui-gtk3-filechooser.c +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -69,6 +69,7 @@ filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){ 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->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic"); 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"); diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index affa0fc..90beb0a 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -456,9 +456,10 @@ struct loaded_config *yon_config_get_compared(char *command){ char *yon_custom_config_init(){ filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_widget_hide(dialog->ChooseFolderCheck); yon_gtk_window_setup(GTK_WINDOW(dialog->Window),NULL,template_app_information.app_title,yon_char_unite("com.ublinux.",template_app_information.app_tech_name,NULL),"ConfigFilechooserWindow"); - + gtk_label_set_text(GTK_LABEL(dialog->HeaderTopic),template_app_information.app_title); GtkFileFilter *filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter,"*.ini"); gtk_file_filter_set_name(filter, "*.ini"); diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 48cb0d5..281206f 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -159,6 +159,7 @@ typedef struct { typedef struct { GtkWidget *Window; GtkWidget *StatusBox; + GtkWidget *HeaderTopic; GtkWidget *MainFileChooser; GtkWidget *SaveButton; GtkWidget *CancelButton; @@ -374,4 +375,6 @@ char *yon_custom_config_init(); #define CHOOSE_FILE_LABEL _("Choose path") + #define FILE_CHOOSER_CHOOSE_FILDER_LABEL _("Choose directory instead of file") + #endif \ No newline at end of file -- 2.35.1 From 2b755a2511426ec9b0587729ecb46d7075a41825 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Feb 2025 18:13:38 +0600 Subject: [PATCH 30/40] Fixed gap --- libublsettingsui-gtk3-filechooser.glade | 1 - 1 file changed, 1 deletion(-) diff --git a/libublsettingsui-gtk3-filechooser.glade b/libublsettingsui-gtk3-filechooser.glade index 6520776..e46209e 100644 --- a/libublsettingsui-gtk3-filechooser.glade +++ b/libublsettingsui-gtk3-filechooser.glade @@ -29,7 +29,6 @@ True False - 5 vertical -- 2.35.1 From 5873918847e1847197e561845d8413c426e9c4e8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Feb 2025 09:31:42 +0600 Subject: [PATCH 31/40] New functions; fixes --- source/libublsettingsui-gtk3-filechooser.c | 75 +++++++++++++--------- source/libublsettingsui-gtk3-save.c | 6 +- source/libublsettingsui-gtk3.h | 3 + 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c index 2e19d7b..7e41b5f 100644 --- a/source/libublsettingsui-gtk3-filechooser.c +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -64,41 +64,52 @@ void on_file_chooser_selected(GtkWidget *self, filechooser_window *window){ if (success_size) yon_char_parsed_free(paths_success,success_size); } +filechooser_window *__yon_filechooser_window = NULL; + +void yon_file_chooser_set_button_label(char *label){ + +} + 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->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic"); - 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: + if (!__yon_filechooser_window){ + filechooser_window *window = malloc(sizeof(filechooser_window)); + __yon_filechooser_window = 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->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic"); + 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; - } + 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; + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + return window; + } else { + return __yon_filechooser_window; + } } GtkResponseType yon_file_chooser_start(filechooser_window *window){ diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 90beb0a..0ea0e47 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -454,8 +454,8 @@ struct loaded_config *yon_config_get_compared(char *command){ } -char *yon_custom_config_init(){ - filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN); +char *yon_custom_config_init(GtkFileChooserAction type){ + filechooser_window *dialog = yon_file_chooser_window_new(type); gtk_widget_hide(dialog->ChooseFolderCheck); yon_gtk_window_setup(GTK_WINDOW(dialog->Window),NULL,template_app_information.app_title,yon_char_unite("com.ublinux.",template_app_information.app_tech_name,NULL),"ConfigFilechooserWindow"); @@ -537,7 +537,7 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){ config_to_save = yon_config_get_type_path(type); if (!path&&type == YON_CONFIG_CUSTOM){ - path = yon_custom_config_init(); + path = yon_custom_config_init(GTK_FILE_CHOOSER_ACTION_SAVE); if (!path) return NULL; } diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 281206f..b4d59a5 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -325,6 +325,8 @@ char *yon_custom_config_init(); #define CANCEL_LABEL _("Cancel") #define ACCEPT_LABEL _("Accept") #define OPEN_LABEL _("Open") + #define CREATE_FOLDER_LABEL _("Create directory") + #define SELECT_FOLDER_LABEL _("Select directory") #define HELP_TITLE_LABEL _("Would you like to read documentation in the Web?") #define HELP_INFO_LABEL _("You will be redirected to documentation website where documentation is\ntranslated and supported by community.") @@ -374,6 +376,7 @@ char *yon_custom_config_init(); #define PATH_INVALID_LABEL _("Invalid path") #define CHOOSE_FILE_LABEL _("Choose path") + #define FILE_CHOOSER_CHOOSE_FILDER_LABEL _("Choose directory instead of file") -- 2.35.1 From 9a8169194aa0dac6b16c3f5eae096a92615b4df9 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Feb 2025 09:47:43 +0600 Subject: [PATCH 32/40] Fixed docmentation confirmation window title --- libublsettingsui-gtk3-filechooser.glade | 2 +- source/libublsettingsui-gtk3.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libublsettingsui-gtk3-filechooser.glade b/libublsettingsui-gtk3-filechooser.glade index e46209e..2d07c00 100644 --- a/libublsettingsui-gtk3-filechooser.glade +++ b/libublsettingsui-gtk3-filechooser.glade @@ -128,7 +128,7 @@ - Save + Open True True True diff --git a/source/libublsettingsui-gtk3.c b/source/libublsettingsui-gtk3.c index 635450b..f8f94a7 100644 --- a/source/libublsettingsui-gtk3.c +++ b/source/libublsettingsui-gtk3.c @@ -74,6 +74,8 @@ void on_open_documentation_confirmation(GtkWidget *self, char *link){ window->HeaderLabel = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel"); window->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox"); gtk_label_set_text(GTK_LABEL(window->HeaderLabel),template_app_information.app_title); + gtk_window_set_title(GTK_WINDOW(window->Window),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_widget_show_all(window->Window); g_signal_connect(G_OBJECT(window->CloseButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link)); @@ -113,6 +115,7 @@ void on_about(GtkWidget *self, char *version_application){ gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),template_app_information.app_title); gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(window),yon_char_append("com.ublinux.",template_app_information.app_tech_name)); gtk_window_set_icon_name(GTK_WINDOW(window),yon_char_append("com.ublinux.",template_app_information.app_tech_name)); + gtk_window_set_title(GTK_WINDOW(window),template_app_information.app_title); gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(window),template_app_information.app_tech_name); gtk_label_set_text(GTK_LABEL(title),template_app_information.app_title); g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL); -- 2.35.1 From ea1d7ff0ac8666a5ca5a8b843e38e3558997d3f3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Feb 2025 10:02:26 +0600 Subject: [PATCH 33/40] Filechooser re-opening fix --- source/libublsettingsui-gtk3-filechooser.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c index 7e41b5f..44c8447 100644 --- a/source/libublsettingsui-gtk3-filechooser.c +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -70,6 +70,10 @@ void yon_file_chooser_set_button_label(char *label){ } +void on_file_chooser_exit(GtkWidget *, filechooser_window *){ + __yon_filechooser_window = NULL; +} + filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){ if (!__yon_filechooser_window){ filechooser_window *window = malloc(sizeof(filechooser_window)); @@ -87,6 +91,7 @@ filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){ 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); + g_signal_connect(G_OBJECT(window->Window),"destroy",G_CALLBACK(on_file_chooser_exit),window); gtk_file_chooser_set_action(GTK_FILE_CHOOSER(window->MainFileChooser),action); switch(action){ -- 2.35.1 From f043a6a39a204bd89046133b82b1e412b46d5a03 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Feb 2025 10:11:12 +0600 Subject: [PATCH 34/40] Fixed filechooser accept button label --- source/libublsettingsui-gtk3-filechooser.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c index 44c8447..96c3eac 100644 --- a/source/libublsettingsui-gtk3-filechooser.c +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -97,16 +97,19 @@ filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){ switch(action){ case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: gtk_widget_hide(window->ChooseFolderCheck); + gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(CREATE_FOLDER_LABEL)); break; case GTK_FILE_CHOOSER_ACTION_OPEN: break; case GTK_FILE_CHOOSER_ACTION_SAVE: gtk_widget_hide(window->ChooseFolderCheck); + gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(SAVE_LABEL)); break; case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck),1); gtk_widget_hide(window->ChooseFolderCheck); + gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(SELECT_FOLDER_LABEL)); break; } -- 2.35.1 From ecddb2321fcd6b5314cb48b4fcbaf41dcba8e46d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Feb 2025 15:59:20 +0600 Subject: [PATCH 35/40] Fixes --- libublsettingsui-gtk3-filechooser.glade | 2 +- source/libublsettingsui-gtk3-filechooser.c | 4 +++- source/libublsettingsui-gtk3-save.c | 4 ++++ source/libublsettingsui-gtk3.h | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libublsettingsui-gtk3-filechooser.glade b/libublsettingsui-gtk3-filechooser.glade index 2d07c00..c5d317b 100644 --- a/libublsettingsui-gtk3-filechooser.glade +++ b/libublsettingsui-gtk3-filechooser.glade @@ -128,7 +128,7 @@ - Open + Load True True True diff --git a/source/libublsettingsui-gtk3-filechooser.c b/source/libublsettingsui-gtk3-filechooser.c index 96c3eac..8a6a4eb 100644 --- a/source/libublsettingsui-gtk3-filechooser.c +++ b/source/libublsettingsui-gtk3-filechooser.c @@ -67,7 +67,9 @@ void on_file_chooser_selected(GtkWidget *self, filechooser_window *window){ filechooser_window *__yon_filechooser_window = NULL; void yon_file_chooser_set_button_label(char *label){ - + if (__yon_filechooser_window){ + gtk_button_set_label(GTK_BUTTON(__yon_filechooser_window->SaveButton),label); + } } void on_file_chooser_exit(GtkWidget *, filechooser_window *){ diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 0ea0e47..5cb9601 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -464,6 +464,10 @@ char *yon_custom_config_init(GtkFileChooserAction type){ gtk_file_filter_add_pattern(filter,"*.ini"); gtk_file_filter_set_name(filter, "*.ini"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + if (type==GTK_FILE_CHOOSER_ACTION_SAVE){ + yon_file_chooser_set_button_label(yon_char_get_localised_from_lib(LOAD_CONFIG_LABEL)) + + } if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ char *file = dialog->last_success_selection; diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index b4d59a5..687162c 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -170,6 +170,7 @@ typedef struct { } filechooser_window; filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action); GtkResponseType yon_file_chooser_start(filechooser_window *window); +void yon_file_chooser_set_button_label(char *label); int yon_confirmation_dialog_call(GtkWidget *self,dialog_confirmation_data *data); @@ -321,6 +322,7 @@ char *yon_custom_config_init(); #define LOAD_LOCAL_LABEL _("Load local configuration") #define LOAD_GLOBAL_LABEL _("Load global configuration") #define LOAD_LABEL _("Load") + #define LOAD_CONFIG_LABEL _("Load file") #define CANCEL_LABEL _("Cancel") #define ACCEPT_LABEL _("Accept") -- 2.35.1 From 6026202d32cb06935cb1cd1a61c683591acf9901 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Feb 2025 16:39:23 +0600 Subject: [PATCH 36/40] Fixes --- source/libublsettingsui-gtk3-save.c | 2 +- source/libublsettingsui-gtk3.h | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/source/libublsettingsui-gtk3-save.c b/source/libublsettingsui-gtk3-save.c index 5cb9601..6f55daa 100644 --- a/source/libublsettingsui-gtk3-save.c +++ b/source/libublsettingsui-gtk3-save.c @@ -465,7 +465,7 @@ char *yon_custom_config_init(GtkFileChooserAction type){ gtk_file_filter_set_name(filter, "*.ini"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); if (type==GTK_FILE_CHOOSER_ACTION_SAVE){ - yon_file_chooser_set_button_label(yon_char_get_localised_from_lib(LOAD_CONFIG_LABEL)) + yon_file_chooser_set_button_label(yon_char_get_localised_from_lib(LOAD_CONFIG_LABEL)); } if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 687162c..3465155 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -299,7 +299,18 @@ 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) + #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",\ + " --help, -h ",_("Show this help"),"\n",\ + " --version, -V ",_("Show package version"),"\n",\ + " --lock-help ",_("Lock this help menu"),"\n",\ + " --lock-save ",_("Lock configuration saving"),"\n",\ + " --lock-save-local ",_("Lock local configration saving"),"\n",\ + " --lock-save-global ",_("Lock global configration saving"),"\n",\ + " --lock-load-global ",_("Lock global configration loading"),"\n",\ + " --clear-config, -c ",_("Reset application settings"),"\n",\ + !yon_char_is_empty(rest)?rest:NULL,NULL) #define template_ui_LocalePath "/usr/share/locale" #define template_ui_LocaleName "libublsettingsui-gtk3" -- 2.35.1 From ba4ffd59e662ff3a4eb55d3cb8d87c5110b1d937 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Feb 2025 11:03:20 +0600 Subject: [PATCH 37/40] Icons update --- ....ublinux.libublsettingsui-gtk3.checked.svg | 24 ++++++------ ...bublsettingsui-gtk3.important-symbolic.svg | 38 ++++++++++++++++++- ....ublinux.libublsettingsui-gtk3.warning.svg | 20 +++++----- 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/icons/status/com.ublinux.libublsettingsui-gtk3.checked.svg b/icons/status/com.ublinux.libublsettingsui-gtk3.checked.svg index e3cab42..1ab3d35 100644 --- a/icons/status/com.ublinux.libublsettingsui-gtk3.checked.svg +++ b/icons/status/com.ublinux.libublsettingsui-gtk3.checked.svg @@ -5,8 +5,8 @@ version="1.1" viewBox="0 0 24 24" id="svg25" - sodipodi:docname="checked.svg" - inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + sodipodi:docname="com.ublinux.libublsettingsui-gtk3.checked.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -21,14 +21,16 @@ inkscape:pagecheckerboard="0" showgrid="false" inkscape:zoom="14.8125" - inkscape:cx="-4.6919831" + inkscape:cx="-4.6582278" inkscape:cy="9.9578059" - inkscape:window-width="1920" - inkscape:window-height="1027" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="svg25" /> + inkscape:window-width="1631" + inkscape:window-height="1047" + inkscape:window-x="1966" + inkscape:window-y="17" + inkscape:window-maximized="0" + inkscape:current-layer="svg25" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" />