From c87ddd0dfb251450e0e2a1ef6897021c9c0cde9f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Jun 2025 18:01:22 +0000 Subject: [PATCH 01/29] WIP storage window saving --- .../ubl-settings-repomanager-data-structs.c | 175 +++++++++++++++++- .../ubl-settings-repomanager-storage-list.c | 8 + .../ubl-settings-repomanager-storage-window.c | 49 ++++- source/ubl-settings-repomanager.c | 10 +- source/ubl-settings-repomanager.h | 16 +- 5 files changed, 247 insertions(+), 11 deletions(-) diff --git a/source/ubl-settings-repomanager-data-structs.c b/source/ubl-settings-repomanager-data-structs.c index 27619e5..abdc460 100644 --- a/source/ubl-settings-repomanager-data-structs.c +++ b/source/ubl-settings-repomanager-data-structs.c @@ -68,7 +68,7 @@ repo_struct *yon_repo_struct_new(){ storage->path=NULL; storage->storage_path=NULL; storage->archs = g_hash_table_new(g_str_hash,g_str_equal); - storage->sign_status=0; + storage->sign_status=NULL; return storage; } @@ -120,7 +120,7 @@ void yon_package_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha arch_struct *yon_arch_copy_full(arch_struct *repo){ arch_struct *copy = yon_arch_struct_new(); copy->name=yon_char_new(repo->name); - copy->path=yon_char_new(repo->name); + copy->path=yon_char_new(repo->path); copy->storage_path=yon_char_new(repo->storage_path); copy->repo_name=yon_char_new(repo->repo_name); yon_package_hash_table_clone(repo->packages,copy->packages); @@ -140,7 +140,7 @@ void yon_arch_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash) repo_struct *yon_repo_copy_full(repo_struct *repo){ repo_struct *copy = yon_repo_struct_new(); copy->name=yon_char_new(repo->name); - copy->path=yon_char_new(repo->name); + copy->path=yon_char_new(repo->path); copy->storage_path=yon_char_new(repo->storage_path); copy->sign_status=repo->sign_status; yon_arch_hash_table_clone(repo->archs,copy->archs); @@ -160,7 +160,7 @@ void yon_repo_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash) storage_struct *yon_storage_copy_full(storage_struct *storage){ storage_struct *copy = yon_storage_struct_new(); copy->name=yon_char_new(storage->name); - copy->path=yon_char_new(storage->name); + copy->path=yon_char_new(storage->path); copy->sign_status=storage->sign_status; yon_repo_hash_table_clone(storage->repos,copy->repos); return copy; @@ -174,4 +174,171 @@ void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha storage_struct *storage_copy = yon_storage_copy_full(storage); g_hash_table_insert(target_hash,storage_copy->path,storage_copy); } +} + +void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct){ + char *changes = config(STORAGE(target_struct->path)); + if (!yon_char_is_empty(changes)){ + int size; + config_str parsed = yon_char_parse(changes,&size,";"); + if (size>0&&!yon_char_is_empty(parsed[0])){ + int removed_size; + config_str removed = yon_char_parse(parsed[0],&removed_size,","); + for (int i=0;irepos,removed[i]); + g_hash_table_remove(target_struct->repos,removed[i]); + yon_repo_sturct_free_full(repo); + } + yon_char_parsed_free(removed,removed_size); + } + if (size>1&&!yon_char_is_empty(parsed[1])){ + int added_size; + config_str added = yon_char_parse(parsed[1],&added_size,","); + for (int i=0;irepos,added[i]); + if (repo){ + repo_struct *copy = yon_repo_copy_full(repo); + g_hash_table_insert(target_struct->repos,copy->path,copy); + } + char *command = create_storage_command(repo->storage_path,repo->name); + yon_launch(yon_debug_output("%s\n",command)); + free(command); + + } + + yon_char_parsed_free(added,added_size); + } + if (size>2&&!yon_char_is_empty(parsed[2])){ + int sign_size; + config_str sign = yon_char_parse(parsed[2],&sign_size, ","); + for (int i=0;irepos,key); + char *command = repo_sign_command(repo->storage_path,repo->name,sign_key); + yon_launch(yon_debug_output("%s\n",command)); + free(command); + free(sign_key); + free(key); + } + yon_char_parsed_free(sign,sign_size); + } + + } + GList *list = g_hash_table_get_values(source_struct->repos); + GList *iter; + char *parameter=NULL; + yon_window_config_get_parameter("storage_info",source_struct->path,¶meter,YON_TYPE_STRING); + for (iter=list;iter;iter=iter->next){ + repo_struct *repo = (repo_struct*)iter->data; + char *temp = yon_char_append_element(parameter,repo->path,","); + if (!yon_char_is_empty(parameter)) free(parameter); + parameter = temp; + } + g_list_free(list); + yon_window_config_add_instant_parameter(source_struct->path,"storage_info",parameter,YON_TYPE_STRING); +} + +void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo){ + char *str = config(STORAGE(storage->path)); + if (!yon_char_is_empty(str)){ + int size; + config_str parsed = yon_char_parse(str,&size,";"); + + if (size>1&&!yon_char_is_empty(parsed[1])){ + int added_size; + config_str added = yon_char_parse(parsed[1],&added_size,","); + if (yon_char_parsed_check_exist(added,added_size,repo->name)==-1){ + yon_char_parsed_add_or_create_if_exists(added,&added_size,repo->name); + } else { + yon_char_parsed_free(added,added_size); + return; + } + if (!yon_char_is_empty(parsed[1])) free(parsed[1]); + parsed[1] = yon_char_parsed_to_string(parsed,size,","); + } else if (size>0){ + yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name); + } else { + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + + } + char *final = yon_char_parsed_to_string_full(parsed,size,";"); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + if (parsed&&size) yon_char_parsed_free(parsed,size); + } else { + char *final = yon_char_unite(";",repo->name,";",NULL); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + } + +} + +void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo){ + + char *str = config(STORAGE(storage->path)); + if (!yon_char_is_empty(str)){ + int size; + config_str parsed = yon_char_parse(str,&size,";"); + + if (size>0&&!yon_char_is_empty(parsed[0])){ + int removed_size; + config_str removed = yon_char_parse(parsed[0],&removed_size,","); + if (yon_char_parsed_check_exist(removed,removed_size,repo->name)==-1){ + yon_char_parsed_add_or_create_if_exists(removed,&removed_size,repo->name); + } else { + yon_char_parsed_free(removed,removed_size); + return; + } + if (!yon_char_is_empty(parsed[1])) free(parsed[1]); + parsed[1] = yon_char_parsed_to_string_full(parsed,size,","); + } else { + yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + } + char *final = yon_char_parsed_to_string_full(parsed,size,";"); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + if (parsed&&size) yon_char_parsed_free(parsed,size); + } else { + char *final = yon_char_unite(repo->name,";;",NULL); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + } +} + +void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign){ + char *str = config(STORAGE(storage->path)); + int size; + config_str parsed = yon_char_parse(str,&size,";"); + if (size>2&&!yon_char_is_empty(parsed[2])){ + int signs_size; + config_str signs = yon_char_parse(parsed[2],&signs_size,","); + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(signs,&signs_size,final); + free(final); + yon_char_parsed_free(signs,signs_size); + } else if (size>1){ + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(parsed,&size,final); + free(final); + } else if (size>0){ + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,final); + free(final); + } else if (!size){ + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,final); + free(final); + } + char *final = yon_char_parsed_to_string_full(parsed,size,";"); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + if (parsed&&size) yon_char_parsed_free(parsed,size); } \ No newline at end of file diff --git a/source/ubl-settings-repomanager-storage-list.c b/source/ubl-settings-repomanager-storage-list.c index 6b85cbe..c3fa433 100644 --- a/source/ubl-settings-repomanager-storage-list.c +++ b/source/ubl-settings-repomanager-storage-list.c @@ -4,6 +4,11 @@ void on_repo_signed(GtkWidget *self, storage_repo_block *block){ storage_config_window *window = g_object_get_data(G_OBJECT(self),"window"); const char *sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(block->SignatureCombo)); + const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_id); + repo_struct *repo = g_hash_table_lookup(storage->repos,block->repo_name); + // yon_repo_struct_sign(storage,repo,sign); + yon_config_register(repo->path,STORAGE_command,(char*)sign); if (!yon_char_is_empty(block->sign_request)) free(block->sign_request); block->sign_request = yon_char_new(sign); } @@ -13,6 +18,9 @@ void on_repo_removed(GtkWidget *self,storage_repo_block *block){ const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_id); if (g_hash_table_lookup(storage->repos,block->repo_name)){ + repo_struct *repo = g_hash_table_lookup(storage->repos,block->repo_name); + // yon_storage_struct_remove(storage,repo); + yon_config_remove_element(storage->path,repo->path,","); g_hash_table_remove(storage->repos,block->repo_name); gtk_widget_destroy(block->MainBox); yon_storage_repo_block_destroy(block); diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index fb2e287..e27be4a 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -14,6 +14,8 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ 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); + while (gtk_events_pending()) gtk_main_iteration(); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); } } @@ -27,6 +29,8 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ 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); + while (gtk_events_pending()) gtk_main_iteration(); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); } } @@ -45,6 +49,8 @@ void on_storage_remove(GtkWidget *self, storage_config_window *window){ const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target); if (storage){ + const char *path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + yon_config_remove_by_key((char*)path); gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); gtk_combo_box_set_active(GTK_COMBO_BOX(window->StoragePathCombo),0); g_hash_table_remove(window->storages_copy,storage_target); @@ -77,9 +83,11 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ block->repo_name=new_repo; repo->path = yon_char_unite(storage_target,"/",new_repo,NULL); repo->storage_path = yon_char_new(storage_target); + yon_config_append_element(storage->path,(char*)repo->path,","); gtk_entry_set_text(GTK_ENTRY(block->RepoNameEntry),new_repo); gtk_box_pack_start(GTK_BOX(window->ReposBox),block->MainBox,0,0,0); g_hash_table_insert(storage->repos,repo->name,repo); + // yon_storage_struct_add_repo(storage,repo); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); } @@ -112,8 +120,28 @@ void yon_storage_config_update(storage_config_window *window){ } } +void yon_storage_remove(char *key, storage_struct *storage,void*){ + char *parameter = config(key); + yon_window_config_add_instant_parameter(key,"storage_info",parameter,YON_TYPE_STRING); + int size; + config_str parsed = yon_char_parse(parameter,&size,","); + for (int i=0;ifirst,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); + g_hash_table_unref(window->storages_copy); + free(window); + yon_interface_update(widgets); // 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_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); @@ -160,6 +188,21 @@ storage_config_window *yon_storage_config_window_new(){ window->delete_storages_size=0; yon_storage_hash_table_clone(main_config.storages,window->storages_copy); + + GList *list = g_hash_table_get_values(window->storages_copy); + GList *iter; + for (iter=list;iter;iter=iter->next){ + storage_struct *storage = (storage_struct*)iter->data; + int repos_size; + config_str paths = NULL; + GList *repos = g_hash_table_get_values(storage->repos); + GList *iter2; + for (iter2=repos;iter2;iter2=iter2->next){ + repo_struct *repo = (repo_struct*)iter2->data; + yon_char_parsed_add_or_create_if_exists(paths,&repos_size,repo->path); + } + 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); g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window); g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window); @@ -180,11 +223,11 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ GList *listiter; for (listiter = storages;listiter;listiter=listiter->next){ storage_struct *cur_storage = (storage_struct*)listiter->data; - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),cur_storage->name,cur_storage->path); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),cur_storage->path,cur_storage->path); } dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - // g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 50cd491..d3b31b8 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -65,7 +65,13 @@ char *yon_path_get_name(char *path){ return copy; } +void yon_remove_config_storages(char *key,storage_struct *storage,void*){ + yon_storage_sturct_free_full(storage); +} + int yon_storages_load(main_window *widgets){ + // g_hash_table_foreach_remove(main_config.storages,(GHRFunc)yon_remove_config_storages,NULL); + g_hash_table_remove_all(main_config.storages); gsize size; config_str storages = yon_window_config_get_section("storage_info",&size); @@ -73,12 +79,12 @@ int yon_storages_load(main_window *widgets){ for(int i=0;iname=storage_name; storage->path=yon_char_new(storages[i]); + g_hash_table_insert(main_config.storages,storage->path,storage); int repos_size; config_str repo_names = yon_char_parse(repos,&repos_size,","); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 5c34572..209a190 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -66,6 +66,8 @@ typedef char* string; #define add_packages_repo_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",sign,"' ",packages_path,NULL) #define remove_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL) +#define repo_sign_command(storage_path, repo, sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage_path, "' -S ", sign,NULL) + #define yon_move_packages_command(storage,arch, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -a '",arch,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,NULL) #define yon_delete_packages_command(storage,arch, target_repo, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' ", packages,NULL) #define yon_delete_packages_sign_command(storage,arch, target_repo,sign, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' -S '",sign,"' ", packages,NULL) @@ -142,6 +144,11 @@ Expire-Date: ",!yon_char_is_empty(expire)?expire:"0","\n\ %echo done\n\ EOF",NULL) +#define STORAGE_search_macro "STORAGE[" +#define STORAGE(target) yon_char_unite("STORAGE[",target,"]",NULL) +#define STORAGE_command "echo \"\"" + + typedef char* string; __attribute__((unused)) static \ @@ -299,7 +306,7 @@ typedef struct { char *storage_path; GHashTable *archs; char *path; - int sign_status; + char *sign_status; } repo_struct; typedef struct { @@ -407,4 +414,9 @@ void yon_sublist_packages_build(char *key, char *file, main_window *widgets); void yon_sublist_build(char *key, storage_struct *storage, main_window *widgets); void yon_storage_repo_block_destroy(storage_repo_block *block); void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash); -void yon_storage_sturct_free_full(storage_struct *storage); \ No newline at end of file +void yon_storage_sturct_free_full(storage_struct *storage); +void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct); +void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo); +void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo); +void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign); +void yon_storage_remove(char *key, storage_struct *storage,void*); \ No newline at end of file From e95eb12c427f4974daa983d91a70061b8373c1b5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 26 Jun 2025 11:38:24 +0000 Subject: [PATCH 02/29] Main window icons and checks --- .../ubl-settings-repomanager-data-structs.c | 12 ++++ .../ubl-settings-repomanager-storage-window.c | 56 ++++++++++--------- source/ubl-settings-repomanager.c | 52 ++++++++++++++--- source/ubl-settings-repomanager.h | 3 +- 4 files changed, 86 insertions(+), 37 deletions(-) diff --git a/source/ubl-settings-repomanager-data-structs.c b/source/ubl-settings-repomanager-data-structs.c index abdc460..ecc77d6 100644 --- a/source/ubl-settings-repomanager-data-structs.c +++ b/source/ubl-settings-repomanager-data-structs.c @@ -107,6 +107,18 @@ arch_struct *yon_arch_struct_new(){ return storage; } +config_str yon_arch_struct_get_packages(arch_struct *arch, int *size){ + char *command = yon_get_packages_command(arch->storage_path,arch->repo_name,arch->name); + (*size)=0; + config_str packages = yon_config_load(command,size); + if (size&&packages){ + for (int i=0;i<(*size);i++){ + yon_char_remove_last_symbol(packages[i],'\n'); + } + } + return packages; +} + void yon_package_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash){ GList *list = g_hash_table_get_keys(source_hash); GList *iter; diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index e27be4a..3f14836 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -16,6 +16,7 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path); while (gtk_events_pending()) gtk_main_iteration(); gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); + yon_config_register(storage->path,STORAGE_command,""); } } @@ -31,31 +32,41 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path); while (gtk_events_pending()) gtk_main_iteration(); gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); + yon_config_register(storage->path,STORAGE_command,""); } } void on_storage_disable(GtkWidget *self, storage_config_window *window){ const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (yon_char_is_empty(storage_target)) return; storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target); if (storage){ + const char *path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (!config((char*)path)){ + yon_config_register((char*)path,STORAGE_command,"-"); + } + yon_config_set_status((char*)path,-1); gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); gtk_combo_box_set_active(GTK_COMBO_BOX(window->StoragePathCombo),0); - g_hash_table_remove(window->storages_copy,storage_target); - yon_storage_sturct_free_full(storage); + // g_hash_table_remove(window->storages_copy,storage_target); + // yon_storage_sturct_free_full(storage); } } void on_storage_remove(GtkWidget *self, storage_config_window *window){ const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (yon_char_is_empty(storage_target)) return; storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target); if (storage){ const char *path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); - yon_config_remove_by_key((char*)path); + if (!config((char*)path)){ + yon_config_register((char*)path,STORAGE_command,"-"); + } + yon_config_set_status((char*)path,-2); gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); gtk_combo_box_set_active(GTK_COMBO_BOX(window->StoragePathCombo),0); - g_hash_table_remove(window->storages_copy,storage_target); - yon_storage_sturct_free_full(storage); - yon_char_parsed_add_or_create_if_exists(window->delete_storages,&window->delete_storages_size,(char*)storage_target); + // g_hash_table_remove(window->storages_copy,storage_target); + // yon_storage_sturct_free_full(storage); } } @@ -122,7 +133,17 @@ void yon_storage_config_update(storage_config_window *window){ void yon_storage_remove(char *key, storage_struct *storage,void*){ char *parameter = config(key); - yon_window_config_add_instant_parameter(key,"storage_info",parameter,YON_TYPE_STRING); + switch (yon_config_get_status(key)){ + case -2: yon_window_config_erase_instant_parameter(key,"storage_info"); + if (rmdir(key)){}; + break; + case -1: yon_window_config_erase_instant_parameter(key,"storage_info"); + break; + case 0: + break; + case 1: yon_window_config_add_instant_parameter(key,"storage_info",parameter,YON_TYPE_STRING); + break; + } int size; config_str parsed = yon_char_parse(parameter,&size,","); for (int i=0;istorages_copy); free(window); yon_interface_update(widgets); -// 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_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); -// gtk_tree_store_clear(main_config.tree_store); -// yon_gtk_tree_store_copy_full(window->storages_copy,main_config.tree_store); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(main_config.tree_store)); -// yon_window_config_save_instant(); -// GtkTreeIter iter; -// const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); -// if (!yon_char_is_empty(id)){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); -// gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); -// gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); -// on_main_tree_selection_changed(NULL,widgets); -// } -// on_subwindow_close(self); -// yon_config_load_update(widgets); -// yon_ubl_status_box_render(STORAGES_SAVED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } - void on_storage_changed(GtkWidget *self, storage_config_window *window){ yon_storage_config_update(window); } @@ -206,7 +208,7 @@ storage_config_window *yon_storage_config_window_new(){ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window); g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window); - // g_signal_connect(G_OBJECT(window->DisableButton),"clicked",G_CALLBACK(on_storage_disable),window); + g_signal_connect(G_OBJECT(window->DisableButton),"clicked",G_CALLBACK(on_storage_disable),window); g_signal_connect(G_OBJECT(window->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window); diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index d3b31b8..8b89881 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -86,9 +86,11 @@ int yon_storages_load(main_window *widgets){ storage->path=yon_char_new(storages[i]); g_hash_table_insert(main_config.storages,storage->path,storage); + if (yon_char_is_empty(repos)) continue; int repos_size; config_str repo_names = yon_char_parse(repos,&repos_size,","); yon_storage_fill_repos(storage,repo_names,repos_size); + yon_char_parsed_free(repo_names,repos_size); } } @@ -100,7 +102,7 @@ void yon_repo_tree_build_storage(char *key, storage_struct *storage, main_window struct repo_tree_build data; data.widgets=widgets; gtk_tree_store_append(widgets->RepoList,&data.storageiter,NULL); - gtk_tree_store_set(widgets->RepoList,&data.storageiter,2,storage->name,3,storage->path,7,storage,8,0,-1); + gtk_tree_store_set(widgets->RepoList,&data.storageiter,0,folder_no_edits,2,storage->name,3,storage->path,7,storage,8,0,-1); g_hash_table_foreach(storage->repos,(GHFunc)yon_repo_tree_build_repo,&data); } @@ -111,8 +113,18 @@ void yon_repo_tree_build_repo(char *key, repo_struct *repo, struct repo_tree_bui } void yon_repo_tree_build_arch(char *key, arch_struct *arch, struct repo_tree_build *data){ + int arch_status = system(yon_repo_get_signature_status_arch(arch->storage_path,arch->repo_name,arch->name)); + int package_status = system(yon_repo_get_signature_status_packages(arch->storage_path,arch->repo_name,arch->name)); + arch_status = WEXITSTATUS(arch_status); + char *image_name = NULL; + if (arch_status != 2 || package_status != 2){ + image_name = warning_icon_name; + } else if (!arch_status&&!package_status){ + image_name = key_icon_name; + } + gtk_tree_store_append(data->widgets->RepoList,&data->architer,&data->repoiter); - gtk_tree_store_set(data->widgets->RepoList,&data->architer,2,arch->name,3,arch->path,7,arch,8,2,-1); + gtk_tree_store_set(data->widgets->RepoList,&data->architer,0,image_name,2,arch->name,3,arch->path,7,arch,8,2,-1); } void yon_interface_update(main_window *widgets){ @@ -263,7 +275,28 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ if (data_type!=YON_REPO_DATA_ARCH){ g_hash_table_foreach(data_struct->repos,(GHFunc)yon_sublist_build,widgets); } else { - g_hash_table_foreach(data_struct->repos,(GHFunc)yon_sublist_packages_build,widgets); + int size; + config_str packages = yon_arch_struct_get_packages((arch_struct*)data_struct, &size); + for (int i=0;istorage_path,((arch_struct*)data_struct)->repo_name,((arch_struct*)data_struct)->name,parsed[1])); + char *sign_icon = ""; + if (!sign_status){ + sign_icon = package_signature_icon_name; + } else { + sign_icon = package_signature_error_icon_name; + } + GtkTreeIter itar; + gtk_list_store_append(widgets->RepoFileList,&itar); + gtk_list_store_set(widgets->RepoFileList,&itar,0,sign_icon,1,parsed[0],2,parsed[1],-1); + } + yon_char_parsed_free(parsed,parsed_size); + } + } + yon_char_parsed_free(packages,size); } } } @@ -284,12 +317,13 @@ void on_package_selection_changed(GtkWidget *self, main_window *widgets){ storage_struct *storage; gtk_tree_model_get(model,&iter,7,&storage,-1); repo_struct *repo = g_hash_table_lookup(storage->repos,target); - - int size; - config_str archs = (config_str)g_hash_table_get_keys_as_array(repo->archs,&size); - char *archs_str = yon_char_parsed_to_string(archs,size,","); - char *info_label = get_repo_info_label(repo->name,archs_str,""); - gtk_label_set_markup(GTK_LABEL(widgets->InformationLabel),info_label); + if (repo){ + int size; + config_str archs = (config_str)g_hash_table_get_keys_as_array(repo->archs,&size); + char *archs_str = yon_char_parsed_to_string(archs,size,","); + char *info_label = get_repo_info_label(repo->name,archs_str,""); + gtk_label_set_markup(GTK_LABEL(widgets->InformationLabel),info_label); + } } break; case YON_REPO_DATA_REPO: { repo_struct *repo; diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 209a190..f222454 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -419,4 +419,5 @@ void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *sour void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo); void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo); void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign); -void yon_storage_remove(char *key, storage_struct *storage,void*); \ No newline at end of file +void yon_storage_remove(char *key, storage_struct *storage,void*); +config_str yon_arch_struct_get_packages(arch_struct *arch, int *size); \ No newline at end of file From e96362e4680ef3eac5f140cdcef3ec55c5c98d74 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 26 Jun 2025 15:27:11 +0000 Subject: [PATCH 03/29] Add window fixed --- source/ubl-settings-repomanager-add-window.c | 595 +++++++++---------- source/ubl-settings-repomanager.c | 6 +- source/ubl-settings-repomanager.h | 1 + source/ubl-strings.h | 1 + 4 files changed, 295 insertions(+), 308 deletions(-) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index 1a49323..9b7b451 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -1,4 +1,4 @@ -// #include "ubl-settings-repomanager.h" +#include "ubl-settings-repomanager.h" // gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data){ @@ -29,72 +29,55 @@ // return final; // } -// void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window){ -// gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); -// char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); -// if (!yon_char_is_empty(path_str)){ -// GtkTreeIter iter, itar; -// GtkTreePath *path = gtk_tree_path_new_from_string(path_str); -// if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ - -// int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); -// for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ -// char *current; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,-1); -// if (!yon_char_is_empty(current)){ -// char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->RepositoryCombo),path_str,current); -// } -// } -// } - -// } -// } - -// void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *window){ -// gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); -// char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); -// if (!yon_char_is_empty(path_str)){ -// GtkTreeIter iter, itar; -// GtkTreePath *path = gtk_tree_path_new_from_string(path_str); -// if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ - -// int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); -// for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ -// char *current, *current_path; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,3,¤t_path,-1); -// if (!yon_char_is_empty(current)){ -// char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo),path_str,current); - -// } -// } -// } -// gtk_widget_set_sensitive(window->RepoSignCombo,1); - -// } else { -// gtk_widget_set_sensitive(window->RepoSignCombo,0); - -// } -// } - -// void on_arch_chosen(GtkWidget *target,repo_add_window *window){ -// char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); -// if (!yon_char_is_empty(path_str)){ -// gtk_widget_set_sensitive(window->PackageSignCombo,1); -// } else { -// gtk_widget_set_sensitive(window->PackageSignCombo,0); -// } -// } - -// void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){ -// gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList)); -// if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))==-1){ -// gtk_widget_set_sensitive(window->AddPackageButton,0); -// } else { -// gtk_widget_set_sensitive(window->AddPackageButton,1); -// } -// } +void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + if (!yon_char_is_empty(path_str)){ + storage_struct *storage = g_hash_table_lookup(main_config.storages,path_str); + int size; + config_str repos = (config_str)g_hash_table_get_keys_as_array(storage->repos,&size); + for (int i=0;iRepositoryCombo),repos[i],repos[i]); + } + } +} + +void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); + char *storage_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + char *repo_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + if (!yon_char_is_empty(storage_str)){ + storage_struct *storage = g_hash_table_lookup(main_config.storages,storage_str); + repo_struct *repo = g_hash_table_lookup(storage->repos,repo_str); + int size; + config_str archs = (config_str)g_hash_table_get_keys_as_array(repo->archs,&size); + for (int i=0;iArchitectureCombo),archs[i],archs[i]); + } + gtk_widget_set_sensitive(window->RepoSignCombo,1); + } else { + gtk_widget_set_sensitive(window->RepoSignCombo,0); + + } +} + +void on_arch_chosen(GtkWidget *target,repo_add_window *window){ + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + if (!yon_char_is_empty(path_str)){ + gtk_widget_set_sensitive(window->PackageSignCombo,1); + } else { + gtk_widget_set_sensitive(window->PackageSignCombo,0); + } +} + +void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList)); + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))==-1){ + gtk_widget_set_sensitive(window->AddPackageButton,0); + } else { + gtk_widget_set_sensitive(window->AddPackageButton,1); + } +} // void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ // gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry)); @@ -113,113 +96,121 @@ // } // } -// void on_add_accept(GtkWidget *self, dictionary *dict){ -// repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); -// file_chooser_window *dialog = yon_dictionary_get_data(dict->first->next,file_chooser_window*); -// char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); -// char *path,*arch_name; -// GtkTreeIter iter,itar,itor; -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&arch_name,3,&path,-1); -// char *packages; -// yon_window_config_get_parameter("package_info",path,&packages,YON_TYPE_STRING); -// int size; -// config_str parsed = yon_char_parse(packages,&size,","); -// GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget)); -// for (int i=0;iStatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// return; -// } -// yon_char_remove_last_symbol(name[0],'\n'); -// if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){ -// if (name_size<=0){ -// yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// return; -// } -// gtk_list_store_append(window->PackagesList,&itar); -// gtk_list_store_set(window->PackagesList,&itar,1,name[0],2,current,3,1,-1); -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// } -// yon_char_parsed_free(name,name_size); -// } -// } -// gtk_widget_destroy(dialog->Window); -// if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ -// gtk_widget_set_sensitive(window->StorageCombo,0); -// gtk_widget_set_sensitive(window->RepositoryCombo,0); -// gtk_widget_set_sensitive(window->ArchitectureCombo,0); -// } -// } - -// void on_add_package(GtkWidget *self, repo_add_window *window){ -// file_chooser_window *dialog = yon_file_chooser_new(); -// 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->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL); -// gtk_widget_show(dialog->Window); -// GtkFileFilter *filter = gtk_file_filter_new(); -// gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); -// gtk_file_filter_set_name(filter,"*.pkg.tar*"); -// 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); -// gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter); -// g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); -// g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_add_accept),dict); -// g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),dict); -// } - -// void on_remove_package(GtkWidget *self, repo_add_window *window){ -// char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); -// char *storage = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); -// char *repo; -// char *path; -// GtkTreeModel *model; -// GtkTreeIter iter,itar,itor; -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,storage); -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&storage,-1); - -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&itar)){ -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&repo,3,&path,-1); -// gtk_list_store_remove(window->PackagesList,&itar); -// } -// if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ -// gtk_widget_set_sensitive(window->StorageCombo,1); -// gtk_widget_set_sensitive(window->RepositoryCombo,1); -// gtk_widget_set_sensitive(window->ArchitectureCombo,1); -// } -// } - -// void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ -// gtk_label_set_text(GTK_LABEL(window->InfoLabel),""); -// GtkTreeModel *model; -// GtkTreeIter iter; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ -// gtk_widget_set_sensitive(window->RemoveButton,1); -// char *target; -// gtk_tree_model_get(model,&iter,2,&target,-1); -// int size; -// config_str info = yon_config_load(get_package_info_command(target),&size); -// char *result = yon_char_parsed_to_string(info,size,""); -// gtk_label_set_text(GTK_LABEL(window->InfoLabel),result); -// yon_char_parsed_free(info,size); -// free(result); -// } else { -// gtk_widget_set_sensitive(window->RemoveButton,0); -// } -// } - - -// void on_add_packages_accept(GtkWidget *self, dictionary *dict){ -// main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); -// repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); +void on_add_accept(GtkWidget *self, dictionary *dict){ + repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); + filechooser_window *dialog = yon_dictionary_get_data(dict->first->next,filechooser_window*); + char *file = dialog->last_success_selection; + int size; + if (!yon_char_is_empty(file)){ + config_str package_name = yon_config_load(yon_get_package_name_from_filename(file),&size); + if (size){ + yon_char_remove_last_symbol(package_name[0],'\n'); + GtkTreeIter iter; + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,0,package_signature_icon_name,1,package_name[0],2,file,3,1,-1); + } + yon_char_parsed_free(package_name,size); + } +} + +void on_file_chooser_file_activate(GtkWidget *self, dictionary *dict){ + on_add_accept(self,dict); +} + + +void on_add_package(GtkWidget *self, repo_add_window *window){ + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN); + 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); + + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); + gtk_file_filter_set_name(filter,"*.pkg.tar*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ + 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); + on_add_accept(self,dict); + } + gtk_widget_destroy(dialog->Window); + free(dialog); + // g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + // g_signal_connect(G_OBJECT(dialog->SaveButton),"clicked",G_CALLBACK(on_add_accept),dict); + // g_signal_connect(G_OBJECT(dialog->MainFileChooser),"file-activated",G_CALLBACK(on_file_chooser_file_activate),dict); +} + +void on_remove_package(GtkWidget *self, repo_add_window *window){ + GtkTreeIter iter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ + gtk_list_store_remove(window->PackagesList,&iter); + } +} + +void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ + gtk_label_set_text(GTK_LABEL(window->InfoLabel),""); + GtkTreeModel *model; + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ + gtk_widget_set_sensitive(window->RemoveButton,1); + char *target; + gtk_tree_model_get(model,&iter,2,&target,-1); + int size; + config_str info = yon_config_load(get_package_info_command(target),&size); + char *result = yon_char_parsed_to_string(info,size,""); + gtk_label_set_text(GTK_LABEL(window->InfoLabel),result); + yon_char_parsed_free(info,size); + free(result); + } else { + gtk_widget_set_sensitive(window->RemoveButton,0); + } +} + + +void on_add_packages_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); + + const char *storage = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + const char *repo = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + const char *arch = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + + const char *repo_sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)); + const char *package_sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)); + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList); + int size; + config_str parsed = NULL; + for_iter(model,&iter){ + char *path; + gtk_tree_model_get(model,&iter,2,&path,-1); + yon_char_parsed_add_or_create_if_exists(parsed, &size,path); + } + + char *packages = yon_char_parsed_to_string(parsed,size," "); + char *command = NULL; + if (repo_sign&&package_sign){ + command = add_packages_sign_command(storage,arch,repo,repo_sign,package_sign,packages); + } else if (!yon_char_is_empty(repo_sign)){ + command = add_packages_repo_sign_command(storage,arch,repo,repo_sign,packages); + } else if (!yon_char_is_empty(package_sign)){ + command = add_packages_package_sign_command(storage,arch,repo,package_sign,packages); + } else { + command = add_packages_command(storage,arch,repo,packages); + } + + if (system(command)){ + yon_ubl_status_box_render(PACKAGES_ADD_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else { + yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } + gtk_widget_destroy(window->MainWindow); + yon_interface_update(widgets); + free(window); + // GtkTreeIter iter, itar; // char *storage; // if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->tree_copy),&itar)){ @@ -274,7 +265,7 @@ // } else { // yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); // } -// } +} // void on_repo_sign_load(GtkWidget *self, repo_add_window *window){ // GtkTreeIter iter; @@ -285,63 +276,6 @@ // gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepoSignCombo),sign); // } -// void on_add_clicked(GtkWidget *self, main_window *widgets){ -// repo_add_window *window = yon_repo_add_window_new(); -// yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),ADD_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window"); -// gtk_label_set_text(GTK_LABEL(window->HeadLabel),ADD_PACKAGES_TITLE_LABEL); -// GtkTreeIter iter; -// for_iter (window->tree_copy,&iter){ -// char *current; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1); -// if (!yon_char_is_empty(current)){ -// char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current); -// } -// } - -// yon_sign_list_update(); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); - -// gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0); -// gtk_combo_box_set_active(GTK_COMBO_BOX(window->PackageSignCombo),0); - -// dictionary *dict = NULL; -// yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); -// yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - -// g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); -// g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); -// g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_arch_chosen),window); -// g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_add_target_package_selection_changed),window); -// g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_add_packages_accept),dict); -// g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_add_package),window); -// g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_remove_package),window); -// g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window); -// yon_add_window_set_selected(widgets,window); -// GtkTreeModel *model; -// GList *list = NULL; -// char *full_path; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ -// gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&full_path,-1); -// if (list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoPackagesTree)),&model)){ -// for (int i=0; iPackagesList,&itar); -// char *temp = yon_char_unite(full_path,"/",path,NULL); -// free(full_path); -// full_path = temp; -// gtk_list_store_set(window->PackagesList,&itar,1,path,2,full_path,-1); -// } -// } -// } -// gtk_widget_show(window->MainWindow); -// } - - // void on_rmb_move(GtkWidget *self, main_window *widgets){ // repo_add_window *window = on_move_clicked(NULL,widgets); // GtkTreeModel *model; @@ -364,77 +298,132 @@ // } // } -// repo_add_window *yon_repo_add_window_new(){ -// repo_add_window *window = malloc(sizeof(repo_add_window)); -// GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_add); -// window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); -// window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); -// window->StorageCombo = yon_gtk_builder_get_widget(builder,"StorageCombo"); -// window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); -// window->RepositoryCombo = yon_gtk_builder_get_widget(builder,"RepositoryCombo"); -// window->ArchitectureCombo = yon_gtk_builder_get_widget(builder,"ArchitectureCombo"); -// window->MoveSourceFrame = yon_gtk_builder_get_widget(builder,"MoveSourceFrame"); -// window->MoveSourceStorageEntry = yon_gtk_builder_get_widget(builder,"MoveSourceStorageEntry"); -// window->MoveSourceRepoEntry = yon_gtk_builder_get_widget(builder,"MoveSourceRepoEntry"); -// window->MoveSourceArchEntry = yon_gtk_builder_get_widget(builder,"MoveSourceArchEntry"); -// window->MoveTargetFrame = yon_gtk_builder_get_widget(builder,"MoveTargetFrame"); -// window->MoveTargetStorageEntry = yon_gtk_builder_get_widget(builder,"MoveTargetStorageEntry"); -// window->MoveTargetRepoEntry = yon_gtk_builder_get_widget(builder,"MoveTargetRepoEntry"); -// window->MoveTargetArchEntry = yon_gtk_builder_get_widget(builder,"MoveTargetArchEntry"); -// window->PackageSignCombo = yon_gtk_builder_get_widget(builder,"PackageSignCombo"); -// window->RepoSignCombo = yon_gtk_builder_get_widget(builder,"RepoSignCombo"); -// window->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton"); -// window->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); -// window->PackagesTree = yon_gtk_builder_get_widget(builder,"PackagesTree"); -// window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); -// window->PackagesToAddLabel = yon_gtk_builder_get_widget(builder,"PackagesToAddLabel"); -// window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); -// window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); -// window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); -// window->tree_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT); -// yon_gtk_tree_store_copy_full(main_config.tree_store,window->tree_copy); - -// g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); -// g_signal_connect(G_OBJECT(window->PackagesTree),"cursor-changed",G_CALLBACK(on_add_window_tree_changed),window); - -// window->added_packages_archs = NULL; -// window->removed_packages_archs = NULL; - -// return window; -// } - -// void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){ -// GtkTreeIter iter; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ - -// char *target = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoList),&iter); -// int mod = yon_char_count(target,":")+1; -// char *arc=NULL; -// char *repo=NULL; -// char *stor=NULL; -// if (mod ==3){ -// arc = yon_char_new(target); -// char *temp = yon_char_new(target); -// repo = yon_char_divide(temp,yon_char_find_last(temp,':')); -// free(temp); -// temp = yon_char_new(repo); -// stor = yon_char_divide(temp,yon_char_find_last(temp,':')); -// free(temp); -// } else if (mod>=2){ -// repo = yon_char_new(target); -// char *temp = yon_char_new(target); -// stor = yon_char_divide(temp,yon_char_find_last(temp,':')); -// free(temp); -// } else if (mod>=1){ -// stor = yon_char_new(target); -// } +void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){ + GtkTreeIter iter, itar, itor; + + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ + int depth = gtk_tree_store_iter_depth(widgets->RepoList,&iter); + char *storage=NULL, *repo=NULL, *arch=NULL; + switch (depth){ + case 0: //storage + { + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&storage,-1); + }break; + case 1: //repo + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&repo,-1); + gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,3,&storage,-1); + break; + case 2: //arch + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&arch,-1); + gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,2,&repo,-1); + gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itor, &itar); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itor,3,&storage,-1); + break; + } + if (!yon_char_is_empty(storage)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StorageCombo),storage); + while(gtk_events_pending()) gtk_main_iteration(); + if (!yon_char_is_empty(repo)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepositoryCombo),repo); + while(gtk_events_pending()) gtk_main_iteration(); + if (!yon_char_is_empty(arch)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->ArchitectureCombo),arch); + } +} + +repo_add_window *yon_repo_add_window_new(){ + repo_add_window *window = malloc(sizeof(repo_add_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_add); + window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->StorageCombo = yon_gtk_builder_get_widget(builder,"StorageCombo"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->RepositoryCombo = yon_gtk_builder_get_widget(builder,"RepositoryCombo"); + window->ArchitectureCombo = yon_gtk_builder_get_widget(builder,"ArchitectureCombo"); + window->MoveSourceFrame = yon_gtk_builder_get_widget(builder,"MoveSourceFrame"); + window->MoveSourceStorageEntry = yon_gtk_builder_get_widget(builder,"MoveSourceStorageEntry"); + window->MoveSourceRepoEntry = yon_gtk_builder_get_widget(builder,"MoveSourceRepoEntry"); + window->MoveSourceArchEntry = yon_gtk_builder_get_widget(builder,"MoveSourceArchEntry"); + window->MoveTargetFrame = yon_gtk_builder_get_widget(builder,"MoveTargetFrame"); + window->MoveTargetStorageEntry = yon_gtk_builder_get_widget(builder,"MoveTargetStorageEntry"); + window->MoveTargetRepoEntry = yon_gtk_builder_get_widget(builder,"MoveTargetRepoEntry"); + window->MoveTargetArchEntry = yon_gtk_builder_get_widget(builder,"MoveTargetArchEntry"); + window->PackageSignCombo = yon_gtk_builder_get_widget(builder,"PackageSignCombo"); + window->RepoSignCombo = yon_gtk_builder_get_widget(builder,"RepoSignCombo"); + window->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton"); + window->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); + window->PackagesTree = yon_gtk_builder_get_widget(builder,"PackagesTree"); + window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); + window->PackagesToAddLabel = yon_gtk_builder_get_widget(builder,"PackagesToAddLabel"); + window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->PackagesTree),"cursor-changed",G_CALLBACK(on_add_window_tree_changed),window); -// if (stor) -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StorageCombo),stor); -// if (repo) -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepositoryCombo),repo); -// if (arc) -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->ArchitectureCombo),arc); -// } -// } \ No newline at end of file + + window->added_packages_archs = NULL; + window->removed_packages_archs = NULL; + + return window; +} + +void on_add_clicked(GtkWidget *self, main_window *widgets){ + repo_add_window *window = yon_repo_add_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),ADD_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window"); + gtk_label_set_text(GTK_LABEL(window->HeadLabel),ADD_PACKAGES_TITLE_LABEL); + GtkTreeIter iter; + int size; + config_str storages = (config_str)g_hash_table_get_keys_as_array(main_config.storages,&size); + for (int i=0;iStorageCombo),storages[i],storages[i]); + } + + yon_sign_list_update(); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + + gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PackageSignCombo),0); + + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + + g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); + g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); + g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_arch_chosen),window); + g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_add_target_package_selection_changed),window); + g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_add_packages_accept),dict); + g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_add_package),window); + g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_remove_package),window); + + yon_rmb_menu_setup(window->PackagesTree,(int(*)(void*))gtk_widget_is_sensitive,window->AddPackageButton, + ADD_PACKAGE_LABEL,add_icon_name,G_CALLBACK(on_add_package),window, + REMOVE_PACKAGE_LABEL,remove_icon,G_CALLBACK(on_remove_package),window, + NULL); + + // g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window); + yon_add_window_set_selected(widgets,window); + GtkTreeModel *model; + GList *list = NULL; + char *full_path; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&full_path,-1); + if (list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoPackagesTree)),&model)){ + for (int i=0; iPackagesList,&itar); + char *temp = yon_char_unite(full_path,"/",path,NULL); + free(full_path); + full_path = temp; + gtk_list_store_set(window->PackagesList,&itar,1,path,2,full_path,-1); + } + } + } + gtk_widget_show(window->MainWindow); +} \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 8b89881..566b4d1 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -17,10 +17,6 @@ config main_config; // if (!yon_char_is_empty(text)) free(pattern); // } -// void on_file_chooser_file_activate(GtkWidget *self, dictionary *dict){ -// on_add_accept(self,dict); -// } - // file_chooser_window *yon_file_chooser_new(){ // file_chooser_window *window = malloc(sizeof(file_chooser_window)); // GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_filechooser); @@ -658,7 +654,7 @@ main_window *yon_main_window_complete(main_window *widgets){ // NULL); g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets); - // g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_add_clicked),widgets); + g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_add_clicked),widgets); // g_signal_connect(G_OBJECT(widgets->MoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets); // g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); g_signal_connect(G_OBJECT(widgets->ReposTree),"cursor-changed",G_CALLBACK(on_main_tree_selection_changed),widgets); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index f222454..e56122e 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -38,6 +38,7 @@ #define document_deleted "com.ublinux.ubl-settings-repomanager.key-red-symbolic" #define document_added "com.ublinux.ubl-settings-repomanager.key-green-symbolic" +#define add_icon_name "com.ublinux.libublsettingsui-gtk3.increase-symbolic" #define move_icon "com.ublinux.libublsettingsui-gtk3.arrows-left-right-symbolic" #define remove_icon "com.ublinux.libublsettingsui-gtk3.trash-symbolic" diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 0699111..cee66b0 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -86,6 +86,7 @@ #define REPO_SIGN_ERROR_LABEL _("Repository sign failed - repository has no packages") #define DATA_LOADED_LABEL _("Data has been loaded") +#define PACKAGES_ADD_ERROR_LABEL _("Failed to add packages") #define PACKAGES_ADD_SUCCESS_LABEL _("Packages were added successfully") #define PACKAGES_REMOVE_SUCCESS_LABEL _("Packages were removed successfully") #define PACKAGES_MOVE_SUCCESS_LABEL _("Packages were moved successfully") From 7b42068aa6e7ed1a4ce128135632482e5195cbde Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 26 Jun 2025 17:56:59 +0000 Subject: [PATCH 04/29] WIP Move window fix --- source/ubl-settings-repomanager-add-window.c | 132 +---- source/ubl-settings-repomanager-move.c | 582 ++++++++++--------- source/ubl-settings-repomanager.c | 19 +- source/ubl-settings-repomanager.h | 19 +- source/ubl-strings.h | 4 +- 5 files changed, 338 insertions(+), 418 deletions(-) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index 9b7b451..6c83bf8 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -1,34 +1,5 @@ #include "ubl-settings-repomanager.h" - -// gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data){ -// GtkTreeIter parent; -// if (gtk_tree_model_iter_parent(model, &parent, iter)) -// return 0; -// return 1; -// } - -// config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level){ -// (*size)=0; -// config_str final = NULL; -// GtkTreePath *path=NULL, *parent_path=NULL; -// GtkTreeIter iter; -// if (parent){ -// parent_path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),parent); -// } -// int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,parent); -// for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ -// path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),&iter); -// if (path && gtk_tree_path_get_depth(path)==level&&(!parent_path||gtk_tree_path_is_descendant(path,parent_path))){ -// char *append=NULL; -// gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,column,&append,-1); -// yon_char_parsed_add_or_create_if_exists(final,size,append); -// } -// gtk_tree_path_free(path); -// } -// return final; -// } - void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window){ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); @@ -46,7 +17,7 @@ void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *win gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); char *storage_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); char *repo_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); - if (!yon_char_is_empty(storage_str)){ + if (!yon_char_is_empty(repo_str)&&!yon_char_is_empty(storage_str)){ storage_struct *storage = g_hash_table_lookup(main_config.storages,storage_str); repo_struct *repo = g_hash_table_lookup(storage->repos,repo_str); int size; @@ -79,23 +50,6 @@ void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window * } } -// void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ -// gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry)); -// gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry)); -// GtkTreeIter iter,itar; -// char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveTargetStorageEntry),id); -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); -// int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); -// for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ -// char *target; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1); -// char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry),child_id,target); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry),child_id,target); -// } -// } - void on_add_accept(GtkWidget *self, dictionary *dict){ repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); filechooser_window *dialog = yon_dictionary_get_data(dict->first->next,filechooser_window*); @@ -136,9 +90,6 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ } gtk_widget_destroy(dialog->Window); free(dialog); - // g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - // g_signal_connect(G_OBJECT(dialog->SaveButton),"clicked",G_CALLBACK(on_add_accept),dict); - // g_signal_connect(G_OBJECT(dialog->MainFileChooser),"file-activated",G_CALLBACK(on_file_chooser_file_activate),dict); } void on_remove_package(GtkWidget *self, repo_add_window *window){ @@ -210,61 +161,12 @@ void on_add_packages_accept(GtkWidget *self, dictionary *dict){ yon_interface_update(widgets); free(window); + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->PackagesList),&iter)){ + gtk_widget_set_sensitive(window->StorageCombo,0); + gtk_widget_set_sensitive(window->RepositoryCombo,0); + gtk_widget_set_sensitive(window->ArchitectureCombo,0); + } -// GtkTreeIter iter, itar; -// char *storage; -// if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->tree_copy),&itar)){ -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&storage,-1); -// const char *repo = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); -// const char *arch = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); -// GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList); -// int size=0; -// config_str packages=NULL; -// int valid = gtk_tree_model_get_iter_first(model,&iter); -// for (;valid;valid=gtk_tree_model_iter_next(model,&iter)){ -// char *target; -// gtk_tree_model_get(model,&iter,2,&target,-1); -// yon_char_parsed_add_or_create_if_exists(packages,&size,target); -// free(target); -// } -// if (size>0){ -// char *command = NULL; -// int repo_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->RepoSignCombo)); -// int pack_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->PackageSignCombo)); -// if (repo_sign&&pack_sign){ -// command = add_packages_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," ")); -// } else if (repo_sign){ -// command = add_packages_repo_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),yon_char_parsed_to_string(packages,size," ")); -// } else if (pack_sign){ -// command = add_packages_package_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," ")); -// } else { -// command = add_packages_command(storage,arch,repo,yon_char_parsed_to_string(packages,size," ")); -// } -// yon_debug_output("%s\n",command); -// if (!system(command)){ -// yon_window_config_add_instant_parameter(yon_char_unite(storage,"/",repo,"/",arch,NULL),"package_info",yon_char_parsed_to_string(packages,size,","),YON_TYPE_STRING); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); -// gtk_tree_store_clear(widgets->RepoList); -// yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList)); - -// const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); -// if (!yon_char_is_empty(id)){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); -// gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); -// gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); -// on_main_tree_selection_changed(NULL,widgets); -// } -// gtk_widget_destroy(window->MainWindow); -// yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -// yon_config_load_update(widgets); -// } -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// } -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// } } // void on_repo_sign_load(GtkWidget *self, repo_add_window *window){ @@ -276,28 +178,6 @@ void on_add_packages_accept(GtkWidget *self, dictionary *dict){ // gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepoSignCombo),sign); // } -// void on_rmb_move(GtkWidget *self, main_window *widgets){ -// repo_add_window *window = on_move_clicked(NULL,widgets); -// GtkTreeModel *model; -// GtkTreeIter iter; -// char *path; -// gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter); -// gtk_tree_model_get(model,&iter,3,&path,-1); -// GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model); -// for (int i=0;iPackagesList,&itar); -// gtk_list_store_set(window->PackagesList,&itar,1,name,2,full_path,-1); -// free(full_path); -// free(filename); -// free(name); -// } -// } - void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){ GtkTreeIter iter, itar, itor; diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index fdbcfcf..c0849fc 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -1,275 +1,313 @@ -// #include "ubl-settings-repomanager.h" - - -// void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ -// GtkWidget *ArchCombo = NULL; -// ArchCombo = self==window->MoveSourceRepoEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; - -// gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(ArchCombo)); -// GtkTreeIter iter,itar; -// char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); -// int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); -// for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ -// char *target; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1); -// char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(ArchCombo),child_id,target); -// } +#include "ubl-settings-repomanager.h" + + + +void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry)); + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry)); + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry)); + if (!yon_char_is_empty(path_str)){ + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveTargetStorageEntry),path_str); + storage_struct *storage = g_hash_table_lookup(main_config.storages,path_str); + int size; + config_str repos = (config_str)g_hash_table_get_keys_as_array(storage->repos,&size); + for (int i=0;iMoveSourceRepoEntry),repos[i],repos[i]); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry),repos[i],repos[i]); + } + } +} + +void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetArchEntry)); + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceArchEntry)); + GtkWidget *check_repo = NULL; + if (self == window->MoveSourceRepoEntry){ + check_repo = window->MoveTargetRepoEntry; + } else { + check_repo = window->MoveSourceRepoEntry; + } + const char *current_repo_selection = gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); + const char *check_repo_selection = gtk_combo_box_get_active_id(GTK_COMBO_BOX(check_repo)); + if (!yon_char_is_empty(current_repo_selection)&&!yon_char_is_empty(check_repo_selection)&&!strcmp(current_repo_selection,check_repo_selection)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),REPO_SAME_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + const char *storage_path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry)); + const char *repo_name = gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); + if (yon_char_is_empty(storage_path)||yon_char_is_empty(repo_name)) return; + storage_struct *storage = g_hash_table_lookup(main_config.storages,storage_path); + if (storage){ + repo_struct *repo = g_hash_table_lookup(storage->repos,repo_name); + if (repo){ + gtk_widget_set_sensitive(window->RepoSignCombo,1); + int size; + config_str archs = (config_str)g_hash_table_get_keys_as_array(repo->archs,&size); + for (int i=0;iMoveSourceArchEntry),archs[i],archs[i]); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetArchEntry),archs[i],archs[i]); + } + } + } -// } +} + +void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ + GtkWidget *check_arch = NULL; + if (self == window->MoveSourceArchEntry){ + check_arch = window->MoveTargetArchEntry; + } else { + check_arch = window->MoveSourceArchEntry; + } + const char *chosen = gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); + if (!gtk_combo_box_set_active_id(GTK_COMBO_BOX(check_arch),chosen)){ + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(check_arch),chosen,chosen); + while(gtk_events_pending())gtk_main_iteration(); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(check_arch),chosen); + } + gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); + gtk_widget_set_sensitive(window->AddPackageButton,1); +} + +void on_move_add_accept(GtkWidget *self, dictionary *dict){ + repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); + filechooser_window *dialog = yon_dictionary_get_data(dict->first->next,filechooser_window*); + + int size; + config_str packages = yon_char_parse(dialog->last_success_selection,&size,","); + for (int i=0;iPackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,full_path,-1); + free(full_path); + } + } + + } else { + GtkTreeIter iter; + int temp_size; + config_str name = yon_config_load(yon_get_package_name_from_filename(packages[i]),&temp_size); + if (temp_size<=0){ + yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + yon_char_remove_last_symbol(name[0],'\n'); + if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){ + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,packages[i],-1); + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + } + + } + } + yon_char_parsed_free(packages,size); + gtk_widget_destroy(dialog->Window); + free(dialog); + GtkTreeIter iter; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->PackagesList),&iter)){ + gtk_widget_set_sensitive(window->MoveSourceStorageEntry,0); + gtk_widget_set_sensitive(window->MoveSourceRepoEntry,0); + gtk_widget_set_sensitive(window->MoveSourceArchEntry,0); + + gtk_widget_set_sensitive(window->MoveTargetRepoEntry,0); + gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); + + if (window->StorageCombo&&window->RepositoryCombo&&window->ArchitectureCombo){ + gtk_widget_set_sensitive(window->StorageCombo,0); + gtk_widget_set_sensitive(window->RepositoryCombo,0); + gtk_widget_set_sensitive(window->ArchitectureCombo,0); + } + } +} + +void on_move_add_package(GtkWidget *self, repo_add_window *window){ + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->MoveTargetArchEntry))>-1&>k_combo_box_get_active(GTK_COMBO_BOX(window->MoveSourceStorageEntry))>-1){ + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow"); + gtk_label_set_text(GTK_LABEL(dialog->HeaderTopic),CHOSE_PACKAGES_TITLE_LABEL); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); + gtk_file_filter_set_name(filter,"*.pkg.tar.*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + GtkTreeIter iter,itar; + char *target; + const char* storage_path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry)); + storage_struct *storage = g_hash_table_lookup(main_config.storages,storage_path); + if (storage){ + const char *repo_name = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry)); + repo_struct *repo = g_hash_table_lookup(storage->repos,repo_name); + if (repo){ + target = repo->path; + } + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog->MainFileChooser),1); + gtk_widget_show(dialog->ChooseFolderCheck); + + } + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),target); + + 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); + + g_signal_connect(G_OBJECT(dialog->MainFileChooser),"current-folder-changed",G_CALLBACK(on_folder_changed),dict); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ + on_move_add_accept(self,dict); + } + } +} + +void on_move_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); + -// void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ -// GtkWidget *TargetArchCombo = self==window->MoveTargetArchEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; -// GtkWidget *TargetRepoCombo = self==window->MoveTargetArchEntry?window->MoveSourceRepoEntry:window->MoveTargetRepoEntry; -// if (gtk_combo_box_get_active(GTK_COMBO_BOX(self))>-1){ + const char *storage = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry)); + const char *source_repo = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry)); + const char *target_repo = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveTargetRepoEntry)); + const char *arch = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry)); -// const char *current = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(self)); -// const char *repo_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(TargetRepoCombo)); - -// if (!yon_char_is_empty(current)&&!yon_char_is_empty(repo_id)){ - -// GtkTreeIter iter, itar; - -// g_signal_handlers_block_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window); -// if (yon_gtk_combo_box_text_find(TargetArchCombo,(char*)current)==-1){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,repo_id); -// gtk_tree_store_append(window->tree_copy,&itar,&iter); -// char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); -// yon_debug_output("%s\n","arch"); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(TargetArchCombo),id,current); -// } -// g_signal_handlers_unblock_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window); -// gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); -// gtk_widget_set_sensitive(window->AddPackageButton,1); -// } -// } -// } - -// void on_move_add_accept(GtkWidget *self, dictionary *dict){ -// repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); -// file_chooser_window *dialog = yon_dictionary_get_data(dict->first->next,file_chooser_window*); -// GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget)); -// for (int i=0;iPackagesList,&iter); -// gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,files[k],-1); -// } -// } -// } else { -// GtkTreeIter iter; -// int temp_size; -// config_str name = yon_config_load(yon_get_package_name_from_filename(path),&temp_size); -// if (temp_size<=0){ -// yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// return; -// } -// yon_char_remove_last_symbol(name[0],'\n'); -// if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){ -// gtk_list_store_append(window->PackagesList,&iter); -// gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,path,-1); -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// } - -// } -// } -// gtk_widget_destroy(dialog->Window); -// free(dialog); -// GtkTreeIter iter; -// if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ -// gtk_widget_set_sensitive(window->MoveSourceStorageEntry,0); -// gtk_widget_set_sensitive(window->MoveSourceRepoEntry,0); -// gtk_widget_set_sensitive(window->MoveSourceArchEntry,0); - -// gtk_widget_set_sensitive(window->MoveTargetRepoEntry,0); -// gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); - -// if (window->StorageCombo&&window->RepositoryCombo&&window->ArchitectureCombo){ -// gtk_widget_set_sensitive(window->StorageCombo,0); -// gtk_widget_set_sensitive(window->RepositoryCombo,0); -// gtk_widget_set_sensitive(window->ArchitectureCombo,0); -// } -// } -// } - -// void on_move_add_package(GtkWidget *self, repo_add_window *window){ -// if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->MoveTargetArchEntry))>-1&>k_combo_box_get_active(GTK_COMBO_BOX(window->MoveSourceStorageEntry))>-1){ -// file_chooser_window *dialog = yon_file_chooser_new(); -// yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow"); -// gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL); -// GtkFileFilter *filter = gtk_file_filter_new(); -// gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); -// gtk_file_filter_set_name(filter,"*.pkg.tar.*"); -// gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter); -// GtkTreeIter iter,itar; -// yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveSourceArchEntry),GTK_TREE_MODEL(window->tree_copy),&iter); -// char *target; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&target,3,&dialog->root_path,-1); -// gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->FileChooserWidget),target); - -// 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); - -// g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"current-folder-changed",G_CALLBACK(on_folder_changed),dialog); -// g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_move_add_accept),dict); -// g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),dict); -// gtk_widget_show(dialog->Window); -// } -// } - -// void on_move_accept(GtkWidget *self, dictionary *dict){ -// main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); -// repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); - -// int size = 0; -// config_str packages = NULL; -// GtkTreeIter iter,itar; -// for_iter(GTK_TREE_MODEL(window->PackagesList),&iter){ -// char *target=NULL; -// gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&iter,2,&target,-1); -// if (!yon_char_is_empty(target)){ -// free(yon_char_divide(target,yon_char_find_last(target,'/'))); -// yon_char_parsed_add_or_create_if_exists(packages,&size,target); -// free(target); -// } -// } -// if (size){ -// char *arch = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->MoveSourceArchEntry)); -// yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry),GTK_TREE_MODEL(window->tree_copy),&iter); -// yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveTargetRepoEntry),GTK_TREE_MODEL(window->tree_copy),&itar); -// char *source_path, *source_repo, *target_path, *target_repo; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&source_repo,-1); -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&target_repo,-1); -// source_path = yon_char_divide(source_repo,yon_char_find_last(source_repo,'/')); -// target_path = yon_char_divide(target_repo,yon_char_find_last(target_repo,'/')); -// char *command = yon_move_packages_command(source_path,arch,source_repo, target_repo, yon_char_parsed_to_string(packages,size," ")); -// yon_debug_output("%s\n",command); -// if (!system(command)){ -// yon_ubl_status_box_render(PACKAGES_MOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); -// gtk_tree_store_clear(widgets->RepoList); -// yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList)); - -// const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); -// if (!yon_char_is_empty(id)){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); -// gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); -// gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); -// on_main_tree_selection_changed(NULL,widgets); -// } -// yon_config_load_update(widgets); -// on_subwindow_close(window->MainWindow); -// } -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// } -// } - -// void on_move_remove_package(GtkWidget *self, repo_add_window *window){ -// GtkTreeIter iter; -// GtkTreeModel *model; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ -// gtk_list_store_remove(window->PackagesList,&iter); -// } -// if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->PackagesList),&iter)){ - -// gtk_widget_set_sensitive(window->MoveSourceStorageEntry,1); -// gtk_widget_set_sensitive(window->MoveSourceRepoEntry,1); -// gtk_widget_set_sensitive(window->MoveSourceArchEntry,1); - -// gtk_widget_set_sensitive(window->MoveTargetRepoEntry,1); -// if (window->StorageCombo&&window->RepositoryCombo&&window->ArchitectureCombo){ -// gtk_widget_set_sensitive(window->StorageCombo,1); -// gtk_widget_set_sensitive(window->RepositoryCombo,1); -// gtk_widget_set_sensitive(window->ArchitectureCombo,1); -// } -// } -// } - -// repo_add_window *on_move_clicked(GtkWidget *self, main_window *widgets){ -// repo_add_window *window = yon_repo_add_window_new(); -// yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),MOVE_PACKAGES_TITLE_LABEL,icon_path,"move-repo-window"); -// gtk_label_set_text(GTK_LABEL(window->HeadLabel),MOVE_PACKAGES_TITLE_LABEL); -// gtk_button_set_label(GTK_BUTTON(window->AddButton),MOVE_LABEL); -// gtk_label_set_text(GTK_LABEL(window->PackagesToAddLabel),MOVE_PACKAGES_LABEL); -// gtk_widget_show(window->MoveSourceFrame); -// gtk_widget_show(window->MoveTargetFrame); -// gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); -// GtkTreeIter iter; -// for_iter (window->tree_copy,&iter){ -// char *current; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1); -// if (!yon_char_is_empty(current)){ -// char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveSourceStorageEntry),path,current); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetStorageEntry),path,current); -// } -// } - -// yon_sign_list_update(); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); -// gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0); -// gtk_combo_box_set_active(GTK_COMBO_BOX(window->PackageSignCombo),0); - -// gtk_widget_destroy(gtk_widget_get_parent(window->StorageCombo)); -// dictionary *dict = NULL; -// yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); -// yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); -// g_signal_connect(G_OBJECT(window->MoveSourceStorageEntry),"changed",G_CALLBACK(on_move_storage_changed),window); -// g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window); -// g_signal_connect(G_OBJECT(window->MoveSourceArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window); - -// g_signal_connect(G_OBJECT(window->MoveTargetRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window); -// g_signal_connect(G_OBJECT(window->MoveTargetArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window); - -// g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_move_add_package),window); -// g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window); -// g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_move_accept),dict); -// g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_repo_sign_load),window); -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ - -// char *target = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoList),&iter); -// int mod = yon_char_count(target,":")+1; -// char *arc=NULL; -// char *repo=NULL; -// char *stor=NULL; -// if (mod ==3){ -// arc = yon_char_new(target); -// char *temp = yon_char_new(target); -// repo = yon_char_divide(temp,yon_char_find_last(temp,':')); -// free(temp); -// temp = yon_char_new(repo); -// stor = yon_char_divide(temp,yon_char_find_last(temp,':')); -// free(temp); -// } else if (mod>=2){ -// repo = yon_char_new(target); -// char *temp = yon_char_new(target); -// stor = yon_char_divide(temp,yon_char_find_last(temp,':')); -// free(temp); -// } else if (mod>=1){ -// stor = yon_char_new(target); -// } - -// if (stor) -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry),stor); -// if (repo) -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry),repo); -// if (arc) -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry),arc); -// } -// gtk_widget_show(window->MainWindow); -// return window; -// } \ No newline at end of file + const char *repo_sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)); + if (!yon_char_is_empty(storage)&&!yon_char_is_empty(source_repo)&&!yon_char_is_empty(target_repo)&&!yon_char_is_empty(arch)){ + + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList); + int size; + config_str parsed = NULL; + for_iter(model,&iter){ + char *path; + gtk_tree_model_get(model,&iter,2,&path,-1); + yon_char_parsed_add_or_create_if_exists(parsed, &size,path); + } + + if (!size) { + yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->PackagesTree); + return; + } + char *packages = yon_char_parsed_to_string(parsed,size," "); + char *command = NULL; + command = yon_move_packages_command(storage,arch,source_repo,target_repo,packages,repo_sign); + if (system(command)){ + yon_ubl_status_box_render(PACKAGES_ADD_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else { + yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } + free(command); + } + gtk_widget_destroy(window->MainWindow); + free(window); +} + +void on_move_remove_package(GtkWidget *self, repo_add_window *window){ + GtkTreeIter iter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ + gtk_list_store_remove(window->PackagesList,&iter); + } + if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->PackagesList),&iter)){ + + gtk_widget_set_sensitive(window->MoveSourceStorageEntry,1); + gtk_widget_set_sensitive(window->MoveSourceRepoEntry,1); + gtk_widget_set_sensitive(window->MoveSourceArchEntry,1); + + gtk_widget_set_sensitive(window->MoveTargetRepoEntry,1); + if (window->StorageCombo&&window->RepositoryCombo&&window->ArchitectureCombo){ + gtk_widget_set_sensitive(window->StorageCombo,1); + gtk_widget_set_sensitive(window->RepositoryCombo,1); + gtk_widget_set_sensitive(window->ArchitectureCombo,1); + } + } +} + + +void yon_move_window_set_selected(main_window *widgets, repo_add_window *window){ + GtkTreeIter iter, itar, itor; + + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ + int depth = gtk_tree_store_iter_depth(widgets->RepoList,&iter); + char *storage=NULL, *repo=NULL, *arch=NULL; + switch (depth){ + case 0: //storage + { + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&storage,-1); + }break; + case 1: //repo + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&repo,-1); + gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,3,&storage,-1); + break; + case 2: //arch + gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,2,&repo,-1); + gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itor, &itar); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itor,3,&storage,-1); + break; + } + if (!yon_char_is_empty(storage)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry),storage); + while(gtk_events_pending()) gtk_main_iteration(); + if (!yon_char_is_empty(repo)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry),repo); + while(gtk_events_pending()) gtk_main_iteration(); + if (!yon_char_is_empty(arch)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry),arch); + } +} + +repo_add_window *on_move_clicked(GtkWidget *self, main_window *widgets){ + repo_add_window *window = yon_repo_add_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),MOVE_PACKAGES_TITLE_LABEL,icon_path,"move-repo-window"); + gtk_label_set_text(GTK_LABEL(window->HeadLabel),MOVE_PACKAGES_TITLE_LABEL); + gtk_button_set_label(GTK_BUTTON(window->AddButton),MOVE_LABEL); + gtk_label_set_text(GTK_LABEL(window->PackagesToAddLabel),MOVE_PACKAGES_LABEL); + gtk_widget_show(window->MoveSourceFrame); + gtk_widget_show(window->MoveTargetFrame); + gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + + int size; + config_str storages = (config_str)g_hash_table_get_keys_as_array(main_config.storages,&size); + for (int i=0;iMoveSourceStorageEntry),storages[i],storages[i]); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetStorageEntry),storages[i],storages[i]); + } + + GtkTreeIter iter; + yon_sign_list_update(); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PackageSignCombo),0); + + gtk_widget_destroy(gtk_widget_get_parent(window->StorageCombo)); + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + g_signal_connect(G_OBJECT(window->MoveSourceStorageEntry),"changed",G_CALLBACK(on_move_storage_changed),window); + g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window); + g_signal_connect(G_OBJECT(window->MoveSourceArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window); + + g_signal_connect(G_OBJECT(window->MoveTargetRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window); + g_signal_connect(G_OBJECT(window->MoveTargetArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window); + + g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_move_add_package),window); + g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window); + + yon_rmb_menu_setup(window->PackagesTree,(int(*)(void*))gtk_widget_is_sensitive,window->AddPackageButton, + ADD_PACKAGE_LABEL,add_icon_name,G_CALLBACK(on_move_add_package),window, + REMOVE_PACKAGE_LABEL,remove_icon,G_CALLBACK(on_move_remove_package),window, + NULL); + + + g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_move_accept),dict); + // g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_repo_sign_load),window); + yon_move_window_set_selected(widgets,window); + gtk_widget_show(window->MainWindow); + return window; +} \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 566b4d1..fc33db7 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -35,10 +35,21 @@ config main_config; // // main window -void on_folder_changed(GtkFileChooser *self, file_chooser_window *dialog){ +void on_folder_changed(GtkFileChooser *self, dictionary *dict){ + repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); + filechooser_window *dialog = yon_dictionary_get_data(dict->first->next,filechooser_window*); const char *current = gtk_file_chooser_get_current_folder(self); - if (!strstr(current,dialog->root_path)){ - gtk_file_chooser_set_current_folder(self,dialog->root_path); + + const char* storage_path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry)); + storage_struct *storage = g_hash_table_lookup(main_config.storages,storage_path); + if (storage){ + const char *repo_name = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry)); + repo_struct *repo = g_hash_table_lookup(storage->repos,repo_name); + if (repo){ + if (!strstr(current,repo->path)){ + gtk_file_chooser_set_current_folder(self,repo->path); + } + } } } @@ -655,7 +666,7 @@ main_window *yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets); g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_add_clicked),widgets); - // g_signal_connect(G_OBJECT(widgets->MoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets); + g_signal_connect(G_OBJECT(widgets->MoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets); // g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); g_signal_connect(G_OBJECT(widgets->ReposTree),"cursor-changed",G_CALLBACK(on_main_tree_selection_changed),widgets); g_signal_connect(G_OBJECT(widgets->CloudButton),"clicked",G_CALLBACK(on_ubl_settings_update_launch),widgets); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index e56122e..cdb12e8 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -69,7 +69,7 @@ typedef char* string; #define repo_sign_command(storage_path, repo, sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage_path, "' -S ", sign,NULL) -#define yon_move_packages_command(storage,arch, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -a '",arch,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,NULL) +#define yon_move_packages_command(storage,arch, source_repo, target_repo, packages,sign) yon_char_unite("repo-manager move -d '",storage,"' -a '",arch,"' -R '",source_repo,"' -r '",target_repo,"' ",sign?"-S ":"",sign?sign:"",sign?" ":"", packages,NULL) #define yon_delete_packages_command(storage,arch, target_repo, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' ", packages,NULL) #define yon_delete_packages_sign_command(storage,arch, target_repo,sign, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' -S '",sign,"' ", packages,NULL) @@ -244,17 +244,6 @@ typedef struct { config_str delete_storages; } storage_config_window; -typedef struct { - GtkWidget *Window; - GtkWidget *StatusBox; - GtkWidget *HeadLabel; - GtkWidget *CancelButton; - GtkWidget *ChooseButton; - GtkWidget *NameEntry; - GtkWidget *FileChooserWidget; - char *root_path; -} file_chooser_window; - typedef struct { GtkWidget *Window; GtkWidget *StatusBox; @@ -374,7 +363,6 @@ void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *win config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level); gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data); void on_file_chooser_file_activate(GtkWidget *self, dictionary *dict); -file_chooser_window *yon_file_chooser_new(); gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data); void on_storage_configure_clicked(GtkWidget *self, main_window *widgets); storage_config_window *yon_storage_config_window_new(); @@ -392,7 +380,7 @@ void on_add_clicked(GtkWidget *self, main_window *widgets); void on_rmb_move(GtkWidget *self, main_window *widgets); repo_add_window *on_move_clicked(GtkWidget *self, main_window *widgets); repo_add_window *on_remove_clicked(GtkWidget *self, main_window *widgets); -void on_folder_changed(GtkFileChooser *self, file_chooser_window *dialog); +void on_folder_changed(GtkFileChooser *self, dictionary *dict); void on_move_remove_package(GtkWidget *self, repo_add_window *window); void on_move_add_accept(GtkWidget *self, dictionary *dict); void on_ubl_settings_update_launch(); @@ -421,4 +409,5 @@ void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo); void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo); void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign); void yon_storage_remove(char *key, storage_struct *storage,void*); -config_str yon_arch_struct_get_packages(arch_struct *arch, int *size); \ No newline at end of file +config_str yon_arch_struct_get_packages(arch_struct *arch, int *size); +void yon_move_window_set_selected(main_window *widgets, repo_add_window *window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index cee66b0..f6ab79b 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -167,4 +167,6 @@ #define FILES_EXIST_LABEL _("Folder must not be empty") -#define NAME_SHORT_LABEL _("Name must be 5 or more symbols") \ No newline at end of file +#define NAME_SHORT_LABEL _("Name must be 5 or more symbols") + +#define REPO_SAME_CHOSEN_LABEL _("Same repository was chosen for source and target") \ No newline at end of file From c3ddc4df0abce167ef4b868665febd39ca844270 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 11:40:43 +0000 Subject: [PATCH 05/29] Key fixed --- source/CMakeLists.txt | 1 + source/ubl-settings-repomanager-add-window.c | 42 ++- source/ubl-settings-repomanager-key.c | 173 +++++++++ source/ubl-settings-repomanager-move.c | 10 +- source/ubl-settings-repomanager-remove.c | 225 ++++++------ source/ubl-settings-repomanager.c | 348 ++----------------- source/ubl-settings-repomanager.h | 7 +- 7 files changed, 341 insertions(+), 465 deletions(-) create mode 100644 source/ubl-settings-repomanager-key.c diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 8326c24..0fce1b5 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -77,6 +77,7 @@ set(SOURCE_FILES ubl-settings-repomanager-remove.c ubl-settings-repomanager-storage-list.c ubl-settings-repomanager-storage-window.c + ubl-settings-repomanager-key.c ubl-settings-repomanager.h ubl-strings.h ) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index 6c83bf8..f0743f7 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -249,6 +249,28 @@ repo_add_window *yon_repo_add_window_new(){ return window; } +void yon_add_window_add_chosen_packages(main_window *widgets, repo_add_window *window){ + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->RepoFileList); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),NULL,&iter)){ + char *target, *path; + gtk_tree_model_get(model,&iter,1,&target,2,&path,-1); + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,target,2,path,-1); + } + GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoPackagesTree)),NULL); + GList *liter; + if (list){ + for (liter=list;liter;liter=liter->next){ + gtk_tree_model_get_iter(model,&iter,(GtkTreePath*)liter->data); + char *target, *path; + gtk_tree_model_get(model,&iter,2,&target,-1); + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,target,-1); + } + } +} + void on_add_clicked(GtkWidget *self, main_window *widgets){ repo_add_window *window = yon_repo_add_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),ADD_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window"); @@ -286,24 +308,6 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ // g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window); yon_add_window_set_selected(widgets,window); - GtkTreeModel *model; - GList *list = NULL; - char *full_path; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&full_path,-1); - if (list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoPackagesTree)),&model)){ - for (int i=0; iPackagesList,&itar); - char *temp = yon_char_unite(full_path,"/",path,NULL); - free(full_path); - full_path = temp; - gtk_list_store_set(window->PackagesList,&itar,1,path,2,full_path,-1); - } - } - } + // yon_add_window_add_chosen_packages(widgets,window); gtk_widget_show(window->MainWindow); } \ No newline at end of file diff --git a/source/ubl-settings-repomanager-key.c b/source/ubl-settings-repomanager-key.c new file mode 100644 index 0000000..66bcc74 --- /dev/null +++ b/source/ubl-settings-repomanager-key.c @@ -0,0 +1,173 @@ +#include "ubl-settings-repomanager.h" + + +void on_calendar_open(GtkWidget *self,key_creation_window *window){ + yon_calendar_popover_open(GTK_ENTRY(window->ExpireEntry),self); +} + +void on_key_generate_accept(GtkWidget *self, key_creation_window* window){ + const char *name = gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); + const char *type = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->EncryptionCombo)); + const char *email = gtk_entry_get_text(GTK_ENTRY(window->EmailEntry)); + char *strength = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->KeyStrengthSpin))); + const char *comment = gtk_entry_get_text(GTK_ENTRY(window->CommentsEntry)); + if (!yon_char_is_empty(name)&&strlen(name)<5){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NAME_SHORT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->NameEntry); + return; + } + GtkWidget *highlight_target=NULL; + if (yon_char_is_empty(name)){ + highlight_target=window->NameEntry; + } else if (yon_char_is_empty(type)){ + highlight_target=window->EncryptionCombo; + } else if (yon_char_is_empty(email)){ + highlight_target=window->EmailEntry; + } else if (yon_char_is_empty(strength)){ + highlight_target=window->KeyStrengthSpin; + } + if (highlight_target){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(highlight_target); + return; + } + char *expire = NULL; + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ExpireCombo))==1){ + GDateTime *datetime = g_date_time_new_from_unix_local(yon_calendar_get_last_date()); + expire = g_date_time_format(datetime,"%Y%m%dT000000"); + g_date_time_unref(datetime); + + } + const char *password = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); + const char *password_confirm = gtk_entry_get_text(GTK_ENTRY(window->PasswordConfirmationEntry)); + int ex_status=0; + if (yon_char_is_empty(password)&&yon_char_is_empty(password_confirm)){ + yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); + ex_status = system(yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password))); + } else if (!strcmp(password,password_confirm)){ + yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password)); + ex_status = system(yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password))); + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_INCORRECT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->PasswordConfirmationEntry); + yon_ubl_status_highlight_incorrect(window->PasswordEntry); + return; + } + if (!ex_status) + yon_ubl_status_box_render(KEY_CREATION_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + else + yon_ubl_status_box_render(KEY_CREATION_FAILURE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + gtk_widget_destroy(window->Window); + yon_sign_list_update(); +} + +key_creation_window *yon_key_creation_window_new(){ + key_creation_window *window = malloc(sizeof(key_creation_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_key); + window->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->NameEntry = yon_gtk_builder_get_widget(builder,"NameEntry"); + window->EmailEntry = yon_gtk_builder_get_widget(builder,"EmailEntry"); + window->CommentsEntry = yon_gtk_builder_get_widget(builder,"CommentsEntry"); + window->EncryptionCombo = yon_gtk_builder_get_widget(builder,"EncryptionCombo"); + window->KeyStrengthSpin = yon_gtk_builder_get_widget(builder,"KeyStrengthSpin"); + window->ExpireCombo = yon_gtk_builder_get_widget(builder,"ExpireCombo"); + window->ExpireEntry = yon_gtk_builder_get_widget(builder,"ExpireEntry"); + window->ExpireButton = yon_gtk_builder_get_widget(builder,"ExpireButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); + window->PasswordEntry = yon_gtk_builder_get_widget(builder,"PasswordEntry"); + window->PasswordConfirmationEntry = yon_gtk_builder_get_widget(builder,"PasswordConfirmationEntry"); + + yon_gtk_entry_set_password_visibility_icon(GTK_ENTRY(window->PasswordConfirmationEntry)); + yon_gtk_entry_set_password_visibility_icon(GTK_ENTRY(window->PasswordEntry)); + + g_signal_connect(G_OBJECT(window->ExpireCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->ExpireButton); + g_signal_connect(G_OBJECT(window->ExpireCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->ExpireEntry); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->ExpireButton),"clicked",G_CALLBACK(on_calendar_open),window); + g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_key_generate_accept),window); + + int size; + config_str encription_keys = yon_file_open(key_encription_path,&size); + window->expire_time=0; + + for (int i=1;iEncryptionCombo),parsed[2],parsed[0]); + yon_char_parsed_free(parsed,parsed_size); + } + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->EncryptionCombo),"RSA"); + return window; +} + +void on_key_clicked(GtkWidget *self, main_window *widgets){ + key_creation_window *window = yon_key_creation_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),KEY_CREATION_TITLE_LABEL,icon_path,"key-create-window"); + gtk_label_set_text(GTK_LABEL(window->HeadLabel),KEY_CREATION_TITLE_LABEL); + gtk_widget_show(window->Window); +} + + + +void on_sign_window_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + sign_window *window = yon_dictionary_get_data(dict->first->next,sign_window*); + GtkTreeModel *model; + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){ + char *arch; + char *repo; + char *storage; + char *signature = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->SignCombo)); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&arch,-1); + char *full_path = yon_char_new(arch); + repo = yon_char_divide(arch,yon_char_find_last(arch,'/')); + storage = yon_char_divide(repo,yon_char_find_last(repo,'/')); + storage = yon_char_append(storage,"/"); + GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),NULL); + char *targets = ""; + for (int i=0;iRepoFileList),&iter,(GtkTreePath*)g_list_nth_data(list,i)); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoFileList),&iter,2,&pack,-1); + char *temp = yon_char_unite(targets, " ", full_path,"/",pack,NULL); + if (!yon_char_is_empty(targets)) free(targets); + targets=temp; + } + if (!system(yon_debug_output("%s\n",yon_sign_package(storage,repo,arch,targets,signature)))){ + yon_ubl_status_box_render(SIGN_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } + on_subwindow_close(window->Window); + } +} + +sign_window *yon_sign_window_new(){ + sign_window *window = malloc(sizeof(sign_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_sign); + + window->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->SignCombo = yon_gtk_builder_get_widget(builder,"SignCombo"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->SignButton = yon_gtk_builder_get_widget(builder,"SignButton"); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + + return window; +} + +void on_packages_sign(GtkWidget *self, main_window *widgets){ + sign_window *window = yon_sign_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),SIGNATURE_TITLE_LABEL,icon_path,"sign-window"); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->SignCombo)); + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + g_signal_connect(G_OBJECT(window->SignButton),"clicked",G_CALLBACK(on_sign_window_accept),dict); + gtk_widget_show(window->Window); +} \ No newline at end of file diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index c0849fc..1e7cb42 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -83,11 +83,12 @@ void on_move_add_accept(GtkWidget *self, dictionary *dict){ if (strstr(files[k],".pkg.tar")&&!strstr(files[k],".sig")){ GtkTreeIter iter; int temp_size; - config_str name = yon_config_load(yon_get_package_name_from_filename(files[k]),&temp_size); - yon_char_remove_last_symbol(name[0],'\n'); char *full_path = yon_char_unite(packages[i],"/",files[k],NULL); + config_str name = yon_config_load(yon_get_package_name_from_filename(full_path),&temp_size); + if (name&&!yon_char_is_empty(name[0])) + yon_char_remove_last_symbol(name[0],'\n'); gtk_list_store_append(window->PackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,full_path,-1); + gtk_list_store_set(window->PackagesList,&iter,1,name&&!yon_char_is_empty(name[0])?name[0]:"",2,full_path,-1); free(full_path); } } @@ -159,7 +160,7 @@ void on_move_add_package(GtkWidget *self, repo_add_window *window){ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog); - g_signal_connect(G_OBJECT(dialog->MainFileChooser),"current-folder-changed",G_CALLBACK(on_folder_changed),dict); + yon_file_chooser_set_root(dialog,target); if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ on_move_add_accept(self,dict); } @@ -308,6 +309,7 @@ repo_add_window *on_move_clicked(GtkWidget *self, main_window *widgets){ g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_move_accept),dict); // g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_repo_sign_load),window); yon_move_window_set_selected(widgets,window); + yon_add_window_add_chosen_packages(widgets,window); gtk_widget_show(window->MainWindow); return window; } \ No newline at end of file diff --git a/source/ubl-settings-repomanager-remove.c b/source/ubl-settings-repomanager-remove.c index 70ad2f3..e27b530 100644 --- a/source/ubl-settings-repomanager-remove.c +++ b/source/ubl-settings-repomanager-remove.c @@ -1,4 +1,4 @@ -// #include "ubl-settings-repomanager.h" +#include "ubl-settings-repomanager.h" // void on_remove_arch_selection_changed(GtkWidget *self, repo_add_window *window){ @@ -9,126 +9,109 @@ // } // } -// void on_remove_accept(GtkWidget *self, dictionary *dict){ -// main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); -// repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); -// GtkTreeModel *model; -// GtkTreeIter iter; -// const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); -// char *storage_path; -// char *repo = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); -// char *arch = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); - -// if (!yon_char_is_empty(storage_id)){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,storage_id); -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&storage_path,-1); -// int size=0; -// config_str packages=NULL; -// for_iter(GTK_TREE_MODEL(window->PackagesList),&iter){ -// char *target; -// gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&iter,1,&target,-1); -// yon_char_parsed_add_or_create_if_exists(packages,&size,target); -// } -// if (size){ -// char *sign = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)); -// char *command; -// if (yon_char_is_empty(sign)){ -// command = yon_delete_packages_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," ")); -// } else { -// command = yon_delete_packages_sign_command(storage_path,arch,repo,sign,yon_char_parsed_to_string(packages,size," ")); -// } -// yon_debug_output("%s\n",command); -// if (!system(command)){ -// yon_ubl_status_box_render(PACKAGES_REMOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); -// gtk_tree_store_clear(widgets->RepoList); -// yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList); -// gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList)); - -// const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); -// if (!yon_char_is_empty(id)){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); -// gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); -// gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); -// on_main_tree_selection_changed(NULL,widgets); -// } -// } -// yon_config_load_update(widgets); -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// return; -// } -// }else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// return; -// } -// gtk_widget_destroy(window->MainWindow); -// } +void on_remove_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); + const char *storage_path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + const char *repo = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); + const char *arch = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); + const char *sign = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)); -// void on_remove_add_package(GtkWidget *self, repo_add_window *window){ -// if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))>-1){ -// file_chooser_window *dialog = yon_file_chooser_new(); -// yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow"); -// gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL); -// GtkFileFilter *filter = gtk_file_filter_new(); -// gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); -// gtk_file_filter_set_name(filter,"*.pkg.tar.*"); -// gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter); -// GtkTreeIter iter,itar; -// yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->ArchitectureCombo),GTK_TREE_MODEL(window->tree_copy),&iter); -// char *target; -// int temp_size=0; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&target,-1); -// yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->ArchitectureCombo),GTK_TREE_MODEL(window->tree_copy),&itar); -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&dialog->root_path,-1); -// gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->FileChooserWidget),target); - -// 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); - -// g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"current-folder-changed",G_CALLBACK(on_folder_changed),dialog); -// g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_move_add_accept),dict); -// g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),dict); -// gtk_widget_show(dialog->Window); -// } -// } + if (!yon_char_is_empty(storage_path)){ + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList); + int size; + config_str packages=NULL; + for_iter(model,&iter){ + char *target; + gtk_tree_model_get(model,&iter,2,&target,-1); + char *filename = yon_char_divide(target,yon_char_find_last(target,'/')); + yon_char_parsed_add_or_create_if_exists(packages,&size,target); + } + if (size){ + char *final = yon_char_parsed_to_string(packages,size," "); + char *command = remove_packages_command(storage_path,arch,repo,final,sign); + if (system(yon_debug_output("%s\n",command))){ -// repo_add_window *on_remove_clicked(GtkWidget *self, main_window *widgets){ -// repo_add_window *window = yon_repo_add_window_new(); -// yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),REMOVE_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window"); -// gtk_label_set_text(GTK_LABEL(window->HeadLabel),REMOVE_PACKAGES_TITLE_LABEL); -// GtkTreeIter iter; -// for_iter (window->tree_copy,&iter){ -// char *current; -// gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1); -// if (!yon_char_is_empty(current)){ -// char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter); -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current); -// } -// } -// gtk_label_set_text(GTK_LABEL(window->PackagesToAddLabel),REMOVE_PACKAGES_LABEL); -// yon_sign_list_update(); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); -// gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0); - -// gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); - -// gtk_button_set_label(GTK_BUTTON(window->AddButton),REMOVE_LABEL); -// dictionary *dict = NULL; -// yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); -// yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); -// g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_arch_chosen),window); -// g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); -// g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); -// g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_remove_arch_selection_changed),window); -// g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_remove_accept),dict); -// g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_remove_add_package),window); -// g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window); -// g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window); -// yon_add_window_set_selected(widgets,window); -// gtk_widget_show(window->MainWindow); -// return window; -// } \ No newline at end of file + } + } + } + gtk_widget_destroy(window->MainWindow); + free(window); + yon_interface_update(widgets); +} + +void on_remove_add_package(GtkWidget *self, repo_add_window *window){ + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))>-1){ + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow"); + gtk_label_set_text(GTK_LABEL(dialog->HeaderTopic),CHOSE_PACKAGES_TITLE_LABEL); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); + gtk_file_filter_set_name(filter,"*.pkg.tar.*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + GtkTreeIter iter,itar; + char *target; + const char* storage_path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + storage_struct *storage = g_hash_table_lookup(main_config.storages,storage_path); + if (storage){ + const char *repo_name = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + repo_struct *repo = g_hash_table_lookup(storage->repos,repo_name); + if (repo){ + target = repo->path; + } + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog->MainFileChooser),1); + gtk_widget_show(dialog->ChooseFolderCheck); + + } + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->MainFileChooser),target); + + 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); + + yon_file_chooser_set_root(dialog,target); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ + on_move_add_accept(self,dict); + } + } +} + + +repo_add_window *on_remove_clicked(GtkWidget *self, main_window *widgets){ + repo_add_window *window = yon_repo_add_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),REMOVE_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window"); + gtk_label_set_text(GTK_LABEL(window->HeadLabel),REMOVE_PACKAGES_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->PackagesToAddLabel),REMOVE_PACKAGES_LABEL); + + int size; + config_str storages = (config_str)g_hash_table_get_keys_as_array(main_config.storages,&size); + for (int i=0;iStorageCombo),storages[i],storages[i]); + } + + yon_sign_list_update(); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0); + + gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + + gtk_button_set_label(GTK_BUTTON(window->AddButton),REMOVE_LABEL); + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_arch_chosen),window); + g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); + g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); + g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_add_target_package_selection_changed),window); + g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_remove_accept),dict); + g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_remove_add_package),window); + g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window); + // g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window); + yon_add_window_set_selected(widgets,window); + yon_add_window_add_chosen_packages(widgets,window); + gtk_widget_show(window->MainWindow); + return window; +} \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index fc33db7..f2f2486 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -5,34 +5,6 @@ config main_config; // // filechooser window section -// void on_file_chooser_entry_changed(GtkEntry *self, file_chooser_window *window){ -// const char *text = gtk_entry_get_text(self); -// GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(window->FileChooserWidget)); -// gtk_file_chooser_remove_filter(GTK_FILE_CHOOSER(window->FileChooserWidget),filter); -// filter = gtk_file_filter_new(); -// char *pattern = !yon_char_is_empty(text)?yon_char_unite("*",text,"*.pkg.tar*[^.sig]",NULL) : "*.pkg.tar*[^.sig]"; -// gtk_file_filter_add_pattern(filter,pattern); -// gtk_file_filter_set_name(filter,"*.pkg.tar*"); -// gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(window->FileChooserWidget),filter); -// if (!yon_char_is_empty(text)) free(pattern); -// } - -// file_chooser_window *yon_file_chooser_new(){ -// file_chooser_window *window = malloc(sizeof(file_chooser_window)); -// GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_filechooser); -// window->Window = yon_gtk_builder_get_widget(builder,"Window"); -// window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); -// window->HeadLabel = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel2"); -// window->ChooseButton = yon_gtk_builder_get_widget(builder,"ChooseButton"); -// window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); -// window->NameEntry = yon_gtk_builder_get_widget(builder,"NameEntry"); -// window->FileChooserWidget = yon_gtk_builder_get_widget(builder,"FileChooserWidget"); -// g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); -// g_signal_connect(G_OBJECT(window->NameEntry),"changed",G_CALLBACK(on_file_chooser_entry_changed),window); - -// return window; -// } - // // main window void on_folder_changed(GtkFileChooser *self, dictionary *dict){ @@ -77,7 +49,6 @@ void yon_remove_config_storages(char *key,storage_struct *storage,void*){ } int yon_storages_load(main_window *widgets){ - // g_hash_table_foreach_remove(main_config.storages,(GHRFunc)yon_remove_config_storages,NULL); g_hash_table_remove_all(main_config.storages); gsize size; @@ -138,90 +109,21 @@ void yon_interface_update(main_window *widgets){ gtk_tree_store_clear(widgets->RepoList); gtk_list_store_clear(widgets->RepoFileList); gtk_list_store_clear(widgets->RepoPackagesList); + GtkTreeIter iter; + GtkTreeModel *model; + GtkTreePath *path = NULL; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){ + path = gtk_tree_model_get_path(model,&iter); + } yon_storages_load(widgets); g_hash_table_foreach(main_config.storages,(GHFunc)yon_repo_tree_build_storage,widgets); + if (path){ + gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),path); + gtk_tree_path_free(path); + } } -// void yon_config_load_update(main_window *widgets){ -// gtk_tree_store_clear(widgets->RepoList); -// gsize size=0; -// config_str storages = yon_window_config_get_section("storage_info",&size); -// GtkTreeIter iter,itar,childiter; -// for (int i=0;iRepoList,&iter,NULL); -// gtk_tree_store_set(widgets->RepoList,&iter,0,folder_no_edits,2,name,3,storages[i],-1); -// free(name); -// yon_window_config_get_parameter("storage_info",storages[i],&name,YON_TYPE_STRING); -// if (!yon_char_is_empty(name)){ -// int parsed_size; -// config_str name_parsed = yon_char_parse(name,&parsed_size,","); -// for (int j=0;jRepoList,&itar,&iter); -// gtk_tree_store_set(widgets->RepoList,&itar,2,nm,3,name_parsed[j],-1); -// int size; -// config_str dirs = yon_file_list_dirs(name_parsed[j],&size); -// for (int k=0;kRepoList,&childiter,&itar); -// gtk_tree_store_set(widgets->RepoList,&childiter,0,sign_status_image,2,dirs[k],3,arch_path,-1); -// } -// } -// free(nm); -// } -// yon_char_parsed_free(name_parsed,parsed_size); -// } - -// } -// if (size) -// yon_char_parsed_free(storages,size); -// } - -// config_str yon_tree_store_storage_get_archs(GtkTreeStore *target, GtkTreeIter *storage, int *size){ -// config_str final = NULL; -// GtkTreeIter iter,itar; -// int repos_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,storage); -// for (;repos_valid;repos_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ -// int archs_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&itar,&iter); -// for (;archs_valid;archs_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&itar)){ -// char *current; -// gtk_tree_model_get(GTK_TREE_MODEL(target),&itar,2,¤t,-1); -// if (yon_char_parsed_check_exist(final,*size,current)==-1) -// yon_char_parsed_add_or_create_if_exists(final,size,current); -// } -// } -// return final; -// } - -// config_str yon_tree_store_repo_get_archs(GtkTreeStore *target, GtkTreeIter *repo, int *size){ -// config_str final = NULL; -// GtkTreeIter iter; -// int repos_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,repo); -// for (;repos_valid;repos_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ -// char *current; -// gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,2,¤t,-1); -// if (yon_char_parsed_check_exist(final,*size,current)==-1) -// yon_char_parsed_add_or_create_if_exists(final,size,current); -// } -// return final; -// } // char *yon_signature_get(GtkTreeView *target, GtkTreeIter *iter){ // GtkTreeIter itar; @@ -387,115 +289,6 @@ void on_ubl_settings_update_launch(){ yon_launch_app_with_arguments(ubl_settings_update_command,NULL); } -// void on_calendar_open(GtkWidget *self,key_creation_window *window){ -// yon_calendar_popover_open(GTK_ENTRY(window->ExpireEntry),self); -// } - -// void on_key_generate_accept(GtkWidget *self, key_creation_window* window){ -// const char *name = gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); -// const char *type = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->EncryptionCombo)); -// const char *email = gtk_entry_get_text(GTK_ENTRY(window->EmailEntry)); -// char *strength = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->KeyStrengthSpin))); -// const char *comment = gtk_entry_get_text(GTK_ENTRY(window->CommentsEntry)); -// if (!yon_char_is_empty(name)&&strlen(name)<5){ -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NAME_SHORT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// yon_ubl_status_highlight_incorrect(window->NameEntry); -// return; -// } -// GtkWidget *highlight_target=NULL; -// if (yon_char_is_empty(name)){ -// highlight_target=window->NameEntry; -// } else if (yon_char_is_empty(type)){ -// highlight_target=window->EncryptionCombo; -// } else if (yon_char_is_empty(email)){ -// highlight_target=window->EmailEntry; -// } else if (yon_char_is_empty(strength)){ -// highlight_target=window->KeyStrengthSpin; -// } -// if (highlight_target){ -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// yon_ubl_status_highlight_incorrect(highlight_target); -// return; -// } -// char *expire = NULL; -// if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ExpireCombo))==1){ -// GDateTime *datetime = g_date_time_new_from_unix_local(yon_calendar_get_last_date()); -// expire = g_date_time_format(datetime,"%Y%m%dT000000"); -// g_date_time_unref(datetime); - -// } -// const char *password = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); -// const char *password_confirm = gtk_entry_get_text(GTK_ENTRY(window->PasswordConfirmationEntry)); -// int ex_status=0; -// if (yon_char_is_empty(password)&&yon_char_is_empty(password_confirm)){ -// yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); -// ex_status = system(yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password))); -// } else if (!strcmp(password,password_confirm)){ -// yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password)); -// ex_status = system(yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password))); -// } else { -// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_INCORRECT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); -// yon_ubl_status_highlight_incorrect(window->PasswordConfirmationEntry); -// yon_ubl_status_highlight_incorrect(window->PasswordEntry); -// return; -// } -// if (!ex_status) -// yon_ubl_status_box_render(KEY_CREATION_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -// else -// yon_ubl_status_box_render(KEY_CREATION_FAILURE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); -// gtk_widget_destroy(window->Window); -// yon_sign_list_update(); -// } - -// key_creation_window *yon_key_creation_window_new(){ -// key_creation_window *window = malloc(sizeof(key_creation_window)); -// GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_key); -// window->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); -// window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); -// window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); -// window->NameEntry = yon_gtk_builder_get_widget(builder,"NameEntry"); -// window->EmailEntry = yon_gtk_builder_get_widget(builder,"EmailEntry"); -// window->CommentsEntry = yon_gtk_builder_get_widget(builder,"CommentsEntry"); -// window->EncryptionCombo = yon_gtk_builder_get_widget(builder,"EncryptionCombo"); -// window->KeyStrengthSpin = yon_gtk_builder_get_widget(builder,"KeyStrengthSpin"); -// window->ExpireCombo = yon_gtk_builder_get_widget(builder,"ExpireCombo"); -// window->ExpireEntry = yon_gtk_builder_get_widget(builder,"ExpireEntry"); -// window->ExpireButton = yon_gtk_builder_get_widget(builder,"ExpireButton"); -// window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); -// window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); -// window->PasswordEntry = yon_gtk_builder_get_widget(builder,"PasswordEntry"); -// window->PasswordConfirmationEntry = yon_gtk_builder_get_widget(builder,"PasswordConfirmationEntry"); - -// yon_gtk_entry_set_password_visibility_icon(GTK_ENTRY(window->PasswordConfirmationEntry)); -// yon_gtk_entry_set_password_visibility_icon(GTK_ENTRY(window->PasswordEntry)); - -// g_signal_connect(G_OBJECT(window->ExpireCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->ExpireButton); -// g_signal_connect(G_OBJECT(window->ExpireCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->ExpireEntry); -// g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); -// g_signal_connect(G_OBJECT(window->ExpireButton),"clicked",G_CALLBACK(on_calendar_open),window); -// g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_key_generate_accept),window); - -// int size; -// config_str encription_keys = yon_file_open(key_encription_path,&size); -// window->expire_time=0; - -// for (int i=1;iEncryptionCombo),parsed[2],parsed[0]); -// yon_char_parsed_free(parsed,parsed_size); -// } -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->EncryptionCombo),"RSA"); -// return window; -// } - -// void on_key_clicked(GtkWidget *self, main_window *widgets){ -// key_creation_window *window = yon_key_creation_window_new(); -// yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),KEY_CREATION_TITLE_LABEL,icon_path,"key-create-window"); -// gtk_label_set_text(GTK_LABEL(window->HeadLabel),KEY_CREATION_TITLE_LABEL); -// gtk_widget_show(window->Window); -// } void on_tree_view_activate(GtkWidget *self, GtkTreePath* path, GtkTreeViewColumn* column, main_window *widgets){ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),path); @@ -523,101 +316,18 @@ void on_update_clicked(GtkWidget *self, main_window *widgets){ yon_interface_update(widgets); } -// void on_sign_window_accept(GtkWidget *self, dictionary *dict){ -// main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); -// sign_window *window = yon_dictionary_get_data(dict->first->next,sign_window*); -// GtkTreeModel *model; -// GtkTreeIter iter; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){ -// char *arch; -// char *repo; -// char *storage; -// char *signature = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->SignCombo)); -// gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&arch,-1); -// char *full_path = yon_char_new(arch); -// repo = yon_char_divide(arch,yon_char_find_last(arch,'/')); -// storage = yon_char_divide(repo,yon_char_find_last(repo,'/')); -// storage = yon_char_append(storage,"/"); -// GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),NULL); -// char *targets = ""; -// for (int i=0;iRepoFileList),&iter,(GtkTreePath*)g_list_nth_data(list,i)); -// gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoFileList),&iter,2,&pack,-1); -// char *temp = yon_char_unite(targets, " ", full_path,"/",pack,NULL); -// if (!yon_char_is_empty(targets)) free(targets); -// targets=temp; -// } -// if (!system(yon_debug_output("%s\n",yon_sign_package(storage,repo,arch,targets,signature)))){ -// yon_ubl_status_box_render(SIGN_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -// } -// on_subwindow_close(window->Window); -// } -// } - -// sign_window *yon_sign_window_new(){ -// sign_window *window = malloc(sizeof(sign_window)); -// GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_sign); - -// window->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); -// window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); -// window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); -// window->SignCombo = yon_gtk_builder_get_widget(builder,"SignCombo"); -// window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); -// window->SignButton = yon_gtk_builder_get_widget(builder,"SignButton"); - -// g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - -// return window; -// } - -// void on_packages_sign(GtkWidget *self, main_window *widgets){ -// sign_window *window = yon_sign_window_new(); -// yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),SIGNATURE_TITLE_LABEL,icon_path,"sign-window"); -// yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->SignCombo)); -// dictionary *dict = NULL; -// yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); -// yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); -// g_signal_connect(G_OBJECT(window->SignButton),"clicked",G_CALLBACK(on_sign_window_accept),dict); -// gtk_widget_show(window->Window); -// } - -// int yon_tree_is_selected(void *widget){ -// main_window *widgets = (main_window*)widget; -// GtkTreeModel *model; -// GtkTreeIter iter, itar; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model,&iter)){ -// gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&itar); -// if (gtk_tree_store_iter_depth(widgets->RepoList,&itar)==2){ -// return 1; -// } -// } -// return 0; -// } - - -// void on_rmb_remove(GtkWidget *self, main_window *widgets){ - -// repo_add_window *window = on_remove_clicked(NULL,widgets); -// GtkTreeModel *model; -// GtkTreeIter iter; -// char *path; -// gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter); -// gtk_tree_model_get(model,&iter,3,&path,-1); -// GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model); -// for (int i=0;iPackagesList,&itar); -// gtk_list_store_set(window->PackagesList,&itar,1,name,2,full_path,-1); -// free(full_path); -// free(filename); -// free(name); -// } -// } +int yon_tree_is_selected(void *widget){ + main_window *widgets = (main_window*)widget; + GtkTreeModel *model; + GtkTreeIter iter, itar; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model,&iter)){ + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&itar); + if (gtk_tree_store_iter_depth(widgets->RepoList,&itar)==2){ + return 1; + } + } + return 0; +} main_window *yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); @@ -654,20 +364,20 @@ main_window *yon_main_window_complete(main_window *widgets){ gtk_style_context_add_class(gtk_widget_get_style_context(widgets->KeyMenuItem),"menuitemtop"); gtk_style_context_remove_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemtop"); gtk_style_context_add_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemmiddle"); - // g_signal_connect(G_OBJECT(widgets->KeyMenuItem),"activate",G_CALLBACK(on_key_clicked),widgets); + g_signal_connect(G_OBJECT(widgets->KeyMenuItem),"activate",G_CALLBACK(on_key_clicked),widgets); } main_config.tree_store = widgets->RepoList; - // rmb_menu_window *rmb = yon_rmb_menu_setup(widgets->RepoFileTree, yon_tree_is_selected,widgets, - // SIGN_LABEL,lib_key_icon_name,G_CALLBACK(on_packages_sign),widgets, - // MOVE_PACKAGES_TITLE_LABEL,move_icon,G_CALLBACK(on_rmb_move),widgets, - // REMOVE_PACKAGES_TITLE_LABEL,remove_icon,G_CALLBACK(on_rmb_remove),widgets, - // NULL); + rmb_menu_window *rmb = yon_rmb_menu_setup(widgets->RepoFileTree, yon_tree_is_selected,widgets, + SIGN_LABEL,lib_key_icon_name,G_CALLBACK(on_packages_sign),widgets, + MOVE_PACKAGES_TITLE_LABEL,move_icon,G_CALLBACK(on_move_clicked),widgets, + REMOVE_PACKAGES_TITLE_LABEL,remove_icon,G_CALLBACK(on_remove_clicked),widgets, + NULL); g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets); g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_add_clicked),widgets); g_signal_connect(G_OBJECT(widgets->MoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets); - // g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); + g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); g_signal_connect(G_OBJECT(widgets->ReposTree),"cursor-changed",G_CALLBACK(on_main_tree_selection_changed),widgets); g_signal_connect(G_OBJECT(widgets->CloudButton),"clicked",G_CALLBACK(on_ubl_settings_update_launch),widgets); g_signal_connect(G_OBJECT(widgets->RepoFileTree),"cursor-changed",G_CALLBACK(on_package_selection_changed),widgets); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index cdb12e8..7867b0f 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -65,7 +65,7 @@ typedef char* string; #define add_packages_sign_command(path,arch,name,repo_sign,pack_sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S ",repo_sign," -s ",pack_sign," ",packages_path,NULL) #define add_packages_package_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -s '",sign,"' ",packages_path,NULL) #define add_packages_repo_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",sign,"' ",packages_path,NULL) -#define remove_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL) +#define remove_packages_command(path,arch,name,packages_path,sign) yon_char_unite("repo-manager remove -r '",name,"' -a '",arch,"' -d '", path,"' ",sign?"-S ":"",sign?sign:"",sign?" ":"",packages_path,NULL) #define repo_sign_command(storage_path, repo, sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage_path, "' -S ", sign,NULL) @@ -410,4 +410,7 @@ void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo); void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign); void yon_storage_remove(char *key, storage_struct *storage,void*); config_str yon_arch_struct_get_packages(arch_struct *arch, int *size); -void yon_move_window_set_selected(main_window *widgets, repo_add_window *window); \ No newline at end of file +void yon_move_window_set_selected(main_window *widgets, repo_add_window *window); +void on_move_add_package(GtkWidget *self, repo_add_window *window); +void on_packages_sign(GtkWidget *self, main_window *widgets); +void yon_add_window_add_chosen_packages(main_window *widgets, repo_add_window *window); \ No newline at end of file From f20b843f28b7f808a34cb9555de0ae911b4fd0e6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 15:42:22 +0000 Subject: [PATCH 06/29] Fixed multiadding packages --- source/ubl-settings-repomanager-add-window.c | 44 ++++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index f0743f7..2063163 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -53,17 +53,43 @@ void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window * void on_add_accept(GtkWidget *self, dictionary *dict){ repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); filechooser_window *dialog = yon_dictionary_get_data(dict->first->next,filechooser_window*); - char *file = dialog->last_success_selection; int size; - if (!yon_char_is_empty(file)){ - config_str package_name = yon_config_load(yon_get_package_name_from_filename(file),&size); - if (size){ - yon_char_remove_last_symbol(package_name[0],'\n'); + config_str packages = yon_char_parse(dialog->last_success_selection,&size,","); + for (int i=0;iPackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,name&&!yon_char_is_empty(name[0])?name[0]:"",2,full_path,-1); + free(full_path); + } + } + + } else { GtkTreeIter iter; - gtk_list_store_append(window->PackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,0,package_signature_icon_name,1,package_name[0],2,file,3,1,-1); + int temp_size; + config_str name = yon_config_load(yon_get_package_name_from_filename(packages[i]),&temp_size); + if (temp_size<=0){ + yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + yon_char_remove_last_symbol(name[0],'\n'); + if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){ + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,packages[i],-1); + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + } + } - yon_char_parsed_free(package_name,size); } } @@ -82,6 +108,8 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ gtk_file_filter_set_name(filter,"*.pkg.tar*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + gtk_widget_show(dialog->ChooseFolderCheck); + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog->MainFileChooser),1); if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); From b019ca4f7a40622d51eabc83c186168e740e3373 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 16:08:55 +0000 Subject: [PATCH 07/29] Fixed repository adding when importing new storage --- .../ubl-settings-repomanager-storage-window.c | 34 +++++++++++++++++++ source/ubl-settings-repomanager.h | 3 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index 3f14836..bc89e38 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -3,6 +3,39 @@ // // storage-configure window section +void yon_storage_open_add_repos(char *storage_path, storage_config_window *window){ + int size; + config_str repos = yon_file_list_dirs(storage_path,&size); + + storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_path); + if (size){ + for (int i=0;irepos,repo_name)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->AddEntry); + continue; + } + char *new_repo = yon_char_new(repo_name); + repo_struct *repo = yon_repo_struct_new(); + storage_repo_block *block = yon_storage_repo_block_new(); + g_object_set_data(G_OBJECT(block->SignatureCombo),"repo_storage",repo); + g_object_set_data(G_OBJECT(block->SignatureCombo),"window",window); + g_object_set_data(G_OBJECT(block->RepoRemoveButton),"window",window); + repo->name=new_repo; + block->repo_name=new_repo; + repo->path = yon_char_unite(storage_path,"/",new_repo,NULL); + repo->storage_path = yon_char_new(storage_path); + yon_config_append_element(storage->path,(char*)repo->path,","); + gtk_entry_set_text(GTK_ENTRY(block->RepoNameEntry),new_repo); + gtk_box_pack_start(GTK_BOX(window->ReposBox),block->MainBox,0,0,0); + g_hash_table_insert(storage->repos,repo->name,repo); + // yon_storage_struct_add_repo(storage,repo); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + } + } +} + void on_storage_open(GtkWidget *self, storage_config_window *window){ filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); @@ -17,6 +50,7 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ while (gtk_events_pending()) gtk_main_iteration(); gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); yon_config_register(storage->path,STORAGE_command,""); + yon_storage_open_add_repos(storage->path,window); } } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 7867b0f..ff5d9ba 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -413,4 +413,5 @@ config_str yon_arch_struct_get_packages(arch_struct *arch, int *size); void yon_move_window_set_selected(main_window *widgets, repo_add_window *window); void on_move_add_package(GtkWidget *self, repo_add_window *window); void on_packages_sign(GtkWidget *self, main_window *widgets); -void yon_add_window_add_chosen_packages(main_window *widgets, repo_add_window *window); \ No newline at end of file +void yon_add_window_add_chosen_packages(main_window *widgets, repo_add_window *window); +void yon_storage_open_add_repos(char *storage_path, storage_config_window *window); \ No newline at end of file From 107ce138eb6ba83fbc1c7168eb3f6a82d4b64b36 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 16:24:44 +0000 Subject: [PATCH 08/29] Added sign tooltips --- source/ubl-settings-repomanager.c | 10 ++++++++-- source/ubl-strings.h | 5 ++++- ubl-settings-repomanager.glade | 6 ++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index f2f2486..6bcd554 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -95,14 +95,17 @@ void yon_repo_tree_build_arch(char *key, arch_struct *arch, struct repo_tree_bui int package_status = system(yon_repo_get_signature_status_packages(arch->storage_path,arch->repo_name,arch->name)); arch_status = WEXITSTATUS(arch_status); char *image_name = NULL; + char *image_tooltip = NULL; if (arch_status != 2 || package_status != 2){ image_name = warning_icon_name; + image_tooltip = UNSIGNED_LABEL; } else if (!arch_status&&!package_status){ image_name = key_icon_name; + image_tooltip = SIGN_LABEL; } gtk_tree_store_append(data->widgets->RepoList,&data->architer,&data->repoiter); - gtk_tree_store_set(data->widgets->RepoList,&data->architer,0,image_name,2,arch->name,3,arch->path,7,arch,8,2,-1); + gtk_tree_store_set(data->widgets->RepoList,&data->architer,0,image_name,2,arch->name,3,arch->path,7,arch,8,2,9,image_tooltip,-1); } void yon_interface_update(main_window *widgets){ @@ -193,14 +196,17 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ if (strcmp(parsed[0],"-")){ int sign_status = system(yon_repo_get_signature_status(((arch_struct*)data_struct)->storage_path,((arch_struct*)data_struct)->repo_name,((arch_struct*)data_struct)->name,parsed[1])); char *sign_icon = ""; + char *sign_tooltip = ""; if (!sign_status){ sign_icon = package_signature_icon_name; + sign_tooltip = SIGNED_LABEL; } else { sign_icon = package_signature_error_icon_name; + sign_tooltip = UNSIGNED_LABEL; } GtkTreeIter itar; gtk_list_store_append(widgets->RepoFileList,&itar); - gtk_list_store_set(widgets->RepoFileList,&itar,0,sign_icon,1,parsed[0],2,parsed[1],-1); + gtk_list_store_set(widgets->RepoFileList,&itar,0,sign_icon,1,parsed[0],2,parsed[1],3,sign_tooltip,-1); } yon_char_parsed_free(parsed,parsed_size); } diff --git a/source/ubl-strings.h b/source/ubl-strings.h index f6ab79b..64ca711 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -169,4 +169,7 @@ #define NAME_SHORT_LABEL _("Name must be 5 or more symbols") -#define REPO_SAME_CHOSEN_LABEL _("Same repository was chosen for source and target") \ No newline at end of file +#define REPO_SAME_CHOSEN_LABEL _("Same repository was chosen for source and target") + +#define SIGNED_LABEL _("Signed") +#define UNSIGNED_LABEL _("Unsigned") \ No newline at end of file diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 4ec5e0f..e9a8b07 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -16,6 +16,8 @@ + + @@ -46,6 +48,8 @@ + + @@ -231,6 +235,7 @@ False treeviewcolumn1 2 + 9 @@ -304,6 +309,7 @@ RepoFileList False 1 + 3 From 7035ef2480e70b4b15542bae4e97ce84d179d09d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 16:31:44 +0000 Subject: [PATCH 09/29] Template update --- Makefile | 106 +++--- ...linux.ubl-settings-repomanager.checked.svg | 327 ------------------ ...linux.ubl-settings-repomanager.warning.svg | 55 --- gresource.xml | 3 - .../com.ublinux.ubl-settings-repomanager.svg | 0 ...tings-repomanager.chain-error-symbolic.svg | 0 ...bl-settings-repomanager.chain-symbolic.svg | 0 ...gs-repomanager.document-green-symbolic.svg | 0 ...ings-repomanager.document-red-symbolic.svg | 0 ...pomanager.document-sign-error-symbolic.svg | 0 ...ngs-repomanager.document-sign-symbolic.svg | 0 ...settings-repomanager.document-symbolic.svg | 0 ...ings-repomanager.folder-green-symbolic.svg | 0 ...ttings-repomanager.folder-red-symbolic.svg | 0 ...l-settings-repomanager.folder-symbolic.svg | 0 ...-settings-repomanager.warning-symbolic.svg | 0 .../ubl-settings-repomanager.pot | 124 ++++--- .../ubl-settings-repomanager_ru.po | 124 ++++--- source/CMakeLists.txt | 1 - ubl-settings-repomanager-banner.png | Bin 33872 -> 0 bytes 20 files changed, 193 insertions(+), 547 deletions(-) delete mode 100644 com.ublinux.ubl-settings-repomanager.checked.svg delete mode 100644 com.ublinux.ubl-settings-repomanager.warning.svg rename com.ublinux.ubl-settings-repomanager.svg => icons/apps/com.ublinux.ubl-settings-repomanager.svg (100%) rename com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.chain-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.document-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.document-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.folder-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg (100%) rename com.ublinux.ubl-settings-repomanager.warning-symbolic.svg => icons/status/com.ublinux.ubl-settings-repomanager.warning-symbolic.svg (100%) rename ubl-settings-repomanager.pot => locale/ubl-settings-repomanager.pot (89%) rename ubl-settings-repomanager_ru.po => locale/ubl-settings-repomanager_ru.po (91%) delete mode 100644 ubl-settings-repomanager-banner.png diff --git a/Makefile b/Makefile index b03a7d3..21263cf 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,6 @@ DEPENDS = /bin/cmake PREFIX ?= /usr/local PKGNAME = $(MAKEFILE_DIR) FILE_VER = source/${PKGNAME}.h -PKGIDENT = $(subst /,-,$(subst /usr,,${PREFIX})) default_target: all @@ -22,11 +21,13 @@ all: init build init: @echo "Initialize ..."; \ - if [ -d ".git" ]; then \ + if [[ -d ".git" ]]; then \ LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \ - if [ -z "$${LATEST_TAG}" ]; then \ - LATEST_TAG="0.0"; \ - fi; \ + if [[ -z "$${LATEST_TAG}" ]]; \ + then \ + LATEST_TAG=$$"0.0"; \ + echo "$${LATEST_TAG} is empty"; \ + fi; \ else \ LATEST_TAG="Development"; \ fi; \ @@ -36,7 +37,7 @@ init: depend: @echo "Check depends ..." @for FILE_DEPEND in $(DEPENDS); do \ - if [ ! -f $${FILE_DEPEND} ]; then \ + if [[ ! -f "$${FILE_DEPEND}" ]]; then \ echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \ exit 1; \ fi; \ @@ -46,21 +47,21 @@ depend: debug: @echo "Debug ..." - if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + if [[ ! -d "${CMAKE_BUILD_DIR}" ]]; then \ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ fi; \ echo "Debug: OK" prepare: @echo "Prepare ..."; \ - if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + if [[ ! -d "${CMAKE_BUILD_DIR}" ]]; then \ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ fi; \ echo "Prepare: OK" check: @echo "Check ..."; \ - if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \ + if [[ -f "${CMAKE_BUILD_DIR}/${PKGNAME}" ]]; then \ echo "Check: OK"; \ else \ echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \ @@ -75,10 +76,9 @@ build: depend prepare uninstall: @echo "Uninstall ..." - @for FILE_PO in $(wildcard *.po); do \ - LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ - FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ - PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + @for LANG in $$(find ./locale -iname "*.po" -print | sed -En "s/.+_([[:alpha:]]+)\.po/\1/p" | sort -u); do \ +# PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \ + PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \ $(RM) "$${PATH_FILE_MO}"; \ done @for SIZE in 16x16 32x32 48x48 scalable; do \ @@ -90,64 +90,64 @@ uninstall: $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \ done; \ done + @for FILE_ICON in $(wildcard icons/*/*.svg); do \ + SUB_NAME=$${FILE_ICON#*/}; SUB_NAME=$${SUB_NAME%/*}; \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/$${SUB_NAME}/$${FILE_ICON}"; \ + done @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" - @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy" - @if [ -z ${DESTDIR} ]; then \ - [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ + @if [[ "${PREFIX}" == @("/usr"|"/usr/") ]]; then \ + $(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy"; \ + else \ +# $(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \ + $(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \ + fi + @if [[ -z "${DESTDIR}" ]]; then \ + [[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ]] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ - [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ + [[ -d "${DESTDIR}${PREFIX}/share/applications" ]] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ fi @echo "Uninstall: OK" install: check uninstall @echo "Install ..." - @for FILE_PO in $(wildcard *.po); do \ - LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ - install -dm755 "${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES"; \ - FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ - PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ - echo "$${FILE_PO}"; \ - msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ + @for LANG in $$(find ./locale -iname "*.po" -print | sed -En "s/.+_([[:alpha:]]+)\.po/\1/p" | sort -u); do \ + install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ +# PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \ + PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \ + PKGNAME_PO="./locale/${PKGNAME}_$${LANG}.po"; [[ -f "$${PKGNAME_PO}" ]] || PKGNAME_PO= ; \ + msgfmt --verbose --use-fuzzy --output-file "$${PATH_FILE_MO}" - < <(msgcat --use-first --no-wrap $${PKGNAME_PO} ./locale/*_$${LANG}.po); \ done @for SIZE in 16 32 48; do \ - install -dm755 "${DESTDIR}/usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \ - rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}/usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \ + rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "icons/apps/com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + done + @for FILE_ICON in $(wildcard icons/*/*.svg); do \ + SUB_NAME=$${FILE_ICON#*/}; SUB_NAME=$${SUB_NAME%/*}; \ + install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/$${SUB_NAME}" $${FILE_ICON}; \ done - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-green-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-red-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-green-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-error-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.chain-error-symbolic.svg" - @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.chain-symbolic.svg" - @install -Dm755 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "crypt-key.csv" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" - @install -Dm644 "com.ublinux.${PKGNAME}.policy" "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy" - @sed -e '\|annotate key=|s|/usr/bin|${PREFIX}/bin|' -e '/action id=/s/\.run/${PKGIDENT}\.run/' -i ${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy - @if [ -z ${DESTDIR} ]; then \ - [ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/share/icons/hicolor/" &>/dev/null || true; \ + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" + @if [[ "${PREFIX}" == @("/usr"|"/usr/") ]]; then \ + install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy"; \ + else \ +# install -Dm644 "com.ublinux.${PKGNAME}.policy" "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \ + install -Dm644 "com.ublinux.${PKGNAME}.policy" "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \ +# sed -e "s+/usr/bin+${PREFIX}/bin+" -e "s+\.run+$${PREFIX//\//-}\.run+g" -i "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \ + sed -e "s+/usr/bin+${PREFIX}/bin+" -e "s+\.run+$${PREFIX//\//-}\.run+g" -i "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \ + fi + @if [[ -z "${DESTDIR}" ]]; then \ + ldconfig -n ${DESTDIR}${PREFIX}/lib; \ + [[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ]] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ - [ -d "${DESTDIR}/usr/share/applications" ] && touch "${DESTDIR}/usr/share/applications" &>/dev/null || true; \ + [[ -d "${DESTDIR}${PREFIX}/share/applications" ]] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ fi @echo "Install: OK" clean: @echo "Clean ..." @$(RM) -rd ${CMAKE_BUILD_DIR} - @if [ -d ${CMAKE_BUILD_DIR} ]; then \ + @if [[ -d "${CMAKE_BUILD_DIR}" ]]; then \ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ else \ echo "Clean: OK"; \ @@ -159,7 +159,7 @@ help: echo "... init"; \ echo "... debug"; \ echo "... prepare"; \ - echo "... build"; \ + echo "... compile"; \ echo "... install"; \ echo "... uninstall"; \ echo "... clean" \ No newline at end of file diff --git a/com.ublinux.ubl-settings-repomanager.checked.svg b/com.ublinux.ubl-settings-repomanager.checked.svg deleted file mode 100644 index e3cab42..0000000 --- a/com.ublinux.ubl-settings-repomanager.checked.svg +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/com.ublinux.ubl-settings-repomanager.warning.svg b/com.ublinux.ubl-settings-repomanager.warning.svg deleted file mode 100644 index 9a90dba..0000000 --- a/com.ublinux.ubl-settings-repomanager.warning.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - diff --git a/gresource.xml b/gresource.xml index 1dd3f75..9c5c8bb 100644 --- a/gresource.xml +++ b/gresource.xml @@ -12,7 +12,4 @@ ubl-settings-repomanager.css - - ubl-settings-repomanager-banner.png - \ No newline at end of file diff --git a/com.ublinux.ubl-settings-repomanager.svg b/icons/apps/com.ublinux.ubl-settings-repomanager.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.svg rename to icons/apps/com.ublinux.ubl-settings-repomanager.svg diff --git a/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.chain-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.document-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.document-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.document-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.document-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.folder-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.warning-symbolic.svg b/icons/status/com.ublinux.ubl-settings-repomanager.warning-symbolic.svg similarity index 100% rename from com.ublinux.ubl-settings-repomanager.warning-symbolic.svg rename to icons/status/com.ublinux.ubl-settings-repomanager.warning-symbolic.svg diff --git a/ubl-settings-repomanager.pot b/locale/ubl-settings-repomanager.pot similarity index 89% rename from ubl-settings-repomanager.pot rename to locale/ubl-settings-repomanager.pot index 2aa34ec..038bef2 100644 --- a/ubl-settings-repomanager.pot +++ b/locale/ubl-settings-repomanager.pot @@ -308,223 +308,239 @@ msgid "Data has been loaded" msgstr "" #: source/ubl-strings.h:89 -msgid "Packages were added successfully" +msgid "Failed to add packages" msgstr "" #: source/ubl-strings.h:90 -msgid "Packages were removed successfully" +msgid "Packages were added successfully" msgstr "" #: source/ubl-strings.h:91 -msgid "Packages were moved successfully" +msgid "Packages were removed successfully" msgstr "" #: source/ubl-strings.h:92 -msgid "Changes saved" +msgid "Packages were moved successfully" msgstr "" #: source/ubl-strings.h:93 -msgid "Key was successfully created" +msgid "Changes saved" msgstr "" #: source/ubl-strings.h:94 +msgid "Key was successfully created" +msgstr "" + +#: source/ubl-strings.h:95 msgid "Key creation failed" msgstr "" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:97 msgid "Choose" msgstr "" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:98 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:100 msgid "Open or create repository" msgstr "" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:101 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:102 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:103 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:104 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:105 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:107 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:108 msgid "Open" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:110 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:112 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:113 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:114 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:115 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:116 msgid "Choose repository or package to sign" msgstr "" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:118 msgid "Name:" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:119 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:120 msgid "< Type branch name >" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:121 msgid "Name must be filled!" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:122 msgid "Choose path for new repository" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:124 msgid "Choose repository folder" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:125 msgid "Choose repository" msgstr "" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:127 msgid "Absent" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:128 msgid "Dependences:" msgstr "" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:129 msgid "Digital signature" msgstr "" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:131 msgid "package" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:132 msgid "repository" msgstr "" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:133 msgid "Repeating packages were not added" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:134 msgid "This repository has already been added" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:136 msgid "Close" msgstr "" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:138 msgid "Are you sure want to disable?" msgstr "" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:140 msgid "Are you sure want to remove?" msgstr "" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:142 msgid "Do not sign" msgstr "" -#: source/ubl-strings.h:143 +#: source/ubl-strings.h:144 msgid "Package name error - package has incorrect name pattern" msgstr "" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:146 msgid "Passwords do not match" msgstr "" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:148 msgid "Package search" msgstr "" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "Storage path" msgstr "" -#: source/ubl-strings.h:151 +#: source/ubl-strings.h:152 msgid "Repository" msgstr "" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:154 msgid "Architecture" msgstr "" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:156 msgid "Repository name" msgstr "" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:158 msgid "Signature" msgstr "" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:160 msgid "Signature status" msgstr "" -#: source/ubl-strings.h:161 +#: source/ubl-strings.h:162 msgid "Sign packages" msgstr "" -#: source/ubl-strings.h:163 +#: source/ubl-strings.h:164 msgid "Packages successfully signed" msgstr "" -#: source/ubl-strings.h:165 +#: source/ubl-strings.h:166 msgid "Folder must contain repositories" msgstr "" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:168 msgid "Folder must not be empty" msgstr "" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:170 msgid "Name must be 5 or more symbols" msgstr "" + +#: source/ubl-strings.h:172 +msgid "Same repository was chosen for source and target" +msgstr "" + +#: source/ubl-strings.h:174 +msgid "Signed" +msgstr "" + +#: source/ubl-strings.h:175 +msgid "Unsigned" +msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/locale/ubl-settings-repomanager_ru.po similarity index 91% rename from ubl-settings-repomanager_ru.po rename to locale/ubl-settings-repomanager_ru.po index 552d851..35bc933 100644 --- a/ubl-settings-repomanager_ru.po +++ b/locale/ubl-settings-repomanager_ru.po @@ -310,54 +310,58 @@ msgid "Data has been loaded" msgstr "Данные загружены" #: source/ubl-strings.h:89 +msgid "Failed to add packages" +msgstr "Ошибка добавления пакетов" + +#: source/ubl-strings.h:90 msgid "Packages were added successfully" msgstr "Пакеты успешно добавлены" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:91 msgid "Packages were removed successfully" msgstr "Пакеты успешно удалены" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:92 msgid "Packages were moved successfully" msgstr "Пакеты успешно перемещены" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:93 msgid "Changes saved" msgstr "Изменения сохранены" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:94 msgid "Key was successfully created" msgstr "Ключ был успешно создан" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:95 msgid "Key creation failed" msgstr "Ошибка создания ключа" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:97 msgid "Choose" msgstr "Выбрать" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:98 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:100 msgid "Open or create repository" msgstr "Открыть или создать репозиторий" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:101 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:102 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:103 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:104 msgid "" "Add/Remove repository from\n" "local package sources" @@ -365,107 +369,107 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:105 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:107 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:108 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:110 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:112 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:113 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:114 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:115 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:116 msgid "Choose repository or package to sign" msgstr "Выберите репозиторий или пакет для подписи" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:118 msgid "Name:" msgstr "Имя:" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:119 msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:120 msgid "< Type branch name >" msgstr "< Введите название ветки >" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:121 msgid "Name must be filled!" msgstr "Введите название!" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:122 msgid "Choose path for new repository" msgstr "Выбрать расположение нового репозитория" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:124 msgid "Choose repository folder" msgstr "Выбрать директорию для репозитория" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:125 msgid "Choose repository" msgstr "Выбрать репозиторий" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:127 msgid "Absent" msgstr "Отсутствует" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:128 msgid "Dependences:" msgstr "Зависит от:" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:129 msgid "Digital signature" msgstr "Цифровая подпись" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:131 msgid "package" msgstr "пакет" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:132 msgid "repository" msgstr "репозиторий" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:133 msgid "Repeating packages were not added" msgstr "Дублирующиеся пакеты не были добавлены" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:134 msgid "This repository has already been added" msgstr "Этот репозиторий уже был добавлен" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:136 msgid "Close" msgstr "Закрыть" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:138 msgid "Are you sure want to disable?" msgstr "" "Внимание! Вы хотите отключить хранилище от управления менеджером " @@ -475,68 +479,80 @@ msgstr "" "Примечание: в дальнейшем Вы можете заново подключить хранилище и управлять " "им." -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:140 msgid "Are you sure want to remove?" msgstr "" "Внимание! Вы ходите удалить хранилище При этом хранилище и вложенные " "репозитории будут безвозвратно удалены!" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:142 msgid "Do not sign" msgstr "Не подписывать" -#: source/ubl-strings.h:143 +#: source/ubl-strings.h:144 msgid "Package name error - package has incorrect name pattern" msgstr "Ошибка имени пакета - некорректное имя пакета" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:146 msgid "Passwords do not match" msgstr "Пароли не совпадают" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:148 msgid "Package search" msgstr "Поиск пакетов" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "Storage path" msgstr "Расположение хранилища" -#: source/ubl-strings.h:151 +#: source/ubl-strings.h:152 msgid "Repository" msgstr "Репозиторий" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:154 msgid "Architecture" msgstr "Архитектура" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:156 msgid "Repository name" msgstr "Имя репозитория" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:158 msgid "Signature" msgstr "Подпись" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:160 msgid "Signature status" msgstr "Статус подписи" -#: source/ubl-strings.h:161 +#: source/ubl-strings.h:162 msgid "Sign packages" msgstr "Подписать пакеты" -#: source/ubl-strings.h:163 +#: source/ubl-strings.h:164 msgid "Packages successfully signed" msgstr "Пакеты успешно подписаны" -#: source/ubl-strings.h:165 +#: source/ubl-strings.h:166 msgid "Folder must contain repositories" msgstr "Директория должна содержать репозитории" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:168 msgid "Folder must not be empty" msgstr "Директория должна быть пустой" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:170 msgid "Name must be 5 or more symbols" msgstr "Имя должно содержать больше 5 символов" + +#: source/ubl-strings.h:172 +msgid "Same repository was chosen for source and target" +msgstr "Для источника и назначения был выбран один и тот же репозиторий" + +#: source/ubl-strings.h:174 +msgid "Signed" +msgstr "Подписан" + +#: source/ubl-strings.h:175 +msgid "Unsigned" +msgstr "Не подписан" diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 0fce1b5..c690837 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -37,7 +37,6 @@ set(DEPENDFILES ../ubl-settings-repomanager-sign.glade ../ubl-settings-repomanager-repo-block.glade ../gresource.xml - ../ubl-settings-repomanager-banner.png ../ubl-settings-repomanager.css ) diff --git a/ubl-settings-repomanager-banner.png b/ubl-settings-repomanager-banner.png deleted file mode 100644 index 8eb67cbc38babeaf498d981356cf7e77e2741f12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33872 zcmeFYWmuKl+BQ6C1O+4{L`v!IkZvYDX{2M)4blxNU6WF}kp=pV{*)KugiV3A=#Adm+N^3pH}1nCm| z4#PwTKQ;FJ#UT)EG9OJ{cbKUsm9wi8+{WIL%H7-9lFHJ{1`dIE%~zz^C9VqKgxziv z`l3EWy|*vmC%g0D^!!pnTT2X1XLf4p`Jz@yor)_#e!BklWYq0CH1)h9_0iG1ZJW2v z1YIUUhgj8tU(t)~(RGhL-;{v103vTEd^XG2i=%pf!)1eY;kM<4%lKp78@s%!q)9<$ zv4D;1Hqn4K(WQHOBTfWu4}TteAGR$$UW%w~eYm-P>G$;g@bA>ZiVIP_WyPD-4tSEj zE!UdH8edtATk4A#ze>zwC7W#W82*U8@Txsysqi$5b%c|sTR{HMf!O*8=fS{<;*aA1 zw%%e3U;IE6T53ESU&>=P-oy(x$AF(3>_&lBdi=P8&(Uwg=FblJm;AD?`yShLjQ@Jf zTeTN|#a!-rEqb$gqS;RO=MQzDm~lWr?dX|OK%3FTVt`8T3HP^k7O~MhJ((FO+g3|S z6|JaM^y7ry^~x^`yFOj|>(7>A8keuLoNX7AppP>epLO~q7A5-#*@*S0(^0>-=ZvK} zO1v^~7q{i2G_r1;csR&fwWDSxNJKh^L`2#H6#t3&LnBfJ)PuF($}kUYN2Bmz$_jXSdS1nm*8X#i=<@b z!hX7uY7P6WCED>-+ccr1*anLg;k@=4kWpl;*F6}ARyE14P1*APYA)eUZs6un~QY==`? zW_B#UDa%2f7yiW$k{fnww;O)9{0_*OACOZOJel>l`Y_R-QkM0}%kx#XVIc8|EAI%VvU-^wg)&o@6P%&*t>bY;d!aLE#< zlb>W*`qk82tbi|jSo-sDSCE%YI{&136SjnzE;yq5o9B7cXp3IDQR>c%qL*BVX|2dg zA)`13?Ve|5#9W1B9&@wX*74S{J`<`(6Z0GS z?(L)R6T2`{xFcKzG?os)T6quPV-PF>gv%)^rk;K#XdiD$YpqD*Diw6DF}|Z&*aOu!!`=q z4CT9om2p1_r!uCq^{+cx&{Z*=?7-lq4oe*CHewYIY+Gd#`^M@xUiwm7>BowXYke@R z{uMphpWuB74Xt!VFMc7r5NeyW$Vgo|u<;$+Q@8hWatNzocr$9hzg5?LxF^lKvkdwq zgRjPy1(l__(Dwt%JKbWkL$%EAihPO#+qO%(xhIMbhbX=&r@W&5B^~RbY3^Y)FR;z# z@!$mk)|uf}0ZUtwl!Lnka=|dsDU^bEts9;RnXlE0CztqPy3b4!q# zSA+=;_DMb@>}mC6s_xM>%tqUaACOd`PL^U*sYw3$?zydDG4gJ`tSs%$Y$v1hZ4v6> zR%ptkiGYPp@Z!FCxOV}@u*g}ScH2WtuQEED07imr?R$*kUvRNBBcDFRH)>|6_S=)Pmk{Z%ILowmvlI(bfbB~f%j^j%wo<})?~)tBmGr-o}LBPmd__2 z*WZ?@>9T3R>6%5}zL3?b*JvSG)o{`&51CFbI&-=ACES|8ehJS#rSRF?0D@gIW8_$c z;26nXJ{F%u$+>a0rv?5D_?TXaRc19KOxT;0Eh!%`!Wf^E7YMG#o4IH4nXqo>VB;_h zQQWhCJ(L4E{Jq^R>0|F5OHD~ZtKi7|?G3zk^C4o{Y!{^}tO)DRy)Qkdwa>8`8h8@U zu!))?BU6GeulDCI(?TTDbNPQ)zhn1OU*CZ9%0 z-c9|mHX)IM$H8A;;Sp+4eu{$4n*Wm=2Xx|hVgc_ezL%TIA&G|6%Hd4Et(!36c;u`R zocH@jEFn`Z>{Y6wXOve#<_ih_N5SOz-|!s|j%Tx`2!5&O%dM@2@2pZoUVL5r@Dd}{ zFI-`5dC3dchrU2RYy3lw5n&@;KAnE7iuj5d88QS=G1{!>5yvmEt6VMQ~1@ zSo%Mw8_eS;(=Mob!qmm3*1Yt~YWUSTRoL*Eegyu3+&$`2Dva-JA09KsK4dg((y?a# zNcSP4C|+cCI!7khB&No;z8Vq5yU6P$kQ^Yi{*a;m4S(}PXmc=$FAlqUZsagYdED@b zfjmRr5W3ZB?`iVG`(I~!WS(?FHdKrV5-Cnz>CZft$cJce+)u%Y%1Jx(GUK3JV`AAg z3nUIC>B_f==$v&Z9J`F-n_?srW6>#4=w^-t{Ufl2mutPGP^ z44IF^O&INu+z%Hh!mnQxRr}b#X|7*lKzl1Kq|TP6YsIX;ni_*v_+;u`(Yx$F>twdw zDfm`4$?eEIr@G%}=Y}I~dgNibJmOxdl@Tvf;#bw=gc)-cJ}}#=VwQC;#roeHQt40r z?vi)7-pMVSO|LA!WPVLoL@1Npc9gKmohd6Vx1<~VAeu^A^8?&Wvi{&jTI?f{s;`45 zoS|sp!b)GbPb17`DW=)t9)+8|QC5=4%^4?R4_kf}EL+^eWzzR*C2#>sCsa=HB z`N~;5-(48RXOm2esIyqDlxriBK!5dhnyDC1(N3sUSp)N@w|u?VC?$}vUq6MTyPwAv zl=wWwz`rJC`!VgZ|5`3P{K0}LJ;$3IzKxP0Y$L~r-+#>MMn1{X7?1@>VkT$gp!^iR zQR1~G4;@ec%H32v;WJ7Ee_~vR`G)QL2LB=z>d~ghc?&L77j0e>UiNcg4s$Y++Poh= zk%ngH?E(9o^)&5sooTmZfNbM1pGCFIXp6|XK7~mr<*VU)FHK&WV}B8Ukv8cbk`-AXGV@eh4I{9q&Al|t#X%JMDH9v#lYlgskmv18DQsO{Z?S@|}`E}+dAsgPha zZ5hPiMJz}q)HE_u!Ew{yNJslV*AQPY>r<21)AJutw(XOsX#Reck=hj#JJp&WAa5g! zEK3soT4dE)jbtKMwIi_lkkE4AtT(AD5Je{>?G14^r8|Jl;WkoIY6?na}L`+#^71xOFBqP8!3-`QiW-P zDG{Bg3QysrSGadRJtN|wu_)u661bc_RRL#3N0t7e2T$WWKtDJxa&TUv$Egb`$Im8+ zOLv#}Ay>&v(cv=E!m>Y9oemu#cpcH}ht147gjFOfEJLo&n|T=ip`U4;bwt0ko9yf- z`+dukWXsA4GHLQC-4N7=SWFCgsE^g>Jzy-)Hidt!QaWGbHxarLb$zZ0;^O&SNqL1E zFgpE3S;b2smt^ebhX7@dct4w3mC(pp&FZ9T&34KX6jMnV0{FXsWFLLaL-@RBRFUA#*geQMQ!odkn5VowkY;CFY zaJ)U``E`b3SL9kSC*EoU+L>z`(6;C*D+!r9Ik1^pIGI_pc{wpYIoLb833-Xo{57r+`2FraZZ;=ZD|SvnK|yv7E_N<1R&WKYo42F8 zsTZrG+ta%t{vJcx(#_n}#@XG*$&u=AOj9!_4|fq78t^^UKi|*6Sy}mC!#leDV->)9 zuzQ(0vvaa>usb-g|N9+o?lLdIApdxw|KlBQnxOk*hgrHgdAOQe%Dl96bbtEqLs*#q z>waesSNp%FV`0v2X>aKOE_DM><@}FF$|)$T{p*gqC9tw_aQ^Equ-N}`rMnIMe-`UM z-tF$2zozr=F9L4=*SP<2^*`tS*Tvu}Wo030Cv%Ux*He%dp}Bj$kcE@EjfK!(znb!M znDU$R3bJx>TEba*I8EWKf`VL}teo5ed=|WxW^h44%YPe6!O_j#)Y07XZYVG~n++Jp zjKfrrPryuom0N(f|k604P{|2BaQ>E7F!{{G6`+SJj?5}faU1k^u2xA{M87B?rqfT{ZQU^XCt{+bOH!(U6u_@7sMT3g<& z69*SJD+ebl7oR34uMiKf5HA-q2cHlJ2MzoG{VAH8b93>S@$#_patrW-DO#AanwoJ5 zvYPV?Sn%<1ahsX(^Z(~d|9_bxH-{!C2bh@bB9=e&Lob+FPALK%+B@p~}&skp2 z4FX|%diOt)SE1NT@F9k~g0c+8IuZpcIGNpNdBa_IE}h>Z^&2-X~~x%r>-xqG%fET$Ks-* zo-$NqCFr)FzqGC|xzUGgKfu7ikiKOpjJ{%{es=7uemSLGHWfb%Z)x`&i8-EC?LKX) zR1Cw*K_sq^W+!3bQs6PtCcq@23WbPIx1tC9P$OfODdQVa_>NT=-qxPg{H@-sB6J|K zm!^&-YVGL4M2tG@p=26@Yv*iIxC)VYaVCC`da?r-D=6)(;PhfNG9xSNuc6IqUbbw`LFQ3qOhh3;YOa4h!w`Ua8pN<0e()-P#(e|b;rs^ShHv*WqLItOKf6Un@+pwvtYint&;P92^%41NxY z<8PGvS#a;(qiYHsLr<}pqCl}7qaM_{c4OiK)4)rlEC!Pe&mA`NN;#y&KOH!Jp%mOZ zHz%ooveD&J+Z|8bKE*H=@*KCQ_y5+pw`HXg&gg1-*rSPuPD*?&pw89lhm)G?B{Ps< z#KmnJoj1KnwOX~S9@r~FIpV!>-Zr?vJ8PVKn4`*qcIsq)_z4MCwcW%p8+L7^$1M2< zJ5DamBwDCZ6umjwsvQA|Meg}Hsvg4rWow(3WE6!XG{{^GOHRyud9a&z?oF8y_H}d< zj{9}cH5G)IFHVWJ-{MJkJ8`k}1E0*cPBD9&PozjLN3F*Du^QF+r-l|c{foEW4?69t zJJ7G>9S$9gRMTWm=&AfN-VS2!P@6MmfCc>+Id6c zCQDh&kp4~4v;+NeyP{aDN|jGi-ej?3AVLQ79s{EX>mSth3|yrJBfi;pJQq3Iw(LHl z_jh_&)X>g_k%!To5@zsrbHeI*Lrfi57D@5eaw_VHxH5>AUW_`nJ08_0#+AEFDCaA9U4%+8 z3N@-wCXVnZc90U%jpd8EKix2M^94TenZZoV)lyFPz?C85@COEiB<5GNod7B$;`%CV z`zJfT>X}fJ_S?1h9WmYMf(T9_==h>Nz;U!B8{(_{gc^pRjaaJ4_#KPs&HpKO!XdVs%2Q}Ss9=eB?>dN5b>)fZ^ygg z^t+5XHln1PkfHo>`*^oU^x*|Ya&mIkJY*zKp2#pIH;>;dFhiZpo1dNS{QjL9R!Yc~ ze*b38_y#TTh(9p&;=;QCRyu1^H`q);D<2yhTiwzU6&i~24F8@57iq!7X8T+?!&X&x z5I-6dNJ|yk*i*Jdzh6E#5miz&x+V88NJ4w_ryL~<-yH#)+&*E8I#Y&4LhrRHVeyYN z&zS4zS4@W!{VrLjL~HotpPiAhvax{)#!0d4YWO`SIJ>Qvw$8OEMmJmLZ_5^NI6x0x z`T-Xg%b-wCQ2HbY^>7XysU`#2QcWyN&p&9V9E}lzI84|*9)`|9^`)?15Y1=6Z7#w< z3J~G=s9%w1z}9ml{9)lYcO_9hd+H$Cm(CWIlR7(j^njbA?4-e>NJOsz%cFy>DdtIA zUhs#9?14N`@SlyyWWOVRAB^&~Lz1!g;DA%l$Ot@>=J(5YEbQ#714;Bh*TrrH=N1;8 zQu-f1R4AVK46h4=LBsGqsd7$e>^G0kToG&C&WPnde-gLi@t%Ss%MERny~pok{^I&tUGT!<9%{04z+P^LyWIjI!1FQ4z8K#Jz^xp z`nlBR`^m$ww!Iyvj|BYvQ{#TbuNIwEh3>G7z{)WJ$i%pYveo@j(afp|qb4Bgx>A+!-l`q7P}9-LDN0rBTC)ho_|=-{=luNJ90ZiHu-f4TSDz+XHgqrPmtx1G zqqdhFwJ(Ixu@VumALr*Js#(Ha#n}N^qet=b&%gl!M_HF*M35{7-L{?#9Aj`4e{G0e z^@z2$+&|@=L;*+PlM=>r-1BXo7lp8{zCQG~!|H{p^<1Ox;Ogjj}eec7QJ z7`~y?*y5$yWv1rlDD?F7pN@oge*aDY%aqXDE5pLdn$XlF2xB08gGlt-@4_gVvOQi{ zzTqRKpr8xGqbYnQx__E!RdsC{hDR5c6U{koTR(ex%J*DY*a89jNkb& z=?-a2;H{|d?e*DQcQ^9jnrk#?-&MvrxA*BW@7C7EbucWKk+>OI5)$t&r0j==G7L|G zP^BxqdX}W{qnV9D#78>dtYtaj@@(&E_ULw}il5lidv4Te7iV-E%!(4fDIY(U0zg1F z+=44YlPMgWW-t%x>`?-=*6U`cp&eZA6AdJX{I7TUAmDOgnI?O5_2&B08f@9}a{uLC zM_fWe0{5h+CaR~whkBLKvP)t~6E`=4Oce}sb8}~MjLPl2iOm%d0N_~W=jZ3z#DtFZ z6vZ84aUsn_q_+F~Lx_W~16fEKO@s2HcCo8DKMwPK`Y z8SLKNWCWOtj-H-VR1|0QNUcMeUCJP*q#O(nM~jY*{yZ_EA?$N}2m8z|ETm)Ph?$|75<;1M`}-WS zva%dvV(e92H&2!*!~&FL<>W>&XOGUW-wo5f^z?LbcPC`g9`R1a2l-2QG}Kb>qsuCK zQBhGmv=Di# ztDhPikb~|&c<}xFJniP@tb?B4@f($*qT;gzdAwFOeJLK3Czv~hh~t%&AO|O>x|c1( zEQ4klZXg)TG?{kh>a3J7yB-k}r(5bp<8_1gocs2T{4ph^)u#K~ZuZXn*gfLK-1(>r zsXP>aV(b+G90j_hf;sy{klE_Js}N*~N^}VW7V`D_v>kt@s?;j92f%u=42G-<7)C3| z=Mde)uI1XiwdadEIB@x}-~izAOTG9=HU!Mf!y}pJow5a2dXWA!67Btso=&4>aCpD0 zakZcSz_xdA_}&$YK|)5>JvOF>S5@86@JgB{cy4a4Gm!F8_4J@zWv2p?i240O*gaog zUlK}6+;S_l04P$WCR2%a*sO#NTISeq zOx{EhvsYJF2hGjtffr%RcANFzj?CC>nK^5zjOyu;0u^v*bTkw%M8D$I%a#i6U|6ss zQ*y|5v!M&B(8@a#$^(4;oN7(<&zqa2$Nk3eI=ulBu$$eDyB>CW-Rv3poua5KEuC3- z-K>K@PJA+*?CtlZX}&MEdMEL}QwE^jVd2y-=Oy^^-Me>7;DAt)k{?^KlS#Hs*nWlo}cu!L@~> zro7qXn>;r=qc=NbJIiaovu`i52X=N?ii(R-mgjN;q(=l#Pfu6uh9vObP$aV#O1CV^ z7Eg2$8~Y(qqk=%F0n722-_gXv0-S87=~Ua0HcLHdd^`w5uwCP}_4~cV#+?lgT>Sj6 z?fDcT@dj+K!QS5GM2CgQ(^r;yJPGpgCnp|<$D105``@LwL`7Ae^iyZJEhg?_@2IM( z&i(pDS21NPAtOBFk-qM|b8)m@u3c6G@@tCxGm=6CXJ6W?0LX?QPQxXGm6epnBy&3x z2c8i~qMB5(_yV9hGSg**DM8+!+u%Sj+A4F3-GySlepPoKQLmbjLaCe-9jpb%4HWgR z!$U6NQ7O@EF{zrf+MTHb!x@>nxlc*-s@2WSkpL=1$HhH;H%yZZr3N`JI3f%WWCnYC zd#dbFb2$80^t)1>k>&t@CQJuVKS8QgljLFhvFu?8B0q1+*3{OP>Ej+pc+ZCtkL4<| z1?{qMuzjo36)(~uq~I73s9RIo13>5TRh|9qNBa$>{HfV1+_Ti2qZruYS{;~@MyyETmu7* zg?&$zgknQMj{MF|GEUjw$%+I4h>_i>HNL;UUsqp$E0TL$uPFQKC;g1cEt}KrvFfdK z0fK~rqVLluR6063unnWS_vzXy>BLJlyQilgfusNsEBGm}jwk7UF9l@9#YMyNsw#6E zn|l|2qSYoKI6!!V(h>Xp`*$kn)bTJj^_u`?=!+^%rUHOu?Chd;c6L^F7h6D~|Kvi> z(FbDnS?Zvvg+-V}ot_q%HWCS%xcvfMH0R-0Im!f;VyV5QHpRmWKggD-F8=Zl?d(w3 zrV8yS2M325vzpHkHEPt=4DJ!Zg~dh7!NEa$7ng*X*jO$oNW5V|RrjA%h{ zE>b=oo=>k{zfN~p02LjQ4f_INz$*^J1K=-q6^|O#frktL?6ev*%m|4fl^*S#VR18)okIy)6##iH++hJExG(HJbW?0$Mf430Pm=~#_V@7? z78XERPFMP+q}d@TcI*aVt-Yh;j~-mHPqVWmzt-0i2G>@wPuau@Ht7Te1jK7}KOGmz{02S=)*ms(plu3g$czx|(0AmCd2JP!s^OPfc$L6Dk z4jih&Py8Jh%JPirWm6;4AIiiz>$N>{PK0s6Mh7AAJ$Ju#ZEP@*_eVs3#BC`8r4qzH zy7}^^yIR%EcWJU%njMbT4RD(Mn0> zq~l#7Zr)pTA-|Y^M~704fj4#z`3N$s4!QufGy+Q7-qJGYwA4CqbRk?dv;D2MJcqmz zk%+SI7w_rcd3t5;9V6Rwxl=d#5it%@>}r!iEQsEHB|3tjHr3zQjI>tK_o%}Fu|e4y zj(~yjngA^k)tjelV1SU4lG?8_jx)#XG#YkVXs`qe1~?Y5iX1{hK6K{a*>4Z;D!k#+ z&57}C^2R1RKtcdc0x$%CcyM9G3)U1%0Ip5!?68xeYtg;MorZ<)$e%p!-7LYW24;J z*;zVXhyo+&dIquy7<%VuRLrWbuFl@fj0WQQm5enA$T_FtKAtLT&~Ud#cCPe4SZ7i6BhCQZ6!n|-hr1c3%WmZKvoqE_)g2vi02Bb2hw6w`S0p25QdOzJ$@v9Kt40I{ zEfqJaQu20o4yveNRj<%ac4g3dUx@4#nEf7uoky&#_PlUaK(b7NQukEU1RGjfGPCXH z>-$1US@|G0mwL&b??mV{*F+U_6WO;fjlS@hq3{l*j%JCh4p=0Pj*cD~u=N8rY;^r7 z!)@f+?)zI>c1-G8?XrmEWTKj;CdTz&zkYuH{08d=TNmeP8g2l&<5p3=E{{ zlBgkwa*p`>mhEO#_p%&Ky`7I3ww5LLzp;)csS@wlBvP|}Y` zEQ5LAblH1(r2(Y%9&IN^pa|by$WN>L+D9)dHG%C2W6crcIEh(5S**e zYpz{>Q+8w-^l?T_H1DUFwoZIF+M5dtcMA>Jz-cDFOO7D*+Scpqyw}p~%trRkjL^ub z601u}A^=na23w<_C}sHzj|Y(n@^neyP{8B$OGAElM>3os`)WOw^yd$oPyO;S9`*w~ zaC>{3;Zf8|28c5sIE<7~D5ffJ(jU8xdE8L%Fm@Glu(lcbn8f^>hha@!-P16kZn~RX_lNL=e0Wd(=874j2xRW@AwGaW|qA*hv2Q7m0)yrzazh>J^7qm&RdkboD^ubL@c z_qIYlMz7g8=+`jS%7jY>o1#&pv_}pP5k}p7 z{ujm5^rsBJ`uI9 zk^nCjyP7kxDX&#v>+Aa%pbNkaZ25#Edu7+^gd=YFi7Ou8A1!FUM-3YA*#=fbA)rM; zC)PS;8vz0XYeeu&SQXGgs9!I{M+y;Eol6*7Y=cWy5Y7E8ImR^@lr3xpKqo&dtJljN zf!S7ddRZ#Py&!q5XGE>8nje5J1Cu(e)%&OjR8z^803vtHgN}JP@n`1cHk-9=G!M<_ zseyreH@kZ`yMHx0VmGT|@|sO*F+c8wd4u}#h-sa?LYukzm%#d6#sY-P?zg5;P%bKi zC>9fS*pm`tT>Llh!P=7T=Ht3i(Wd|qf(!s+2u=KXCQd$L9Gu@%@ZQw`{PI12t{9Ft)bN|F zYzftCtz{-}weV9al zKUnSey15bz*bk+Qx959Y;F4bRs0}MQEZBcGKqQ$ZQ|0aqsb-6YZ#SRs_uwXsuA}^t z$GE6Qi1$i{%bdS9Ohpb{XsBsxivcyVsi`Rk{s~|@HKH1wfw_P#QTqo>UA|skZvel` zFt>bj+9-i}51H!H8rv71jeJ#|DtfbZlO^H{+T=01Gtiyf@yIQUIJ)6R{$!H79ecqV zqa5#sp<*6{ATS^~IzI{CwkFIUrO4ul|7KXU7`H>m$kv#xZ$1_KO&+6vNt?Tu> z8yt2oheN5F8LCrZ=q6P!P6J-Ncyf*+*5|3=23ZGfv<@B7PK2&Cc9ddL1I!^XACKssc)Jf2Y9 z1YO!JpiLBuCx&WSY!@2xRz}B85#x{*<(wJV4)WlVn3#F=SHK(!@$t!Sp9mf8t$yiT z5^K-9$Yq4hE-uQ@Bv4guqicHT3h8QIj0SWrY2Fa_ra=q$K@WZPgSev;5OS2LwV>v% z_?l`#dOF*eD}9?`e+G?j@Wsx%a5=cRLbS_>KGkfHGNdA%!lQ$l2!o zD5k12(A+#U5aje9akuAjO_q9h;HuZ_m{7vH*ITJtNALbt9bXpLeU!-z^XTt@cAUB1 z>A-qXm6+W;HoaZ8&`^QJW&)bKsHmv4v@`*YG^ya=%{`tMZLfH}zdmi!a^KzGcc!u) zHV7b!&Sxf8Uo7&`!)vbny6KMmMSC%@cmk=AaL%5O0l$Ed9E~Z!M9up5LBPDqmdT85 zeKRa|#7_CNuGFf?+K?#Oh~-gDdpm{hORW7>$Xe^#8;`&`tZDmteb6c1kxFTFL1H8_KYnFn@DZ{*JBDMAQG(N5>!+#;~nf(Vp3p)*jol z*ENW?>5muwTC=i?gF{0~YCmOr!!}Yr`Z#615G%T{|3S#b%6gdD-)L7Yx0jO9=2z7m zG$x^PG372kqv6;6r|DhS^X3++@*W+4uHPcyPcgXZn<#Hx2*gS?(VC2+_^7Akun{i&=9~ZhGG4L>C3csFYockWvnl|h zW`$-j^I#;`iu`zicUSn#v9Gtp>bro7j^{v>s8d~*zpkN=q2DQIybOwZ!D0FcF4k7v!Qw_2Tl(>SXH?xT;p|&;C%){ji!$md#ZBx?T06>Eoz+6; zPGs^uyS(?+miyqy#v}r-3l&e1F9P2FIPNKu_88o@q6p_j9&hnJ-6G9>EDoprRPFZG zk?QCQU}~Zopl@CaU=K#?;?x~0*?qd7IL_*K=vPQ& zUbHVKy*l!m16wOcQ0te54{cfDrAq09wW2yow#%AaJz>{5zctwx-v8!p4=p%8@pVw| zgu^c36(Q_{kNQYX^Tp*zaf%W+F{MaOTO<%C41y({qUB{drI7R>N-Ob`_iEk`PWR5? zu(#^SLm!xi{o%W{qyvx9;mum)v|&9wLq>1i5qcWO`A*re$1a*0D;KCBS=)=X=6@v_G zH-=75z7I~Rae0QwwscH6j(+ygwK7WgKtbIQaUE7G~@KGlra&tC#jOL?(bW6#W8KAry1?hA%iAYf7DCZl1?^t zC|b9t&+nx9eV+Qxk7y3)<+x2)uN76{mde#NY;bU>=&o_$Xx=;1pul3v7ST5NK z#`;Aj_!&(!i=+&sQUrSWRH)=Q6^uQQ$kwxCYwuSfkBy+5x3P?uX|J$_KG?8gO?Sb( zuH{)zP`wKTls_EQ#PoQp46YMj9uQ=he$bu_a0@xxI;jZcXKAC`ISWhuPsMeQrAwHr5BU$LVQSdO2;sY}XSgFg*--7>Ru z%1ErePaEK`N54!k4wcURp|zI|mSlcFM_&)80Ogi~~?W^tcb4@<&AnT|t)5-B?E9GR|pq7Sfq zm#Y*jmc1V(Kfoit#rIfNSBlqrM_n%B`c1db(jaW$L$!JMKqf;6r zCWA+t(0S|8w0G$Q!}lrGgs8!x(mhKV1B3|avtA`)Os55_Kq8aCteQ!r`3xsw#++j| zbcJ>s=0Ag&SgAzJ6RNar0dJohN~1q`AKm%@{giCy78kkgBC}evM1toeU}EbBVKD#i zx(<70p-9%TiYWdELdJCQ+!}jIWzQ?ikEqO-R2M_-a&BFR!mE#`2IF1YZahg%D2d9+ zQ49E=BzGB#nPtOL0o4&w19kMq(y{LqnlSthW;=fTC-#6apFple$=S*tm9_r@=4VZ z$8+_Rce|njPL{1vpYI*{y|<{@ghw{t9*qrOmk)fL?p0@_s3UaIRaoS>z_;=`b{j78 z<=Qd$b%fJWDNrW*{zkmRO+~B^1Yda9vH_~;lkFh|O5z714D$CAJsoe@N0Ob@%LG_5 z=~WgeEo#D${3bvGm zvHT9`?8$iS6nerjc=k5D>IXy&3J>G-3O&EMMDsh!D9WQu*(w>;ny7e`Vsvg<)(ujk zaUv_$&mN)A;mY&X%O?}R2U=e-gi|YF^AVe5z+4lQtKL|#@oAuRlpo->WH;96dX({1 z27i5rclt+HPVdyk(p5Q^Z2fYEG+AO%rj1PS0ak<4{0}TjzAQ^#@gI$OvQ`UBY}NC5&MWfD?SK`GAHg+VfUw5Aa5k~n9) zl_x)aeYgod4By-3Uf5p_c#EovtLwg&5s_Do)5Jl!tnQR`t9&<|b#XO$30!c=)VWJ# zCC4AP{M-73-%~a#=)4QJN4JsZ-bj0`x37MDxd4+^z959hA2T%&7IMI#fR-H_(b008 z#8y1P%7}4g4IAK}Xe-QWv0W=?{s?DJ6zDr@9o;AsUo+NuwjZofpRYCb`PgU&-r=>V z^FGWFs3d?fF_`H+JaipfpRZ+kh9AKeT#m6Xb1{&2SU9zJjLzWFAA>S1LDwWC2d@6} zM+o$3*3z;6+fgt- zPZrs0=KMf?a#u_34KSmCz7tS{GBvtk4hvSlWJtL4;)?$`erx^8D&s*3y3Bu2R&R&t zfHdi_U>MS&lhNmm+=y^pZDtd_KGwM7+xLZWhv9A}%tx)$C2#E{F#&-N2x0K&gMNjH zN_zwZW=Qd|5;Ui)mFuNd)Yqh2qx!c-lLjv2^yfxEIHJ7S#}E#<5`Y->(lNkI@n~t3 z`oay1+0L>={UdS3uJER8>!Z}CP_!=9jnLESn-_NHYXfKeN!uH2ZELYM0CU7CB!t!P zf^6FHSKEdUQ3a$G=!k(T*Cp5wRts>Wa4RbyPlVPMwf%W5XOj;Y1i-n$poCE}!rq6d zz^oxHl)0O?llS3}Bj>l(A=CFM$Hu!Zu&qr*4f@rwQ5|$ephYzSjuFuCcYpqjiGzc4 zN2LO~0Cel~ufJKax})c$wn!U}f;|D`3lJ|xqqntcL;)}M`t|Es;32Zg_J1Xtk2F{d zw5i}b7HD*xi6{)Y^;P~4Dz|^!(Zr7) zJ>uZz4h8(3K&;zZWOnoVGU)NZc?m|~gHQmSTvAdJXrilGw!dgdhvNa=SGHbX1SQ^u zH9sF}`?~jW>Gaf#7cT&lc|JE9@Cst{M(M`bsY~Fw z@IBk5P94mh*rZC32eu8GbR{!;`};s40L&U7QmO&%?+knofRM6Z=mUJum^DxQ;9Bzr zeVbhhsp)$ZD)ak2Jw1SM1i7G^B?>VAX12Ci?8fbPrv_|^1Sa*3B+YyX{f*1LLd5wx zHRPBWf(KjQSd|mRNogq~;K<6R zBx`iI<(F}y$A#G12|hi66PCK0aEWr+u2eNAbA=Z8q^pF zk*Q1jNjJ*13|Jy7(>VKp=j{Nr$KO7>px{!9h9U6l^&bE#EesF%oPynAfuc!>70$+= zL^1QVN~RFo!Q%xK^vsMpAT$AG444!^yU`>KKp;%X(3~A0+|9lv4K;X8>L1|e7rnM-`9Yr* zIO#e`0AK#c4WaHLP3B~&FG@j%$YU%SCf-BlE)NCY7XsJoG!eA{b#6~Zre9HC^ za8OC$5GO95_wnBe0;p7vV_pdh3MQQR7y?ICx=Qg^dp_EA1E!}Bf+ktq=HedrM?cO% zoJke=C6vBg_} zcJ1VZ3s_r2QPz{dJ`!MiscCF{eP<;Jy zV6>@QXmpxTqLaEujc8l)Q-TA7N?(7!P5xICaIrnmZtpbL(W5j(B9cj!2Yw$zA-IB} zQ0aPUS#HV`lX}R*@QdJ`uiKd2vI-;Jd4!QVEH)a$0HAk0G zOfmvL85({k69akf=bc2CmevWxteiJ`DKhTPO2rd*k@EAWMF|bDoZCCQL>Qnrp@sM< zsi}ZiM_Fh9X*ofO?r-9obf_^Q;UP!g9e;yK&B4n{G$aQS`!+qBl~ISv=+T|Q5+sS& zxRij32Npzkq0CBaC(CQylyKniz>^H|u51aJygtsGn&MnGAPSH603HieNr82% z%8ohvA7At30B;MtK7hUf=jrimsuOZB9u3KBFb1HS#cg0i$w1Nl_6>EN+;eY9MkrGj z=x%JOJs|7DN;NHZg1v3sUb|v2?U&AMgUddF3;>jNtnd)cV}H6N3Gk<0AJBg2=1LGX zqDO^%Mp(0jr$!~C2$;8z50mH1mp{LK%lPQAoe~fHo`p0bqXaOh1m<^0814_@qyfy) zBdIJ`(ycXU0N|Ae4Pf>I}ReNGoA@Gq>AFD+risTcF5^aC=+ZFd)`D0&hhd z9p0g=0A^LEObeK!0k^#wH~6}s762MYuFXiUWl_{Ty)*(?tl|eOkl%v^Gy^<6 z@CF(NyV=%YQ9A=Y4^&CN>uuxLAT#AzO%)7UaNR9!-CWpqGu)Y69RcS`|Fp4Dl6N{F zN9i911VS!O&RoJ6NUKk9o8vHe<=UDW3Fc(11K~I*<0gP9hQ`LlVCiXrk%hC5fjUe- zMTTgcxq2E1uX@@Q+H+-~g#iqa9#^_W);i~4EeZ8Ahz~?b=Mj*){&EZ+3CA%y&va2h zl3@6KBt(*9z?%S8>IpC$0)eZ!Qt^K09yYLZ6adR2FaZJG_Gc)rXeY2zkUoCAeW>~; zFk%-)XOuH(zyxSiIj5`03_UEql9(#0sz6GN0MbVg=PP%iC%Oh89RhJp!r)D97LW)# zrTwoC`tQ!b?5r+_Q+{5>Nf4Bg7U;;psJXwm7eE}ldguPjRH5f8l0q9|EcAABoi8j&^E2XTRZfW8r$#RV3NY27v>+`>bpnB|7wK@D09p!fl( z1VS6RYo*zd3L&r#481_H2yu$&X>fpG`i+I*P1@Eoe2Lqb%)vtj8YalIAd7%Hl?Z}) zXk>)u-7x;`tTeZ71kyP~92ERT$0T6ssO{)bHJB-s#Dp;=Z-C^&N{HnShs%E5j)p;5 z2eCShg1HM3dMUjH2to+3y7Z9@!t3loTK3NB2mZ7>gBBjX?giEk>z&hub41X?FjavO zMREC7g?N_vk)--fh8qw@fcWnY^7Q#}N3#xD(f-CNfDGWMeg@lo2a2JEk^s$tdK?j% z$?=UXT5N7c{njK@p=77z7Qs| ziZ;o6XZZr&8W6?0{cz`ZuEZtV8Ua5+r2}#>>ixJ?0iam{>mrtJE@p$o+cRLcymQrq z^9C&(N813qwCS$Dg=8z_kUd}_T|A*)D{t$V(OIhl4ccx7qv`_T5eke2ToqX^coz}yIBdT zC~S>W^;t7}b1_Cq< zWHbVT3p%w^wQnQYleKRLU~G(dlTj4_%~b&v2uG0tRL!-3*lbYZW(U{ew2R&bc^nA> zU6D(=cARQ;Ly0dHl>6%-*vg%z=5v(UoIQ_2AjCvPS>WpT1_l_A(oZ1Xz@(#$AOI`nT?%G)bjJRlKjOWntV*lDJH())jfCIt{bkKm(a49V^)Ey>h$M`lT z00IY$tVi|5503Rb4xHS1rpJ1yE+B-#gBChv1mqdOD=>GpR+jLkMmd`hld1wv2k0dV ztKE{pk0adSNa}#$L`jhDo(@ZRjAYTslD18!5)vCE{nCvOz8aXw+CDaI-xLG!4Ne(! zoCA*-!-y9<&rK5TEH+YpF+p`8u@dR38@k*xP>`N>RW{sb`-DX^TgRy&O;N~HZC@zl zWhEuvKs>C&d90llWuANW(fDQ{jGw^`LChCql#pk-CYmD<%K?bg6dOR**{`Q`OM$GAjRD zEv^cj2E5^g{{D-dj2qiEhv?&(1dqygq3OGvh zE)?C-%q#p^gcT%gTS~IWSUyGiqS@KCzHbO?*QJ>2M#4nc+r(O0xHY|N1e?(Y|X{1zqVVLkM~`A zU_#~x&`~berC{PSlm~qS11RLmG)hado^?4IH>lyMBapm0%qfcmhYc%yFm}0sBtY>; z)B(dQnh@&jKYc~^Igq!xfirFfe|+O>eZ{3a7rP?(!0t2Xh?8`fQ7rrRPvTy z;#6BKJq)mhhK4dwvmD3Z{=|!FgoiX#1SFLK@P>caIko&UOd)D_g~8#Bk+o6EP?=t; ziWJuw1Q7YJ(M4%w9Srx1hhM_v@f0R#kOV(_n1Z;6U8;MDXHLZ(C-00dwWyM;!**oV zUEHkd$KMZ*eod$2Fi0G&t@TwoW==K*j8!>~0oU47Yw%9LcB$@{0f}l$B9R~BrCX_# z3Xb7v?W?tEa~eOkW8UjNunmEdzDE%82z@t;;BZs=bQ2b@sUM-BS}D};ERB#Ahi3uz z{>}D`v}L1Ndr!}WqG5ZNWtexM3c2(^hjeg(A*O11`}FXqv}Ihb311R4TF>Es{@wKX zqu7%Kv*OM$^aRYx=B=N=|E2 z_syJnnHZfvaSL?mK<__+>Hb?!PbKgHdjKlGPYui#v?y!V4bHZ$O#&Ve0BL~2%N;Wj zEb$8WYHzO9PaY?L5eS-Ag0T;@E$0ZlJMWY|LZyB3*9w<)Cwoa10`nTc+yHy#>T=^T z7J#uLsR#k~olgm4rpzhvC88?|483efKij46dLvzx7??Y_wOwUoPdhM2=V3U3$3Q$w z-9W}PEvV^Q`G~^^k7l*w70`bHRATtgl+p(4j`FIiP?&zK9zJ}{6R&+se3)`{iLNQ# zi7O1xrRFOp;#WNQ9SUI9sa?N;J%f!6bZiTR4q0siG!3Knp{N&H7(I*WIZRLjj8ZTv zwt9@SWO)KKn=swtVOk3%9qvdW#&|(tVVXXm3V>pT<$@*(D|IctmQ$!rg<1}M1%)@9 zL07N=s|K>i{v#gA!neYyxV@b%$_?C`Rtg|I@gdPonpUm2r_h_0oI>@BUjktN5^o!xeYjV?dR`M49DzZcZ zvvkyax_gSh!Ok7N{W`UIe~tTD5^TQU`14>5dGml6g>(J^yg83sJjVHqU7tUqv;Dzy zv>tv}8LJIX_gRDykm0bifKvI)xk*%~+qMnA+qttIc>tQ#;@>y#>q#s2UvFrZbM z@@U$_vt|CPev@P|+BQ{2usE^?&@vlXtBre-ZnRf&TFj1nnnf<_l%pQ6VlzI*38brX zK!1+aRz4t)LOn||p2{A|8xK!G(IXn1_uX!4YCQ7?cC6_DN*cjbGO8^LgPB8X_ijo| zJQiv&emA>78nUn5QpUsJYEjl0dCL6CZ6Pts|6mJQG+gx54tx=Ibi@Pg$pR6u4USyp z9W|#Pt_@K;&!+eIdTJNz3nlz_3y^R!iv6orQ_RV-FO^PyKYr8H*GC1tFuq}MKHYJK zqkf(t3JfpskPz#KW~}*EWb!|wA5Ix~&#NX&GrX)|6g2DoCHdqZk>+8sEWlr)8d=fyC{l>*#Ig?sS;jl=f7cue+ z%quXshQ2R?MJz1N1hLPDMVDxNMqefP(rLxCzkBd;t@YXo)#m0V!Iu8vz5mAo#O9%; z5VH2UJ-l28W{s-SPe&z4u8`3R6&0Nprae=CGuUQgl5Vq5FANYc4BK$Ef}16b>XYQI zj^{4hQ=?=d=W1gZOJ%Bl=#ne<7HAuYiGU89;3OVDKWE=s$*WsD%)){??Xfx2q_4}C z_7=8m1bu268j)uA*j|uq%Pv}!&FM!H_@mdNi@I&cJX7_Ci&YGmTD}bPj1W~*XJpT@ zrmGUluq=c9UNh*y{yV+$RPk(5h`4&XzZn!5G;NpJk+dag8JAz*4$9aLYb$XDr@TGdM9OTni!c z^&oaBhkjW5heY#qth;Utgc~xvbRVWALPNOr)h-WSHa1W~o;_ zNb>~qow4dGv3-Mc)p4KCI;BktbiX7ybEfe@x*fq6kMx-Og21CL`f75&nP^3LWmYt{ z$@1HG5|{j#zjHRxZ%-77rzp9 zB^%ySktZ;E70!sGA^*%_;!(CL%R3lIQ^21~r_i;-$T?`$7qH?wcR`2zpc?ntgx)gT zyGJk~RRA;jS0XBwazVb!{NbyE^MB&3ZA*V{NKw{cQfF87oc8nF)+ILiP#kHvexN*@ z1JqV-b=}u0l(JkvnJ3Gj1K;(>hUhduQ8SeCW*Uv0!L`f(rhM9HPK(+w&2*l_{+hhe zc*0>~Z!Y39x+LC=+E`;;zQwY~{Cay27=hEoI&2Dn93<-k5!9 z-ur;@xD~--Z!*0TX(PVXiMck^&NyRCl9_1P9KG30iJDeyQ}{w8zg?AmfE~-9HP;QE z&?{G-i;kafoBv|!cFVx>7X2?9;s+V7D)d@4hkA?$S*ez8fAXHf@1L~%cO-F1sJq$E zD0WU_B**KCU~#soUQsmis~^#qEKb^`+XEl@?itM+%qzru+$vABA|(Dd!c151@?w8j zqudO=;hN3xtjn;gu_wTY(2R0<$iZUE!Eu-HpexXpUd#Uvj`zs~g}C#rrOOm-5G^bd zM6u(XM&~;=l$@<%9}-Z8@-oPkX~Slk4i{h)dwE25&1WPd<3HtqIg1p-FYPfZ*;wd7 zUEmV%{LVHR_~qM5|i(BqP>PDVW!?XZXeB4rnqO1s%=g$@aA<9 zKB*#F%&eJxyP28e5aRkOsAe*pj`kdtSA%F*V4pzjMrI`TL3kU|WXorJG58IbHQw$% zxLS5C_syK!k{#MIT@6A z=58XWhZ%=>>jo2B82%nL$_VoIie6Ydr086xJ!6@mrptGt7t*I!5VBKLRoeTph9OKg zWcM>e5?6TF!}M;8j^dOv#|K@L9wYIW!wN$W$KtwAx#Rx9A$}p_e~Ii!Eu=Af$Hw@` z)=T*Km}Qq*-(0%%>f={7LCiU;=iFP-@mv;{b^8}+RcZAFCnXfnHXcUk8NC^*-IzB1 zxeOm?+pL{fiPLfcVTad>!s4~vu9w}%P2>r%AJ6ZYD@@O+aSh{PCB&X=-qyFbJ!V?P z#{=reX4hF?7n|2k=<6FGKG%(>>w1k6iiGQoR^$ciIm_ggwyAd9zI$Fl9=*Fn_C36Q zf`~Ux`vMQkCHZC?^75?fA9OIdXFkvCWHF8m3gpYwn&WJqr-i;%kJjqtENO5Y+V>;C zPBu$wFDwp=33RIs70;t5+!a>UE*ezcQU6XZm#^sP%c;0|(wdDmk`zp+6=*ln>(0J}(-y8@XG?8U-;IwLNC2w;;_kL)sn>HBm0nT8w!b za5e>oaQ5;%*Ui*v^r~O<_exLEDs#~Nmbx|PO|%o>dtvt$6uZ z*G#NIbkXi#ZjP6HHDOfX@M;C6OlD!5I_F|i{Qc9oU~SZUYpU&3ZPZb?0yzDBpksz9 zh7&duzP=g1z*GwP5zk@G^VHq_KD4pXFa|rO*jz+`WJiT#u!+0qVX}A{s*Qrl`1HuQ zpkV?Qd~pJ>Vg>^x7>@hEn48h@a31zwcHkj`g&$f#0gDbh02$kCQi6T_!N{Xi<2o}0 ziFMrGv;sIa-VCw=81mYzEa|S-3Zz0wogTTp{AR1n_5y)LKh|2bZ-_=x`3JK!hE-iY zss_CdR_a!;2nLx1kKLoG;Zr}U&aM#Q8$fD4Lc!RJH(h`nIt4s4KoVer1pOk#Mt)$Z z5h0~6x){tI)&kq53zU@jlqgs$gQ)#B2G(_P-A&Po+deMDVIrbab?!g|+ckOvEOQG~&cW3vqZ3v>#?4DAw-NG+{apOOVNvxI%MujYmq&Mpo5H{c;N zeSOc@Bs4gv&&widan9Y=;n}O(*Pr+8IQS~$d{H`{=$g5$uC6{M+H*Oa$0_b~{o3hz zR$J{7iUI)(4ZZ*-bj!>CGCDwO2k2%G;QQz&B7PT93HSF3qO^(MTVFEQr0NkX9JU7& z>sbUoI3s)R1?c{u;}o^@SMq|x{3|TMz`*#>$tmHWMh)_|qO&z1bDf(dR{^r8UIn;u;ksXECwL zNTk_FWX?%oo>Z}e_GlTx3`qzcH2fl)k>a+nusni_^*;Y&2#W}FO8{6uuS5#Tu9b7m za{L9CiatGL{@|A)@VtR%(i_wtSXjX)1_p;P*q8x;)7{B2mG%8A2OL9?;1XS_b=4ML7KqaqX3cJV5Tl)G9kR1)oLXU+7a< zyMii)PlbR>1JMG45;#3i7RydZL8*Z?qiIuzEGB(Dlds%>uCa2~aSY^AM)W|-K(aRV zhzH!oGL)2*(NrPc*^2%%!JxNnfI8^AyJCvBXka0P#)9;S_A41H&E9PU!Ke=EGGexl zPX(*}#M3hcWHET$t>Y^ErFy|{3l1{<;x_o|9)LLn)+YIQ9>b73883`o`;x5fO1vzb z^X6w0Vjiz|{QC78D6KFXqi5J&G0uePU^jI@bIi)D9UbE}QLcwOjo8eeU$*u49+ub%T-OdV=RH-smR+L!Ul8e2{T@OgM@Ak+$Hi7Y*{vy!1XH54jBr zb!XU=lO6t4bS1ENz4XYtuS_FPeO4x?{*)|#UD)zD+CRfPFgJ!B#df~Df81fUdSt>c z3Z53&QBG$%H_2kP3FerzXmT~V5D1WDfzpE!{0BtBz_1TyJl-zU%JyqMA0t;sL{uIL zjH5YdNb;a ze$TyrJWP*Y?Gk)ot#B;@Mq$Z-8xESS&V5yOW}o_)!*)o9=3JGZnz|DaSjN4VjEom0{y&H`c63p){bZ$Q0AzhaCg2gfo#{G$wTFh^k zC{PgL9(3t(1)K;zFJKR0ITqrU0GoGsZ6HswlRXINp>dWTtV&GZyl8AhBFlvZ)(uw1 z2gg!yA0X*szwnc@VRf&`1Wa;*HTzXo){EaRN}_W@#DR5HRrh*(dgdYF;$|}HF9lC8 zwXfN3LpYTxs)M{W2VqDf50@xD490P+dpCgYEI~f{HtX3lEvkbLhwYQo3pzySN=B9{ zKpnXz9oQYw%32SB5j-@cL;U0gk;Ejd*Rv(DLIO%*R8V{+dar{u?6ofUi=~mWL4NYw zD+KoBs)IMs+SC!O{*#=K9zDVv!Liz`>%^+)$ZYDA7s}kH@C|Mq2KXOukAP+XB{cLC zqI8LaxfvAInWrpa;75E8w^xJzJ{~aW$+~->xGVMI<8s&oB zvKg+_X{w{5A=(P^bKdF0pNo;g3N&MO+nzrWT6GtY>{ho(L7S2VEQTRse)sUYzym}% zFWG+!KNsTg(fHF-4Uzp6tu{QVs1Yn&Fy+PbEMIEC#1HpmWqu#XX!w0%=-Q8=(?{E-7qm5E0`Td_SbMcj3`AAuk8{c_Wcv64-SLAM3 zwW{OTlrP6x)9!@|a10-G-Zn#Gz4z9B(~bu9w1ZUEKWN3rP1k`c7K2q7$fQ71t{&pM zP%dmVLT!?tqP1mvX#~U(*zKR`s-%+d7xI-(68Zkg?EE}DHI{L|kB(lEutr(EXRv;) z$wk%fs?_iU`GrlE>bcWL72if?ijZKquEpliZt56GKQMg%-T61xEu@ywHACGOKfO*4 zkW3|4%)E=}LlCG+%*v_)n|tAu#u8+-p^v`ioA6aZcn5rDZj*#LzXuAP@4B!^Y^TNU0Y#+~l(i-CZMZ}fgO1zahx;~4VsJt1Lz-aD7fsgcJ8 z2|^%?c|#Kng#;hWX~K7BK-K2e+Pje@aP0np_XV_>Y}trPm=Ec)N1s7>Qw+m!$9M>2dM(jj67#4y*Gty(93nvO$X#A1MJJD`2fB$E!gA zROSOem6Mu$JKdHEsEQM4Agvr7De!c3GAf$EgP-9Bu{zxqITBgGsONm}*bRJf70Jnm zWmn{6sVtxyD6q4#u^}q3OK8+EdJ=`!t}Bh@)X0Y3YSJN!I%=J>mY=>v+O4<6FU&1Z9LJiTqf*HJ7lOoZNI~ zK{~^Cd)}K}sM(Vd^Pm8t9n9u>Z_r5+T(eOAOvEYf-}ID!0X=4zWfTO!;qfZ-fNk0* zW9ki})wxCCZyGXyn1F{nU%N0aKAoGtH;*UzttyGE>Y#2mQ?#9NUc=F7lA6SrcHvnt z4bRR{Bfjhgz{mpnuWz;@?K}p9Ng63Lud=U3!TUra?2W!F#YvG6&Wc`usV2^?2l`nA zwFaa|y+&Wp(Lma0(FhC*8C4iQY_ocSLZ&a(EpKh18v~CsoSd90VFD7rb4QV)HK&3( zSQAxf$)MY|2~AFi1%D1iPZ_4jBcAhpQH#jto-fL3?@UFS0`N^S1lf)OFQBbwJw7uVXI59rn2F*I0 zM&QydjlMq^s)z{!xCt*}0R%2f#X=Gi)}tQU=vx|;aN&<71LPC6@{_|S%qkK#v4NtU zrfR>BFLvg~iw2Ngc%B3*F?nR`U*iEny>XWUG#G{%BA!7h1jY*@3gHoMPG)?f+p8T$Tp&4DG~rCUYh}YX)pC%L!IevU9BBSeQu~|Ewn^LU^y&>R zEC|kr$4&k_%jw-SPd8$3H38DE2P_bLD)-ANTc5A4tZYC9le&Ai3(A|AHLq3N0?V~F zcYiMIUj!QpNiTQ5z)oS&8OW0(pyMFrWev>D&@sdDm9V9J>BbGshDs|x+&VR-JdoEi zv%g=PgXX5Y_jpq5(sFW+25>1MDgeTRANcgirxR2><&;eNMe$#w8?2bfoC`7}zFJBa&-abyG5frYhxUh!B;W2s_2zKn_d+{Fg0XNpYqNcE&RFI{)hW_z3KK#I^%4z$~f`zW(4i2qHLH zIAMBL78d#xDCrR4KufftygdG2;-xwqs`SiEm9yT!KaTHTEH{W4auK~DO9d&DFh&8t z3So2|bDQ4Vi?qa{1SsrFLVq^weTE2p)-jyp-N~TDdaqRubmN@Q^_NY#_fh zdFhgt^tS4#2w@Tvh3W`QSADt8w zJ1rZPKnp4R-e3?8Cr8b!S+NULFT`RzY@SSoXqlHOHp)nBoKf`O22}F3M?b#8S+525 zd2-j1A>utRS*;1*`h3-w1iN#p?;c?*U_O9n6tWBwgN~*j#kv_}O9o4y?)OH2?fmdB ztZwKI);+nJpWGGVT%Lr)hKb=@U$$fVXd|ryJEpfv1jqIG2AH@zj z!z~cfrHuk~?0x(_jVmhBBc}=k&*gGufLW$q>t|p>A{ZlBp-+JO6&i-k0L+ERdv$QJ z9Ue<%VlZzYXX6RvDAksBSv`M*9{3V#kln!dS0_6l<7Xn$E2V43u-e!r#YPK4I$?AG zrm@L;J%p5X6x7Tps*n%HHzD+60mAg+^P<8m-wy0jTeP2g_%I1P(OovB7vpAeWr~Dh zJ(x-k3M>r%c<2updDtbuiN(h_PVTOcdrevf21@0Y(Aorb#F6F2N^I^QMLl=pXTVoj zAjE)hf$tv#;7^cv1a_UirS021WZcg+{B}CWvUJZXUCo}$9a(}rD2|Kku08$s)sV#n zEj`qF(K%&?rF%mu{N!iC<7ZHPkDE)4UR zqGSzw7-uQUl=tHa{Nc#EhfCAUID<>O;EBrRvvy`?w(-C(WveDE|JGobMq)ee#r7*AYN*&^m)h4)m3B{Hw;&n9 zG6h%lT%%cHS!wA86kTA4TYz4aBl#pok9Si1coM@x0+F(i1qw+KLTZvdc6XFcy_!SBGUZ~{OzTKHL>EDBL58-H3<6S`L=yJ#REo#xQGyedt0+2MYNQ#z^~Au+)p&b=eW}TN_C+E6dxyH+CkX=wfR4 zN82j`u|GNY{mrxvg_3O*{U;watqy*&kb!6?I|!J8VyvL`uu1zw%kGdp=;oiog- zlQr3`o{qyYvYGoa%ocC;t?eHK9I}HLY^WeQ~W`nIu{sK7?rq-+zJ&i2bu7 z(c1;}m+NLfXb=dJA^g7)FpVBJNXE+*4wW^#x)Ra_+hPh7%r&uJG;9A z4CD$s41+@9bWSgS`Y1j=5*p>X&O#grYa%V0XncmnfQRY&lKH7I?2KSs_`;M)=;x~5cqrjw@)^# zw!md$t%@TL>-)^a*2Jl;QKb^v*z@vjQHmu4N6D(*;`pP$qnTSltVT$M0=qn2ZrQd? zn5b*bYqItMA?;%B`u=j`M%RTdpynHPx*+f8Og=-tQ;YYD?fNVnhzvn*aBT#Sl~*AM70nqw%2IVDfw>Ox0<1S@#&*c zDR!RsuATB)^NjHK2 zSjmUUB9LRp&vXGO*w6e-9lB{EyL>;NaE}KoV}%v8!r%^vWDXb9Nl$I z??0Q3JbgRqIL54ueI=AQAjwjhp@UtmZMtkZG5w^KZmJMsQ#tR`^DTs*FzWI@%ib~=7H)h(&fp>i8M`>D>9W)PsW&YM?F4i zNnsSFFd8C+S=?9W79I-Qb=U)f|9!~=9tWq7cV7yx2{0*`IZE|>HWGW6m3MhP?OG|{7dxy-;Xrs`YBjV$BzqV3+p%+Ry+=H=%$sD6|X`2 zrsCa2%$rb5(aD=#p*`L0)?raF=)FaM-7Q=XGO{*&=a{^nV@ORDT-TpWcN*`|=XUuF zzoRObR#}hCTL-3(%$0!{_p1ktItuc}enL0hH%cQ)rOJj)3=qyn-=kg#J2_+CpHmg= z2|91OR@%bsJo1D2BY)M;R_^2yNDrN{DY!Oh+`5Q1ty_=eZs`B#nbem2;g7V?=#p7e zOe-u(p^^OUk``6LK`{7Q-tEWimBqVD6l#^?`D*t4;!c7}q0=?rpABGt_4g( zbfkLQBhzN5qj-mN{{6(a4jPsHYVE5=+OU{`!~Vv1?uuU$t2O3jO8tuLr8RS;OEa^Y zva3)V>f#@n13T>Ni@hp_vR=d@7H!1uF8*%goxQEX;(NITBSLqud#yc8op9ULuU}O2 z6#KrRkd-J;7Ezv9c>Xmd=C4uq*3lwrvJ7>F5?E}5<-n>vdv%<@g zrQo2R=RPQX%Q{@ccyA#@z^KeR&JtD%xb`<2%Y)V;$R{tH`ZMLHAL(Uh;+kH^pKTQ0 z=#_OVpm-NMuu0$e-8JCvAX@{k<9**F4{_r=&j-4@Z?N>_HCAySs2MvOEpaS08f~Jk zIh$gh7vQR1Wo&sdJTiGrF|4erRL3*>o>-RN@+Pk0fx%6upl3pX#*&$4h=tG0gCc3~ zlO-KPzujh%8kx5Cd$5YCYSdWLoH2Tno`Z3CGKn4kS06VxEG2uJAZXy14}GuaK+|pY z$n_?Nht$);J$*yf=Lg9bO4k0?tc}StN}38Cd1+;woJLNQF25KzzFo{)V8$qT)2f!l zdnqZ9y3O-N_--xXN&5kF>i)0Yg-fM#Q|iS!rxoq)OoAJ^6vgJG@%y>6hIM^o-L11!>eVcf7tn-a8dg{+o0;C|B|O!*1iV7+<$~ z@rm9|CIGirCK3eoPw071ylNv#B>r^yD%q7E*W&)%c3)}F_QF_c)Rg3}HCNt=kHtI^ z$WC?bl#1N;B-&}FqMKUW^GOs6-(zhFd^wWmM}{$ecA7g^wnD3R$d@#rEuG9^%{Usg zxVKm&tLmfy7J;OW^io(IWj2KsM)Se_cUO@ z Date: Fri, 27 Jun 2025 16:55:59 +0000 Subject: [PATCH 10/29] Fixed pool loading as repository --- source/ubl-settings-repomanager-storage-window.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index bc89e38..4761fea 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -11,6 +11,7 @@ void yon_storage_open_add_repos(char *storage_path, storage_config_window *windo if (size){ for (int i=0;irepos,repo_name)){ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(window->AddEntry); From cb266f7419a784b1e569910c5aeb68c00bd8e37c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 17:36:19 +0000 Subject: [PATCH 11/29] Fixed info label boldness --- source/ubl-settings-repomanager-add-window.c | 28 ++++------- source/ubl-settings-repomanager-move.c | 51 +++++++++++++------- source/ubl-settings-repomanager.c | 18 ++++++- source/ubl-settings-repomanager.h | 5 +- 4 files changed, 64 insertions(+), 38 deletions(-) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index 2063163..fef5012 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -138,10 +138,11 @@ void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ gtk_tree_model_get(model,&iter,2,&target,-1); int size; config_str info = yon_config_load(get_package_info_command(target),&size); + yon_package_info_set_markup(info,size); char *result = yon_char_parsed_to_string(info,size,""); - gtk_label_set_text(GTK_LABEL(window->InfoLabel),result); + gtk_label_set_markup(GTK_LABEL(window->InfoLabel),result); yon_char_parsed_free(info,size); - free(result); + if (!yon_char_is_empty(result)) free(result); } else { gtk_widget_set_sensitive(window->RemoveButton,0); } @@ -213,23 +214,12 @@ void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ int depth = gtk_tree_store_iter_depth(widgets->RepoList,&iter); char *storage=NULL, *repo=NULL, *arch=NULL; - switch (depth){ - case 0: //storage - { - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&storage,-1); - }break; - case 1: //repo - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&repo,-1); - gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,3,&storage,-1); - break; - case 2: //arch - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&arch,-1); - gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,2,&repo,-1); - gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itor, &itar); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itor,3,&storage,-1); - break; + storage_struct *storage_str; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,7,&storage_str,-1); + if (depth==2){ + storage = ((arch_struct*)storage_str)->storage_path; + repo = ((arch_struct*)storage_str)->repo_name; + arch = ((arch_struct*)storage_str)->name; } if (!yon_char_is_empty(storage)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StorageCombo),storage); while(gtk_events_pending()) gtk_main_iteration(); diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index 1e7cb42..dec38e2 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -19,6 +19,7 @@ void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ } void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ + if (gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry))) return; gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetArchEntry)); gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceArchEntry)); GtkWidget *check_repo = NULL; @@ -49,6 +50,13 @@ void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ } } } + if (!yon_char_is_empty(current_repo_selection)||!yon_char_is_empty(check_repo_selection)){ + gtk_widget_set_sensitive(window->MoveSourceArchEntry,1); + gtk_widget_set_sensitive(window->MoveTargetArchEntry,1); + } else { + gtk_widget_set_sensitive(window->MoveSourceArchEntry,0); + gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); + } } @@ -176,7 +184,26 @@ void on_move_accept(GtkWidget *self, dictionary *dict){ const char *source_repo = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry)); const char *target_repo = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveTargetRepoEntry)); const char *arch = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry)); - + if (yon_char_is_empty(storage)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->MoveSourceStorageEntry); + return; + } + if (yon_char_is_empty(source_repo)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->MoveSourceRepoEntry); + return; + } + if (yon_char_is_empty(target_repo)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->MoveTargetRepoEntry); + return; + } + if (yon_char_is_empty(arch)) { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->MoveSourceArchEntry); + return; + } const char *repo_sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)); if (!yon_char_is_empty(storage)&&!yon_char_is_empty(source_repo)&&!yon_char_is_empty(target_repo)&&!yon_char_is_empty(arch)){ @@ -237,22 +264,12 @@ void yon_move_window_set_selected(main_window *widgets, repo_add_window *window) if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ int depth = gtk_tree_store_iter_depth(widgets->RepoList,&iter); char *storage=NULL, *repo=NULL, *arch=NULL; - switch (depth){ - case 0: //storage - { - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&storage,-1); - }break; - case 1: //repo - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&repo,-1); - gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,3,&storage,-1); - break; - case 2: //arch - gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itar, &iter); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itar,2,&repo,-1); - gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itor, &itar); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itor,3,&storage,-1); - break; + storage_struct *storage_str; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,7,&storage_str,-1); + if (depth==2){ + storage = ((arch_struct*)storage_str)->storage_path; + repo = ((arch_struct*)storage_str)->repo_name; + arch = ((arch_struct*)storage_str)->name; } if (!yon_char_is_empty(storage)) gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry),storage); while(gtk_events_pending()) gtk_main_iteration(); diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 6bcd554..8e6cf31 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -216,6 +216,20 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ } } +void yon_package_info_set_markup(config_str parsed, int size){ + for (int i=0;i",temp,":",escaped,NULL); + free(parsed[i]); + free(escaped); + free(temp); + parsed[i]=temp2; + } + } +} + void on_package_selection_changed(GtkWidget *self, main_window *widgets){ GtkTreeIter iter; GtkTreeModel *model; @@ -259,8 +273,10 @@ void on_package_selection_changed(GtkWidget *self, main_window *widgets){ char *command = get_package_info_command(path); int size; config_str parsed = yon_config_load(command,&size); + yon_package_info_set_markup(parsed,size); char *info_label = yon_char_parsed_to_string(parsed,size,""); - gtk_label_set_markup(GTK_LABEL(widgets->InformationLabel),g_markup_escape_text(info_label,strlen(info_label))); + + gtk_label_set_markup(GTK_LABEL(widgets->InformationLabel),info_label); yon_char_parsed_free(parsed,size); if (!yon_char_is_empty(info_label)) free(info_label); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index ff5d9ba..58a2a2c 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -414,4 +414,7 @@ void yon_move_window_set_selected(main_window *widgets, repo_add_window *window) void on_move_add_package(GtkWidget *self, repo_add_window *window); void on_packages_sign(GtkWidget *self, main_window *widgets); void yon_add_window_add_chosen_packages(main_window *widgets, repo_add_window *window); -void yon_storage_open_add_repos(char *storage_path, storage_config_window *window); \ No newline at end of file +void yon_storage_open_add_repos(char *storage_path, storage_config_window *window); +void yon_package_info_set_markup(config_str parsed, int size); +void on_remove_window_tree_changed(GtkWidget *self, repo_add_window *window); +void on_move_window_tree_changed(GtkWidget *self, repo_add_window *window); \ No newline at end of file From ad9606a3b62f3873d1d2f49ca9e37e622ae408d3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Jun 2025 17:51:30 +0000 Subject: [PATCH 12/29] Status messages fix --- source/ubl-settings-repomanager-move.c | 4 ++-- source/ubl-settings-repomanager-remove.c | 6 ++++-- source/ubl-strings.h | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index dec38e2..82e045e 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -226,9 +226,9 @@ void on_move_accept(GtkWidget *self, dictionary *dict){ char *command = NULL; command = yon_move_packages_command(storage,arch,source_repo,target_repo,packages,repo_sign); if (system(command)){ - yon_ubl_status_box_render(PACKAGES_ADD_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_box_render(PACKAGES_MOVE_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } else { - yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_render(PACKAGES_MOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } free(command); } diff --git a/source/ubl-settings-repomanager-remove.c b/source/ubl-settings-repomanager-remove.c index e27b530..3fdb693 100644 --- a/source/ubl-settings-repomanager-remove.c +++ b/source/ubl-settings-repomanager-remove.c @@ -33,8 +33,10 @@ void on_remove_accept(GtkWidget *self, dictionary *dict){ char *final = yon_char_parsed_to_string(packages,size," "); char *command = remove_packages_command(storage_path,arch,repo,final,sign); if (system(yon_debug_output("%s\n",command))){ - - } + yon_ubl_status_box_render(PACKAGES_REMOVE_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else { + yon_ubl_status_box_render(PACKAGES_REMOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } } } gtk_widget_destroy(window->MainWindow); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 64ca711..8c49489 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -88,7 +88,9 @@ #define DATA_LOADED_LABEL _("Data has been loaded") #define PACKAGES_ADD_ERROR_LABEL _("Failed to add packages") #define PACKAGES_ADD_SUCCESS_LABEL _("Packages were added successfully") +#define PACKAGES_REMOVE_ERROR_LABEL _("Packages remove has failed") #define PACKAGES_REMOVE_SUCCESS_LABEL _("Packages were removed successfully") +#define PACKAGES_MOVE_ERROR_LABEL _("Packages move has failed") #define PACKAGES_MOVE_SUCCESS_LABEL _("Packages were moved successfully") #define STORAGES_SAVED_LABEL _("Changes saved") #define KEY_CREATION_SUCCESS_LABEL _("Key was successfully created") From b0e53d3ec3e82b0ba7d7a06b88eb58be88da7b49 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 09:21:25 +0000 Subject: [PATCH 13/29] Changed wiki link --- locale/ubl-settings-repomanager_ru.po | 4 ++++ source/ubl-settings-repomanager.h | 2 -- source/ubl-strings.h | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/locale/ubl-settings-repomanager_ru.po b/locale/ubl-settings-repomanager_ru.po index 35bc933..5ce0fba 100644 --- a/locale/ubl-settings-repomanager_ru.po +++ b/locale/ubl-settings-repomanager_ru.po @@ -21,6 +21,10 @@ msgstr "" msgid "Repository manager" msgstr "Менеджер репозиториев" +#: source/ubl-strings.h:4 +msgid "https://wiki.ublinux.ru/en/Software/Programs_and_utilities/All/ubl-settings-repomanager" +msgstr "https://wiki.ublinux.ru/ru/Software/Programs_and_utilities/All/ubl-settings-repomanager" + #: source/ubl-strings.h:3 msgid "Repository management and configuring" msgstr "Настройка параметров и управление репозиториями системы" diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 58a2a2c..2fd2db4 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -17,8 +17,6 @@ #endif #include "ubl-strings.h" -#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-repomanager" - #define _(String) gettext(String) #define glade_path "/com/ublinux/ui/ubl-settings-repomanager.glade" diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 8c49489..b887100 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -2,6 +2,8 @@ #define TITLE_LABEL _("Repository manager") #define TITLE_INFO_LABEL _("Repository management and configuring") +#define WIKI_LINK _("https://wiki.ublinux.ru/en/Software/Programs_and_utilities/All/ubl-settings-repomanager") + #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.") #define HELP_ALWAYS_OPEN_LABEL _("Always redirect to online documentation") From 52c6d86c05b1e12b38bc1ca297843071612630e9 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 12:11:45 +0000 Subject: [PATCH 14/29] Fixed move window packages path in command; added add window command debug output --- source/ubl-settings-repomanager-add-window.c | 2 +- source/ubl-settings-repomanager-move.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c index fef5012..18e1870 100644 --- a/source/ubl-settings-repomanager-add-window.c +++ b/source/ubl-settings-repomanager-add-window.c @@ -181,7 +181,7 @@ void on_add_packages_accept(GtkWidget *self, dictionary *dict){ command = add_packages_command(storage,arch,repo,packages); } - if (system(command)){ + if (system(yon_debug_output("%s\n",command))){ yon_ubl_status_box_render(PACKAGES_ADD_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } else { yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index 82e045e..551474d 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -214,7 +214,7 @@ void on_move_accept(GtkWidget *self, dictionary *dict){ for_iter(model,&iter){ char *path; gtk_tree_model_get(model,&iter,2,&path,-1); - yon_char_parsed_add_or_create_if_exists(parsed, &size,path); + yon_char_parsed_add_or_create_if_exists(parsed, &size,path+(yon_char_find_last(path,'/')>-1?yon_char_find_last(path,'/')+1:0)); } if (!size) { @@ -225,7 +225,7 @@ void on_move_accept(GtkWidget *self, dictionary *dict){ char *packages = yon_char_parsed_to_string(parsed,size," "); char *command = NULL; command = yon_move_packages_command(storage,arch,source_repo,target_repo,packages,repo_sign); - if (system(command)){ + if (system(yon_debug_output("%s\n",command))){ yon_ubl_status_box_render(PACKAGES_MOVE_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } else { yon_ubl_status_box_render(PACKAGES_MOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); From ba1b42d4f809188db54a3c0651ce9083b293cece Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 15:21:12 +0000 Subject: [PATCH 15/29] Fixed storage window file choosers --- locale/ubl-settings-repomanager.pot | 274 +++++++++-------- locale/ubl-settings-repomanager_ru.po | 280 +++++++++--------- .../ubl-settings-repomanager-storage-window.c | 3 + source/ubl-strings.h | 1 + 4 files changed, 298 insertions(+), 260 deletions(-) diff --git a/locale/ubl-settings-repomanager.pot b/locale/ubl-settings-repomanager.pot index 038bef2..7b5453d 100644 --- a/locale/ubl-settings-repomanager.pot +++ b/locale/ubl-settings-repomanager.pot @@ -26,521 +26,539 @@ msgid "Repository management and configuring" msgstr "" #: source/ubl-strings.h:5 +msgid "" +"https://wiki.ublinux.ru/en/Software/Programs_and_utilities/All/ubl-settings-" +"repomanager" +msgstr "" + +#: source/ubl-strings.h:7 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/ubl-strings.h:6 +#: source/ubl-strings.h:8 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/ubl-strings.h:7 +#: source/ubl-strings.h:9 msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:8 +#: source/ubl-strings.h:10 msgid "Open documentation" msgstr "" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:11 msgid "Project Home Page" msgstr "" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:12 msgid "Nothing were chosen" msgstr "" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:14 msgid "Information" msgstr "" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:16 msgid "Choose package(-s)" msgstr "" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:17 msgid "Choose folder" msgstr "" -#: source/ubl-strings.h:16 +#: source/ubl-strings.h:18 msgid "Add packages" msgstr "" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:19 msgid "Move packages" msgstr "" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:20 msgid "Remove packages" msgstr "" -#: source/ubl-strings.h:20 source/ubl-strings.h:39 +#: source/ubl-strings.h:22 source/ubl-strings.h:41 msgid "Key creation" msgstr "" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:23 msgid "Email:" msgstr "" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:24 msgid "Key additional configuration" msgstr "" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:25 msgid "Commentary:" msgstr "" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:26 msgid "Encryption type:" msgstr "" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:27 msgid "key strength (in bits):" msgstr "" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:28 msgid "Expires:" msgstr "" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:29 msgid "Password:" msgstr "" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:30 msgid "Password confirmation:" msgstr "" -#: source/ubl-strings.h:29 +#: source/ubl-strings.h:31 msgid "Timeless" msgstr "" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 msgid "Until" msgstr "" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:34 msgid "Add" msgstr "" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:36 msgid "Update" msgstr "" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:37 msgid "Configure storages" msgstr "" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:38 msgid "System update" msgstr "" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:40 msgid "Empty important field" msgstr "" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:43 msgid "Repository data has been loaded successfully" msgstr "" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:45 msgid "Saving has succeeded" msgstr "" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:47 msgid "General" msgstr "" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:48 msgid "Publication" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:49 msgid "Trusted repository" msgstr "" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:50 msgid "Server type:" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:51 msgid "IP adress:" msgstr "" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:52 msgid "Port:" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:53 msgid "Publish" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:54 msgid "Code name:" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:55 msgid "Branch:" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:56 msgid "Architecture:" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:57 msgid "Components:" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:58 msgid "Signature:" msgstr "" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:59 msgid "Sign" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:61 msgid "Move" msgstr "" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:62 msgid "Remove" msgstr "" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:64 msgid "Sign repo" msgstr "" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:65 msgid "Remove repo" msgstr "" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:66 msgid "Manage storages" msgstr "" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:67 msgid "Storage:" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:68 msgid "Open existing" msgstr "" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:69 msgid "Create new" msgstr "" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:70 +msgid "Create new storage" +msgstr "" + +#: source/ubl-strings.h:71 msgid "Disable" msgstr "" -#: source/ubl-strings.h:69 +#: source/ubl-strings.h:72 msgid "Delete" msgstr "" -#: source/ubl-strings.h:70 +#: source/ubl-strings.h:73 msgid "Add repository" msgstr "" -#: source/ubl-strings.h:71 +#: source/ubl-strings.h:74 msgid "Repository (-ies)" msgstr "" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:75 msgid "Accept" msgstr "" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:77 msgid "Repository:" msgstr "" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:78 msgid "Source" msgstr "" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:79 msgid "Target" msgstr "" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:80 msgid "Packages sign:" msgstr "" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:81 msgid "Repository sign:" msgstr "" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:82 msgid "Package (-s) to add" msgstr "" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:83 msgid "Package (-s) to remove" msgstr "" -#: source/ubl-strings.h:81 +#: source/ubl-strings.h:84 msgid "Package (-s) to move" msgstr "" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:85 msgid "Name" msgstr "" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:86 msgid "Path" msgstr "" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:87 msgid "Remove package" msgstr "" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:88 msgid "Add package" msgstr "" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:90 msgid "Repository sign failed - repository has no packages" msgstr "" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:91 msgid "Data has been loaded" msgstr "" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:92 msgid "Failed to add packages" msgstr "" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:93 msgid "Packages were added successfully" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:94 +msgid "Packages remove has failed" +msgstr "" + +#: source/ubl-strings.h:95 msgid "Packages were removed successfully" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:96 +msgid "Packages move has failed" +msgstr "" + +#: source/ubl-strings.h:97 msgid "Packages were moved successfully" msgstr "" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:98 msgid "Changes saved" msgstr "" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:99 msgid "Key was successfully created" msgstr "" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:100 msgid "Key creation failed" msgstr "" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:102 msgid "Choose" msgstr "" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:103 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:105 msgid "Open or create repository" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:106 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:107 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:108 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:109 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:110 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:111 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:112 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:113 msgid "Open" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:115 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:117 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:118 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:119 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:120 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:121 msgid "Choose repository or package to sign" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:123 msgid "Name:" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:124 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:125 msgid "< Type branch name >" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:126 msgid "Name must be filled!" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:127 msgid "Choose path for new repository" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:129 msgid "Choose repository folder" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:130 msgid "Choose repository" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:132 msgid "Absent" msgstr "" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:133 msgid "Dependences:" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:134 msgid "Digital signature" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:136 msgid "package" msgstr "" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:137 msgid "repository" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:138 msgid "Repeating packages were not added" msgstr "" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:139 msgid "This repository has already been added" msgstr "" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:141 msgid "Close" msgstr "" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:143 msgid "Are you sure want to disable?" msgstr "" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:145 msgid "Are you sure want to remove?" msgstr "" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:147 msgid "Do not sign" msgstr "" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:149 msgid "Package name error - package has incorrect name pattern" msgstr "" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:151 msgid "Passwords do not match" msgstr "" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:153 msgid "Package search" msgstr "" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:155 msgid "Storage path" msgstr "" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:157 msgid "Repository" msgstr "" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:159 msgid "Architecture" msgstr "" -#: source/ubl-strings.h:156 +#: source/ubl-strings.h:161 msgid "Repository name" msgstr "" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:163 msgid "Signature" msgstr "" -#: source/ubl-strings.h:160 +#: source/ubl-strings.h:165 msgid "Signature status" msgstr "" -#: source/ubl-strings.h:162 +#: source/ubl-strings.h:167 msgid "Sign packages" msgstr "" -#: source/ubl-strings.h:164 +#: source/ubl-strings.h:169 msgid "Packages successfully signed" msgstr "" -#: source/ubl-strings.h:166 +#: source/ubl-strings.h:171 msgid "Folder must contain repositories" msgstr "" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:173 msgid "Folder must not be empty" msgstr "" -#: source/ubl-strings.h:170 +#: source/ubl-strings.h:175 msgid "Name must be 5 or more symbols" msgstr "" -#: source/ubl-strings.h:172 +#: source/ubl-strings.h:177 msgid "Same repository was chosen for source and target" msgstr "" -#: source/ubl-strings.h:174 +#: source/ubl-strings.h:179 msgid "Signed" msgstr "" -#: source/ubl-strings.h:175 +#: source/ubl-strings.h:180 msgid "Unsigned" msgstr "" diff --git a/locale/ubl-settings-repomanager_ru.po b/locale/ubl-settings-repomanager_ru.po index 5ce0fba..7019b3b 100644 --- a/locale/ubl-settings-repomanager_ru.po +++ b/locale/ubl-settings-repomanager_ru.po @@ -21,19 +21,23 @@ msgstr "" msgid "Repository manager" msgstr "Менеджер репозиториев" -#: source/ubl-strings.h:4 -msgid "https://wiki.ublinux.ru/en/Software/Programs_and_utilities/All/ubl-settings-repomanager" -msgstr "https://wiki.ublinux.ru/ru/Software/Programs_and_utilities/All/ubl-settings-repomanager" - #: source/ubl-strings.h:3 msgid "Repository management and configuring" msgstr "Настройка параметров и управление репозиториями системы" #: source/ubl-strings.h:5 +msgid "" +"https://wiki.ublinux.ru/en/Software/Programs_and_utilities/All/ubl-settings-" +"repomanager" +msgstr "" +"https://wiki.ublinux.ru/ru/Software/Programs_and_utilities/All/ubl-settings-" +"repomanager" + +#: source/ubl-strings.h:7 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:6 +#: source/ubl-strings.h:8 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -41,331 +45,343 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/ubl-strings.h:7 +#: source/ubl-strings.h:9 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/ubl-strings.h:8 +#: source/ubl-strings.h:10 msgid "Open documentation" msgstr "Прочитать справку" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:11 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:12 msgid "Nothing were chosen" msgstr "Ничего не выбрано" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:14 msgid "Information" msgstr "Информация" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:16 msgid "Choose package(-s)" msgstr "Выбрать пакеты" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:17 msgid "Choose folder" msgstr "Выбрать директорию для репозитория" -#: source/ubl-strings.h:16 +#: source/ubl-strings.h:18 msgid "Add packages" msgstr "Добавить пакеты" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:19 msgid "Move packages" msgstr "Переместить пакеты" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:20 msgid "Remove packages" msgstr "Удалить пакеты" -#: source/ubl-strings.h:20 source/ubl-strings.h:39 +#: source/ubl-strings.h:22 source/ubl-strings.h:41 msgid "Key creation" msgstr "Создание ключа" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:23 msgid "Email:" msgstr "Адрес электронной почты:" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:24 msgid "Key additional configuration" msgstr "Дополнительные параметры ключа" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:25 msgid "Commentary:" msgstr "Комментарий:" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:26 msgid "Encryption type:" msgstr "Тип шифрования:" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:27 msgid "key strength (in bits):" msgstr "Стойкость ключа (в битах):" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:28 msgid "Expires:" msgstr "Срок действия:" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:29 msgid "Password:" msgstr "Пароль:" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:30 msgid "Password confirmation:" msgstr "Подтверждение пароля:" -#: source/ubl-strings.h:29 +#: source/ubl-strings.h:31 msgid "Timeless" msgstr "Бессрочный" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 msgid "Until" msgstr "До" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:34 msgid "Add" msgstr "Добавить" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:36 msgid "Update" msgstr "Обновить" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:37 msgid "Configure storages" msgstr "Редактировать хранилища" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:38 msgid "System update" msgstr "Обновление системы" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:40 msgid "Empty important field" msgstr "Пустое важное поле" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:43 msgid "Repository data has been loaded successfully" msgstr "Информация о пакетах успешно загружена" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:45 msgid "Saving has succeeded" msgstr "Успешно сохранено" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:47 msgid "General" msgstr "Общие" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:48 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:49 msgid "Trusted repository" msgstr "Доверенный репозиторий" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:50 msgid "Server type:" msgstr "Тип сервера:" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:51 msgid "IP adress:" msgstr "IP-адрес:" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:52 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:53 msgid "Publish" msgstr "Опубликовать" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:54 msgid "Code name:" msgstr "Кодовое имя:" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:55 msgid "Branch:" msgstr "Ветка:" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:56 msgid "Architecture:" msgstr "Архитектура:" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:57 msgid "Components:" msgstr "Компоненты" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:58 msgid "Signature:" msgstr "Подпись:" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:59 msgid "Sign" msgstr "Подписать" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:61 msgid "Move" msgstr "Переместить" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:62 msgid "Remove" msgstr "Удалить" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:64 msgid "Sign repo" msgstr "Подписать репозиторий" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:65 msgid "Remove repo" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:66 msgid "Manage storages" msgstr "Управление хранилищами" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:67 msgid "Storage:" msgstr "Хранилище:" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:68 msgid "Open existing" msgstr "Открыть существующее хранилище" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:69 msgid "Create new" msgstr "Создать" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:70 +msgid "Create new storage" +msgstr "Создать новое хранилище" + +#: source/ubl-strings.h:71 msgid "Disable" msgstr "Отключить" -#: source/ubl-strings.h:69 +#: source/ubl-strings.h:72 msgid "Delete" msgstr "Удалить" -#: source/ubl-strings.h:70 +#: source/ubl-strings.h:73 msgid "Add repository" msgstr "Добавить репозиторий" -#: source/ubl-strings.h:71 +#: source/ubl-strings.h:74 msgid "Repository (-ies)" msgstr "Репозиторий (-ии)" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:75 msgid "Accept" msgstr "Принять" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:77 msgid "Repository:" msgstr "Репозиторий:" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:78 msgid "Source" msgstr "Источник" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:79 msgid "Target" msgstr "Назначение" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:80 msgid "Packages sign:" msgstr "Подпись пакетов:" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:81 msgid "Repository sign:" msgstr "Подпись репозитория:" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:82 msgid "Package (-s) to add" msgstr "Пакет(-ы) для добавления" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:83 msgid "Package (-s) to remove" msgstr "Пакет(-ы) для удаления" -#: source/ubl-strings.h:81 +#: source/ubl-strings.h:84 msgid "Package (-s) to move" msgstr "Пакет(-ы) для перемещения" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:85 msgid "Name" msgstr "Имя" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:86 msgid "Path" msgstr "Путь" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:87 msgid "Remove package" msgstr "Удалить пакет" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:88 msgid "Add package" msgstr "Добавить пакет" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:90 msgid "Repository sign failed - repository has no packages" msgstr "Ошибка подписи репозитория - репозиторий не содержит пакетов" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:91 msgid "Data has been loaded" msgstr "Данные загружены" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:92 msgid "Failed to add packages" msgstr "Ошибка добавления пакетов" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:93 msgid "Packages were added successfully" msgstr "Пакеты успешно добавлены" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:94 +msgid "Packages remove has failed" +msgstr "Ошибка удаления пакетов" + +#: source/ubl-strings.h:95 msgid "Packages were removed successfully" msgstr "Пакеты успешно удалены" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:96 +msgid "Packages move has failed" +msgstr "Ошибка перемещения пакетов" + +#: source/ubl-strings.h:97 msgid "Packages were moved successfully" msgstr "Пакеты успешно перемещены" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:98 msgid "Changes saved" msgstr "Изменения сохранены" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:99 msgid "Key was successfully created" msgstr "Ключ был успешно создан" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:100 msgid "Key creation failed" msgstr "Ошибка создания ключа" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:102 msgid "Choose" msgstr "Выбрать" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:103 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:105 msgid "Open or create repository" msgstr "Открыть или создать репозиторий" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:106 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:107 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:108 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:109 msgid "" "Add/Remove repository from\n" "local package sources" @@ -373,107 +389,107 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:110 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:111 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:112 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:113 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:115 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:117 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:118 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:119 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:120 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:121 msgid "Choose repository or package to sign" msgstr "Выберите репозиторий или пакет для подписи" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:123 msgid "Name:" msgstr "Имя:" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:124 msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:125 msgid "< Type branch name >" msgstr "< Введите название ветки >" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:126 msgid "Name must be filled!" msgstr "Введите название!" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:127 msgid "Choose path for new repository" msgstr "Выбрать расположение нового репозитория" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:129 msgid "Choose repository folder" msgstr "Выбрать директорию для репозитория" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:130 msgid "Choose repository" msgstr "Выбрать репозиторий" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:132 msgid "Absent" msgstr "Отсутствует" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:133 msgid "Dependences:" msgstr "Зависит от:" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:134 msgid "Digital signature" msgstr "Цифровая подпись" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:136 msgid "package" msgstr "пакет" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:137 msgid "repository" msgstr "репозиторий" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:138 msgid "Repeating packages were not added" msgstr "Дублирующиеся пакеты не были добавлены" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:139 msgid "This repository has already been added" msgstr "Этот репозиторий уже был добавлен" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:141 msgid "Close" msgstr "Закрыть" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:143 msgid "Are you sure want to disable?" msgstr "" "Внимание! Вы хотите отключить хранилище от управления менеджером " @@ -483,80 +499,80 @@ msgstr "" "Примечание: в дальнейшем Вы можете заново подключить хранилище и управлять " "им." -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:145 msgid "Are you sure want to remove?" msgstr "" "Внимание! Вы ходите удалить хранилище При этом хранилище и вложенные " "репозитории будут безвозвратно удалены!" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:147 msgid "Do not sign" msgstr "Не подписывать" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:149 msgid "Package name error - package has incorrect name pattern" msgstr "Ошибка имени пакета - некорректное имя пакета" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:151 msgid "Passwords do not match" msgstr "Пароли не совпадают" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:153 msgid "Package search" msgstr "Поиск пакетов" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:155 msgid "Storage path" msgstr "Расположение хранилища" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:157 msgid "Repository" msgstr "Репозиторий" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:159 msgid "Architecture" msgstr "Архитектура" -#: source/ubl-strings.h:156 +#: source/ubl-strings.h:161 msgid "Repository name" msgstr "Имя репозитория" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:163 msgid "Signature" msgstr "Подпись" -#: source/ubl-strings.h:160 +#: source/ubl-strings.h:165 msgid "Signature status" msgstr "Статус подписи" -#: source/ubl-strings.h:162 +#: source/ubl-strings.h:167 msgid "Sign packages" msgstr "Подписать пакеты" -#: source/ubl-strings.h:164 +#: source/ubl-strings.h:169 msgid "Packages successfully signed" msgstr "Пакеты успешно подписаны" -#: source/ubl-strings.h:166 +#: source/ubl-strings.h:171 msgid "Folder must contain repositories" msgstr "Директория должна содержать репозитории" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:173 msgid "Folder must not be empty" msgstr "Директория должна быть пустой" -#: source/ubl-strings.h:170 +#: source/ubl-strings.h:175 msgid "Name must be 5 or more symbols" msgstr "Имя должно содержать больше 5 символов" -#: source/ubl-strings.h:172 +#: source/ubl-strings.h:177 msgid "Same repository was chosen for source and target" msgstr "Для источника и назначения был выбран один и тот же репозиторий" -#: source/ubl-strings.h:174 +#: source/ubl-strings.h:179 msgid "Signed" msgstr "Подписан" -#: source/ubl-strings.h:175 +#: source/ubl-strings.h:180 msgid "Unsigned" msgstr "Не подписан" diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index 4761fea..a6062d8 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -40,6 +40,7 @@ void yon_storage_open_add_repos(char *storage_path, storage_config_window *windo 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_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog->MainFileChooser)); storage_struct *storage = yon_storage_struct_new(); @@ -58,6 +59,8 @@ 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); + 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){ storage_struct *storage = yon_storage_struct_new(); storage->path=dialog->last_success_selection; diff --git a/source/ubl-strings.h b/source/ubl-strings.h index b887100..2fe0c2f 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -67,6 +67,7 @@ #define STORAGE_LABEL _("Storage:") #define OPEN_EXISTING_TOOLTIP_LABEL _("Open existing") #define CREATE_NEW_TOOLTIP_LABEL _("Create new") +#define CREATE_NEW_STORAGE_LABEL _("Create new storage") #define DISABLE_TOOLTIP_LABEL _("Disable") #define DELETE_TOOLTIP_LABEL _("Delete") #define ADD_REPO_TOOLTIP_LABEL _("Add repository") From f94ec4258ddaad1554e6be3e1097edbea242e09b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 15:52:35 +0000 Subject: [PATCH 16/29] Fixed move add package button sensitivity --- source/ubl-settings-repomanager-move.c | 18 +++++++++++++++++- source/ubl-settings-repomanager.h | 3 ++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index 551474d..963f539 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -60,6 +60,17 @@ void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ } +void on_move_check_fill(GtkWidget *self, repo_add_window *window){ + if (gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry))&& + gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry))&& + gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry))&& + gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveTargetStorageEntry))&& + gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveTargetRepoEntry))&& + gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->MoveTargetArchEntry))){ + gtk_widget_set_sensitive(window->AddPackageButton,1); + } +} + void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ GtkWidget *check_arch = NULL; if (self == window->MoveSourceArchEntry){ @@ -74,7 +85,6 @@ void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ gtk_combo_box_set_active_id(GTK_COMBO_BOX(check_arch),chosen); } gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); - gtk_widget_set_sensitive(window->AddPackageButton,1); } void on_move_add_accept(GtkWidget *self, dictionary *dict){ @@ -313,6 +323,12 @@ repo_add_window *on_move_clicked(GtkWidget *self, main_window *widgets){ g_signal_connect(G_OBJECT(window->MoveTargetRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window); g_signal_connect(G_OBJECT(window->MoveTargetArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window); + + g_signal_connect(G_OBJECT(window->MoveSourceStorageEntry),"changed",G_CALLBACK(on_move_check_fill),window); + g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_move_check_fill),window); + g_signal_connect(G_OBJECT(window->MoveSourceArchEntry),"changed",G_CALLBACK(on_move_check_fill),window); + g_signal_connect(G_OBJECT(window->MoveTargetRepoEntry),"changed",G_CALLBACK(on_move_check_fill),window); + g_signal_connect(G_OBJECT(window->MoveTargetArchEntry),"changed",G_CALLBACK(on_move_check_fill),window); g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_move_add_package),window); g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 2fd2db4..fb5f48a 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -415,4 +415,5 @@ void yon_add_window_add_chosen_packages(main_window *widgets, repo_add_window *w void yon_storage_open_add_repos(char *storage_path, storage_config_window *window); void yon_package_info_set_markup(config_str parsed, int size); void on_remove_window_tree_changed(GtkWidget *self, repo_add_window *window); -void on_move_window_tree_changed(GtkWidget *self, repo_add_window *window); \ No newline at end of file +void on_move_window_tree_changed(GtkWidget *self, repo_add_window *window); +void on_move_check_fill(GtkWidget *self, repo_add_window *window); \ No newline at end of file From 9cddcedcc6e6d4ebc374bf9af6a6aa07015d4ab7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 16:06:49 +0000 Subject: [PATCH 17/29] Fixed package info show after moving --- source/ubl-settings-repomanager.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 8e6cf31..2dd8dd5 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -237,8 +237,8 @@ void on_package_selection_changed(GtkWidget *self, main_window *widgets){ GtkTreeIter subiter; GtkTreeModel *submodel; if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&submodel,&subiter)) return; - char *target; - gtk_tree_model_get(submodel,&subiter,1,&target,-1); + char *target, *filename; + gtk_tree_model_get(submodel,&subiter,1,&target,2,&filename,-1); enum YON_REPO_DATA_TYPE data_type; gtk_tree_model_get(model,&iter,8,&data_type,-1); switch (data_type){ @@ -267,7 +267,6 @@ void on_package_selection_changed(GtkWidget *self, main_window *widgets){ case YON_REPO_DATA_ARCH: { arch_struct *arch; gtk_tree_model_get(model,&iter,7,&arch,-1); - char *filename = g_hash_table_lookup(arch->packages,target); char *path = yon_char_unite(arch->storage_path,"/",arch->repo_name,"/",arch->name,"/",filename,NULL); char *command = get_package_info_command(path); From 66d7bb1feac9446470f53a90080f87ad40e42a56 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 16:19:42 +0000 Subject: [PATCH 18/29] Fixed main window update after adding/removing/moving packages --- source/ubl-settings-repomanager-move.c | 1 + source/ubl-settings-repomanager.c | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-repomanager-move.c b/source/ubl-settings-repomanager-move.c index 963f539..14fe774 100644 --- a/source/ubl-settings-repomanager-move.c +++ b/source/ubl-settings-repomanager-move.c @@ -242,6 +242,7 @@ void on_move_accept(GtkWidget *self, dictionary *dict){ } free(command); } + yon_interface_update(widgets); gtk_widget_destroy(window->MainWindow); free(window); } diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 2dd8dd5..28e6cc6 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -109,22 +109,24 @@ void yon_repo_tree_build_arch(char *key, arch_struct *arch, struct repo_tree_bui } void yon_interface_update(main_window *widgets){ - gtk_tree_store_clear(widgets->RepoList); - gtk_list_store_clear(widgets->RepoFileList); - gtk_list_store_clear(widgets->RepoPackagesList); GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path = NULL; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){ path = gtk_tree_model_get_path(model,&iter); } + gtk_tree_store_clear(widgets->RepoList); + gtk_list_store_clear(widgets->RepoFileList); + gtk_list_store_clear(widgets->RepoPackagesList); yon_storages_load(widgets); g_hash_table_foreach(main_config.storages,(GHFunc)yon_repo_tree_build_storage,widgets); if (path){ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),path); + gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),path); gtk_tree_path_free(path); } + // on_main_tree_selection_changed(widgets->Window,widgets); } @@ -173,7 +175,7 @@ void yon_sublist_packages_build(char *key, char *file, main_window *widgets){ gtk_list_store_set(widgets->RepoFileList,&iter,1,key,-1); } -void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ +void on_main_tree_selection_changed(GtkWidget *, main_window *widgets){ gtk_list_store_clear(widgets->RepoFileList); gtk_list_store_clear(widgets->RepoPackagesList); GtkTreeIter iter; From 5d3dbdc4a387d46e5696afd3e26a663ab8e890da Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 30 Jun 2025 16:40:04 +0000 Subject: [PATCH 19/29] Test fix for repo sign indicator --- source/ubl-settings-repomanager.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 28e6cc6..aac26a1 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -96,12 +96,12 @@ void yon_repo_tree_build_arch(char *key, arch_struct *arch, struct repo_tree_bui arch_status = WEXITSTATUS(arch_status); char *image_name = NULL; char *image_tooltip = NULL; - if (arch_status != 2 || package_status != 2){ - image_name = warning_icon_name; - image_tooltip = UNSIGNED_LABEL; - } else if (!arch_status&&!package_status){ + if (!arch_status&&!package_status){ image_name = key_icon_name; image_tooltip = SIGN_LABEL; + } else if (arch_status != 2 || package_status != 2){ + image_name = warning_icon_name; + image_tooltip = UNSIGNED_LABEL; } gtk_tree_store_append(data->widgets->RepoList,&data->architer,&data->repoiter); @@ -126,7 +126,7 @@ void yon_interface_update(main_window *widgets){ gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),path); gtk_tree_path_free(path); } - // on_main_tree_selection_changed(widgets->Window,widgets); + on_main_tree_selection_changed(widgets->Window,widgets); } From 2f3cedc1e5c2cd6be1a9a9427ab441d2c1a22b7f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 1 Jul 2025 12:06:45 +0600 Subject: [PATCH 20/29] Sign fixes --- source/ubl-settings-repomanager-key.c | 4 ++++ source/ubl-settings-repomanager.c | 1 + source/ubl-settings-repomanager.h | 2 +- source/ubl-strings.h | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager-key.c b/source/ubl-settings-repomanager-key.c index 66bcc74..55f30bb 100644 --- a/source/ubl-settings-repomanager-key.c +++ b/source/ubl-settings-repomanager-key.c @@ -140,9 +140,13 @@ void on_sign_window_accept(GtkWidget *self, dictionary *dict){ } if (!system(yon_debug_output("%s\n",yon_sign_package(storage,repo,arch,targets,signature)))){ yon_ubl_status_box_render(SIGN_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } else { + yon_ubl_status_box_render(SIGN_FAIL_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } on_subwindow_close(window->Window); } + yon_interface_update(widgets); } sign_window *yon_sign_window_new(){ diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index aac26a1..916ccf1 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -112,6 +112,7 @@ void yon_interface_update(main_window *widgets){ GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path = NULL; + yon_sign_list_update(); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){ path = gtk_tree_model_get_path(model,&iter); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index fb5f48a..7f09479 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -107,7 +107,7 @@ typedef char* string; #define get_package_info_command(filename) yon_char_unite("pacman -Q --info --file '",filename,"' 2>/dev/null|sed -e 's/ */ /g' -e 's/ : /: /g' -e 's/\\n/ /g' -e 's/^ /\\t/g'",NULL) -#define get_storage_info_label(path, repos, archs) yon_char_unite("",STORAGE_PATH_LABEL,": ", path,"\n\n", REPOS_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,NULL) +#define get_storage_info_lab el(path, repos, archs) yon_char_unite("",STORAGE_PATH_LABEL,": ", path,"\n\n", REPOS_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,NULL) #define get_repo_info_label(repos, archs,sign) yon_char_unite("",REPO_NAME_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,"\n\n",sign,NULL) diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 2fe0c2f..d78e540 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -167,6 +167,7 @@ #define SIGNATURE_TITLE_LABEL _("Sign packages") #define SIGN_SUCCESS_LABEL _("Packages successfully signed") +#define SIGN_FAIL_LABEL _("Package sign has failed") #define EMPTY_FOLDER_LABEL _("Folder must contain repositories") From 3fe841179a1f9cbd29fd03dba8b13af6e77d9bae Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 2 Jul 2025 12:09:34 +0600 Subject: [PATCH 21/29] Changed gpg key creation command --- source/ubl-settings-repomanager.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 7f09479..d5ea5f4 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -119,9 +119,9 @@ Key-Type: ",type,"\n\ Key-Length: 1024\n\ Subkey-Type: ELG-E\n\ Subkey-Length: ",strength,"\n\ -Name-Real: ",name,"\n\ -Name-Comment: ",comment,"\n\ -Name-Email: ",email,"\n\ +Name-Real: ",name,"\n",\ +!yon_char_is_empty(comment)?"Name-Comment: ":"",!yon_char_is_empty(comment)?comment:"",!yon_char_is_empty(comment)?"\n":""\ +"Name-Email: ",email,"\n\ Expire-Date: ",!yon_char_is_empty(expire)?expire:"0","\n\ Passphrase: ",password,"\n\ %commit\n\ From bf1ee25b4aaead960aa83c568ad4e1c8fe89bec0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 2 Jul 2025 12:11:49 +0600 Subject: [PATCH 22/29] Added email as key creation restriction --- source/ubl-settings-repomanager-key.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/ubl-settings-repomanager-key.c b/source/ubl-settings-repomanager-key.c index 55f30bb..01dfd76 100644 --- a/source/ubl-settings-repomanager-key.c +++ b/source/ubl-settings-repomanager-key.c @@ -16,6 +16,11 @@ void on_key_generate_accept(GtkWidget *self, key_creation_window* window){ yon_ubl_status_highlight_incorrect(window->NameEntry); return; } + if (!yon_char_is_empty(email)&&strlen(email)<5){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NAME_SHORT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->EmailEntry); + return; + } GtkWidget *highlight_target=NULL; if (yon_char_is_empty(name)){ highlight_target=window->NameEntry; From f406009dda73ef4df9d0d8dfcc8f8b8fec6c7696 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 2 Jul 2025 12:17:41 +0600 Subject: [PATCH 23/29] Changed gpg key creation command --- source/ubl-settings-repomanager.c | 2 +- source/ubl-settings-repomanager.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 916ccf1..281cf1c 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -303,7 +303,7 @@ void yon_combo_box_text_set_signs(GtkComboBoxText *target){ void yon_sign_list_update(){ if (main_config.signs&&main_config.signs_size) yon_char_parsed_free(main_config.signs,main_config.signs_size); - main_config.signs = yon_config_load(get_gpg_keys_command,&main_config.signs_size); + main_config.signs = yon_config_load(yon_debug_output("%s\n",get_gpg_keys_command),&main_config.signs_size); for (int i=0;i Date: Fri, 4 Jul 2025 12:15:15 +0600 Subject: [PATCH 24/29] Fixed building --- source/ubl-settings-repomanager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 4d0288f..58ab5ff 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -134,7 +134,7 @@ Key-Type: ",type,"\n\ Key-Length: 1024\n\ Subkey-Type: ELG-E\n\ Subkey-Length: ",strength,"\n\ -Name-Real: ",name,"\n"\ +Name-Real: ",name,"\n",\ !yon_char_is_empty(comment)?"Name-Comment: ":"",!yon_char_is_empty(comment)?comment:"",!yon_char_is_empty(comment)?"\n":""\ "Name-Email: ",email,"\n\ Expire-Date: ",!yon_char_is_empty(expire)?expire:"0","\n\ From e8ed37390577c6cb2961bc5f18466ec48ba5b84d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 4 Jul 2025 12:18:59 +0600 Subject: [PATCH 25/29] Fixed storage configuration window crash --- source/ubl-settings-repomanager-storage-window.c | 2 ++ source/ubl-settings-repomanager.c | 2 +- ubl-settings-repomanager-configuration.glade | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index a6062d8..fbf6154 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -243,6 +243,8 @@ storage_config_window *yon_storage_config_window_new(){ } yon_config_register(storage->path,STORAGE_command,yon_char_parsed_to_string(paths,repos_size,",")); } + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddEntry); + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddRepoButton); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window); g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window); diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 281cf1c..d86c2c5 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -422,9 +422,9 @@ main_window *yon_main_window_complete(main_window *widgets){ int main(int argc, char *argv[]){ setlocale(LC_ALL, ""); textdomain (LocaleName); + yon_ubl_connect_config((_template_config*)&main_config); config_init(); - yon_ubl_connect_config((_template_config*)&main_config); yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK); config_str unfound = NULL; int size=0; diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index 32f8374..ff552d3 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -228,6 +228,7 @@ True + False True @@ -239,6 +240,7 @@ True + False True True Add repository From fa85a98427c5b749310be929713f53a49df28eed Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 7 Jul 2025 14:19:30 +0600 Subject: [PATCH 26/29] Test fix for repo creation widgets sensitivity --- source/ubl-settings-repomanager-storage-window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index fbf6154..2ddf9b4 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -243,8 +243,6 @@ storage_config_window *yon_storage_config_window_new(){ } yon_config_register(storage->path,STORAGE_command,yon_char_parsed_to_string(paths,repos_size,",")); } - g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddEntry); - g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddRepoButton); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window); g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window); @@ -252,6 +250,8 @@ storage_config_window *yon_storage_config_window_new(){ g_signal_connect(G_OBJECT(window->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window); + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddEntry); + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddRepoButton); return window; From b3abb772d61771553a43d0c5367eba910d64ec48 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 7 Jul 2025 14:32:38 +0600 Subject: [PATCH 27/29] Fixed repo creation --- source/ubl-settings-repomanager-storage-window.c | 8 ++++++-- source/ubl-settings-repomanager.h | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index 2ddf9b4..e1c74b3 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -207,6 +207,10 @@ void on_storage_changed(GtkWidget *self, storage_config_window *window){ yon_storage_config_update(window); } +void yon_repo_creation_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target){ + gtk_widget_set_sensitive(target,gtk_combo_box_get_active(toggle)>-1 ? 1 : 0); +} + storage_config_window *yon_storage_config_window_new(){ storage_config_window *window = malloc(sizeof(storage_config_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_storage_config); @@ -250,8 +254,8 @@ storage_config_window *yon_storage_config_window_new(){ g_signal_connect(G_OBJECT(window->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window); - g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddEntry); - g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->AddRepoButton); + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_repo_creation_set_sensitive_from_combo_box),window->AddEntry); + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(yon_repo_creation_set_sensitive_from_combo_box),window->AddRepoButton); return window; diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 58ab5ff..d0a0405 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -416,4 +416,5 @@ void yon_storage_open_add_repos(char *storage_path, storage_config_window *windo void yon_package_info_set_markup(config_str parsed, int size); 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); \ No newline at end of file +void on_move_check_fill(GtkWidget *self, repo_add_window *window); +void yon_repo_creation_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target); \ No newline at end of file From aa0299d3a935af02fd68fce7706f0dba73e24d1f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 7 Jul 2025 15:17:24 +0600 Subject: [PATCH 28/29] Repo sign from storage window fix --- .../ubl-settings-repomanager-data-structs.c | 118 +++++++++--------- .../ubl-settings-repomanager-storage-window.c | 3 +- source/ubl-settings-repomanager.h | 2 +- 3 files changed, 62 insertions(+), 61 deletions(-) diff --git a/source/ubl-settings-repomanager-data-structs.c b/source/ubl-settings-repomanager-data-structs.c index ecc77d6..1425065 100644 --- a/source/ubl-settings-repomanager-data-structs.c +++ b/source/ubl-settings-repomanager-data-structs.c @@ -188,68 +188,68 @@ void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha } } -void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct){ - char *changes = config(STORAGE(target_struct->path)); - if (!yon_char_is_empty(changes)){ - int size; - config_str parsed = yon_char_parse(changes,&size,";"); - if (size>0&&!yon_char_is_empty(parsed[0])){ - int removed_size; - config_str removed = yon_char_parse(parsed[0],&removed_size,","); - for (int i=0;irepos,removed[i]); - g_hash_table_remove(target_struct->repos,removed[i]); - yon_repo_sturct_free_full(repo); - } - yon_char_parsed_free(removed,removed_size); - } - if (size>1&&!yon_char_is_empty(parsed[1])){ - int added_size; - config_str added = yon_char_parse(parsed[1],&added_size,","); - for (int i=0;irepos,added[i]); - if (repo){ - repo_struct *copy = yon_repo_copy_full(repo); - g_hash_table_insert(target_struct->repos,copy->path,copy); - } - char *command = create_storage_command(repo->storage_path,repo->name); - yon_launch(yon_debug_output("%s\n",command)); - free(command); +// void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct){ +// char *changes = config(STORAGE(target_struct->path)); +// if (!yon_char_is_empty(changes)){ +// int size; +// config_str parsed = yon_char_parse(changes,&size,";"); +// if (size>0&&!yon_char_is_empty(parsed[0])){ +// int removed_size; +// config_str removed = yon_char_parse(parsed[0],&removed_size,","); +// for (int i=0;irepos,removed[i]); +// g_hash_table_remove(target_struct->repos,removed[i]); +// yon_repo_sturct_free_full(repo); +// } +// yon_char_parsed_free(removed,removed_size); +// } +// if (size>1&&!yon_char_is_empty(parsed[1])){ +// int added_size; +// config_str added = yon_char_parse(parsed[1],&added_size,","); +// for (int i=0;irepos,added[i]); +// if (repo){ +// repo_struct *copy = yon_repo_copy_full(repo); +// g_hash_table_insert(target_struct->repos,copy->path,copy); +// } +// char *command = create_storage_command(repo->storage_path,repo->name); +// yon_launch(yon_debug_output("%s\n",command)); +// free(command); - } +// } - yon_char_parsed_free(added,added_size); - } - if (size>2&&!yon_char_is_empty(parsed[2])){ - int sign_size; - config_str sign = yon_char_parse(parsed[2],&sign_size, ","); - for (int i=0;irepos,key); - char *command = repo_sign_command(repo->storage_path,repo->name,sign_key); - yon_launch(yon_debug_output("%s\n",command)); - free(command); - free(sign_key); - free(key); - } - yon_char_parsed_free(sign,sign_size); - } +// yon_char_parsed_free(added,added_size); +// } +// if (size>2&&!yon_char_is_empty(parsed[2])){ +// int sign_size; +// config_str sign = yon_char_parse(parsed[2],&sign_size, ","); +// for (int i=0;irepos,key); +// char *command = repo_sign_command(repo->storage_path,repo->name,sign_key); +// yon_launch(yon_debug_output("%s\n",command)); +// free(command); +// free(sign_key); +// free(key); +// } +// yon_char_parsed_free(sign,sign_size); +// } - } - GList *list = g_hash_table_get_values(source_struct->repos); - GList *iter; - char *parameter=NULL; - yon_window_config_get_parameter("storage_info",source_struct->path,¶meter,YON_TYPE_STRING); - for (iter=list;iter;iter=iter->next){ - repo_struct *repo = (repo_struct*)iter->data; - char *temp = yon_char_append_element(parameter,repo->path,","); - if (!yon_char_is_empty(parameter)) free(parameter); - parameter = temp; - } - g_list_free(list); - yon_window_config_add_instant_parameter(source_struct->path,"storage_info",parameter,YON_TYPE_STRING); -} +// } +// GList *list = g_hash_table_get_values(source_struct->repos); +// GList *iter; +// char *parameter=NULL; +// yon_window_config_get_parameter("storage_info",source_struct->path,¶meter,YON_TYPE_STRING); +// for (iter=list;iter;iter=iter->next){ +// repo_struct *repo = (repo_struct*)iter->data; +// char *temp = yon_char_append_element(parameter,repo->path,","); +// if (!yon_char_is_empty(parameter)) free(parameter); +// parameter = temp; +// } +// g_list_free(list); +// yon_window_config_add_instant_parameter(source_struct->path,"storage_info",parameter,YON_TYPE_STRING); +// } void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo){ char *str = config(STORAGE(storage->path)); diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index e1c74b3..9eb4d51 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -185,8 +185,9 @@ void yon_storage_remove(char *key, storage_struct *storage,void*){ int size; config_str parsed = yon_char_parse(parameter,&size,","); for (int i=0;i Date: Mon, 7 Jul 2025 15:18:38 +0600 Subject: [PATCH 29/29] Repo sign from storage window fix --- .../ubl-settings-repomanager-data-structs.c | 63 ------------------- 1 file changed, 63 deletions(-) diff --git a/source/ubl-settings-repomanager-data-structs.c b/source/ubl-settings-repomanager-data-structs.c index 1425065..5bd68d0 100644 --- a/source/ubl-settings-repomanager-data-structs.c +++ b/source/ubl-settings-repomanager-data-structs.c @@ -188,69 +188,6 @@ void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha } } -// void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct){ -// char *changes = config(STORAGE(target_struct->path)); -// if (!yon_char_is_empty(changes)){ -// int size; -// config_str parsed = yon_char_parse(changes,&size,";"); -// if (size>0&&!yon_char_is_empty(parsed[0])){ -// int removed_size; -// config_str removed = yon_char_parse(parsed[0],&removed_size,","); -// for (int i=0;irepos,removed[i]); -// g_hash_table_remove(target_struct->repos,removed[i]); -// yon_repo_sturct_free_full(repo); -// } -// yon_char_parsed_free(removed,removed_size); -// } -// if (size>1&&!yon_char_is_empty(parsed[1])){ -// int added_size; -// config_str added = yon_char_parse(parsed[1],&added_size,","); -// for (int i=0;irepos,added[i]); -// if (repo){ -// repo_struct *copy = yon_repo_copy_full(repo); -// g_hash_table_insert(target_struct->repos,copy->path,copy); -// } -// char *command = create_storage_command(repo->storage_path,repo->name); -// yon_launch(yon_debug_output("%s\n",command)); -// free(command); - -// } - -// yon_char_parsed_free(added,added_size); -// } -// if (size>2&&!yon_char_is_empty(parsed[2])){ -// int sign_size; -// config_str sign = yon_char_parse(parsed[2],&sign_size, ","); -// for (int i=0;irepos,key); -// char *command = repo_sign_command(repo->storage_path,repo->name,sign_key); -// yon_launch(yon_debug_output("%s\n",command)); -// free(command); -// free(sign_key); -// free(key); -// } -// yon_char_parsed_free(sign,sign_size); -// } - -// } -// GList *list = g_hash_table_get_values(source_struct->repos); -// GList *iter; -// char *parameter=NULL; -// yon_window_config_get_parameter("storage_info",source_struct->path,¶meter,YON_TYPE_STRING); -// for (iter=list;iter;iter=iter->next){ -// repo_struct *repo = (repo_struct*)iter->data; -// char *temp = yon_char_append_element(parameter,repo->path,","); -// if (!yon_char_is_empty(parameter)) free(parameter); -// parameter = temp; -// } -// g_list_free(list); -// yon_window_config_add_instant_parameter(source_struct->path,"storage_info",parameter,YON_TYPE_STRING); -// } - void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo){ char *str = config(STORAGE(storage->path)); if (!yon_char_is_empty(str)){