From 6c34f635f57137dbd528c24d6e4786ac04711d79 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 15 Aug 2025 14:46:55 +0600 Subject: [PATCH 1/5] Changed default file chooser folder for storage window --- source/ubl-settings-repomanager-storage-window.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index daa3246..dd46259 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -41,6 +41,12 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),OPEN_EXISTING_TOOLTIP_LABEL,icon_path,"file_chooser_window"); + if (yon_char_is_empty(main_config.last_selection)){ + char *user_folder_path = yon_ubl_user_get_home_directory(); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),user_folder_path); + } else { + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),main_config.last_selection); + } if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ char *filename = dialog->last_success_selection; int exist_size=0; @@ -55,6 +61,8 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ storage_struct *storage = yon_storage_struct_new(); storage->path=dialog->last_success_selection; storage->name = yon_char_new(storage->path); + if (!yon_char_is_empty(main_config.last_selection)) free(main_config.last_selection); + main_config.last_selection = yon_char_new(storage->path); free(yon_char_divide(storage->name,yon_char_find_last(storage->name,'/'))); g_hash_table_insert(window->storages_copy,storage->path,storage); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path); @@ -68,6 +76,12 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ void on_storage_create(GtkWidget *self, storage_config_window *window){ filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER); + if (yon_char_is_empty(main_config.last_selection)){ + char *user_folder_path = yon_ubl_user_get_home_directory(); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),user_folder_path); + } else { + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),main_config.last_selection); + } yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CREATE_NEW_STORAGE_LABEL,icon_path,"file_chooser_window"); gtk_button_set_label(GTK_BUTTON(dialog->SaveButton),yon_char_get_localised_from_lib(CREATE_NEW_TOOLTIP_LABEL)); if (yon_file_chooser_start(dialog)==GTK_RESPONSE_APPLY){ @@ -84,6 +98,8 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ yon_char_parsed_free(exist_storages,exist_size); storage->path=dialog->last_success_selection; storage->name = yon_char_new(storage->path); + if (!yon_char_is_empty(main_config.last_selection)) free(main_config.last_selection); + main_config.last_selection = yon_char_new(storage->path); free(yon_char_divide(storage->name,yon_char_find_last(storage->name,'/'))); g_hash_table_insert(window->storages_copy,storage->path,storage); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path); From 48af1a8d7aabf5512cdf7da6148d52c2ff23ca1a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 15 Aug 2025 14:52:52 +0600 Subject: [PATCH 2/5] Changed default file chooser folder for add window --- source/ubl-settings-repomanager-add-window.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index 34af8c1..8a44def 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -100,6 +100,12 @@ void on_file_chooser_file_activate(GtkWidget *self, dictionary *dict){ void on_add_package(GtkWidget *self, repo_add_window *window){ filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN); + if (yon_char_is_empty(main_config.last_selection)){ + char *user_folder_path = yon_ubl_user_get_home_directory(); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),user_folder_path); + } else { + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),main_config.last_selection); + } yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"filechooserWindow"); gtk_label_set_text(GTK_LABEL(dialog->HeaderTopic),CHOSE_PACKAGES_TITLE_LABEL); @@ -114,6 +120,8 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog); + if (!yon_char_is_empty(main_config.last_selection)) free(main_config.last_selection); + main_config.last_selection = yon_char_new(dialog->last_any_selection); on_add_accept(self,dict); } gtk_widget_destroy(dialog->Window); From bc9eb3e71fa0d8d0dcbf0b9896812ca16bb4dea7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 21 Aug 2025 16:54:11 +0600 Subject: [PATCH 3/5] Reposiroties sorting --- .../ubl-settings-repomanager-storage-window.c | 36 +++++++++++++++---- source/ubl-settings-repomanager.c | 2 +- source/ubl-settings-repomanager.h | 3 +- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index dd46259..5918b8d 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -184,11 +184,13 @@ void yon_storage_config_update(storage_config_window *window){ const char *active = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); if (active){ storage_struct *storage = g_hash_table_lookup(window->storages_copy,active); - GList *repos = g_hash_table_get_values(storage->repos); + int size; + config_str repo_keys = (config_str)g_hash_table_get_keys_as_array(storage->repos,&size); + qsort(repo_keys,size,sizeof(char*),yon_char_parsed_compare); + for (int i = 0;irepos,repo_keys[i]); if (repos){ - GList *iter; - for (iter = repos;iter;iter=iter->next){ - repo_struct *cur_repo = (repo_struct*)iter->data; + repo_struct *cur_repo = repos; storage_repo_block *cur_block = NULL; cur_block = yon_storage_repo_block_new(); g_object_set_data(G_OBJECT(cur_block->SignatureCombo),"repo_storage",cur_repo); @@ -229,14 +231,35 @@ void yon_storage_remove(char *key, storage_struct *storage,void*){ yon_storage_sturct_free_full(storage); } +int yon_char_parsed_compare(const void *a, const void *b){ + const config_str str_a = (const config_str)a; + const config_str str_b = (const config_str)b; + + return strcmp(*str_a,*str_b); +} + + void on_storage_accept(GtkWidget *self, dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); gtk_widget_destroy(window->MainWindow); - g_hash_table_foreach_remove(window->storages_copy,(GHRFunc)yon_storage_remove,NULL); + int size; + config_str keys = (config_str)g_hash_table_get_keys_as_array(window->storages_copy,&size); + for (int i=0;istorages_copy,keys[i]),NULL); + } + g_hash_table_remove_all(window->storages_copy); + // g_hash_table_foreach_remove(window->storages_copy,(GHRFunc)yon_storage_remove,NULL); g_hash_table_unref(window->storages_copy); free(window); - yon_interface_update(widgets); + yon_interface_update(widgets); } void on_storage_changed(GtkWidget *self, storage_config_window *window){ @@ -281,6 +304,7 @@ storage_config_window *yon_storage_config_window_new(){ repo_struct *repo = (repo_struct*)iter2->data; yon_char_parsed_add_or_create_if_exists(paths,&repos_size,repo->path); } + qsort(paths,repos_size,sizeof(char*),yon_char_parsed_compare); yon_config_register(storage->path,STORAGE_command,yon_char_parsed_to_string(paths,repos_size,",")); } g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index f6f4d0f..79ddb33 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -444,10 +444,10 @@ int main(int argc, char *argv[]){ yon_ubl_setup_arguments(argc,argv,&unfound,&size,NULL); gtk_init(&argc,&argv); template_main_window *widgets = yon_ubl_window_setup(); - yon_window_remove_exit_config_check(widgets); gtk_widget_hide(gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(widgets->SaveMenuItem)))); gtk_widget_hide(gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(widgets->LoadGlobalMenuItem)))); widgets = (template_main_window*)yon_main_window_complete((main_window*)widgets); + yon_window_remove_exit_config_check(widgets); char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); yon_window_config_load(path); // yon_config_load_update((main_window*)widgets); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 01b286c..5289534 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -418,4 +418,5 @@ void on_remove_window_tree_changed(GtkWidget *self, repo_add_window *window); void on_move_window_tree_changed(GtkWidget *self, repo_add_window *window); void on_move_check_fill(GtkWidget *self, repo_add_window *window); void yon_repo_creation_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target); -int yon_sort_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data); \ No newline at end of file +int yon_sort_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data); +int yon_char_parsed_compare(const void *a, const void *b); \ No newline at end of file From 423f073f0d25452749026501852f593a7971dbdc Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 21 Aug 2025 17:07:34 +0600 Subject: [PATCH 4/5] Merged Add and Create storage buttons --- source/ubl-settings-repomanager-storage-window.c | 1 + ubl-settings-repomanager-configuration.glade | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index 5918b8d..f53fdb7 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -41,6 +41,7 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),OPEN_EXISTING_TOOLTIP_LABEL,icon_path,"file_chooser_window"); + gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(dialog->MainFileChooser),1); if (yon_char_is_empty(main_config.last_selection)){ char *user_folder_path = yon_ubl_user_get_home_directory(); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),user_folder_path); diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index ff552d3..12e3c89 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -111,7 +111,6 @@ - True True True Create new From 87bcf287b289a3692f06829d8764ef3766caf7bd Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 21 Aug 2025 17:49:34 +0600 Subject: [PATCH 5/5] Added status message for unadded repo --- locale/ubl-settings-repomanager.pot | 4 ++++ locale/ubl-settings-repomanager_ru.po | 4 ++++ source/ubl-settings-repomanager-storage-window.c | 5 +++++ source/ubl-strings.h | 4 +++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/locale/ubl-settings-repomanager.pot b/locale/ubl-settings-repomanager.pot index 9235aae..191a390 100644 --- a/locale/ubl-settings-repomanager.pot +++ b/locale/ubl-settings-repomanager.pot @@ -570,3 +570,7 @@ msgstr "" #: source/ubl-strings.h:183 msgid "Chosen storage directory is inside of another storage" msgstr "" + +#: source/ubl-strings.h:183 +msgid "Repository were not added" +msgstr "" diff --git a/locale/ubl-settings-repomanager_ru.po b/locale/ubl-settings-repomanager_ru.po index 4cd2087..1b1a622 100644 --- a/locale/ubl-settings-repomanager_ru.po +++ b/locale/ubl-settings-repomanager_ru.po @@ -584,3 +584,7 @@ msgstr "Не подписан" #: source/ubl-strings.h:183 msgid "Chosen storage directory is inside of another storage" msgstr "Выбранный каталог хранилища находится внутри другого хранилища" + +#: source/ubl-strings.h:183 +msgid "Repository were not added" +msgstr "Репозиторий не добавлен" diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index f53fdb7..140d51d 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -243,6 +243,11 @@ int yon_char_parsed_compare(const void *a, const void *b){ void on_storage_accept(GtkWidget *self, dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); + if (gtk_entry_get_text(GTK_ENTRY(window->AddEntry))){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),UNADDED_REPO_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->AddRepoButton); + return; + } gtk_widget_destroy(window->MainWindow); int size; config_str keys = (config_str)g_hash_table_get_keys_as_array(window->storages_copy,&size); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 07ba2b1..bb87678 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -180,4 +180,6 @@ #define SIGNED_LABEL _("Signed") #define UNSIGNED_LABEL _("Unsigned") -#define INSIDE_STORAGE_ERROR_LABEL _("Chosen storage directory is inside of another storage") \ No newline at end of file +#define INSIDE_STORAGE_ERROR_LABEL _("Chosen storage directory is inside of another storage") + +#define UNADDED_REPO_LABEL _("Repository were not added") \ No newline at end of file