From e95eb12c427f4974daa983d91a70061b8373c1b5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 26 Jun 2025 11:38:24 +0000 Subject: [PATCH] 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