From fa5b9bfc31288d500091dc5c1d88f1aaf49d9ecb Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 12 Apr 2024 17:43:00 +0600 Subject: [PATCH 01/82] Repomanager rework beginning --- gresource.xml | 4 +- source/CMakeLists.txt | 17 +- source/ubl-settings-repomanager.c | 1106 ++-------- source/ubl-settings-repomanager.h | 199 +- source/ubl-strings.h | 19 - source/ubl-utils.c | 1924 ----------------- source/ubl-utils.h | 367 ---- ubl-settings-repomanager-add.glade | 620 ++++++ ubl-settings-repomanager-configuration.glade | 337 +++ ubl-settings-repomanager-filechooser.glade | 90 + ubl-settings-repomanager-move.glade | 498 +++++ ...tings-repomanager-progressbar-window.glade | 107 +- ubl-settings-repomanager-windows.glade | 549 ----- ubl-settings-repomanager.css | 84 +- ubl-settings-repomanager.glade | 1678 ++------------ 15 files changed, 2051 insertions(+), 5548 deletions(-) delete mode 100644 source/ubl-utils.c delete mode 100644 source/ubl-utils.h create mode 100644 ubl-settings-repomanager-add.glade create mode 100644 ubl-settings-repomanager-configuration.glade create mode 100644 ubl-settings-repomanager-filechooser.glade create mode 100644 ubl-settings-repomanager-move.glade rename ubl-settings-repomanager-sign.glade => ubl-settings-repomanager-progressbar-window.glade (56%) delete mode 100644 ubl-settings-repomanager-windows.glade diff --git a/gresource.xml b/gresource.xml index 58afa6e..0a81b82 100644 --- a/gresource.xml +++ b/gresource.xml @@ -2,8 +2,8 @@ ubl-settings-repomanager.glade - ubl-settings-repomanager-windows.glade - ubl-settings-repomanager-sign.glade + ubl-settings-repomanager-add.glade + ubl-settings-repomanager-configuration.glade ubl-settings-repomanager.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 4eb002d..62d60b4 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,6 +8,11 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) +pkg_check_modules(VTE291 REQUIRED vte-2.91) +include_directories(${VTE291_INCLUDE_DIRS}) +link_directories(${VTE291_LIBRARY_DIRS}) +add_definitions(${VTE291_CFLAGS_OTHER}) + find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) option(WEBKIT_FOUND "No" OFF) @@ -31,8 +36,8 @@ add_custom_target(GLADE ubl-settings-repomanager.glade) set(DEPENDFILES ../ubl-settings-repomanager.glade - ../ubl-settings-repomanager-windows.glade - ../ubl-settings-repomanager-sign.glade + ../ubl-settings-repomanager-add.glade + ../ubl-settings-repomanager-configuration.glade ../gresource.xml ../ubl-settings-repomanager-banner.png ../ubl-settings-repomanager.css @@ -70,15 +75,17 @@ set(SOURCE_FILES ubl-settings-repomanager.c ubl-settings-repomanager.h ubl-strings.h - ubl-utils.h - ubl-utils.c ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h ) set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} - pthread) + ${VTE291_LIBRARIES} + pthread + ublsettings + ublsettings-gtk3 + ublsettingsui-gtk3) add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 0abdd92..e7deeb9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -2,766 +2,96 @@ config main_config; -/**on_close_subwindow(GtkWidget *self) - * [EN] - * Closes window in which [self] is contained. - * [RU] - * Закрывает окно, в котором расположен виджет [self]. -*/ -void on_close_subwindow(GtkWidget *self){ - gtk_widget_destroy(gtk_widget_get_toplevel(self)); +//storage-configure window section +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); + window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->StoragePathEntry = yon_gtk_builder_get_widget(builder,"StoragePathEntry"); + window->OpenExistingButton = yon_gtk_builder_get_widget(builder,"OpenExistingButton"); + window->CreateNewButton = yon_gtk_builder_get_widget(builder,"CreateNewButton"); + window->DisableButton = yon_gtk_builder_get_widget(builder,"DisableButton"); + window->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton"); + window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox"); + window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); + window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + + return window; +} + +void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ + storage_config_window *window = yon_storage_config_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","storage-configuration-window"); + gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); + gtk_widget_show(window->MainWindow); +} + +//repo-add window section +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->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->AddButton),"clicked",G_CALLBACK(on_subwindow_close),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),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","add-repo-window"); + gtk_widget_show(window->MainWindow); +} + +void 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),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","add-repo-window"); + gtk_widget_show(window->MoveSourceFrame); + gtk_widget_show(window->MoveTargetFrame); + gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + gtk_widget_show(window->MainWindow); +} + +void 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),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","add-repo-window"); + gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + gtk_widget_show(window->MainWindow); } -/**yon_open_browser(GtkWidget *self, char *link) - * [EN] - * Opens browser with [link] link. - * [RU] - * Открывает браузер с [link] ссылкой. -*/ -void yon_open_browser(GtkWidget *self, char *link){ - yon_ubl_browser_window_open(link,TITLE_LABEL); -} - -/**on_open_documentation_confirmation(GtkWidget *self, char *link) - * [EN] - * Opens confirmation window for [link] link. - * [RU] - * Открывает окно подтверждение перехода по ссылке [link]. -*/ -void on_open_documentation_confirmation(GtkWidget *self, char *link){ - if (main_config.always_open_documentation==0){ - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); - documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window)); - widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow"); - widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton"); - widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton"); - widgets->HatText = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel"); - widgets->HeaderText = yon_gtk_builder_get_widget(builder,"helpHeader"); - widgets->InfoText = yon_gtk_builder_get_widget(builder,"helpText"); - widgets->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox"); - gtk_label_set_text(GTK_LABEL(widgets->HatText),TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->HeaderText),HELP_TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->InfoText),HELP_INFO_LABEL); - gtk_button_set_label(GTK_BUTTON(widgets->AcceptButton),OPEN_HELP_LABEL); - gtk_button_set_label(GTK_BUTTON(widgets->AlwaysOpenCheck),HELP_ALWAYS_OPEN_LABEL); - gtk_button_set_label(GTK_BUTTON(widgets->CloseButton),CANCEL_LABEL); - gtk_widget_show_all(widgets->Window); - g_signal_connect(G_OBJECT(widgets->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); - g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link)); - g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); - - - } else { - yon_open_browser(self,link); - } -} - -/**on_link(GtkWidget *self, char* uri, gpointer user_data) - * [EN] - * Signal for hadnling AboutDialog links. - * Connect to "activate-link" signal. - * [self] is AboutDialog window; - * [uri] is activated link; - * [user_data] is pointer for user data, hasn't used in standard handler; - * [RU] - * Функция для обработки сигнала нажатия на ссылку окна AboutDialog. - * Присоединять к сигналу "activate-link". - * [self] - окно AboutDialog; - * [uri] - ссылка, по которой совершается переход; - * [user_data] - указатель на любые другие данные, не используется в стандартном обработчике; -*/ -void on_link(GtkWidget *self, char* uri, gpointer user_data){ - gtk_widget_destroy(self); - on_open_documentation_confirmation(self,uri); -} - -/**on_about() - * [EN] - * Function for setting up and showing AboutDialog. - * Connect it to "activate" signal of Documentation MenuItem. - * [RU] - * Функиця для настройки и показа окна AboutDialog. - * Присоединять к сигналу "activate" кнопки справки типа MenuItem. -*/ -void on_about(){ - GtkBuilder *builder=gtk_builder_new_from_resource(glade_path); - GtkWidget *window=yon_gtk_builder_get_widget(builder,"AboutWindow"); - GtkWidget *title=yon_gtk_builder_get_widget(builder,"headerAboutTopic"); - GtkWidget *hideButtonBox=yon_gtk_builder_get_widget(builder,"buttonBoxHide"); - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window),version_application); - gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window),PROJECT_HOME_LABEL); - gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(title),TITLE_LABEL); - g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL); - gtk_widget_set_visible(hideButtonBox,0); - gtk_widget_destroy(hideButtonBox); - gtk_widget_show(window); -} - -void on_load(){ - gsize size=0; - gsize sigsize=0; - config_str repos = yon_window_config_get_section("repos",&size); - config_str signatures = yon_window_config_get_section("signatures",&sigsize); - gtk_tree_store_clear(main_config.tree_store); - for (int i=0;i",-1); - if (repostatus == 1) gtk_tree_store_set(main_config.tree_store,&iter,0,folder_no_edits,3,0,-1); - else if (repostatus == -1){ - yon_launch(yon_char_unite("rm -rfd ",origin_flagged,NULL)); - yon_window_config_erase_custom_parameter(origin_flagged,"repos"); - GtkTreeIter *deleteIter = gtk_tree_iter_copy(&iter); - if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ - gtk_tree_iter_free(deleteIter); - deleteIter = gtk_tree_iter_copy(&iter); - if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ - gtk_tree_iter_free(deleteIter); - deleteIter = gtk_tree_iter_copy(&iter); - gtk_tree_store_remove(main_config.tree_store,deleteIter); - break; - } else { - gtk_tree_store_remove(main_config.tree_store,&iter); - } - } else { - gtk_tree_store_remove(main_config.tree_store,&iter); - - } - continue; - } - gboolean valid_child=gtk_tree_model_iter_children(GTK_TREE_MODEL(main_config.tree_store),&childIter,&iter); - for (;valid_child;valid_child=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&childIter)){ - char *pack_name, *pack_path; - char *pack_old_repo, *pack_new_repo; - char *pack_code_name, *pack_version, *pack_arch, *pack_depends; - int pack_status=0; - gboolean moved=0; - char *icon; - char *pack_sign; - gboolean pack_signed=0; - - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,0,&icon,1,&pack_name,2,&pack_path,3,&pack_status,4,&pack_old_repo,5,&pack_new_repo,6,&moved,9,&pack_code_name,10,&pack_version,11,&pack_arch,12,&pack_depends,13,&pack_sign,14,&pack_signed,-1); - if (!pack_path) continue; - char *pack_sign_paths; - pack_sign_paths = yon_char_new(pack_path); - yon_char_divide(pack_sign_paths,yon_char_find_last(pack_sign_paths,'/')); - packnames = yon_char_unite(packnames ? yon_char_append(packnames," "):"",pack_sign_paths,NULL); - if (pack_sign&&pack_signed==1){ - char *package_full_name = yon_char_new(pack_path); - yon_char_divide(package_full_name,yon_char_find_last(package_full_name,'/')); - yon_window_config_add_custom_parameter(package_full_name,"signatures",yon_char_new(pack_sign),YON_TYPE_STRING); - yon_char_divide_search(pack_sign,"<",-1); - pack_sign=yon_char_divide_search(pack_sign,">",-1); - if (!pack_groups||!(yon_dictionary_get(&pack_groups,pack_sign))){ - dictionary *dict = yon_dictionary_new(); - dict->key = pack_sign_paths; - yon_dictionary_add_or_create_if_exists_with_data(pack_groups,yon_char_new(pack_sign),dict); - } else { - dictionary *dict = yon_dictionary_new(); - dict->key = pack_sign_paths; - yon_dictionary_add_or_create_if_exists_with_data(pack_groups->data,yon_char_new(pack_sign),dict); - } - } - printf("%d\n",pack_status); - if (pack_status==1||!strcmp(icon,document_added)){ - add_packages = yon_char_unite(add_packages ? yon_char_append(add_packages,",") : "",pack_path,NULL); - yon_char_divide(pack_path,yon_char_find_last(pack_path,'/')); - pack_path = yon_char_unite(origin_flagged,"/pool/overlay/",pack_path,NULL); - gtk_tree_store_set(main_config.tree_store,&childIter,2,pack_path,-1); - repostatus=1; - } else if (pack_status==-1||!strcmp(icon,document_deleted)){ - remove_packages = yon_char_unite(remove_packages ? yon_char_append(remove_packages,",") : "",pack_code_name,NULL); - } - if (pack_status==1||!strcmp(icon,document_added)) gtk_tree_store_set(main_config.tree_store,&childIter,0,document_no_edits,3,0,-1); - if (pack_status == -1||!strcmp(icon,document_deleted)){ - GtkTreeIter *deleteIter = gtk_tree_iter_copy(&childIter); - if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ - gtk_tree_iter_free(deleteIter); - deleteIter = gtk_tree_iter_copy(&childIter); - if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){ - gtk_tree_iter_free(deleteIter); - deleteIter = gtk_tree_iter_copy(&childIter); - gtk_tree_store_remove(main_config.tree_store,deleteIter); - break; - } else { - gtk_tree_store_remove(main_config.tree_store,&childIter); - } - } else { - gtk_tree_store_remove(main_config.tree_store,&childIter); - } - } - } - if (origin_flagged&&name_flagged){ - if (add_packages){ - char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL; - add_command = yon_char_unite(command, " add -d \"",origin_flagged,"\" -r \"",name_flagged, sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" ," -p ", add_packages,NULL); - } - if (remove_packages){ - char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL; - remove_command = yon_char_unite(command, " remove -d \"",origin_flagged,"\" -r \"",name_flagged, sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" , " -p ", remove_packages,NULL); - } - if (repostatus == 1){ - yon_window_config_add_custom_parameter(yon_char_unite(origin_flagged,NULL),"repos",packnames,YON_TYPE_STRING); - } - if (!add_packages&&!signed_packages&&!remove_packages&&repostatus==1) - add_command = yon_char_unite(command, " add -d \"",origin_flagged,"\" -r \"",name_flagged,sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" ,NULL); - if (add_signed_command){ yon_launch(add_signed_command); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);} - if (add_command) { yon_launch(add_command); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);} - if (remove_command) { yon_launch(remove_command); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);} - if (pack_groups){ - dictionary *dct; - for_dictionaries(dct,pack_groups){ - char *signed_packs=NULL; - dictionary *pck; - for_dictionaries(pck,yon_dictionary_get_data(dct,dictionary*)){ - signed_packs=yon_char_unite(signed_packs ? yon_char_append(signed_packs,","): "" ,pck->key,NULL); - } - char *sign_command = yon_char_unite(command, " add -f -d ",origin_flagged," -r ",name_flagged," --sign-pkg ", dct->key," -p $(find ",origin_flagged,"/pool/overlay -name ", signed_packs,")",NULL); - yon_launch(sign_command); - } - - } - if (repo_sign_flagged){ - char *repo_sign_command = yon_char_unite(command, " add -f -d ",origin_flagged, " -r ", name_flagged, " --sign-repo ", repo_sign_flagged ,NULL); - yon_window_config_add_custom_parameter(yon_char_unite(origin_flagged,NULL),"signatures",repo_sign_flagged_full,YON_TYPE_STRING); - yon_launch(repo_sign_command); - } - } - } - yon_ubl_status_box_render(SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -} - -void on_search(GtkCellEditable *self, main_window *widgets){ - GtkTreeIter iter, childIter; - char *name=NULL; - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.tree_store),&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,1,&name,-1); - if (strstr(name,gtk_entry_get_text(GTK_ENTRY(widgets->Finder)))) { - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); - return; - } - gtk_tree_view_expand_row(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),&iter),1); - int child_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(main_config.tree_store),&childIter,&iter); - for (;child_valid;child_valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&childIter)){ - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,1,&name,-1); - if (strstr(name,gtk_entry_get_text(GTK_ENTRY(widgets->Finder)))) { - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&childIter); - return; - } - - } - gtk_tree_view_expand_row(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),&iter),0); - } - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -} - -void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - GtkTreeIter iter; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - char *codeName=NULL,*version=NULL,*architecture=NULL, *dependeces=NULL, *signature=NULL; - int serverType=0,trusted=0,published=0; - gtk_tree_model_get(model,&iter,9,&codeName,10,&version,11,&architecture,12,&dependeces,13,&signature,-1); - gtk_label_set_text(GTK_LABEL(widgets->CodeNameInfoLabel),codeName ? codeName : ""); - gtk_label_set_text(GTK_LABEL(widgets->VersionInfoLabel),version ? version : ""); - gtk_label_set_text(GTK_LABEL(widgets->ArchitectureInfoLabel),architecture ? architecture : ""); - gtk_label_set_text(GTK_LABEL(widgets->DependencesInfoLabel),dependeces ? dependeces : ""); - gtk_label_set_text(GTK_LABEL(widgets->SignatureInfoLabel),signature ? signature : ABSENT_LABEL); - int depth = gtk_tree_store_iter_depth(main_config.tree_store,&iter); - if (depth == 0){ - gtk_widget_set_sensitive(widgets->CreateButton,1); - gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1); - gtk_widget_set_sensitive(widgets->ConfigureButton,1); - gtk_widget_set_sensitive(widgets->DeleteButton,1); - gtk_widget_set_sensitive(widgets->AddPackageButton,1); - gtk_widget_set_sensitive(widgets->RemovePackageButton,0); - gtk_widget_set_sensitive(widgets->SignButton,1); - gtk_widget_set_visible(widgets->NameBox,1); - gtk_widget_set_visible(widgets->DependenceBox,0); - gtk_widget_set_visible(widgets->VersionBox,0); - gtk_widget_set_visible(widgets->ArchitectureBox,0); - gtk_widget_set_visible(widgets->SignatureBox,1); - } else if (depth == 1){ - gtk_widget_set_sensitive(widgets->CreateButton,1); - gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1); - gtk_widget_set_sensitive(widgets->ConfigureButton,0); - gtk_widget_set_sensitive(widgets->DeleteButton,0); - gtk_widget_set_sensitive(widgets->AddPackageButton,1); - gtk_widget_set_sensitive(widgets->RemovePackageButton,1); - gtk_widget_set_sensitive(widgets->SignButton,1); - gtk_widget_set_visible(widgets->NameBox,1); - gtk_widget_set_visible(widgets->DependenceBox,1); - gtk_widget_set_visible(widgets->VersionBox,1); - gtk_widget_set_visible(widgets->ArchitectureBox,1); - gtk_widget_set_visible(widgets->SignatureBox,1); - } - } else { - gtk_widget_set_sensitive(widgets->CreateButton,1); - gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1); - gtk_widget_set_sensitive(widgets->ConfigureButton,0); - gtk_widget_set_sensitive(widgets->DeleteButton,0); - gtk_widget_set_sensitive(widgets->AddPackageButton,0); - gtk_widget_set_sensitive(widgets->RemovePackageButton,0); - gtk_widget_set_sensitive(widgets->SignButton,0); - gtk_widget_set_visible(widgets->NameBox,0); - gtk_widget_set_visible(widgets->DependenceBox,0); - gtk_widget_set_visible(widgets->VersionBox,0); - gtk_widget_set_visible(widgets->ArchitectureBox,0); - gtk_widget_set_visible(widgets->SignatureBox,0); - } -} - -void on_repo_add_new(GtkWidget *self, dictionary *dict){ - main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); - repo_create_window *window = yon_dictionary_get_data(dict->first->next,repo_create_window*); - if (!window->path){ yon_ubl_status_box_render(CHOOSE_PATH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); return;} - char *name=NULL; - - name = window->path; - if (!name||strcmp(name,"")!=0){ - GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); - if (iter){ - struct dirent *de; - GtkTreeIter child; - char *reponame = yon_char_new(name); - yon_char_divide(reponame,yon_char_find_last(reponame,'/')); - char *searchpath = yon_char_unite(name,"/",reponame,"/x86_64/",NULL); - DIR *directory = opendir(searchpath); - if (directory){ - char *found_packages = NULL; - while ((de = readdir(directory))) - { - if (strstr(de->d_name,"pkg.tar.")&&!strstr(de->d_name,".sig")){ - char *filename = yon_char_unite(searchpath,"/",de->d_name,NULL); - FILE *file = popen(get_package_info_command(filename),"r"); - char *cur_string=g_malloc0(sizeof(char)*4096); - char *packname=NULL, *packver=NULL, *packarch=NULL, *packdepends=NULL; - while (fgets(cur_string,4096,file)){ - char *stringe = yon_char_divide_search(cur_string,"\n",-1); - char *p = yon_char_divide_search(stringe,":",-1); - if (strstr(p,"Name")) packname = yon_char_new(stringe); - else if (strstr(p,"Version")) packver = yon_char_new(stringe); - else if (strstr(p,"Architecture")) packarch = yon_char_new(stringe); - else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe); - else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe); - } - gtk_tree_store_append(main_config.tree_store,&child,iter); - gtk_tree_store_set(main_config.tree_store,&child,0,document_no_edits,1,yon_char_unite(packname,"-",packver,"-",packarch,NULL),2,filename,3,0,9,packname,10,packver,11,packarch,12,packdepends,-1); - found_packages = yon_char_unite(found_packages ? yon_char_append(found_packages," ") : "",de->d_name,NULL); - } - } - yon_window_config_add_custom_parameter(window->path,"repos",found_packages,YON_TYPE_STRING); - gtk_tree_store_set(main_config.tree_store,iter,0,folder_no_edits,2,window->path,3,0,9,reponame,-1); - } else { - gtk_tree_store_set(main_config.tree_store,iter,0,folder_added,2,window->path,3,1,9,reponame,-1); - - } - } - } -} - -char *on_choose_repo_folder(GtkWidget *self,repo_create_window *window){ - GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); - gtk_window_set_icon_name(GTK_WINDOW(chooser),icon_path); - int res = gtk_dialog_run(GTK_DIALOG(chooser)); - if (res==GTK_RESPONSE_ACCEPT){ - - char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - window->path=yon_char_new(filename); - } - on_close_subwindow(chooser); -} - -void on_repo_new (GtkWidget *self, main_window *widgets){ - repo_create_window *window = new(repo_create_window); - window->path=NULL; - on_choose_repo_folder(self,window); - dictionary *dict = yon_dictionary_new_with_data("",widgets); - dict = yon_dictionary_append_with_data(dict,"",window); - on_repo_add_new(self,dict); -} - -void on_repo_add_file(GtkWidget *self, main_window *widgets){ - yon_add_file(widgets); -} - -void on_repo_remove_package(GtkWidget *self, main_window *widgets){ - yon_repo_remove_package(widgets); -} - -void on_repo_remove(GtkWidget *self, main_window *widgets){ - yon_repo_remove(widgets); -} - -void on_sign_save(GtkWidget *self, dictionary *dict){ - GtkTreeIter iter; - main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); - repo_sign_window *window = yon_dictionary_get_data(dict->first->next,repo_sign_window*); - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - char *key = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->KeysCombo)); - gtk_tree_store_set(main_config.tree_store,&iter,13,key,14,1,-1); - } - on_tree_selection_changed(self,widgets); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - on_close_subwindow(self); -} - -void on_repo_sign(GtkWidget *self, main_window *widgets){ - repo_sign_window *window = g_malloc(sizeof(repo_sign_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(glade_sign_path); - window->Window = yon_gtk_builder_get_widget(builder,"repoSignWindow"); - window->HeaderLabel = yon_gtk_builder_get_widget(builder,"signHeaderNameLabel"); - window->KeysCombo = yon_gtk_builder_get_widget(builder,"repoSignKeysCombo"); - - window->SaveButton = yon_gtk_builder_get_widget(builder,"repoSignSaveButton"); - window->CloseButton = yon_gtk_builder_get_widget(builder,"repoSignCancelButton"); - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - GtkTreeIter iter; - gtk_window_set_title(GTK_WINDOW(window->Window),TITLE_LABEL); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - if (gtk_tree_store_iter_depth(main_config.tree_store,&iter)==1) - gtk_label_set_text(GTK_LABEL( window->HeaderLabel),yon_char_unite(DIGITAL_SIGNATURE_LABEL," - ",PACKAGE_LABEL,NULL)); - else - gtk_label_set_text(GTK_LABEL( window->HeaderLabel),yon_char_unite(DIGITAL_SIGNATURE_LABEL," - ",REPOSITORY_LABEL,NULL)); - int size=0; - config_str ret = yon_config_load(get_gpg_keys_command,&size); - for (int i=0;iKeysCombo),ret[i]); - } - dictionary *dict = yon_dictionary_new_with_data("",widgets); - dict = yon_dictionary_append_with_data(dict,"",window); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_sign_save),dict); - g_signal_connect(G_OBJECT(window->CloseButton),"clicked", G_CALLBACK(on_close_subwindow),NULL); - - gtk_widget_show(window->Window); - } else { - yon_ubl_status_box_render(SIGN_CHOOSE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - } -} - -void on_repo_configure(GtkWidget *self, main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - GtkTreeIter iter; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - GtkBuilder *builder = gtk_builder_new_from_resource(glade_repo_path); - repo_create_window *window = new(repo_create_window); - window->Window=yon_gtk_builder_get_widget(builder,"repoEditWindow"); - window->NameEntry=yon_gtk_builder_get_widget(builder,"repoEditNameEntry"); - window->CancelButton=yon_gtk_builder_get_widget(builder,"repoEditCancelButton"); - window->SaveButton=yon_gtk_builder_get_widget(builder,"repoEditSaveButton"); - window->BranchesTree=yon_gtk_builder_get_widget(builder,"repoEditBranchTree"); - window->BranchesListStore=GTK_LIST_STORE(gtk_builder_get_object(builder,"curRepoEditList")); - gtk_widget_show(window->Window); - dictionary *dict = yon_dictionary_new_with_data("",widgets); - dict = yon_dictionary_append_with_data(dict,"",window); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_repo_configure_done),dict); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); - gtk_list_store_clear(window->BranchesListStore); - } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); -} - -void on_repo_configure_done(GtkWidget *self, dictionary *dict){ - main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); - repo_create_window *window = yon_dictionary_get_data(dict->first->next,repo_create_window*); - GtkTreeIter iter, parentIter; - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(main_config.tree_store),&parentIter,&iter)) - iter=parentIter; - char *oldname=NULL; - int status=0; - char *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); - gtk_tree_model_get(model,&iter,1,&oldname,3,&status,-1); - if (status==0) - gtk_tree_store_set(main_config.tree_store,&iter,1,name,4,oldname,6,1,-1); - else if (status==1) - gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1); - } - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - on_close_subwindow(self); -} - -void on_repo_load_local(GtkWidget *self, main_window *widgets){ - GtkFileFilter *file_filter = gtk_file_filter_new(); - GtkWidget *chooser = gtk_file_chooser_dialog_new(LOAD_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); - gtk_window_set_icon_name(GTK_WINDOW(chooser),"com.ublinux.ubl-settings-repomanager"); - int res = gtk_dialog_run(GTK_DIALOG(chooser)); - if (res==GTK_RESPONSE_ACCEPT){ - - char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - yon_repo_append(widgets,filename,YON_REPO_LINE_REPO_TYPE); - } - on_close_subwindow(chooser); -} - -GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYPE type){ - GtkTreeIter *retIter=g_malloc0(sizeof(GtkTreeIter)); - GtkTreeIter iter,parentIter; - GtkIconTheme *theme = gtk_icon_theme_get_default(); - char *name_short = yon_char_new(name); - gboolean fls = 0; - while(1){ - yon_char_divide_search(name_short,"/",-1); - if (!strstr(name_short,"/")) break; - } - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&parentIter)){ - if (type==YON_REPO_LINE_REPO_TYPE){ - GtkTreeIter ater; - char *repo_path; - int valid = gtk_tree_model_get_iter_first(model,&ater); - for (;valid;valid=gtk_tree_model_iter_next(model,&ater)){ - gtk_tree_model_get(model,&ater,2,&repo_path,-1); - if (!strcmp(repo_path,name)){ - yon_ubl_status_box_render(REPO_ALREADY_EXISTS_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - return NULL; - } - } - gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, folder_no_edits, 1, name_short,2,name,3,1,4,fls,-1); - retIter = gtk_tree_iter_copy(&iter); - } - else if (type==YON_REPO_LINE_FILE_TYPE){ - GtkTreeIter branch; - if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){ - GtkTreeIter repo; - char *filename; - int valid = gtk_tree_model_iter_nth_child(model,&repo,&branch,0); - for (;valid;valid=gtk_tree_model_iter_next(model,&repo)){ - gtk_tree_model_get(model,&repo,1,&filename,-1); - if (!strcmp(yon_char_divide_search(yon_char_new(name_short),".pkg.tar",-1), filename)){ - yon_ubl_status_box_render(ALREADY_EXIST,BACKGROUND_IMAGE_FAIL_TYPE); - return NULL; - } - free(filename); - } - gtk_tree_store_append(main_config.tree_store,&iter,&branch); - gtk_tree_store_set(main_config.tree_store,&iter,0, document_no_edits, 1, name_short,2,name,3,1,4,fls,-1); - retIter = gtk_tree_iter_copy(&iter); - - } else { - GtkTreeIter repo; - char *filename; - int valid = gtk_tree_model_iter_nth_child(model,&repo,&parentIter,0); - for (;valid;valid=gtk_tree_model_iter_next(model,&repo)){ - gtk_tree_model_get(model,&repo,1,&filename,-1); - if (!strcmp(yon_char_divide_search(yon_char_new(name_short),".pkg.tar",-1), filename)){ - yon_ubl_status_box_render(ALREADY_EXIST,BACKGROUND_IMAGE_FAIL_TYPE); - return NULL; - } - free(filename); - } - gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, document_no_edits, 1, name_short,2,name,3,1,4,fls,-1); - retIter = gtk_tree_iter_copy(&iter); - } - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); - } - else if (type==YON_REPO_LINE_REPO_TYPE){ - gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, folder_no_edits, 1, name_short,2,name,3,1,4,fls,9,name_short,-1); - retIter = gtk_tree_iter_copy(&iter); - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); - } else { - yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - } - return retIter; -} - -void yon_repo_remove_package(main_window *widgets){ - GtkTreeIter iter; - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - GtkTreeIter iterparent; - if (gtk_tree_model_iter_parent(model,&iterparent,&iter)){ - int status = 0; - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&status,-1); - if (status != 1){ - gtk_tree_store_set(main_config.tree_store,&iter,3,-1,-1); - gtk_tree_store_set(main_config.tree_store,&iter,0,document_deleted,-1); - } else gtk_tree_store_remove(main_config.tree_store,&iter); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - }else yon_ubl_status_box_render(CHOOSE_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - } -} - -void yon_repo_remove(main_window *widgets){ - GtkTreeIter iter, childIter, *deletecopy; - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){ - if(gtk_tree_store_iter_depth(main_config.tree_store,&iter)==0){ - int repostatus=0; - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&repostatus,-1); - if (repostatus ==0){ - gtk_tree_store_set(main_config.tree_store,&iter,3,-1,0,folder_deleted,-1); - int valid=gtk_tree_model_iter_children(model,&childIter,&iter); - for (;valid;valid=gtk_tree_model_iter_next(model,&childIter)){ - int status=5; - gtk_tree_model_get(model,&childIter,3,&status,-1); - if (status==1){ - deletecopy = gtk_tree_iter_copy(&childIter); - gtk_tree_model_iter_previous(model,&childIter); - gtk_tree_store_remove(main_config.tree_store,deletecopy); - } else if (status == 0){ - gtk_tree_store_set(main_config.tree_store,&childIter, 0,document_deleted,3,-1,-1); - } - } - } else if (repostatus == 1) { - gtk_tree_store_remove(main_config.tree_store,&iter); - } - }else yon_ubl_status_box_render(CHOOSE_REPO_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); -} - -gboolean yon_check_file_pattern(GtkFileFilterInfo *info){ - if (!strstr(info->filename,".sig")&&strstr(info->filename,".pkg.tar.")) - return 1; - else return 0; -} - -void yon_add_file(main_window *widgets){ - GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); - GtkFileFilter *file_filter = gtk_file_filter_new(); - file_filter = gtk_file_filter_new(); - gtk_file_filter_add_custom(file_filter,GTK_FILE_FILTER_FILENAME,(GtkFileFilterFunc)yon_check_file_pattern,NULL,NULL); - gtk_file_filter_set_name(file_filter,".pkg.tar.*"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); - file_filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(file_filter,"*"); - gtk_file_filter_set_name(file_filter,"All"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); - gtk_window_set_icon_name(GTK_WINDOW(chooser),"com.ublinux.ubl-settings-repomanager"); - int res = gtk_dialog_run(GTK_DIALOG(chooser)); - if (res==GTK_RESPONSE_ACCEPT){ - char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - FILE *file = popen(get_package_info_command(filename),"r"); - char *cur_string=g_malloc0(sizeof(char)*4096); - char *packname=NULL, *packver=NULL, *packarch=NULL, *packdepends=NULL; - while (fgets(cur_string,4096,file)){ - char *stringe = yon_char_divide_search(cur_string,"\n",-1); - char *p = yon_char_divide_search(stringe,":",-1); - if (strstr(p,"Name")) packname = yon_char_new(stringe); - else if (strstr(p,"Version")) packver = yon_char_new(stringe); - else if (strstr(p,"Architecture")) packarch = yon_char_new(stringe); - else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe); - else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe); - } - int add = 1; - GtkTreeIter *iter = yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); - if (iter){ - gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),iter)); - gtk_tree_store_set(main_config.tree_store,iter,0,document_added,1,yon_char_unite(packname,"-",packver,"-",packarch,NULL),2,filename,3,add,9,packname,10,packver,11,packarch,12,packdepends,-1); - } - } - on_tree_selection_changed(NULL,widgets); - on_close_subwindow(chooser); - - -} - - /* setup functions */ void config_init(){ main_config.tree_store=NULL; main_config.always_open_documentation=0; - main_config.win_height=0; - main_config.win_width=0; - main_config.win_pos_x=0; - main_config.win_pos_y=0; main_config.socket_id=-1; main_config.save_socket_id=-1; main_config.load_socket_id=-1; @@ -772,235 +102,65 @@ void config_init(){ main_config.lock_save_local=0; } -main_window *setup_window(){ - /* Widgets getting | Получение виджетов */ - main_window *widgets = malloc(sizeof(main_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); - widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); - widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic"); - widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox"); - widgets->MovePaned = yon_gtk_builder_get_widget(builder,"MovePaned"); - - widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay"); - widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage"); - widgets->HeadBox = yon_gtk_builder_get_widget(builder,"HeaderBox"); - widgets->HeadTitleLabel = yon_gtk_builder_get_widget(builder,"HeaderTitleLabel"); - widgets->HeadInfoLabel = yon_gtk_builder_get_widget(builder,"HeaderInfoLabel"); - - widgets->StatusBox = yon_gtk_builder_get_widget(builder,"mainStatusBox"); - widgets->StatusIcon = yon_gtk_builder_get_widget(builder,"mainStatusIcon"); - widgets->StatusLabel = yon_gtk_builder_get_widget(builder,"mainStatusLabel"); - - widgets->SaveLabel = yon_gtk_builder_get_widget(builder,"headerSaveConfigLabel"); - widgets->SaveMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalLocalConfigurationMenuItem"); - widgets->SaveGlobalMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalConfigurationMenuItem"); - widgets->SaveLocalMenuItem = yon_gtk_builder_get_widget(builder,"SaveLocalConfigurationMenuItem"); - widgets->RightBox = yon_gtk_builder_get_widget(builder,"HeaderRightBox"); - - widgets->LoadLabel = yon_gtk_builder_get_widget(builder,"headerLoadConfigLabel"); - widgets->LoadGlobalMenuItem = yon_gtk_builder_get_widget(builder,"LoadGlobalConfigurationMenuItem"); - widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); - widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); +main_window *yon_main_window_complete(main_window *widgets){ + widgets = yon_remalloc(widgets,sizeof(main_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); + gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0); + // Custom widgets configuration + { + widgets->UpdateButton = yon_gtk_builder_get_widget(builder,"UpdateButton"); + widgets->DBConfigurationButton = yon_gtk_builder_get_widget(builder,"DBConfigurationButton"); + widgets->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); + widgets->MoveButton = yon_gtk_builder_get_widget(builder,"MoveButton"); + widgets->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); + widgets->CloudButton = yon_gtk_builder_get_widget(builder,"CloudButton"); + + widgets->ReposTree = yon_gtk_builder_get_widget(builder,"ReposTree"); + widgets->SearchEntry = yon_gtk_builder_get_widget(builder,"SearchEntry"); + widgets->RepoFileTree = yon_gtk_builder_get_widget(builder,"RepoFileTree"); + widgets->RepoPackagesTree = yon_gtk_builder_get_widget(builder,"RepoPackagesTree"); + widgets->InformationLabel = yon_gtk_builder_get_widget(builder,"InformationLabel"); + + widgets->RepoList = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); + widgets->RepoFileList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoFileList")); + widgets->RepoPackagesTre = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoPackagesTre")); + + 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); + + gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); - widgets->GeneralTabLabel = yon_gtk_builder_get_widget(builder,"GeneralTabLabel"); - widgets->PublicationTabLabel = yon_gtk_builder_get_widget(builder,"PublicationTabLabel"); - widgets->CreateButton = yon_gtk_builder_get_widget(builder,"CreateButton"); - widgets->LoadFromNetButton = yon_gtk_builder_get_widget(builder,"LoadNetButton"); - widgets->ConfigureButton = yon_gtk_builder_get_widget(builder,"ConfigureButton"); - widgets->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton"); - widgets->LoadFromLocalButton = yon_gtk_builder_get_widget(builder,"LoadLocalButton"); - widgets->SwitchPublishButton = yon_gtk_builder_get_widget(builder,"SwitchPublishButton"); - widgets->CheckDependencesButton = yon_gtk_builder_get_widget(builder,"CheckDependencesButton"); - widgets->SignButton = yon_gtk_builder_get_widget(builder,"SignButton"); - widgets->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton"); - widgets->RemovePackageButton = yon_gtk_builder_get_widget(builder,"RemovePackageButton"); - widgets->RepoTree = yon_gtk_builder_get_widget(builder,"RepoTree"); - widgets->TrustedRepoCheck = yon_gtk_builder_get_widget(builder,"TrustedCheck"); - widgets->ServerTypeLabel = yon_gtk_builder_get_widget(builder,"ServerLabel"); - widgets->ServerTypeCombo = yon_gtk_builder_get_widget(builder,"ServerCombo"); - widgets->IpAdressLabel = yon_gtk_builder_get_widget(builder,"IpAdresslabel"); - widgets->IpAdressCombo = yon_gtk_builder_get_widget(builder,"IpAdressCombo"); - widgets->PortLabel = yon_gtk_builder_get_widget(builder,"PortLabel"); - widgets->PortSpin = yon_gtk_builder_get_widget(builder,"PortSpin"); - widgets->OutputEntry = yon_gtk_builder_get_widget(builder,"OutputEntry"); - widgets->CopyButton = yon_gtk_builder_get_widget(builder,"CopyButton"); - widgets->PublishButton = yon_gtk_builder_get_widget(builder,"PublishButton"); - widgets->CodeNameLabel = yon_gtk_builder_get_widget(builder,"CodeNameLabel"); - widgets->CodeNameInfoLabel = yon_gtk_builder_get_widget(builder,"CodeNameInfoLabel"); - widgets->BranchLabel = yon_gtk_builder_get_widget(builder,"BranchLabel"); - widgets->BranchInfoLabel = yon_gtk_builder_get_widget(builder,"BranchInfoLabel"); - widgets->VersionLabel = yon_gtk_builder_get_widget(builder,"VersionLabel"); - widgets->VersionInfoLabel = yon_gtk_builder_get_widget(builder,"VersionInfoLabel"); - widgets->ArchitectureLabel = yon_gtk_builder_get_widget(builder,"ArchitectureLabel"); - widgets->ArchitectureInfoLabel = yon_gtk_builder_get_widget(builder,"ArchitectureInfoLabel"); - widgets->ComponentsLabel = yon_gtk_builder_get_widget(builder,"ComponentsLabel"); - widgets->DependencesInfoLabel = yon_gtk_builder_get_widget(builder,"DependencesInfoLabel"); - widgets->SignatureLabel = yon_gtk_builder_get_widget(builder,"SignatureLabel"); - widgets->SignatureInfoLabel = yon_gtk_builder_get_widget(builder,"SignatureInfoLabel"); - widgets->Finder = yon_gtk_builder_get_widget(builder,"RepoFinder"); - widgets->NameBox = yon_gtk_builder_get_widget(builder,"nameBox"); - widgets->VersionBox = yon_gtk_builder_get_widget(builder,"versionBox"); - widgets->ArchitectureBox = yon_gtk_builder_get_widget(builder,"archBox"); - widgets->DependenceBox = yon_gtk_builder_get_widget(builder,"dependBox"); - widgets->SignatureBox = yon_gtk_builder_get_widget(builder,"signatureBox"); - widgets->SaveButton = yon_gtk_builder_get_widget(builder,"mainSaveButton"); - main_config.tree_store = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); - widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); - widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); - - gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); - GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem); - - if (main_config.lock_load_global == 1){ - gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0); - } - if (main_config.lock_save_global == 1&&main_config.lock_save_local == 1){ - gtk_widget_set_sensitive(gtk_widget_get_parent(gtk_widget_get_parent(widgets->SaveLabel)),0); - }else{ - if (main_config.lock_save_global == 1){ - gtk_widget_set_sensitive(widgets->SaveGlobalMenuItem,0); - gtk_widget_set_sensitive(widgets->SaveMenuItem,0); - } - if (main_config.lock_save_local == 1){ - gtk_widget_set_sensitive(widgets->SaveLocalMenuItem,0); - gtk_widget_set_sensitive(widgets->SaveMenuItem,0); - } + /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ + /* Localisation | Локализация */ + gtk_widget_show(widgets->Window); + return widgets; } - - - /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ - yon_window_config_add_listener(widgets->MovePaned,"pane_position","position",YON_TYPE_INT); - - /* Signal connection | Присоединение сигналов */ - g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); - g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); - g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); - g_signal_connect(G_OBJECT(widgets->CreateButton),"clicked",G_CALLBACK(on_repo_new),widgets); - g_signal_connect(G_OBJECT(widgets->AddPackageButton),"clicked",G_CALLBACK(on_repo_add_file),widgets); - g_signal_connect(G_OBJECT(widgets->RemovePackageButton),"clicked",G_CALLBACK(on_repo_remove_package),widgets); - g_signal_connect(G_OBJECT(widgets->DeleteButton),"clicked",G_CALLBACK(on_repo_remove),widgets); - g_signal_connect(G_OBJECT(widgets->LoadFromLocalButton),"clicked",G_CALLBACK(on_repo_load_local),widgets); - g_signal_connect(G_OBJECT(widgets->ConfigureButton),"clicked",G_CALLBACK(on_repo_configure),widgets); - g_signal_connect(G_OBJECT(widgets->SignButton),"clicked",G_CALLBACK(on_repo_sign),widgets); - g_signal_connect(G_OBJECT(widgets->SaveButton),"clicked",G_CALLBACK(on_save),widgets); - g_signal_connect(G_OBJECT(widgets->RepoTree),"cursor-changed",G_CALLBACK(on_tree_selection_changed),widgets); - g_signal_connect(G_OBJECT(widgets->Finder),"changed",G_CALLBACK(on_search),widgets); - - /* Localisation | Локализация */ - gtk_widget_show(widgets->Window); - - - return widgets; } -int main(int argc, char *argv[]){ +int main(int argc, char *argv[]){ local=setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); - int option_index=0; - int show_help=0; - int debug_mode=0; - { - struct option long_options[] = { - {"help", 0, 0, 'h'}, - {"version", 0, 0, 'V'}, - {"lock-help", 0,0, 1}, - {"lock-save", 0,0, 2}, - {"lock-save-local", 0,0, 3}, - {"lock-save-global", 0,0, 4}, - {"lock-load-global", 0,0, 5}, - {"socket-id", 1, 0, 's'}, - {"socket-ext-id", 1,0, 'e'}, - {"socket-trd-id", 1,0, 't'}, - {"debug", 0,0, 'd'}, - {"clean-config", 0,0, 'c'}, - { NULL, 0, NULL, 0 } - }; - for (int i=0;iSaveMenuItem)))); + gtk_widget_hide(gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(widgets->LoadGlobalMenuItem)))); + widgets = (template_main_window*)yon_main_window_complete((main_window*)widgets); + char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); + yon_window_config_load(path); if (getuid()!=0){ - main_config.lock_load_global=1; - main_config.lock_save_global=1; - main_config.lock_save_local=1; - main_config.lock_root=1; + yon_ubl_status_box_render("",BACKGROUND_IMAGE_SUCCESS_TYPE); } - gtk_init(&argc,&argv); - - - main_window *widgets = setup_window(); - yon_ubl_header_setup_resource(widgets->HeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); - yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); - yon_ubl_status_box_render(LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); - yon_window_config_setup(GTK_WINDOW(widgets->Window)); - yon_window_config_load(config_path); - - /*Check for null config parameter | Проверка на отсутствующий в конфигурации параметр */ - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(widgets->MovePaned),"position",val); - int paned_size = g_value_get_int(val); - if (paned_size<100) - gtk_paned_set_position(GTK_PANED(widgets->MovePaned),400); - - on_load(); - GtkTreeIter *iter = g_malloc0(sizeof(GtkTreeIter)); - if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.tree_store),iter)) - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),iter); - GtkCssProvider *css=gtk_css_provider_new(); - gtk_css_provider_load_from_resource(css,CssPath); - gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), - GTK_STYLE_PROVIDER(css), - -1); gtk_main(); + return 0; } \ No newline at end of file diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 70d39a9..1b0ac73 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -1,6 +1,5 @@ #include #include -#include "ubl-utils.h" #include #include #include @@ -10,7 +9,9 @@ #include #include #include -#include "../compile/ubl-cmake.h" +#include +#include +#include #ifdef WEBKIT_FOUND #include #endif @@ -21,19 +22,17 @@ #define _(String) gettext(String) #define glade_path "/com/ublinux/ui/ubl-settings-repomanager.glade" -#define glade_repo_path "/com/ublinux/ui/ubl-settings-repomanager-windows.glade" -#define glade_sign_path "/com/ublinux/ui/ubl-settings-repomanager-sign.glade" +#define glade_path_repo_add "/com/ublinux/ui/ubl-settings-repomanager-add.glade" +#define glade_path_storage_config "/com/ublinux/ui/ubl-settings-repomanager-configuration.glade" #define banner_path "/com/ublinux/images/ubl-settings-repomanager-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-repomanager.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define icon_path "com.ublinux.ubl-settings-repomanager" -#define folder_no_edits "com.ublinux.ubl-settings-repomanager.folder-symbolic" -#define folder_deleted "com.ublinux.ubl-settings-repomanager.folder-red-symbolic" -#define folder_added "com.ublinux.ubl-settings-repomanager.folder-green-symbolic" -#define document_no_edits "com.ublinux.ubl-settings-repomanager.document-symbolic" -#define document_deleted "com.ublinux.ubl-settings-repomanager.document-red-symbolic" -#define document_added "com.ublinux.ubl-settings-repomanager.document-green-symbolic" +#define folder_no_edits "com.ublinux.libublsettingsui-gtk3.folder-symbolic" +#define document_no_edits "com.ublinux.libublsettingsui-gtk3.key-symbolic" +#define document_deleted "com.ublinux.ubl-settings-repomanager.key-red-symbolic" +#define document_added "com.ublinux.ubl-settings-repomanager.key-green-symbolic" #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-repomanager" @@ -49,143 +48,69 @@ string version_application; char *local; typedef struct { + template_config_fields GtkTreeStore *tree_store; - int always_open_documentation; - int win_pos_x; - int win_pos_y; - int win_width; - int win_height; - - int socket_id; - int load_socket_id; - int save_socket_id; - - int lock_help; - int lock_save_local; - int lock_save_global; - int lock_load_global; int lock_root; } config; typedef struct { - GtkWidget *Window; - GtkWidget *HatLabel; - GtkWidget *PlugBox; - - GtkWidget *MovePaned; - - GtkWidget *HeadOverlay; - GtkWidget *HeadImage; - GtkWidget *HeadBox; - GtkWidget *HeadTitleLabel; - GtkWidget *HeadInfoLabel; - - GtkWidget *StatusBox; - GtkWidget *StatusIcon; - GtkWidget *StatusLabel; - - GtkWidget *SaveLabel; - GtkWidget *SaveMenuItem; - GtkWidget *SaveGlobalMenuItem; - GtkWidget *SaveLocalMenuItem; - GtkWidget *RightBox; - - GtkWidget *LoadLabel; - GtkWidget *LoadGlobalMenuItem; - GtkWidget *LoadLocalMenuItem; - GtkWidget *LeftBox; - - GtkWidget *DocumentationMenuItem; - GtkWidget *AboutMenuItem; - - GtkWidget *GeneralTabLabel; - GtkWidget *PublicationTabLabel; - GtkWidget *CreateButton; - GtkWidget *LoadFromNetButton; - GtkWidget *ConfigureButton; - GtkWidget *DeleteButton; - GtkWidget *LoadFromLocalButton; - GtkWidget *SwitchPublishButton; - GtkWidget *CheckDependencesButton; - GtkWidget *SignButton; - GtkWidget *AddPackageButton; - GtkWidget *RemovePackageButton; - GtkWidget *RepoTree; - GtkWidget *TrustedRepoCheck; - GtkWidget *ServerTypeLabel; - GtkWidget *ServerTypeCombo; - GtkWidget *IpAdressLabel; - GtkWidget *IpAdressCombo; - GtkWidget *PortLabel; - GtkWidget *PortSpin; - GtkWidget *OutputEntry; - GtkWidget *CopyButton; - GtkWidget *PublishButton; - GtkWidget *CodeNameLabel; - GtkWidget *CodeNameInfoLabel; - GtkWidget *BranchLabel; - GtkWidget *BranchInfoLabel; - GtkWidget *VersionLabel; - GtkWidget *VersionInfoLabel; - GtkWidget *ArchitectureLabel; - GtkWidget *ArchitectureInfoLabel; - GtkWidget *ComponentsLabel; - GtkWidget *DependencesInfoLabel; - GtkWidget *SignatureLabel; - GtkWidget *SignatureInfoLabel; - GtkWidget *Finder; - GtkWidget *SaveButton; - GtkWidget *NameBox; - GtkWidget *VersionBox; - GtkWidget *ArchitectureBox; - GtkWidget *DependenceBox; - GtkWidget *SignatureBox; + template_window_fields + GtkWidget *UpdateButton; + GtkWidget *DBConfigurationButton; + GtkWidget *AddButton; + GtkWidget *MoveButton; + GtkWidget *RemoveButton; + GtkWidget *CloudButton; + GtkWidget *ReposTree; + GtkWidget *RepoFileTree; + GtkWidget *SearchEntry; + GtkWidget *RepoPackagesTree; + GtkWidget *InformationLabel; + GtkTreeStore *RepoList; + GtkListStore *RepoFileList; + GtkListStore *RepoPackagesTre; } main_window; typedef struct { - GtkWidget *Window; - GtkWidget *NameEntry; - GtkWidget *BranchesTree; + GtkWidget *MainWindow; + GtkWidget *StatusBox; + GtkWidget *HeadLabel; GtkWidget *CancelButton; - GtkWidget *SaveButton; - GtkCellRenderer *BranchCell; - GtkWidget *repoChooseFolderButton; - - GtkListStore *BranchesListStore; - GtkWidget *PathLabel; - char *path; -} repo_create_window; - -typedef struct { - GtkWidget *Window; - GtkWidget *HeaderLabel; - GtkWidget *KeysCombo; - - GtkWidget *CloseButton; - GtkWidget *SaveButton; -} repo_sign_window; + GtkWidget *AddButton; + GtkWidget *MoveSourceFrame; + GtkWidget *MoveSourceStorageEntry; + GtkWidget *MoveSourceRepoEntry; + GtkWidget *MoveSourceArchEntry; + GtkWidget *MoveTargetFrame; + GtkWidget *MoveTargetStorageEntry; + GtkWidget *MoveTargetRepoEntry; + GtkWidget *MoveTargetArchEntry; + GtkWidget *StorageCombo; + GtkWidget *RepositoryCombo; + GtkWidget *ArchitectureCombo; + GtkWidget *PackageSignCombo; + GtkWidget *RepoSignCombo; + GtkWidget *AddPackageButton; + GtkWidget *RemoveButton; + GtkWidget *PackagesTree; + GtkWidget *InfoLabel; + GtkListStore *PackagesList; +} repo_add_window; typedef struct { - GtkWidget *Window; - - GtkWidget *HatText; - GtkWidget *HeaderText; - GtkWidget *InfoText; - GtkWidget *AlwaysOpenCheck; - - GtkWidget *CloseButton; + GtkWidget *MainWindow; + GtkWidget *HeadLabel; + GtkWidget *CancelButton; GtkWidget *AcceptButton; -} documentation_confirmation_window; - -typedef enum { - YON_REPO_LINE_REPO_TYPE, - YON_REPO_LINE_FILE_TYPE, - YON_REPO_LINE_BRANCH_TYPE -} YON_REPO_LINE_TYPE; + GtkWidget *StatusBox; + GtkWidget *StoragePathEntry; + GtkWidget *OpenExistingButton; + GtkWidget *CreateNewButton; + GtkWidget *DisableButton; + GtkWidget *DeleteButton; + GtkWidget *ReposBox; + GtkWidget *AddEntry; + GtkWidget *AddRepoButton; +} storage_config_window; -main_window *setup_window(); -void yon_add_file(main_window *widgets); -GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYPE type); -void yon_repo_remove_package(main_window *widgets); -void yon_repo_remove(main_window *widgets); -void on_repo_configure_done(GtkWidget *self, dictionary *dict); \ No newline at end of file +main_window *setup_window(); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 872817d..86c5b73 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,25 +1,6 @@ -#define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) -#define HELP_LABEL yon_char_unite(_("ubl-settings-repomanager version:")," ", version_application,"\n",TITLE_LABEL,"\n",_("Usage:"), " ubl-settings-repomanager ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL) - -#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") #define TITLE_LABEL _("Repository manager") #define TITLE_INFO_LABEL _("Repository management and configuring") -#define SUCCESS_LABEL _("Operation succeeded") - -#define ABOUT_LABEL _("About") -#define DOCUMENTATION_LABEL _("Documentation") - -#define SAVE_LOCAL_LABEL _("Save to local configuration") -#define SAVE_GLOBAL_LABEL _("Save to global configuration") -#define SAVE_CONFIGURATION_LABEL _("Save configuration") -#define SAVE_LABEL _("Save") - -#define LOAD_LOCAL_LABEL _("Load local configuration") -#define LOAD_GLOBAL_LABEL _("Load global configuration") -#define LOAD_LABEL _("Load") - -#define CANCEL_LABEL _("Cancel") #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.") diff --git a/source/ubl-utils.c b/source/ubl-utils.c deleted file mode 100644 index b75f4ff..0000000 --- a/source/ubl-utils.c +++ /dev/null @@ -1,1924 +0,0 @@ -#include "ubl-utils.h" - -// dictionary functions - -/**yon_dictionary_new(): - * [EN] - * Creates and returns empty dictionary - * [RU] - * Создаёт и возвращает пустой словарь. - */ -dictionary *yon_dictionary_new() -{ - dictionary *dict = malloc(sizeof(dictionary)); - dict->data = NULL; - dict->key = NULL; - dict->next = NULL; - dict->prev = NULL; - dict->first = dict; - dict->data_type = DICTIONARY_OTHER_TYPE; - return dict; -} - -/**yon_dictionary_copy(dictionary *dict) - * [EN] - * - * [RU] - * Создаёт и возвращает копию элемента словаря [dict] -*/ -dictionary *yon_dictinoary_copy(dictionary *dict){ - dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); - dct->data_type= dict->data_type; - return dct; -} - -/**yon_dictionary_copy_deep(dictionary *dict) - * [EN] - * - * [RU] - * Создаёт полную копию словаря [dict] и возвращает первый элемент -*/ -dictionary *yon_dictionary_copy_deep(dictionary *dict){ - dictionary *dct = NULL; - dictionary *newone=NULL; - for_dictionaries(dct,dict){ - yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data); - newone->data_type=dct->data_type; - } - return newone->first; -} - -/**int yon_dictionary_set_data(dictionary *dict, void *data) - * [EN] - * - * [RU] - * Установить элементу словаря [dict] значение [data] -*/ -int yon_dictionary_set_data(dictionary *dict, void *data){ - dict->data=data; -} - -/**int yon_dictionary_set_key(dictionary *dict, char *key) - * [EN] - * - * [RU] - * Изменяет ключ элемента словаря [dict] на [key] -*/ -int yon_dictionary_set_key(dictionary *dict, char *key){ - dict->key=key; - return 1; -} - -/** int yon_dictionary_set(dictionary *dict, char *key, void *data) - * [EN] - * - * [RU] -* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] -*/ -int yon_dictionary_set(dictionary *dict, char *key, void *data){ - dict->key=key; - dict->data=data; - return 1; -} - -/**int yon_dictionary_empty(dictionary *dict) - * [EN] - * - * [RU] - * Очищает элемент словаря [dict] от данных -*/ -int yon_dictionary_empty(dictionary *dict){ - dict->data=NULL; - dict->data_type=DICTIONARY_OTHER_TYPE; - return 1; -} - -/**yon_dictionary_switch_to_last(dictionary **dict) - * [EN] - * - * [RU] - * Переключает словарь [dict] на последний элемент. -*/ -void yon_dictionary_switch_to_last(dictionary **dict) -{ - dictionary *dct=NULL, *dact=*dict; - for_dictionaries(dct,dact); -} - -/**yon_dictionary_create_conneced(dictionary *targetdict) - * [EN] - * - * [RU] - * Создаёт новый элемент словаря [targetdict] -*/ -dictionary *yon_dictionary_append(dictionary *targetdict) -{ - targetdict = yon_dictionary_get_last(targetdict); - targetdict->next = yon_dictionary_new(); - targetdict->next->prev = targetdict; - targetdict->next->first = targetdict->first; - targetdict->next->data_type = DICTIONARY_OTHER_TYPE; - return targetdict->next; -} - -/**yon_dictionary_get_last(dictionary *dict) - * [EN] - * - * [RU] - * Возвращает последний элемент словаря [dict]. - * В отличае от yon_dictionary_switch_to_last() - * словарь [dict] остаётся на прежнем элементе. -*/ -dictionary *yon_dictionary_get_last(dictionary *dict) -{ - if (dict->next){ - dictionary *dct = NULL; - for_dictionaries(dct,dict); - return dct; - } else return dict; -} - -/**yon_dictionary_switch_places(dictionary *dict, int aim) - * [EN] - * - * [RU] - * Меняет элемент словаря [dict] местами с другим элементом. - * если [aim]<0 элемент меняется местами с левым элементом; - * если [aim]>0 элемент меняется местами с правым элементом; -*/ -dictionary *yon_dictionary_swap(dictionary *dict, int aim) -{ - if (aim < 0) - { - if (dict->prev) - { - if (dict->prev->prev) - { - dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev; - if (next) - { - preprev->next = dict; - dict->prev = preprev; - dict->next = prev; - prev->prev = dict; - prev->next = next; - next->prev = prev; - } - else - { - preprev->next = dict; - dict->prev = preprev; - dict->next = prev; - prev->prev = dict; - prev->next = NULL; - } - return prev; - } - else - { - dictionary *next = dict->next, *prev = dict->prev; - if (next) - { - yon_dictionary_make_first(dict); - dict->prev = NULL; - dict->next = prev; - prev->prev = dict; - prev->next = next; - next->prev = prev; - } - else - { - dict->prev = NULL; - dict->next = prev; - prev->prev = dict; - prev->next = NULL; - } - return prev; - } - } - } - else if (aim > 0) - { - if (dict->next) - { - if (dict->next->next) - { - dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next; - if (prev) - { - prev->next = next; - next->prev = prev; - next->next = dict; - dict->prev = next; - dict->next = afnext; - afnext->prev = dict; - } - else - { - yon_dictionary_make_first(next); - next->prev = NULL; - next->next = dict; - dict->prev = next; - dict->next = afnext; - afnext->prev = dict; - } - return next; - } - else - { - dictionary *next = dict->next, *prev = dict->prev; - if (prev) - { - prev->next = next; - next->prev = prev; - next->next = dict; - dict->prev = next; - dict->next = NULL; - } - else - { - next->prev = NULL; - next->next = dict; - dict->prev = next; - dict->next = NULL; - } - } - } - } -} - -/**yon_dictionary_make_first(dictionary *dict) - * [EN] - * - * [RU] - * Устанавливает указатель первого элемента словаря [dict] - * на текущий элемент. Не использовать. -*/ -void yon_dictionary_make_first(dictionary *dict) -{ - for (dictionary *dct = dict->first; dct != NULL; dct = dct->next) - { - dct->first = dict; - } -} - -/**yon_dictionary_make_nth(dictionary *dict, int nth) - * [EN] - * - * [RU] - * Перемещает элемент словаря [dict] на позицию [nth]. -*/ -void yon_dictionary_make_nth(dictionary *dict, int nth) -{ - dictionary *dct = dict->first; - for (int i = 0; i < nth; i++) - { - if (dct == NULL) - return; - else - dct = dct->next; - } - yon_dictionary_rip(dict); - dictionary *prev = dct->prev; - prev->next = dict; - dict->prev = prev; - dict->next = dct; - dct->prev = dict; -} - -/**yon_dictionary_create_with_data(char *key, void *data) - * [EN] - * - * [RU] - * Создаёт новый словарь с ключом [key] и указателем на данные [data] -*/ -dictionary *yon_dictionary_new_with_data(char *key, void *data) -{ - dictionary *dct = yon_dictionary_new(); - dct->key = yon_char_new(key); - dct->data = data; - dct->data_type = DICTIONARY_OTHER_TYPE; - return dct; -} - -/** void *yon_dictionary_free_all(dictionary *dictionary,void *data_manipulation) - * [EN] - * Frees whole [dictionary] and activates [data_manipulation] function if not NULL with [dictionary]->data argument for each dictionary. - * [RU] - * Освобождает память для всех элементов словаря [dictionary] и активирует функцию [data_manipulation], если она была передана, с аргументом [dictionary]->data на каждый элемент словаря. -*/ -void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){ - dictionary *dict=NULL; - for_dictionaries(dict,dictionary_to_free){ - if(data_manipulation) - data_manipulation(dict->data); - if(dict->prev) - free(dict->prev); - } - free(dict); - return NULL; -} - -/**yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data) - * [EN] - * - * [RU] - * Создаёт новый элемент словаря, присоединяемый в конец словаря [dict] - * с ключом [key] и указателем на данные [data] -*/ -dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data) -{ - dictionary *dct = yon_dictionary_append(dict); - dct->key = yon_char_new(key); - dct->data = data; - dct->data_type = DICTIONARY_OTHER_TYPE; - return dct; -} - -/**yon_dictionary_connect(dictionary *old, dictionary *toconnect) - * [EN] - * - * [RU] - * Присоединяет словарь [toconnect] в конец словаря [old]. -*/ -dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect) -{ - dictionary *dict = yon_dictionary_get_last(old); - dict->next = toconnect; - toconnect->prev = dict; - toconnect->first = dict->first; - return toconnect; -} - -/**yon_dictionary_get(dictionary **dict, char *key) - * [EN] - * - * [RU] - * Возвращает элемент словаря [dict] с ключом [key]. - * Если такого элемента не было обнаружено, возвращается NULL -*/ -dictionary *yon_dictionary_get(dictionary **dict, char *key) -{ - dictionary *dct = *dict; - for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next) - { - if (strcmp(pointer->key, key) == 0) - { - *dict = pointer; - return pointer; - } - } - return NULL; -} - -/**yon_dictionary_rip(dictionary *dict) - * [EN] - * - * [RU] - * Вырезает элемент из словаря и возвращает вырезанный элемент. -*/ -dictionary *yon_dictionary_rip(dictionary *dict) -{ - if (!dict->next&&!dict->prev) return NULL; - else if (!dict->next) - { - dictionary *prev = dict->prev; - if (prev) - { - prev->next = NULL; - return prev; - } - else - return dict; - } - else if (!dict->prev) - { - dictionary *next = dict->next; - if (next) - { - yon_dictionary_make_first(next); - next->prev = NULL; - return next; - } - else - return dict; - } - else - { - dictionary *next = dict->next, *prev = dict->prev; - next->prev = prev; - prev->next = next; - return next; - } -} - -/**yon_dictionary_get_nth(dictionary *dict, int place) - * [EN] - * - * [RU] - * Возвращает [place]-й элемент словаря [dict] -*/ -dictionary *yon_dictionary_get_nth(dictionary *dict, int place) -{ - if (dict){ - dict = dict->first; - int i = 0; - for (i = 0; i < place; i++) - if (dict->next) - dict = dict->next; - else - break; - if (i == place) - return dict; - else - return NULL; - } else return NULL; -} - -// char functions - -int yon_char_find_last(char *source, char find){ - int size = strlen(source); - int i=size; - for (;source[i]!=find&&i>0;i--); - return i; -} - -/**[EN] - * - * creates new char string by combining two char strings. - */ -char *yon_char_append(char *source, char *append) -{ - if (source && append) - { - int size = strlen(source) + strlen(append) + 1; - char *final = malloc(size); - memset(final, 0, size); - if (strstr(source, "%%")) - sprintf(final, source, append); - else - sprintf(final, "%s%s", source, append); - return final; - } - else - return NULL; -} - -/**[EN] - * - * creates new char string by copying another char. - */ -char *yon_char_new(char *chr) -{ - if (chr){ - char *newchar = malloc(strlen(chr) + 1); - memset(newchar, 0, strlen(chr) + 1); - memcpy(newchar, chr, strlen(chr)); - return newchar; - } else - return NULL; -} - -/**yon_char_unite(char *source, ...) - * [En] - * - * [RU] - * Объединяет строку [source] со всеми строками, написанными в [...] -*/ -char *yon_char_unite(char *source, ...){ - va_list arglist; - char *new_char=NULL; - char *unite_char=NULL; - new_char=yon_char_new(source); - va_start(arglist,source); - unite_char = va_arg(arglist,char*); - while(unite_char){ - new_char = yon_char_append(new_char,unite_char); - unite_char = va_arg(arglist,char*); - } - va_end(arglist); - return new_char; -} - -/**yon_cut(char *source, int size, int startpos) - * [EN] - * cuts source string by size length from startpos position. - */ -char *yon_cut(char *source, int size, int startpos) -{ - char *cut = NULL; - cut = malloc(size + 1); - memset(cut, 0, size + 1); - memcpy(cut, source + startpos, size); - return cut; -} - -/**yon_char_divide(char *source, int dividepos) - * [EN] - * divides source string in dividepos position, - * returning left part of divided string and - * inserting right part to source string. - */ -char *yon_char_divide(char *source, int dividepos) -{ - char *cut = malloc(dividepos + 1); - memset(cut, 0, dividepos + 1); - memcpy(cut, source, dividepos); - char *left = malloc(strlen(source) - strlen(cut)); - memset(left, 0, strlen(source) - strlen(cut)); - memcpy(left, source + dividepos + 1, (strlen(source) - dividepos)); - memset(source, 0, strlen(source)); - memcpy(source, left, strlen(left)); - return cut; -} - -/**yon_char_find_count(char *source, char *find) - * [EN] - * - * [RU] - * Считает количество символов [find] в строке [source] -*/ -int yon_char_find_count(char *source, char *find){ - char *working_string=yon_char_new(source); - int i=0; - int size=0; - int pos=0; - config_str rtn = yon_char_parse(working_string,&size,"\n"); - for (int j=0;j= 10; i++) - { - convert_check = convert_check / 10; - } - char *ch = g_malloc0(i * sizeof(char) + 1); - sprintf(ch, "%d", int_to_convert); - return ch; -} - -/**yon_char_replace(char *source, char *find, char*replace) - * [EN] - * - * [RU] - * Заменяет в строке [source] все вхождения строки [find] на [replace] -*/ -char *yon_char_replace(char *source, char *find, char*replace){ - if (!strstr(replace,find)){ - - - char *final=NULL; - char *temp=NULL; - if(!strstr(replace,find)){ - while ((final=strstr(source,find))){ - temp=malloc(strlen(source)-strlen(final)); - memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); - memcpy(temp,source,strlen(source)-strlen(final)); - temp=yon_char_append(temp,replace); - source=yon_char_append(temp,final+1); - } - - } - } - return source; -} - -/**yon_char_parse(char *parameters, int *size, char *divider) - * [EN] - * Parses string [parameters], divided by [divider], - * then returns parsed string array and sets [size] to - * size of returned array -*/ -char **yon_char_parse(char *parameters, int *size, char *divider){ - char **string=NULL; - int i=1; - string=malloc(sizeof(char*)); - char *paramline=yon_char_new(parameters); - char *param; - if (!strstr(parameters,divider)) return NULL; - while ((param=yon_char_divide_search(paramline,divider,1))){ - if (strcmp(param,paramline)==0||param[0]=='\0') break; - string=realloc(string,sizeof(char*)*i); - string[i-1]=yon_char_new(param); - i++; - } - string=realloc(string,sizeof(char*)*i); - string[i-1]=yon_char_new(paramline); - i++; - *size=i-1; - return string; -} - -/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete) - * [EN] - * - * [RU] - * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size] - * Возвращает получившийся массив, в [size] загружается размер нового массива. -*/ -char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete){ - char **new_char_parsed=NULL; - new_char_parsed=malloc(sizeof(char*)*((*size)-1)); - int flag = 0; - for (int i=0;i < (*size);i++){ - if (i==item_to_delete) { - flag = 1; - } - if (flag == 0) { - new_char_parsed[i]=yon_char_new(char_string[i]); - } - else if (flag == 1 && i!=item_to_delete) { - new_char_parsed[i-1]=yon_char_new(char_string[i]); - } - } - (*size)=(*size)-1; - return new_char_parsed; -} - -/**yon_char_parsed_check_exist(char **parameters, int size, char *param) - * [EN] - * Checks if [parameters] string array of length [size] - * has [param] element; - * [RU] - * Проверяет есть ли в массиве строк [parameters], размера [size] - * элемент [param] -*/ -int yon_char_parsed_check_exist(char **parameters, int size, char *param){ - - for (int i=0;id_name); - file = fopen(path, "r"); - if (strlen(de->d_name) > 9) - { - char *extension = strstr(path, "."); - if (extension != NULL) - { - if (strcmp(extension, ".desktop") == 0) - { - apps tempapp; - GKeyFile *gfile = g_key_file_new(); - GError *err = NULL; - g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); - char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err); - if (err) - { - printf("%s\n", err->message); - } - if (strcmp(Type, "Application") == 0) - tempapp.Type = 1; - else if (strcmp(Type, "pyApplication") == 0) - tempapp.Type = 2; - else - continue; - tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); - if (tempapp.Name == NULL) - continue; - tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL); - if (tempapp.Categories == NULL) - continue; - tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); - if (tempapp.Exec == NULL) - continue; - tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); - if (tempapp.Icon == NULL) - continue; - tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL); - if (!tempapp.Pluggable) - tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL); - if (tempapp.Pluggable) - tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL); - if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0) - if (size == 0) - { - applist = (apps *)malloc(size + 1 * sizeof(apps)); - applist[0].Name = yon_char_new(tempapp.Name); - applist[0].Categories = yon_char_new(tempapp.Categories); - applist[0].Exec = yon_char_new(tempapp.Exec); - applist[0].Icon = yon_char_new(tempapp.Icon); - applist[0].Type = tempapp.Type; - applist[0].Pluggable = tempapp.Pluggable; - applist[0].DualPluggable = tempapp.DualPluggable; - size++; - } - else - { - applist = (apps *)realloc(applist, (size + 1) * sizeof(apps)); - applist[size].Name = yon_char_new(tempapp.Name); - applist[size].Categories = yon_char_new(tempapp.Categories); - applist[size].Exec = yon_char_new(tempapp.Exec); - applist[size].Icon = yon_char_new(tempapp.Icon); - applist[size].Pluggable = tempapp.Pluggable; - applist[size].DualPluggable = tempapp.DualPluggable; - applist[size].Type = tempapp.Type; - size++; - } - } - } - } - } - } - *sizef = size; - return applist; -}; - -void yon_apps_sort(apps *applist, int size) -{ - apps tmp; - if (size > 2) - { - for (int i = 1; i < size; i++) - { - for (int j = 1; j < size; j++) - { - if (strcmp(applist[j].Name, applist[j - 1].Name) < 0) - { - tmp = applist[j]; - applist[j] = applist[j - 1]; - applist[j - 1] = tmp; - }; - } - }; - } -}; - -apps *yon_apps_get_by_name(apps *applist, char *name, int size) -{ - for (int i = 0; i < size; i++) - { - if (strcmp(applist[i].Name, name) == 0) - return &applist[i]; - } - return NULL; -}; - -//config functions - -/**yon_config_load_register(char *command) - * [EN] - * - * [RU] - * Выполняет команду [command]. - * Полученные данные парсятся и регистрируются в конфиг. -*/ -int yon_config_load_register(char *command){ - if (__yon__config__strings){ - __yon__config__strings = yon_dictionary_free_all(__yon__config__strings,NULL); - } - FILE *output = popen(command, "r"); - char **output_strings = NULL; - output_strings = malloc(sizeof(char)); - int i = 0; - char str[4096]; - memset(str, 0, 4096); - while (fgets(str, 4096, output)) - { - if (strcmp(str, "") != 0&& strcmp(str,"(null)\n")!=0) - { - char *key = yon_char_divide_search(str,"=",-1); - yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,str); - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - } - } - check_config - return 0; - else return 1; -} - -/**yon_config_remove_by_key(char *key) - * [EN] - * - * [RU] - * Удаляет параметр конфига по ключу [key] -*/ -int yon_config_remove_by_key(char *key){ - check_config{ - dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); - if (dict){ - yon_dictionary_rip(dict); - return 1; - }else return 0; - } - return 0; -} - -/**yon_config_remove_by_data(void *data) - * [EN] - * - * [RU] - * Производит поиск по конфигу на наличие параметра со значением [data] и удаляет найденное значение из конфига. -*/ -int yon_config_remove_by_data(void *data){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict,__yon__config__strings){ - if (dict->data==data){ - yon_dictionary_rip(dict); - return 1; - } - } - return 0; - } - return 0; -} - -/**yon_config_remove_element(char *key, char *deleted) - * [EN] - * - * [RU] - * Удаляет элемент [deleted] из массива параметров с ключом [key] -*/ -int yon_config_remove_element(char *key, char *deleted){ - check_config{ - dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); - char *data = (char*)dict->data; - char *found = strstr(data,deleted); - int size=strlen(data)-strlen(found)+1; - char *new_data = malloc(size); - memset(new_data,0,size); - if (strlen(found)!=strlen(deleted)){ - memcpy(new_data,data,size-1); - new_data = yon_char_append(new_data,found+strlen(deleted)+1); - } else { - memcpy(new_data,data,size-2); - new_data = yon_char_append(new_data,found+strlen(deleted)); - } - dict->data=(void*)(new_data); - free(data); - dict->flag1=1; - return 1; - } else return 0; -} - -/**yon_config_get_by_key(char *key) - * [EN] - * - * [RU] - * Возвращает значение параметра конфига с ключом [key] -*/ -void *yon_config_get_by_key(char *key){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict, __yon__config__strings){ - if (strcmp(dict->key,key)==0){ - return dict->data; - } - } - } - return NULL; -} - -/**yon_config_get_key_by_data(char *data) - * [EN] - * - * [RU] - * Возвращает ключ параметра конфига со значением [data]. - * Если параметр с таким значением не найден, возвращается NULL -*/ -char *yon_config_get_key_by_data(char *data){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict, __yon__config__strings){ - if (strcmp(((char*)dict->data),data)==0){ - return dict->key; - } - } - } - return NULL; -} - -/**yon_config_set(char *key, void *data) - * [EN] - * - * [RU] - * Производит поиск по конфигу и заменяет значение параметра с ключом [key] на новое значение [data]; -*/ -int yon_config_set(char *key, void *data){ - check_config{ - dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); - dict->data=data; - return 1; - } else return 0; -} - -/**yon_config_clean() - * [EN] - * Erase all parameters from config; - * [RU] - * Удаляет все параметры из конфига; -*/ -int yon_config_clean(){ - check_config{ - __yon__config__strings = yon_dictionary_free_all(__yon__config__strings, NULL); - return 1; - } - else return 0; -} - -/**yon_config_register(char *key, void *data) - * [EN] - * - * [RU] - * Регистрирует новый параметр конфига. - * [key] - ключ параметра; - * [data] - значение параметра; -*/ -void yon_config_register(char *key, void *data){ - yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,data); - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; -} - -/**yon_config_load(char *command, int *str_len) - * [EN] - * - * [RU] - * Выполняет команду [command] и возвращает распаршеный результат выполнения команды. - * В [str_len] возвращается длина возвращаемого массива -*/ -config_str yon_config_load(char *command, int *str_len){ - FILE *output = popen(command, "r"); - char **output_strings = NULL; - output_strings = malloc(sizeof(char)); - int i = 0; - char str[4096]; - memset(str, 0, 4096); - while (fgets(str, 4096, output)) - { - if (strcmp(str, "") != 0) - { - output_strings = realloc(output_strings, sizeof(char *) * (i + 1)); - // printf("%s\n", str); - output_strings[i] = NULL; - output_strings[i] = yon_char_new(str); - memset(str, 0, 4096); - i++; - } - } - if (i>0){ - *str_len = i; - return output_strings; - } else{ - *str_len=-1; - return NULL; - } -} - -/**int yon_config_save(char *command) - * [EN] - * Saves config with [command] - * [RU] - * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: - * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" -*/ -int yon_config_save_registered(char *command){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict,__yon__config__strings){ - command = yon_char_unite(command, " ", yon_dictionary_get_data(dict,char*), NULL); - } - if (popen(command, "r")) return 1; - else return 0; - } else return 0; -} - -/**yon_config_get_all(int *size) - * [EN] - * - * [RU] - * Возвращает массив со всеми параметрами конфига, оканчивающаяся NULL - * [size] - указатель, в который выгружается длина массива -*/ -config_str yon_config_get_all(int *size){ - check_config{ - *size = 1; - config_str conf = NULL; - dictionary *dict = NULL; - for_dictionaries(dict,__yon__config__strings){ - conf = yon_remalloc(conf,sizeof(char*)*(*size)); - conf[(*size)-1] = yon_char_unite(dict->key,"=",(char*)dict->data,NULL); - size++; - } - conf = yon_remalloc(conf,sizeof(char*)*(*size+1)); - conf[*size] = NULL; - return conf; - } else return NULL; -} - -/**char *yon_config_get_parameter(config parameters, int size, char *param) - * [EN] - * Gets parameter [param] from parameter list [parameters] of size [size]; - * or NULL if nothing were found - * [RU] - * Возвращает параметр [param] из массива строк [parameters] размером [size] - * или NULL если такой не был найден -*/ -char *yon_config_get_parameter(config_str parameters, int size, char *param) -{ - if (param[0]==' ') - yon_char_divide_search(param," ",-1); - param=yon_char_divide_search(yon_char_new(param)," ",-1); - - char *str = NULL; - for (int j = 0; j < size; j++) - { - char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1); - if (name) - { - if (strcmp(name, param) == 0) - { - str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1); - if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0) - return str; - else - return NULL; - } - } - } - return NULL; -} - - - -// terminal-using functions - -/**yon_launch_app_with_arguments(char *name, char *args) - * [EN] - * Execute [command] in separate thread; - * [RU] - * Выполнить команду [command] в отдельном потоке; -*/ -int yon_launch_app_with_arguments(char *name, char *args) -{ - char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); - pthread_t thread_id; - char *command = NULL; - command = path; - pthread_create(&thread_id, NULL, (void *)yon_launch, command); -}; - -/**yon_launch(char *command) - * [EN] - * Execute command [command] - * [RU] - * Выполнить команду [command] -*/ -void yon_launch(char *command) -{ - system(command); -} - -// Gtk functions - - -#ifdef __GTK_H__ - - -static render_data render; - -#ifdef VTE_TERMINAL - -static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) -{ - if (!terminal) return; - if (pid == -1) printf("Error\n\n\n"); - else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); -} - -/** - * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument) - * [EN] - * launches terminal with specific [command], - * terminal is shown in [place_to_show] container, - * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. - * [RU] - * Запускает терминал с командой [command], - * терминал добавляется в контейнер [place_to_show] виджета, - * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. -*/ -void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument){ - char **commands=new_arr(char*,2); - gchar **envp = g_get_environ(); - commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); - commands[1]=NULL; - char **env=new_arr(char*,2); - env[0]=""; - env[1]=NULL; - GtkWidget *terminal = vte_terminal_new(); - vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); - VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); - vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); - gtk_container_add(GTK_CONTAINER(place_to_show),terminal); - char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL); - printf("%s\n",install_command); - if(endwork_function) - g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument); - vte_terminal_spawn_async(VTE_TERMINAL(terminal), - VTE_PTY_DEFAULT, - NULL, - commands, - NULL, - 0, - NULL, NULL, - NULL, - -1, - NULL, - child_ready, - install_command); - vte_pty_spawn_async(pty, - NULL, - commands, - NULL, - 0, - NULL, NULL, - NULL, - -1, - NULL, - NULL, - NULL); - vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1); - vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); - vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); - gtk_widget_show_all(terminal); - } - -/**yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument) - * [EN] - * launches terminal with specific [command], - * terminal is shown in [place_to_show] container, - * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. - * [RU] - * Запускает терминал с командой [command], - * терминал добавляется в контейнер [place_to_show] виджета, - * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. -*/ -void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){ - char **commands=new_arr(char*,2); - gchar **envp = g_get_environ(); - commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); - commands[1]=NULL; - char **env=new_arr(char*,2); - env[0]=""; - env[1]=NULL; - vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); - VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); - vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); - char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL); - if(endwork_function) - g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument); - vte_terminal_spawn_async(VTE_TERMINAL(terminal), - VTE_PTY_DEFAULT, - NULL, - commands, - NULL, - 0, - NULL, NULL, - NULL, - -1, - NULL, - child_ready, - install_command); - vte_pty_spawn_async(pty, - NULL, - commands, - NULL, - 0, - NULL, NULL, - NULL, - -1, - NULL, - NULL, - NULL); - vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100); - vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); - vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); - gtk_widget_show_all(terminal); - } -#endif - - // Window config functions - - #define check_window_config_setup if(__yon_window_config_target_window) - - typedef struct { - char *parameter_name; - enum YON_TYPE containing_type; - GtkWidget *track_widget; - char *property_name; - } __yon_listener_parameter; - - typedef struct { - char *parameter_name; - char *section; - enum YON_TYPE containing_type; - void *property; - } __yon_custom_parameter; - - struct { - int x; - int y; - int width; - int height; - int fullscreen; - dictionary *custom_listeners; - dictionary *custom_parameters; - dictionary *deleted_parameters; - } __yon_main_window_config; - - static GtkWindow *__yon_window_config_target_window = NULL; - static GKeyFile *__yon_window_config_file = NULL; - static char *__yon_window_config_path = NULL; - - void yon_window_config_save(){ - g_key_file_set_integer(__yon_window_config_file,"window","WindowPosX",__yon_main_window_config.x); - g_key_file_set_integer(__yon_window_config_file,"window","WindowPosY",__yon_main_window_config.y); - g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width); - g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height); - g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen); - dictionary *dict=NULL; - if (__yon_main_window_config.custom_listeners) - for_dictionaries(dict,__yon_main_window_config.custom_listeners){ - __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); - switch(param->containing_type){ - case YON_TYPE_STRING: - g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val)); - break; - case YON_TYPE_INT: - g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val)); - break; - case YON_TYPE_BOOLEAN: - g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val)); - break; - case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; - } - } - if (__yon_main_window_config.custom_parameters) - for_dictionaries(dict,__yon_main_window_config.custom_parameters){ - __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); - switch (param->containing_type){ - case YON_TYPE_STRING: - g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property); - break; - case YON_TYPE_INT: - g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property); - break; - case YON_TYPE_BOOLEAN: - g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property); - break; - default: - break; - } - } - if (__yon_main_window_config.deleted_parameters) - for_dictionaries(dict,__yon_main_window_config.deleted_parameters){ - __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); - g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL); - } - g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL); - } - - void yon_get_is_fullscreen(){ - gtk_window_is_maximized(__yon_window_config_target_window); - __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window); - if (!__yon_main_window_config.fullscreen) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); - } - - /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event) - * [EN] - * - * [RU] - * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается. - */ - void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){ - check_window_config_setup{ - yon_get_is_fullscreen(); - yon_window_config_save(); - } - gtk_main_quit(); - } - - void __yon_window_config_on_resize(){ - int max=0; - max=gtk_window_is_maximized(__yon_window_config_target_window); - if(max==0){ - gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height); - gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); - } - } - - /**yon_window_config_setup(GtkWindow *window) - * [EN] - * - * [RU] - * Устанавливает указатель на окно для отслеживания его положения и размера - */ - void yon_window_config_setup(GtkWindow *window){ - __yon_window_config_target_window = window; - g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); - g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); - } - - void _yon_maximize(void *data){ - g_usleep(G_USEC_PER_SEC/10); - if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window); - } - - /**yon_window_config_load(char *path) - * [EN] - * - * [RU] - * Загружает конфиг окна и инициализирует отслеживание его параметров - */ - int yon_window_config_load(char *path){ - __yon_window_config_file = g_key_file_new(); - __yon_window_config_path=yon_char_new(path); - if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ - struct stat st; - int size; - char *path = yon_char_divide(yon_char_new(__yon_window_config_path),yon_char_find_last(__yon_window_config_path,'/')); - if (stat(path, &st) == -1) { - mkdir(path, 0777); - } - FILE *fp; - fp=fopen(__yon_window_config_path,"w"); - fclose(fp); - g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL); - } - __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL); - __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL); - __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL); - __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL); - __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL); - dictionary *dict=NULL; - if (__yon_main_window_config.custom_listeners) - for_dictionaries(dict,__yon_main_window_config.custom_listeners){ - __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); - switch(param->containing_type){ - case YON_TYPE_STRING: - g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL)); - break; - case YON_TYPE_INT: - g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL)); - break; - case YON_TYPE_BOOLEAN: - gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL); - g_value_set_boolean(val,res); - break; - default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; - } - g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val); - } - if (__yon_main_window_config.width==0) __yon_main_window_config.width=800; - if (__yon_main_window_config.height==0) __yon_main_window_config.height=600; - gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); - gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); - pthread_t tid; - pthread_create(&tid,NULL,(void *)_yon_maximize,NULL); - return 1; - } - - void yon_window_config_apply(){ - dictionary *dict=NULL; - gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); - gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); - } - - config_str yon_window_config_get_section(char *section, gsize *size){ - config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL); - return key; - } - - /**yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type) - * [EN] - * - * [RU] - * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name]. - */ - void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){ - __yon_listener_parameter *param = NULL; - param = yon_remalloc(param,sizeof(__yon_listener_parameter)); - param->parameter_name = yon_char_new(param_name); - param->track_widget = widget; - param->property_name = yon_char_new(widget_property); - param->containing_type = val_type; - yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param); - } - - void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){ - __yon_custom_parameter *param = NULL; - param = yon_remalloc(param,sizeof(__yon_custom_parameter)); - param->parameter_name = yon_char_new(param_name); - param->section=section; - param->property = tracked_value; - param->containing_type = val_type; - yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param); - } - - void yon_window_config_erase_custom_parameter(char *param_name, char *section){ - __yon_custom_parameter *param = NULL; - param = yon_remalloc(param,sizeof(__yon_custom_parameter)); - param->parameter_name=param_name; - param->section=section; - yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param); - } - - int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){ - GError *err=NULL; - switch (type){ - case YON_TYPE_BOOLEAN: - *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err); - if (err) return 0; else return 1; - break; - case YON_TYPE_INT: - *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err); - if (err) return 0; else return 1; - break; - case YON_TYPE_STRING: - *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err); - if (err) return 0; else return 1; - break; - case YON_TYPE_STRING_LIST: - gsize size=0; - *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err); - *((char***)return_value)=yon_remalloc(return_value,size+1); - *((char***)return_value)[size]=NULL; - if (err) return 0; else return 1; - break; - } - } - -GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ - GtkWidget *menu_item = gtk_menu_item_new(); - gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - GtkWidget *label = gtk_label_new(buttonname); - GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); - gtk_label_set_xalign(GTK_LABEL(label),0.0); - gtk_box_pack_start(GTK_BOX(box),image,0,0,5); - gtk_box_pack_start(GTK_BOX(box),label,0,0,5); - gtk_container_add(GTK_CONTAINER(menu_item),box); - gtk_widget_show_all(menu_item); - return menu_item; -} - -GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ - GtkWidget *menu_item = gtk_menu_item_new(); - gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - GtkWidget *label = gtk_label_new(buttonname); - GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); - gtk_label_set_xalign(GTK_LABEL(label),0.0); - gtk_box_pack_start(GTK_BOX(box),image,0,0,5); - gtk_box_pack_start(GTK_BOX(box),label,0,0,5); - gtk_container_add(GTK_CONTAINER(menu_item),box); - gtk_widget_show_all(menu_item); - return menu_item; -} - - -// other Gtk functions - -/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size) - * [EN] - * - * [RU] - * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size] -*/ -int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){ - if (combo&¶meters){ - for (int i=0;imessage); - g_error_free(err); - } - if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type) - { - gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); - gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); - gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); - } - else if (type == BACKGROUND_IMAGE_FAIL_TYPE) - { - gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); - gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); - gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); - } - if (text) - gtk_label_set_text(GTK_LABEL(data.label), text); -} - -void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){ - _yon_ubl_status_box_render(text,type); -} - -/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id) - * [EN] - * Set up plugs for using with GtkSockets insine ubl-settings-manager. - * [main_window] is container widget, which holds main application functionality. - * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header. - * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header. - * [socket_main_id] is id of socket for [main_window]. - * [socket_left_id] is id of socket for [left_window]. - * [socket_right_id] is id of socket for [right_window]. - * [RU] - * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager. - * [main_window] - контейнер основного интерфейса приложения. - * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager. - * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager. - * [socket_main_id] - id сокета для [main_window]. - * [socket_left_id] - id сокета для [left_window]. - * [socket_right_id] - id сокета для [right_window]. -*/ -void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){ - if (main_window&&socket_main_id>-1){ - gtk_widget_hide(gtk_widget_get_toplevel(main_window)); - GtkWidget *plug_main=gtk_plug_new(socket_main_id); - GtkWidget *plug_left=NULL; - GtkWidget *plug_right=NULL; - GtkWidget *box=NULL; - g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL); - if (socket_left_id>-1&&left_window){ - plug_left=gtk_plug_new(socket_left_id); - g_object_ref(left_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_container_add(GTK_CONTAINER(plug_left),left_window); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder"); - gtk_widget_show(plug_left); - } - else if (left_window){ - if (box==NULL){ - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); - gtk_box_reorder_child(GTK_BOX(main_window),box,0); - gtk_widget_show(box); - } - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited"); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5); - } - if (socket_right_id>-1&&right_window){ - plug_right=gtk_plug_new(socket_right_id); - g_object_ref(right_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_container_add(GTK_CONTAINER(plug_right),right_window); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder"); - gtk_widget_show(plug_right); - } - else if (right_window){ - if (box==NULL){ - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); - gtk_box_reorder_child(GTK_BOX(main_window),box,0); - gtk_widget_show(box); - } - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited"); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5); - } - g_object_ref(main_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window); - gtk_container_add(GTK_CONTAINER(plug_main),main_window); - gtk_widget_show(plug_main); - } -} - -#ifdef WEBKIT_FOUND - -/**yon_ubl_browser_window_open(char *link, char *browser_window_name) - * [EN] - * Launches integrated browser window, named [browser_window_name] at header with [link]. - * [RU] - * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link] -*/ -void yon_ubl_browser_window_open(char *link, char *browser_window_name){ - GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL); - GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0); - GtkWidget *header=gtk_header_bar_new(); - GtkWidget *header_label=gtk_label_new(browser_window_name); - GtkWidget *WebView=webkit_web_view_new(); - gtk_container_add(GTK_CONTAINER(browser),web_place); - gtk_window_set_titlebar(GTK_WINDOW(browser),header); - gtk_window_set_title(GTK_WINDOW(browser),browser_window_name); - gtk_widget_set_size_request(browser,800,600); - gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label); - gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link); - gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0); - gtk_widget_show_all(browser); -} -#else - -/**yon_ubl_browser_window_open(char *link, char *browser_window_name) - * [EN] - * Launches browser with [link]. - * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function. - * [RU] - * Открывает браузер со страницей по ссылке [link] - * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции. -*/ -void yon_ubl_browser_window_open(char *link, char *browser_window_name){ - char *user=getenv("SUDO_USER"); - if (!user) - user=getlogin(); - char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL); - yon_launch_app(command); -} -#endif - -#endif \ No newline at end of file diff --git a/source/ubl-utils.h b/source/ubl-utils.h deleted file mode 100644 index 6ef2559..0000000 --- a/source/ubl-utils.h +++ /dev/null @@ -1,367 +0,0 @@ -#ifndef UBL_UTILS -#define UBL_UTILS -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../compile/ubl-cmake.h" -#ifdef WEBKIT_FOUND - #include -#endif -#define DesktopPath "/usr/share/applications/" - -#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) - -#define new(type) malloc(sizeof(type)) -#define new_arr(type,size) malloc(sizeof(type)*size) - -#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL) - -typedef enum -{ - #ifdef __GTK_H__ - DICTIONARY_GTK_WIDGETS_TYPE, - #endif - DICTIONARY_OTHER_TYPE=0, - DICTIONARY_CHAR_TYPE, - DICTIONARY_INT_TYPE, - DICTIONARY_BOOL_TYPE, - -} DICT_TYPE; - -typedef struct dictionary -{ - char *key; - void *data; - struct dictionary *next; - struct dictionary *prev; - struct dictionary *first; - DICT_TYPE data_type; - int flag1; -} dictionary; - -typedef struct apps -{ - char *Name; - int Type; - char *Categories; - char *Exec; - char *Icon; - int Pluggable; - int DualPluggable; -} apps; - -typedef char** config_str; - -static dictionary *__yon__config__strings = NULL; -#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) - -#define config(key) yon_config_get_by_key(key) - -#define for_config dictionary temp = NULL; for_dictionary(temp,__yon__config__strings) - -#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size) -// dictionary functions - -/**yon_dictionary_get_data(dictionary, type) - * [EN] - * Gets data from dictionary. - * [dictionary] is dictionary, from which data should be extracted; - * [type] is type of data, [dictionary] contains. - * [RU] - * Возвращает данные из словаря. - * [dictionary] - словарь из которого достаются данные. - * [type] - тип данных, хранящихся в словаре [dictionary]. -*/ -#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data) - -/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) - * [EN] - * - * [RU] - * Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data]. - * Если словарь не существует, создаёт его -*/ -#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \ - else dict=yon_dictionary_append_with_data(dict,key,data);} - -dictionary *yon_dictionary_new(); - -dictionary *yon_dictionary_append(dictionary *targetdict); - -dictionary *yon_dictionary_get_last(dictionary *dict); - -dictionary *yon_dictionary_swap(dictionary *dict, int aim); - -void yon_dictionary_make_first(dictionary *dict); - -void yon_dictionary_make_nth(dictionary *dict, int nth); - -dictionary *yon_dictionary_new_with_data(char *key, void *data); - -dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data); - -dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect); - -dictionary *yon_dictionary_get(dictionary **dict, char *key); - -dictionary *yon_dictionary_rip(dictionary *dict); - -dictionary *yon_dictionary_get_nth(dictionary *dict, int place); - -void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*)); - -// char functions - -int yon_char_find_last(char *source, char find); - -char *yon_char_append(char *source, char *append); - -char *yon_char_new(char *chr); - -char *yon_char_unite(char *source, ...); - -char *yon_cut(char *source, int size, int startpos); - -char *yon_char_divide(char *source, int dividepos); - -char *yon_char_divide_search(char *source, char *dividepos, int delete_divider); - -char *yon_char_from_int(int int_to_convert); - -char *yon_char_replace(char *source, char *find, char*replace); - -char **yon_char_parse(char *parameters, int *size, char *divider); - -char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete); - -int yon_char_parsed_check_exist(char **parameters, int size, char *param); - -int yon_char_find_count(char *source, char *find); - -int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size); - -config_str yon_char_parsed_new (int *size, ...); - -void yon_char_parsed_copy(config_str *source, config_str *to_copy); - -config_str yon_char_parsed_append(config_str parsed, int *size, char *string); - -int yon_ubl_check_root(); - -char *yon_ubl_root_user_get(); - -char *yon_ubl_user_get_home_directory(); - -// parsing functions - -config_str philos_list_user(int* size); - -apps *yon_apps_scan_and_parse_desktops(int *sizef); - -void yon_apps_sort(apps *applist, int size); - -apps *yon_apps_get_by_name(apps *applist, char *name, int size); - -config_str yon_config_load(char *command, int *str_len); - -int yon_config_save_registered(char *command); - -char *yon_config_get_parameter(config_str parameters, int size, char *param); - -int yon_config_load_register(char *command); - -int yon_config_remove_by_key(char *key); - -int yon_config_remove_by_data(void *data); - -int yon_config_remove_element(char *key, char *deleted); - -void *yon_config_get_by_key(char *key); - -char *yon_config_get_key_by_data(char *data); - -int yon_config_set(char *key, void *data); - -int yon_config_clean(); - -void yon_config_register(char *key, void *data); - -config_str yon_config_get_all(); - -// terminal-using functions - -int yon_launch_app_with_arguments(char *name, char *args); - -void yon_launch(char *command); - -// Gtk functions - -#ifdef __GTK_H__ -#ifdef VTE_TERMINAL -void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument); - -void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument); - -#endif - -enum YON_TYPE{ - YON_TYPE_STRING, - YON_TYPE_STRING_LIST, - YON_TYPE_INT, - YON_TYPE_BOOLEAN, - YON_TYPE_OTHER -}; - -GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); -GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); - -/**yon_gtk_builder_get_widget(builder, widget_name) - * [EN] - * Returns GtkWidget from GtkBuilder *[builder]. - * [builder] is GtkBuilder*; - * [widget_name] is id of widget; -*/ -#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name)) - -typedef struct -{ - GtkWidget *Icon; - GtkWidget *Label; - GtkWidget *IconView; - GtkListStore *List; -} expander_icon_view; - -void yon_window_config_setup(GtkWindow *window); - -int yon_window_config_load(char *path); - -config_str yon_window_config_get_section(char *section, gsize *size); - -void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type); - -void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type); - -void yon_window_config_erase_custom_parameter(char *param_name, char *section); - -int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type); - -int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); - -int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find); - -int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment); - -int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...); - -int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...); - - - -typedef enum -{ - BACKGROUND_IMAGE_SUCCESS_TYPE, - BACKGROUND_IMAGE_FAIL_TYPE -} BACKGROUND_IMAGE_TYPE; - -typedef struct { - BACKGROUND_IMAGE_TYPE type; - GtkWidget *icon; - GtkWidget *box; - GtkWidget *label; - char* text_to_render; -} render_data; - - -/**yon_ubl_status_box_setup(render,icon,box,label) - * [EN] - * Sets up [render] structure of type render_data. - * [icon] is GtkImage widget of status box for showing status icons; - * [box] is GtkBox widget of status box for showing status color; - * [label] is GtkLabel widget of status box for showing status text; - * [RU] - * Настраивает структуру [render] типа render_data. - * [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки; - * [box] - виджет типа GtkBox в котором будет отображаться цвет статуса; - * [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения; -*/ -int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label); - -/**yon_ubl_status_box_render(render,text,type) - * [EN] - * Renders message in status box; - * [render] is render_data structure of status box; - * [text] is text to be shown in status box; - * [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE - * [RU] - * Отображает сообщение в статусном окне. - * [render] - структура типа render_data для нужного статусного окна; - * [text] - текст, отображаемый в статусном окне; - * [type] - тип сообщения. Может быть: - * BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак) - * или - * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка) -*/ -void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type); - -#ifdef __cplusplus - -/**yon_ubl_header_setup(overlay, head, image, imag_path) - * [EN] - * Sets up header of app. - * [overlay] is overlay for app header; - * [head] is box of header, which connects to [overlay] - * [image] is header background image; - * [imag_path] is path of image, shown in [image] - * [RU] - * Настраивает заголовок приложения. - * [overlay] - оверлей заголовка приложения; - * [head] - шапка заголовка, присоединяемая к [overlay] - * [image] - виджет картинки для заднего фона; - * [imag_path] - путь до картинки, загружаемой в [image] -*/ -#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()), GTK_WIDGET(head.gobj()), GTK_WIDGET(image.gobj()), (char *)imag_path) -#else - -/**yon_ubl_header_setup(overlay, head, image, imag_path) - * [EN] - * Sets up header of app. - * [overlay] is overlay for app header; - * [head] is box of header, which connects to [overlay] - * [image] is header background image; - * [imag_path] is path of image, shown in [image] - * [RU] - * Настраивает заголовок приложения. - * [overlay] - оверлей заголовка приложения; - * [head] - шапка заголовка, присоединяемая к [overlay] - * [image] - виджет картинки для заднего фона; - * [imag_path] - путь до картинки, загружаемой в [image] -*/ -#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path) -#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path) -#endif - -void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path); - -void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path); - -void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id); -#ifdef WEBKIT_FOUND - -void yon_ubl_browser_window_open(char *link, char *browser_window_name); -#else -void yon_ubl_browser_window_open(char *link, char *browser_window_name); -#endif -#endif -#endif \ No newline at end of file diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade new file mode 100644 index 0000000..dcab229 --- /dev/null +++ b/ubl-settings-repomanager-add.glade @@ -0,0 +1,620 @@ + + + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.trash-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.increase-symbolic + + + 800 + 600 + False + True + com.ublinux.ubl-settings-repomanager + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + vertical + 5 + + + True + False + 5 + + + True + False + Storage: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + Repository + + + False + True + 2 + + + + + True + False + + + True + True + 3 + + + + + True + False + Architecture: + + + False + True + 4 + + + + + True + False + + + True + True + 5 + + + + + False + True + 0 + + + + + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + False + Storage: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + Repository + + + False + True + 2 + + + + + True + False + + + True + True + 3 + + + + + True + False + Architecture: + + + False + True + 4 + + + + + True + False + + + True + True + 5 + + + + + + + + + True + False + Source + + + + + False + True + 1 + + + + + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + False + Storage: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + Repository + + + False + True + 2 + + + + + True + False + + + True + True + 3 + + + + + True + False + Architecture: + + + False + True + 4 + + + + + True + False + + + True + True + 5 + + + + + + + + + True + False + Target + + + + + False + True + 2 + + + + + True + False + 5 + + + True + False + Packages sign: + 0 + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 3 + + + + + True + False + 5 + + + True + False + Repository sign: + 0 + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 4 + + + + + True + False + 5 + + + True + False + 8 + vertical + 5 + + + True + True + True + image2 + + + + False + True + 0 + + + + + True + True + True + image1 + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + True + in + + + True + True + PackagesList + + + + + + + + True + True + 0 + + + + + True + True + in + + + True + False + + + True + False + True + 0 + 0 + + + + + + + True + True + 1 + + + + + + + + + True + False + Package (-s) to add + + + + + True + True + 1 + + + + + True + True + 5 + + + + + True + True + 1 + + + + + + + True + False + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + Cancel + True + True + True + + + 1 + + + + + Add + True + True + True + + + end + 2 + + + + + + + + + + + + diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade new file mode 100644 index 0000000..a970bdd --- /dev/null +++ b/ubl-settings-repomanager-configuration.glade @@ -0,0 +1,337 @@ + + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.zoom-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.increase-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.trash-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.increase-symbolic + + + 450 + 200 + False + True + com.ublinux.ubl-settings-repomanager + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + vertical + + + True + False + 5 + + + True + False + Storage: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + True + True + True + image1 + + + + False + True + 2 + + + + + True + True + True + image2 + + + + False + True + 3 + + + + + True + True + True + image3 + + + + False + True + 4 + + + + + True + True + True + image4 + + + + False + True + 5 + + + + + False + True + 0 + + + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + vertical + 5 + + + True + True + + + True + False + none + + + True + False + vertical + 5 + + + + + + + + + + + + + + + + + + + True + True + 0 + + + + + True + False + 5 + + + True + True + + + True + True + 0 + + + + + True + True + True + image5 + + + + False + True + 1 + + + + + False + True + 1 + + + + + + + + + True + False + Repository (-ies) + + + + + True + True + 1 + + + + + True + True + 1 + + + + + + + True + False + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + Cancel + True + True + True + + + 1 + + + + + Accept + True + True + True + + + end + 2 + + + + + + diff --git a/ubl-settings-repomanager-filechooser.glade b/ubl-settings-repomanager-filechooser.glade new file mode 100644 index 0000000..375dece --- /dev/null +++ b/ubl-settings-repomanager-filechooser.glade @@ -0,0 +1,90 @@ + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.accept-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic + + + False + dialog + + + False + vertical + 2 + + + False + end + + + Cancel + True + True + True + image2 + + + True + True + 0 + + + + + Choose + True + True + True + image1 + + + True + True + 1 + + + + + False + False + 0 + + + + + + + True + False + True + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + + diff --git a/ubl-settings-repomanager-move.glade b/ubl-settings-repomanager-move.glade new file mode 100644 index 0000000..f145770 --- /dev/null +++ b/ubl-settings-repomanager-move.glade @@ -0,0 +1,498 @@ + + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.trash-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.add-symbolic + + + 800 + 600 + False + True + com.ublinux.ubl-settings-repomanager + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + 5 + + + True + False + 0 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + False + Storage: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + Repository + + + False + True + 2 + + + + + True + False + + + True + True + 3 + + + + + True + False + Architecture: + + + False + True + 4 + + + + + True + False + + + True + True + 5 + + + + + + + + + True + False + Source + + + + + False + True + 0 + + + + + True + False + 0 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + False + Storage: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + Repository + + + False + True + 2 + + + + + True + False + + + True + True + 3 + + + + + True + False + Architecture: + + + False + True + 4 + + + + + True + False + + + True + True + 5 + + + + + + + + + True + False + Target + + + + + False + True + 1 + + + + + True + False + 5 + + + True + False + Repository sign: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 2 + + + + + True + False + 5 + + + True + False + 8 + vertical + 5 + + + True + True + True + image2 + + + + False + True + 0 + + + + + True + True + True + image1 + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + True + in + + + True + True + + + + + + + + True + True + 0 + + + + + True + True + in + + + True + False + + + True + False + True + 0 + 0 + + + + + + + True + True + 1 + + + + + + + + + True + False + Package (-s) to add + + + + + True + True + 1 + + + + + True + True + 3 + + + + + True + True + 1 + + + + + + + True + False + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + Cancel + True + True + True + + + 1 + + + + + Add + True + True + True + + + end + 2 + + + + + + diff --git a/ubl-settings-repomanager-sign.glade b/ubl-settings-repomanager-progressbar-window.glade similarity index 56% rename from ubl-settings-repomanager-sign.glade rename to ubl-settings-repomanager-progressbar-window.glade index 491c267..13218ba 100644 --- a/ubl-settings-repomanager-sign.glade +++ b/ubl-settings-repomanager-progressbar-window.glade @@ -2,18 +2,9 @@ - - True - False - process-stop-symbolic - - - True - False - emblem-ok-symbolic - - + 450 + 200 False True com.ublinux.ubl-settings-repomanager @@ -36,69 +27,86 @@ vertical 5 - + True False + 15 + + + True + False + dialog-information-symbolic + 6 + + + False + True + 0 + + + + + True + False + Please, wait. List of repository packages is currently updating. It can take a while + True + 0 + + + False + True + 1 + + - False + True True 0 - - - True - True - 0 - - - - - True - False - end - 5 - True - - Cancel + True - True - True - image16 - + False + vertical + 15 + + + True + False + + + False + True + 0 + + - True + False True - 0 + 1 - - Save + True - True - True - image17 - + False + 0% + 0 True True - 1 + 2 - False + True True - 1 + 0 @@ -107,9 +115,8 @@ True False - True - + True False Repository manager diff --git a/ubl-settings-repomanager-windows.glade b/ubl-settings-repomanager-windows.glade deleted file mode 100644 index 98d4bbd..0000000 --- a/ubl-settings-repomanager-windows.glade +++ /dev/null @@ -1,549 +0,0 @@ - - - - - - - - - - - - - - - master - True - - - - - True - False - process-stop-symbolic - - - True - False - emblem-ok-symbolic - - - 450 - 150 - False - True - com.ublinux.ubl-settings-repomanager - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - 10 - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - Name: - 0 - - - False - True - 0 - - - - - True - True - - - True - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 4 - - - Choose repository folder - True - True - True - start - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - - - False - Branches: - 0 - - - False - True - 0 - - - - - False - True - 2 - - - - - True - False - 5 - - - True - True - never - in - - - True - False - - - True - curRepoEditList - False - True - 0 - False - - - - - - column - - - True - < Type branch name > - - - 0 - - - - - - - - - - - - - - True - True - 0 - - - - - True - True - 3 - - - - - True - True - 0 - - - - - True - False - end - 5 - True - - - Cancel - True - True - True - image14 - - - - True - True - 0 - - - - - Save - True - True - True - image15 - - - - True - True - 1 - - - - - False - True - 1 - - - - - - - True - False - True - - - True - False - Repository manager - - - - - - - - True - False - 32 - com.ublinux.ubl-settings-repomanager - - - - - - - True - False - process-stop-symbolic - - - True - False - emblem-ok-symbolic - - - 450 - 150 - False - True - com.ublinux.ubl-settings-repomanager - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - 10 - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - Name: - 0 - - - False - True - 0 - - - - - True - True - - - True - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - False - Branches: - 0 - - - False - True - 0 - - - - - False - True - 1 - - - - - True - False - 5 - - - True - True - never - in - - - True - False - - - True - curRepoEditList - False - 0 - False - - - none - - - - - column - - - - 0 - - - - - - - - - - - - - - True - True - 0 - - - - - True - True - 3 - - - - - True - True - 0 - - - - - True - False - end - 5 - True - - - Cancel - True - True - True - image16 - - - - True - True - 0 - - - - - Save - True - True - True - image17 - - - - True - True - 1 - - - - - False - True - 1 - - - - - - - True - False - True - - - True - False - Repository manager - - - - - - - - True - False - 32 - com.ublinux.ubl-settings-repomanager - - - - - - diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css index 2a55ea0..1ca94fe 100644 --- a/ubl-settings-repomanager.css +++ b/ubl-settings-repomanager.css @@ -1,4 +1,3 @@ - .thin { margin:0px; padding:0px; @@ -38,7 +37,7 @@ background:transparent; border-left-width:inherit; border-right-width:inherit; } - + .menuitemtop{ margin-bottom:0px; border-color:inherit; @@ -46,25 +45,19 @@ background:transparent; border-left-width:inherit; border-right-width:inherit; } - .menuitemtop *{ - margin:2px 2px 0 2px; - padding-top:2px; - padding-bottom:2px; - /* padding: 5px 0px 3px 5px; */ + .menuitemtop >*{ + margin:4px 2px 0 2px; + padding: 3px 10px 3px 5px; border:transparent; } - .menuitemmiddle *{ + .menuitemmiddle >*{ margin:0 2px 0 2px; - padding-top:2px; - padding-bottom:2px; - /* padding: 3px 0px 3px 5px; */ + padding: 3px 10px 3px 5px; border:transparent; } - .menuitembottom *{ + .menuitembottom >*{ margin:0 2px 2px 2px; - padding-top:2px; - padding-bottom:2px; - /* padding: 3px 0px 5px 5px; */ + padding: 3px 10px 3px 5px; } .menuitemtop:hover { background:@theme_bg_color; @@ -87,27 +80,21 @@ background:transparent; border-right-width:inherit; } - .menuitemtop:hover* { - margin:2px 2px 0 2px; - padding-top:2px; - padding-bottom:2px; - /* padding: 5px 0 3px 5px; */ + .menuitemtop:hover>* { + margin:4px 2px 0 2px; + padding: 3px 10px 3px 5px; background:@theme_selected_bg_color; border-radius:2px; } - .menuitemmiddle:hover* { - margin:0 2px 0px 2px; - padding-top:2px; - padding-bottom:2px; - /* padding: 3px 0px 3px 5px; */ + .menuitemmiddle:hover>* { + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; background:@theme_selected_bg_color; border-radius:2px; } - .menuitembottom:hover* { + .menuitembottom:hover>* { margin:0 2px 2px 2px; - padding-top:2px; - padding-bottom:2px; - /* padding: 3px 0px 5px 5px; */ + padding: 3px 10px 3px 5px; background:@theme_selected_bg_color; border-radius:2px; } @@ -118,24 +105,35 @@ background:transparent; .boxInfoMessOK{ background-color: #f3f0ac; } -.invisprogress { - background-color:transparent; - color:transparent; - +.errorBox { + border-width: 2px; + border-color: #ea9999; + border-style:solid; } -.invisprogress.osd { - background:transparent; - color:transparent; + +.chosenOutline{ + transition: 0ms; + border-width: 1px; + border-color: #f3f0ac; + border-style:solid; } -.invisprogress.trough * { - background:transparent; - color:transparent; + +.separatorTop{ + border-color: darker (@theme_bg_color); + border-top-width:1px; + border-style:solid; } -.invisprogress.trough.empty { - background:transparent; - color:transparent; + +.separatorBottom{ + border-color: darker (@theme_bg_color); + border-bottom-width:1px; + border-style:solid; } .marginright image{ margin-right: 2px; -} \ No newline at end of file +} + +treeview row:nth-child(odd) { background-color: #000000; } + +treeview row:nth-child(even) { background-color: #ffffff; } \ No newline at end of file diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 39b7c4e..42a9d95 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -1,319 +1,59 @@ - + - - - - - False - False - True - center - com.ublinux.ubl-settings-repomanager - dialog - True - ubl-settings-repomanager - 1.1 - Copyright © 2022 - 2023, UBSoft LLC - Repository manager - https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-repomanager - Project Home Page - Это приложение распространяется без каких-либо гарантий. -Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. - UBGroup - UBGroup - com.ublinux.ubl-settings-repomanager - True - gpl-2-0 - - - True - False - vertical - 2 - - - False - end - - - False - False - 1 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - Repository manager - - - - - - - - - + True False - - - 90 - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 69 - com.ublinux.ubl-settings-repomanager - - - False - True - 0 - - - - - True - False - - - True - False - - - True - False - vertical - - - 255 - True - False - end - Repository manager - 0 - - - - - - - - True - True - 0 - - - - - 255 - True - False - start - Repository management and configuring - 0 - - - - - - - - True - True - 1 - - - - - False - True - 0 - - - - - True - True - 0 - - - - - True - True - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 65536 - 1 - 10 + True + + + True False - document-new-symbolic - - - True - False - value-increase-symbolic - - - True - False - value-decrease-symbolic - - - True - False - edit-copy-symbolic + com.ublinux.libublsettingsui-gtk3.sync-symbolic True False - document-open-symbolic + com.ublinux.libublsettingsui-gtk3.database-symbolic True False - system-run-symbolic + com.ublinux.libublsettingsui-gtk3.increase-symbolic True False - user-trash-symbolic + com.ublinux.libublsettingsui-gtk3.arrows-left-right-symbolic True False - com.ublinux.ubl-settings-repomanager.document-sign-symbolic + com.ublinux.libublsettingsui-gtk3.trash-symbolic - + True False - com.ublinux.libublsettingsui-gtk3.cancel-symbolic + com.ublinux.libublsettingsui-gtk3.cloud-arrow-up-symbolic - + True False - com.ublinux.libublsettingsui-gtk3.accept-symbolic - - - False - False - 450 - com.ublinux.ubl-settings-repomanager + vertical - + True False - 5 - 5 - 5 - 5 - vertical - 10 True False - - - True - False - start - 20 - 20 - dialog-question-symbolic - 6 - - - False - True - 0 - - + 5 True @@ -322,18 +62,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. vertical 5 - + True - False - start - Would you like to read documentation in the Web? - True - 0 - - - + True + True + image1 @@ -343,16 +78,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + True - False - start - start - You will be redirected to documentation website where documentation is -translated and supported by community. - 0 + True + True + image2 @@ -362,1095 +94,119 @@ translated and supported by community. - - Always redirect to online documentation + True True - False - end - True + True + image3 False True - end 2 - - - - True - True - 1 - - - - - - True - True - 0 - - - - - - - True - False - - - True - False - Repository manager - - - - - - - - Cancel - True - True - True - image8 - - - - - - Open documentation - True - True - True - image9 - - - - end - 1 - - - - - - - True - False - False - - - True - False - Load from global configuration - - - - - - True - False - Load from local configuration - - - - - - True - False - False - False - - - True - False - False - - - True - False - Save to global and local documentation - - - - - - True - False - Save to global configuration - - - - - - True - False - Save to local configuration - - - - - - 800 - 600 - False - 800 - 600 - com.ublinux.ubl-settings-repomanager - - - True - False - vertical - - - True - False - vertical - - - True - False - + True - False - 5 - 5 - 5 - 5 - 5 - 5 - 25 + True + True + image4 + False True - 0 + 3 - + True - False - start - 5 - 5 - 5 - 5 - 6 - 6 - - - - + True + True + image5 + False True - 1 + 4 - - - False - True - 0 - - - - - True - False - vertical - - 81 + True - False - - - True - False - start - - - -1 - - + True + True + image6 + False True - 0 + 5 False True - 1 + 0 True False - 5 - 5 - 5 - 5 - 5 - 5 - True - True - vertical + 5 True False + 10 5 - + True - False - vertical - 5 + True + in - - True - False - vertical - - - True - True - 40 - edit-find-symbolic - False - False - name - - - False - True - 0 - - - - - False - True - 0 - - - - + True True - 395 - True + RepoList + False + treeviewcolumn1 - - True - False - 5 - 5 - 5 + + column - - True - False - vertical - 5 - - - True - False - - - False - True - 0 - - - - - True - True - True - Open or create repository - image1 - - - - False - True - 1 - - - - - True - True - Open existing repository - image2 - - - - False - True - 2 - - - - - True - True - Configure repository - image3 - - - - False - True - 3 - - - - - True - False - True - True - Delete repository - image4 - - - - False - True - 4 - - - - - True - False - - - False - True - 5 - - - - - True - False - True - True - Sign - image5 - - - - False - True - 6 - - - - - True - False - - - False - True - 7 - - - - - True - False - True - True - Add package - image11 - - - - False - True - 11 - - - - - True - False - True - True - Remove package - image12 - - - - False - True - 12 - - - - - False - True - 0 - - - - - True - False - 0 - in - - - True - False - 5 - 5 - 5 - 5 - - - True - True - - - True - False - none - - - True - True - RepoStore - False - treeviewcolumn2 - 0 - - - - - - column - - - - - column - - - - 0 - - - - - [D] - - - 5 - - - - - - 1 - - - - - - - - - - - - - - - - - - - True - True - 1 - - - - - False - True - - - - - True - True - 5 - 5 - False - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - 5 - - - False - 5 - - - True - False - start - Code name: - 0 - - - - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - False - 5 - - - True - False - start - Branch: - 0 - - - - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 1 - - - - - False - 5 - - - True - False - start - Version: - 0 - - - - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 2 - - - - - False - 5 - - - True - False - start - Architecture: - 0 - - - - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 3 - - - - - False - 5 - - - True - False - start - Dependences: - 0 - - - - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 4 - - - - - False - 5 - - - True - False - start - Signature: - 0 - - - - - - False - True - 0 - - - - - True - False - True - 0 - - - False - True - 1 - - - - - False - True - 5 - - - - - - - True - False - General + + 4 - - False - + + 1 + - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - 5 - - - Trusted repository - True - True - False - start - True - - - False - True - 0 - - - - - True - False - 5 - - - True - False - Server type: - 0 - - - False - True - 0 - - - - - True - False - 0 - - HTML - local - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - - - True - False - IP adress: - 0 - - - False - True - 0 - - - - - True - False - 0 - True - - 192.168.1.110 - - - - False - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - 5 - - - True - False - Port: - 0 - - - False - True - 0 - - - - - True - True - 0 - adjustment1 - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - 5 - - - True - False - True - - - True - True - 0 - - - - - True - True - True - image13 - - - - False - True - 1 - - - - - False - True - 4 - - - - - Publish - True - True - True - start - - - False - True - 5 - - - - - 1 - - - - - True - False - Publication - - - 1 - False - + + + 0 + - - True - True - - - True - True - 1 - @@ -1466,75 +222,20 @@ translated and supported by community. 0 - - - False - True - 2 - - - - - True - True - 0 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - Repository manager - - - - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 32 - com.ublinux.ubl-settings-repomanager - - - - - True - False - - - True - False - True - menu3 True False + 10 + vertical + 5 - + True - False - Save + True + edit-find-symbolic + False + False False @@ -1543,135 +244,154 @@ translated and supported by community. - + True - False - pan-down-symbolic + True + in + + + True + True + RepoFileList + False + 0 + + + column + + + + 1 + + + + + + 0 + + + + + + - False + True True 1 + + + 125 + True + True + in + + + True + True + RepoPackagesTre + False + + + column + + + + 1 + + + + + + 0 + + + + + + + + + False + True + 2 + + + + True + True + 1 + - - - False - True - 0 - - - - - True - True - True - False - True - True - menu2 - none - - - - - - False - True - end - 1 - - - - - Save - True - True - True - - - False - True - 2 - - - - - end - 1 - - - - - False - - - True - True - False - True - menu1 - - + True False + 0.019999999552965164 + in - + True False - Load + 5 + 5 + 5 + + + True + False + vertical + + + True + False + 0 + + + False + True + 0 + + + + - - False - True - 0 - - - + + True False - pan-down-symbolic + Information - - False - True - 1 - + + True + True + 2 + - False + True True - 0 + 1 - 2 + -1 - + + True + True + 0 + - - - - - - - - - - From 9c88ee35ae9007b3604d73a3001810a1c09d73b5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 3 May 2024 18:11:57 +0600 Subject: [PATCH 02/82] Added interaction for storage configuration window --- gresource.xml | 1 + source/CMakeLists.txt | 1 + source/ubl-settings-repomanager.c | 185 ++++++++++++++++++- source/ubl-settings-repomanager.h | 9 +- source/ubl-strings.h | 8 +- ubl-settings-repomanager-configuration.glade | 27 +-- ubl-settings-repomanager-filechooser.glade | 4 +- ubl-settings-repomanager-repo-block.glade | 88 +++++++++ ubl-settings-repomanager.glade | 64 ++++++- 9 files changed, 359 insertions(+), 28 deletions(-) create mode 100644 ubl-settings-repomanager-repo-block.glade diff --git a/gresource.xml b/gresource.xml index 0a81b82..162aec7 100644 --- a/gresource.xml +++ b/gresource.xml @@ -4,6 +4,7 @@ ubl-settings-repomanager.glade ubl-settings-repomanager-add.glade ubl-settings-repomanager-configuration.glade + ubl-settings-repomanager-repo-block.glade ubl-settings-repomanager.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 62d60b4..a5251e3 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -38,6 +38,7 @@ set(DEPENDFILES ../ubl-settings-repomanager.glade ../ubl-settings-repomanager-add.glade ../ubl-settings-repomanager-configuration.glade + ../ubl-settings-repomanager-repo-block.glade ../gresource.xml ../ubl-settings-repomanager-banner.png ../ubl-settings-repomanager.css diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e7deeb9..6df40a8 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -2,7 +2,170 @@ config main_config; +void on_repo_signed(){ + +} + +void on_repo_removed(GtkWidget *self,storage_config_window *window){ + GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); + char *repo = (char*)gtk_entry_get_text(GTK_ENTRY(g_list_nth_data(list,0))); + GtkTreeIter iter; + char *storage; + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&storage,-1); + dictionary *storg = yon_dictionary_get_data(yon_dictionary_get(&window->storages,storage),dictionary*); + window->storages->data = yon_dictionary_rip(yon_dictionary_get(&storg,repo)); + yon_storage_config_update(window); +} + +void yon_storage_config_update(storage_config_window *window){ + GList *children = gtk_container_get_children(GTK_CONTAINER(window->ReposBox)); + for (int i=0;iStoragePathCombo),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&name,-1); + dictionary *current = yon_dictionary_get(&window->storages,name); + if (current&¤t->data){ + dictionary *cur_repo = yon_dictionary_get_data(current,dictionary*); + dictionary *dic=NULL; + for_dictionaries(dic,cur_repo){ + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_block); + GtkWidget *box = yon_gtk_builder_get_widget(builder,"MainBox"); + gtk_box_pack_start(GTK_BOX(window->ReposBox),box,0,0,0); + g_signal_connect(gtk_builder_get_object(builder,"SignatureButton"),"clicked",G_CALLBACK(on_repo_signed),window); + g_signal_connect(gtk_builder_get_object(builder,"RepoRemoveButton"),"clicked",G_CALLBACK(on_repo_removed),window); + gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder,"RepoNameEntry")),dic->key); + } + } + } +} + //storage-configure window section +void on_storage_open(GtkWidget *self, storage_config_window *window){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + int responce = gtk_dialog_run(GTK_DIALOG(dialog)); + if (responce == GTK_RESPONSE_ACCEPT){ + char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(path)){ + GtkTreeIter iter; + gtk_list_store_append(window->StorageList,&iter); + gtk_list_store_set(window->StorageList,&iter,0,path,-1); + yon_dictionary_add_or_create_if_exists_with_data(window->storages,path,NULL); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + } + } + gtk_widget_destroy(dialog); +} + +void on_storage_create(GtkWidget *self, storage_config_window *window){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + int responce = gtk_dialog_run(GTK_DIALOG(dialog)); + if (responce == GTK_RESPONSE_ACCEPT){ + char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(path)){ + GtkTreeIter iter; + gtk_list_store_append(window->StorageList,&iter); + gtk_list_store_set(window->StorageList,&iter,0,path,-1); + yon_dictionary_add_or_create_if_exists_with_data(window->storages,path,NULL); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + } + } + gtk_widget_destroy(dialog); +} +void on_storage_disable(GtkWidget *self, storage_config_window *window){ + dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); + data->action_text=DISABLE_CONFIRMATION_LABEL; + data->function=NULL; + data->data=NULL; + if (yon_confirmation_dialog_call(self,data)){ + GtkTreeIter iter; + char *storage; + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&storage,-1); + dictionary *storages = yon_dictionary_get(&window->storages,storage); + if (storages){ + gtk_list_store_remove(window->StorageList,&iter); + window->storages = yon_dictionary_rip(storages); + } + } + yon_storage_config_update(window); +} +void on_storage_remove(GtkWidget *self, storage_config_window *window){ + dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); + data->action_text=REMOVE_CONFIRMATION_LABEL; + data->function=NULL; + data->data=NULL; + if (yon_confirmation_dialog_call(self,data)){ + GtkTreeIter iter; + char *storage; + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&storage,-1); + dictionary *storages = yon_dictionary_get(&window->storages,storage); + if (storages){ + gtk_list_store_remove(window->StorageList,&iter); + window->storages = yon_dictionary_rip(storages); + } + } + yon_storage_config_update(window); +} + +void on_repo_add(GtkWidget *self, storage_config_window *window){ + char *new_repo = (char*)gtk_entry_get_text(GTK_ENTRY(window->AddEntry)); + if (yon_char_is_empty(new_repo)){ + yon_ubl_status_highlight_incorrect(window->AddEntry); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_NAME_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + GtkTreeIter iter; + char *name; + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&name,-1); + dictionary *current = yon_dictionary_get(&window->storages,name); + yon_dictionary_add_or_create_if_exists_with_data(current->data,new_repo,NULL); + yon_storage_config_update(window); + } + +} + +void on_storage_accept(GtkWidget *self,dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); + dictionary *present = NULL; + GtkTreeIter iter; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->RepoList),&iter); + for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->RepoList),&iter)){ + char *name; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&name,-1); + if (yon_dictionary_get(&window->storages,name)){ + dictionary *cur = yon_gtk_tree_store_get_children(GTK_TREE_STORE(widgets->RepoList),&iter,2); + yon_dictionary_add_or_create_if_exists_with_data(present,name,cur); + } else { + gtk_tree_store_remove(widgets->RepoList,&iter); + } + } + dictionary *dic=NULL; + GtkTreeIter parent; + for_dictionaries(dic,window->storages){ + if (!yon_dictionary_get(&present,dic->key)){ + gtk_tree_store_append(widgets->RepoList,&parent,NULL); + gtk_tree_store_set(widgets->RepoList,&parent,3,dic->key,-1); + char *name = yon_char_new(dic->key); + int pos = yon_char_find_last(name,'/'); + if (pos>-1) free(yon_char_divide(name,pos)); + gtk_tree_store_set(widgets->RepoList,&parent,2,name,3,dic->key,-1); + yon_gtk_tree_store_fill_children(widgets->RepoList,&parent,dic->data,2); + } + + } + + on_subwindow_close(self); +} + 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); @@ -11,7 +174,7 @@ storage_config_window *yon_storage_config_window_new(){ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); - window->StoragePathEntry = yon_gtk_builder_get_widget(builder,"StoragePathEntry"); + window->StoragePathCombo = yon_gtk_builder_get_widget(builder,"StoragePathCombo"); window->OpenExistingButton = yon_gtk_builder_get_widget(builder,"OpenExistingButton"); window->CreateNewButton = yon_gtk_builder_get_widget(builder,"CreateNewButton"); window->DisableButton = yon_gtk_builder_get_widget(builder,"DisableButton"); @@ -19,8 +182,14 @@ storage_config_window *yon_storage_config_window_new(){ window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox"); window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); + window->StorageList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->AcceptButton),"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->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); + g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); + window->storages=NULL; return window; } @@ -29,6 +198,18 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ storage_config_window *window = yon_storage_config_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","storage-configuration-window"); gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); + GtkTreeIter iter; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->RepoList),&iter); + for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->RepoList),&iter)){ + char *name; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&name,-1); + dictionary *cur = yon_gtk_tree_store_get_children(GTK_TREE_STORE(widgets->RepoList),&iter,2); + yon_dictionary_add_or_create_if_exists_with_data(window->storages,name,cur); + } + 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); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 1b0ac73..c9a43d7 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -24,6 +24,7 @@ #define glade_path "/com/ublinux/ui/ubl-settings-repomanager.glade" #define glade_path_repo_add "/com/ublinux/ui/ubl-settings-repomanager-add.glade" #define glade_path_storage_config "/com/ublinux/ui/ubl-settings-repomanager-configuration.glade" +#define glade_path_repo_block "/com/ublinux/ui/ubl-settings-repomanager-repo-block.glade" #define banner_path "/com/ublinux/images/ubl-settings-repomanager-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-repomanager.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) @@ -103,7 +104,7 @@ typedef struct { GtkWidget *CancelButton; GtkWidget *AcceptButton; GtkWidget *StatusBox; - GtkWidget *StoragePathEntry; + GtkWidget *StoragePathCombo; GtkWidget *OpenExistingButton; GtkWidget *CreateNewButton; GtkWidget *DisableButton; @@ -111,6 +112,10 @@ typedef struct { GtkWidget *ReposBox; GtkWidget *AddEntry; GtkWidget *AddRepoButton; + GtkListStore *StorageList; + dictionary *storages; } storage_config_window; -main_window *setup_window(); \ No newline at end of file +main_window *setup_window(); + +void yon_storage_config_update(storage_config_window *window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 86c5b73..61ef52f 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -63,4 +63,10 @@ #define PACKAGE_LABEL _("package") #define REPOSITORY_LABEL _("repository") #define ALREADY_EXIST _("This package already exists in that repository") -#define REPO_ALREADY_EXISTS_LABEL _("This repository has already been added") \ No newline at end of file +#define REPO_ALREADY_EXISTS_LABEL _("This repository has already been added") + +#define CLOSE_LABEL _("Close") + +#define DISABLE_CONFIRMATION_LABEL _("Are you sure want to disable?") + +#define REMOVE_CONFIRMATION_LABEL _("Are you sure want to remove?") \ No newline at end of file diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index a970bdd..0307cc1 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -28,6 +28,12 @@ False com.ublinux.libublsettingsui-gtk3.increase-symbolic + + + + + + 450 200 @@ -82,9 +88,17 @@ - + True - True + False + liststore1 + 0 + + + + 0 + + True @@ -200,15 +214,6 @@ - - - - - - - - - diff --git a/ubl-settings-repomanager-filechooser.glade b/ubl-settings-repomanager-filechooser.glade index 375dece..51e6354 100644 --- a/ubl-settings-repomanager-filechooser.glade +++ b/ubl-settings-repomanager-filechooser.glade @@ -25,7 +25,7 @@ False end - + Cancel True True @@ -39,7 +39,7 @@ - + Choose True True diff --git a/ubl-settings-repomanager-repo-block.glade b/ubl-settings-repomanager-repo-block.glade new file mode 100644 index 0000000..9d02791 --- /dev/null +++ b/ubl-settings-repomanager-repo-block.glade @@ -0,0 +1,88 @@ + + + + + + + True + False + com.ublinux.libublsettingsui-gtk3.key-symbolic + + + True + False + com.ublinux.libublsettingsui-gtk3.trash-symbolic + + + True + False + 5 + + + True + False + + + False + True + 0 + + + + + True + False + Signature: + 0 + + + False + True + 1 + + + + + True + False + + + True + True + 2 + + + + + True + True + True + image1 + + + + False + True + 3 + + + + + True + True + True + image2 + + + + False + True + 4 + + + + diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 42a9d95..6ba3b54 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -8,9 +8,36 @@ False True - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True False @@ -184,9 +211,13 @@ True True - RepoList + RepoStore False treeviewcolumn1 + 2 + + + column @@ -195,13 +226,20 @@ 4 + 0 + + + + + + 4 1 - 0 + 2 @@ -255,19 +293,22 @@ RepoFileList False 0 + + + column - 1 + 0 - 0 + 1 @@ -291,21 +332,24 @@ True True - RepoPackagesTre + RepoPackagesStore False + + + column - 1 + 0 - 0 + 1 From 5e40a1de0064339c9558e37aa125a9d763503cc5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 7 May 2024 16:21:01 +0600 Subject: [PATCH 03/82] Storage configuration actions --- source/ubl-settings-repomanager.c | 229 +++++++++++-------- source/ubl-settings-repomanager.h | 8 +- ubl-settings-repomanager-add.glade | 10 +- ubl-settings-repomanager-configuration.glade | 31 ++- ubl-settings-repomanager.glade | 2 + 5 files changed, 184 insertions(+), 96 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 6df40a8..62fba96 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -9,12 +9,11 @@ void on_repo_signed(){ void on_repo_removed(GtkWidget *self,storage_config_window *window){ GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); char *repo = (char*)gtk_entry_get_text(GTK_ENTRY(g_list_nth_data(list,0))); - GtkTreeIter iter; + GtkTreeIter iter, itar; char *storage; gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&storage,-1); - dictionary *storg = yon_dictionary_get_data(yon_dictionary_get(&window->storages,storage),dictionary*); - window->storages->data = yon_dictionary_rip(yon_dictionary_get(&storg,repo)); + gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + gtk_tree_store_remove(GTK_TREE_STORE(window->storages_copy),&itar); yon_storage_config_update(window); } @@ -23,38 +22,40 @@ void yon_storage_config_update(storage_config_window *window){ for (int i=0;iStoragePathCombo),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&name,-1); - dictionary *current = yon_dictionary_get(&window->storages,name); - if (current&¤t->data){ - dictionary *cur_repo = yon_dictionary_get_data(current,dictionary*); - dictionary *dic=NULL; - for_dictionaries(dic,cur_repo){ + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&childiter,&itar)){ + int valid = 1; + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&childiter)){ + char *repo; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&childiter,2,&repo,-1); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_block); GtkWidget *box = yon_gtk_builder_get_widget(builder,"MainBox"); gtk_box_pack_start(GTK_BOX(window->ReposBox),box,0,0,0); g_signal_connect(gtk_builder_get_object(builder,"SignatureButton"),"clicked",G_CALLBACK(on_repo_signed),window); g_signal_connect(gtk_builder_get_object(builder,"RepoRemoveButton"),"clicked",G_CALLBACK(on_repo_removed),window); - gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder,"RepoNameEntry")),dic->key); + gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder,"RepoNameEntry")),repo); } } } } //storage-configure window section + void on_storage_open(GtkWidget *self, storage_config_window *window){ GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); int responce = gtk_dialog_run(GTK_DIALOG(dialog)); if (responce == GTK_RESPONSE_ACCEPT){ char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); if (!yon_char_is_empty(path)){ - GtkTreeIter iter; - gtk_list_store_append(window->StorageList,&iter); - gtk_list_store_set(window->StorageList,&iter,0,path,-1); - yon_dictionary_add_or_create_if_exists_with_data(window->storages,path,NULL); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + GtkTreeIter iter, itar; + gtk_tree_store_append(window->storages_copy,&iter,NULL); + gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + char *name = yon_char_new(path); + free(yon_char_divide(name,yon_char_find_last(name,'/'))); + gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); } } @@ -67,33 +68,33 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ if (responce == GTK_RESPONSE_ACCEPT){ char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); if (!yon_char_is_empty(path)){ - GtkTreeIter iter; - gtk_list_store_append(window->StorageList,&iter); - gtk_list_store_set(window->StorageList,&iter,0,path,-1); - yon_dictionary_add_or_create_if_exists_with_data(window->storages,path,NULL); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + GtkTreeIter iter, itar; + gtk_tree_store_append(window->storages_copy,&iter,NULL); + gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + char *name = yon_char_new(path); + free(yon_char_divide(name,yon_char_find_last(name,'/'))); + gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); } } gtk_widget_destroy(dialog); } + void on_storage_disable(GtkWidget *self, storage_config_window *window){ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); data->action_text=DISABLE_CONFIRMATION_LABEL; data->function=NULL; data->data=NULL; - if (yon_confirmation_dialog_call(self,data)){ - GtkTreeIter iter; - char *storage; - gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&storage,-1); - dictionary *storages = yon_dictionary_get(&window->storages,storage); - if (storages){ - gtk_list_store_remove(window->StorageList,&iter); - window->storages = yon_dictionary_rip(storages); + GtkTreeIter iter,itar; + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ + if (yon_confirmation_dialog_call(self,data)){ + char *storage; + gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,0,&storage,-1); } + yon_storage_config_update(window); } - yon_storage_config_update(window); } void on_storage_remove(GtkWidget *self, storage_config_window *window){ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); @@ -101,71 +102,51 @@ void on_storage_remove(GtkWidget *self, storage_config_window *window){ data->function=NULL; data->data=NULL; if (yon_confirmation_dialog_call(self,data)){ - GtkTreeIter iter; + GtkTreeIter iter,itar; char *storage; gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&storage,-1); - dictionary *storages = yon_dictionary_get(&window->storages,storage); - if (storages){ - gtk_list_store_remove(window->StorageList,&iter); - window->storages = yon_dictionary_rip(storages); - } + gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,0,&storage,-1); } yon_storage_config_update(window); } void on_repo_add(GtkWidget *self, storage_config_window *window){ - char *new_repo = (char*)gtk_entry_get_text(GTK_ENTRY(window->AddEntry)); + char *new_repo = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->AddEntry))); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); if (yon_char_is_empty(new_repo)){ yon_ubl_status_highlight_incorrect(window->AddEntry); yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_NAME_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); return; } - GtkTreeIter iter; - char *name; + GtkTreeIter iter,itar, childiter; if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(window->StorageList),&iter,0,&name,-1); - dictionary *current = yon_dictionary_get(&window->storages,name); - yon_dictionary_add_or_create_if_exists_with_data(current->data,new_repo,NULL); + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + gtk_tree_store_append(window->storages_copy,&childiter,&itar); + gtk_tree_store_set(window->storages_copy,&childiter,2,new_repo,-1); yon_storage_config_update(window); } - + free(new_repo); } -void on_storage_accept(GtkWidget *self,dictionary *dict){ +void on_storage_accept(GtkWidget *self, dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); - dictionary *present = NULL; - GtkTreeIter iter; - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->RepoList),&iter); - for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->RepoList),&iter)){ - char *name; - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&name,-1); - if (yon_dictionary_get(&window->storages,name)){ - dictionary *cur = yon_gtk_tree_store_get_children(GTK_TREE_STORE(widgets->RepoList),&iter,2); - yon_dictionary_add_or_create_if_exists_with_data(present,name,cur); - } else { - gtk_tree_store_remove(widgets->RepoList,&iter); - } - } - dictionary *dic=NULL; - GtkTreeIter parent; - for_dictionaries(dic,window->storages){ - if (!yon_dictionary_get(&present,dic->key)){ - gtk_tree_store_append(widgets->RepoList,&parent,NULL); - gtk_tree_store_set(widgets->RepoList,&parent,3,dic->key,-1); - char *name = yon_char_new(dic->key); - int pos = yon_char_find_last(name,'/'); - if (pos>-1) free(yon_char_divide(name,pos)); - gtk_tree_store_set(widgets->RepoList,&parent,2,name,3,dic->key,-1); - yon_gtk_tree_store_fill_children(widgets->RepoList,&parent,dic->data,2); - } - - } - + 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)); on_subwindow_close(self); } +gboolean yon_storage_filter_func(GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data); + +void on_storage_changed(GtkWidget *self, storage_config_window *window){ + yon_storage_config_update(window); +} + 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); @@ -182,30 +163,30 @@ storage_config_window *yon_storage_config_window_new(){ window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox"); window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); - window->StorageList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); + window->storages_copy = gtk_tree_store_new(6,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING); + yon_gtk_tree_store_copy_full(main_config.tree_store,window->storages_copy); + gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->storages_copy)); 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->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); - window->storages=NULL; + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window); + gtk_combo_box_set_model(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->storages_copy)); return window; } void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ storage_config_window *window = yon_storage_config_window_new(); - yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","storage-configuration-window"); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"storage-configuration-window"); gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); - GtkTreeIter iter; - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->RepoList),&iter); - for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->RepoList),&iter)){ - char *name; - gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,2,&name,-1); - dictionary *cur = yon_gtk_tree_store_get_children(GTK_TREE_STORE(widgets->RepoList),&iter,2); - yon_dictionary_add_or_create_if_exists_with_data(window->storages,name,cur); - } + window->StorageFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(window->storages_copy),NULL); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(window->StorageFilter),yon_storage_filter_func,widgets,NULL); + gtk_combo_box_set_model(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->StorageFilter)); + 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); @@ -214,6 +195,58 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ } //repo-add window section +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; + } + +gboolean yon_repo_filter_func(GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data){ + GtkTreeIter parent; + if (gtk_tree_model_iter_parent(model, &parent, iter)){ + char *name; + gtk_tree_model_get(model,iter,2,&name,-1); + printf("%s\n",name); + if (gtk_tree_model_iter_parent(model,iter,&parent)) + return 1; + } + return 0; + } + +gboolean yon_arch_filter_func(GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data){ + GtkTreeIter parent; + if (gtk_tree_model_iter_parent(model, &parent, iter)){ + if (gtk_tree_model_iter_parent(model, iter, &parent)){ + if (gtk_tree_model_iter_parent(model,&parent,iter)) + return 1; + } + } + return 0; + } + +gboolean yon_package_filter_func(GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data){ + GtkTreeIter parent; + if (gtk_tree_model_iter_parent(model, &parent, iter)){ + if (gtk_tree_model_iter_parent(model, iter, &parent)){ + if (gtk_tree_model_iter_parent(model,&parent,iter)){ + if (gtk_tree_model_iter_parent(model, iter, &parent)){ + return 1; + } + } + } + } + return 0; + } + 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); @@ -241,6 +274,12 @@ repo_add_window *yon_repo_add_window_new(){ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); + window->storage_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); + window->repo_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); + window->arch_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); + window->package_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); @@ -249,13 +288,22 @@ repo_add_window *yon_repo_add_window_new(){ 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),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","add-repo-window"); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"add-repo-window"); + gtk_tree_model_filter_set_visible_func(window->storage_filter,yon_storage_filter_func,NULL,NULL); + gtk_tree_model_filter_set_visible_func(window->repo_filter,yon_repo_filter_func,NULL,NULL); + gtk_tree_model_filter_set_visible_func(window->arch_filter,yon_arch_filter_func,NULL,NULL); + gtk_tree_model_filter_set_visible_func(window->package_filter,yon_package_filter_func,NULL,NULL); + + gtk_combo_box_set_model(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->storage_filter)); + gtk_combo_box_set_model(GTK_COMBO_BOX(window->RepositoryCombo),GTK_TREE_MODEL(window->repo_filter)); + gtk_combo_box_set_model(GTK_COMBO_BOX(window->ArchitectureCombo),GTK_TREE_MODEL(window->arch_filter)); + gtk_tree_view_set_model(GTK_TREE_VIEW(window->PackagesTree),GTK_TREE_MODEL(window->package_filter)); gtk_widget_show(window->MainWindow); } void 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),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","add-repo-window"); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"move-repo-window"); gtk_widget_show(window->MoveSourceFrame); gtk_widget_show(window->MoveTargetFrame); gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); @@ -264,7 +312,7 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ void 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),TITLE_LABEL,"com.ublinux.ubl-settings-repomanager","add-repo-window"); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"remove-repo-window"); gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); gtk_widget_show(window->MainWindow); } @@ -305,6 +353,7 @@ main_window *yon_main_window_complete(main_window *widgets){ widgets->RepoList = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); widgets->RepoFileList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoFileList")); widgets->RepoPackagesTre = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoPackagesTre")); + main_config.tree_store = widgets->RepoList; 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); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index c9a43d7..b3d8377 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -96,6 +96,10 @@ typedef struct { GtkWidget *PackagesTree; GtkWidget *InfoLabel; GtkListStore *PackagesList; + GtkTreeModelFilter *storage_filter; + GtkTreeModelFilter *repo_filter; + GtkTreeModelFilter *arch_filter; + GtkTreeModelFilter *package_filter; } repo_add_window; typedef struct { @@ -112,8 +116,10 @@ typedef struct { GtkWidget *ReposBox; GtkWidget *AddEntry; GtkWidget *AddRepoButton; + GtkWidget *TestTree; GtkListStore *StorageList; - dictionary *storages; + GtkTreeStore *storages_copy; + GtkTreeModel *StorageFilter; } storage_config_window; main_window *setup_window(); diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index dcab229..1255f5d 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -68,12 +68,18 @@ - + True False + + + + 2 + + - True + False True 1 diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index 0307cc1..92f28f7 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -36,7 +36,7 @@ 450 - 200 + 300 False True com.ublinux.ubl-settings-repomanager @@ -92,11 +92,11 @@ True False liststore1 - 0 + 0 - 0 + 3 @@ -289,6 +289,31 @@ 1 + + + True + True + + + + + + column + + + + 2 + + + + + + + False + True + 2 + + diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 6ba3b54..2373121 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -36,6 +36,8 @@ + + From 33ce2595cc3ae078af8b373bf72803f375f06241 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 14 May 2024 18:27:41 +0600 Subject: [PATCH 04/82] Added saving and loading of storages, repositories --- source/ubl-settings-repomanager.c | 264 +++++++++++++++++++++++------ source/ubl-settings-repomanager.h | 12 +- ubl-settings-repomanager-add.glade | 35 +++- 3 files changed, 247 insertions(+), 64 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 62fba96..fec3dca 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -57,8 +57,25 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + char *repos=NULL; + int repos_size=0; + yon_window_config_get_parameter("storage_info",path,&repos,YON_TYPE_STRING); + if (!yon_char_is_empty(repos)){ + config_str repos_list = yon_char_parse(repos,&repos_size,","); + for (int i=0;istorages_copy,&itar,&iter); + gtk_tree_store_set(window->storages_copy,&itar,2,render_name,3,repos_list[i],-1); + free(render_name); + } + yon_char_parsed_free(repos_list,repos_size); + } else { + yon_window_config_add_custom_parameter(path,"storage_info","",YON_TYPE_STRING); + } } } + yon_storage_config_update(window); gtk_widget_destroy(dialog); } @@ -76,8 +93,10 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + yon_window_config_add_custom_parameter(path,"storage_info","",YON_TYPE_STRING); } } + yon_storage_config_update(window); gtk_widget_destroy(dialog); } @@ -92,6 +111,7 @@ void on_storage_disable(GtkWidget *self, storage_config_window *window){ char *storage; gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,0,&storage,-1); + yon_window_config_erase_custom_parameter(storage,"storage_info"); } yon_storage_config_update(window); } @@ -106,7 +126,18 @@ void on_storage_remove(GtkWidget *self, storage_config_window *window){ char *storage; gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,0,&storage,-1); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;iStoragePathCombo),&iter)){ gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + char *path; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&path,-1); + char *child_path = yon_char_unite(path,"/",new_repo,NULL); gtk_tree_store_append(window->storages_copy,&childiter,&itar); - gtk_tree_store_set(window->storages_copy,&childiter,2,new_repo,-1); + gtk_tree_store_set(window->storages_copy,&childiter,2,new_repo,3,child_path,-1); yon_storage_config_update(window); + char *old; + yon_window_config_get_parameter("storage_info",path,&old,YON_TYPE_STRING); + int old_repos_size; + config_str old_repos_parsed = yon_char_parse(old,&old_repos_size,","); + if (yon_char_parsed_check_exist(old_repos_parsed,old_repos_size,child_path)==-1){ + yon_char_parsed_add_or_create_if_exists(old_repos_parsed,&old_repos_size,child_path); + } + yon_window_config_add_custom_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); + yon_char_parsed_free(old_repos_parsed,old_repos_size); + yon_launch(create_storage_command(path, new_repo)); + int size; + config_str dirs = yon_file_list_dirs(child_path,&size); + for (int i=0;istorages_copy,&iter,&childiter); + gtk_tree_store_set(window->storages_copy,&iter,2,dirs[i],3,arch_path,-1); + + if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){ + config_str final = NULL; + int final_size=0; + DIR *current_dir = opendir(arch_path); + struct dirent* cur_dir; + while ((cur_dir=readdir(current_dir))){ + if (strlen(cur_dir->d_name)>8){ + char *extension = yon_char_new(cur_dir->d_name); + free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4)); + if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){ + yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name); + } + } + } + closedir(current_dir); + yon_window_config_add_custom_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); + } + } + yon_char_parsed_free(dirs,size); } free(new_repo); } @@ -204,48 +274,76 @@ gboolean yon_storage_filter_func(GtkTreeModel *model, return 1; } -gboolean yon_repo_filter_func(GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data){ - GtkTreeIter parent; - if (gtk_tree_model_iter_parent(model, &parent, iter)){ - char *name; - gtk_tree_model_get(model,iter,2,&name,-1); - printf("%s\n",name); - if (gtk_tree_model_iter_parent(model,iter,&parent)) - return 1; +config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level){ + 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); } - return 0; - } - -gboolean yon_arch_filter_func(GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data){ - GtkTreeIter parent; - if (gtk_tree_model_iter_parent(model, &parent, iter)){ - if (gtk_tree_model_iter_parent(model, iter, &parent)){ - if (gtk_tree_model_iter_parent(model,&parent,iter)) - return 1; + 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); + free(append); } + gtk_tree_path_free(path); } - return 0; - } + return final; +} -gboolean yon_package_filter_func(GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data){ - GtkTreeIter parent; - if (gtk_tree_model_iter_parent(model, &parent, iter)){ - if (gtk_tree_model_iter_parent(model, iter, &parent)){ - if (gtk_tree_model_iter_parent(model,&parent,iter)){ - if (gtk_tree_model_iter_parent(model, iter, &parent)){ - return 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)){ + 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); } } } + } - return 0; - } +} + +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; + 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->ArchitectureCombo),path_str,current); + } + } + } + } +} + +void on_add_selection_changed(GtkWidget *self, repo_add_window *window){ + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->storage_filter)); + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->repo_filter)); + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->arch_filter)); + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->package_filter)); +} repo_add_window *yon_repo_add_window_new(){ repo_add_window *window = malloc(sizeof(repo_add_window)); @@ -272,32 +370,38 @@ repo_add_window *yon_repo_add_window_new(){ window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); - - window->storage_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); - window->repo_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); - window->arch_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); - window->package_filter = (GtkTreeModelFilter*)gtk_tree_model_filter_new(GTK_TREE_MODEL(main_config.tree_store),NULL); - - + window->tree_copy = gtk_tree_store_new(6,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING); + yon_gtk_tree_store_copy_full(main_config.tree_store,window->tree_copy); + window->storage_filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); + window->repo_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); + window->arch_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); + window->package_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); + gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->tree_copy)); + + 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_selection_changed),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); return window; } +// main 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),TITLE_LABEL,icon_path,"add-repo-window"); - gtk_tree_model_filter_set_visible_func(window->storage_filter,yon_storage_filter_func,NULL,NULL); - gtk_tree_model_filter_set_visible_func(window->repo_filter,yon_repo_filter_func,NULL,NULL); - gtk_tree_model_filter_set_visible_func(window->arch_filter,yon_arch_filter_func,NULL,NULL); - gtk_tree_model_filter_set_visible_func(window->package_filter,yon_package_filter_func,NULL,NULL); - - gtk_combo_box_set_model(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->storage_filter)); - gtk_combo_box_set_model(GTK_COMBO_BOX(window->RepositoryCombo),GTK_TREE_MODEL(window->repo_filter)); - gtk_combo_box_set_model(GTK_COMBO_BOX(window->ArchitectureCombo),GTK_TREE_MODEL(window->arch_filter)); - gtk_tree_view_set_model(GTK_TREE_VIEW(window->PackagesTree),GTK_TREE_MODEL(window->package_filter)); + 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_widget_show(window->MainWindow); } @@ -331,6 +435,60 @@ void config_init(){ main_config.lock_save_local=0; } +void yon_config_load_update(main_window *widgets){ + 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,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,3,name_parsed[j],2,nm,-1); + free(nm); + int size; + config_str dirs = yon_file_list_dirs(name_parsed[j],&size); + for (int k=0;kRepoList,&iter,&itar); + gtk_tree_store_set(widgets->RepoList,&iter,2,dirs[k],3,arch_path,-1); + + if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){ + config_str final = NULL; + int final_size=0; + DIR *current_dir = opendir(arch_path); + struct dirent* cur_dir; + while ((cur_dir=readdir(current_dir))){ + if (strlen(cur_dir->d_name)>8){ + char *extension = yon_char_new(cur_dir->d_name); + free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4)); + if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){ + yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name); + } + } + } + closedir(current_dir); + yon_window_config_add_custom_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); + } + } + } + yon_char_parsed_free(name_parsed,parsed_size); + } + + } + if (size) + yon_char_parsed_free(storages,size); +} + main_window *yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); @@ -361,6 +519,7 @@ main_window *yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); + @@ -388,6 +547,7 @@ int main(int argc, char *argv[]){ widgets = (template_main_window*)yon_main_window_complete((main_window*)widgets); char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); yon_window_config_load(path); + yon_config_load_update((main_window*)widgets); if (getuid()!=0){ yon_ubl_status_box_render("",BACKGROUND_IMAGE_SUCCESS_TYPE); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index b3d8377..e778b0c 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -44,6 +44,8 @@ typedef char* string; #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) +#define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL) + string version_application; char *local; @@ -95,11 +97,13 @@ typedef struct { GtkWidget *RemoveButton; GtkWidget *PackagesTree; GtkWidget *InfoLabel; + GtkWidget *TestTree; GtkListStore *PackagesList; - GtkTreeModelFilter *storage_filter; - GtkTreeModelFilter *repo_filter; - GtkTreeModelFilter *arch_filter; - GtkTreeModelFilter *package_filter; + GtkTreeStore *tree_copy; + GtkTreeModel *storage_filter; + GtkTreeModel *repo_filter; + GtkTreeModel *arch_filter; + GtkTreeModel *package_filter; } repo_add_window; typedef struct { diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 1255f5d..13ae7fa 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -68,18 +68,12 @@ - + True False - - - - 2 - - - False + True True 1 @@ -560,6 +554,31 @@ 5 + + + True + True + + + + + + column + + + + 2 + + + + + + + False + True + 6 + + True From 7861614253a0a18078ec25ade3f9f0bbaec284ca Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 15 May 2024 18:36:44 +0600 Subject: [PATCH 05/82] Partially make of packages adding --- source/ubl-settings-repomanager.c | 112 ++++++++++++++++++++++++++++- ubl-settings-repomanager-add.glade | 45 +++++++++++- ubl-settings-repomanager.glade | 14 ++-- 3 files changed, 158 insertions(+), 13 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index fec3dca..4979239 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -327,17 +327,81 @@ void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *win 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); + 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); + + } + } + } + } +} + +void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList)); + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + 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)){ + char *curpath; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&curpath,-1); + char *packages; + yon_window_config_get_parameter("package_info",curpath,&packages,YON_TYPE_STRING); + if (!yon_char_is_empty(packages)){ + int size; + config_str parsed = yon_char_parse(packages,&size,","); + for (int i=0;iPackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,parsed[i],2,full_path_package,-1); + free(full_path_package); } } } } } +void on_add_package(GtkWidget *self, repo_add_window *window){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,ACCEPT_LABEL,GTK_RESPONSE_ACCEPT,NULL); + gtk_widget_show(dialog); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.tar.*"); + gtk_file_filter_set_name(filter,"*.tar.*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); + int responce = gtk_dialog_run(GTK_DIALOG(dialog)); + if (responce == GTK_RESPONSE_ACCEPT){ + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + char *path; + GtkTreeIter iter,itar; + 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,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)); + for (int i=0;iPackagesList,&itar); + gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,-1); + + } + } + } + gtk_widget_destroy(dialog); +} + +void on_remove_package(){ + +} + void on_add_selection_changed(GtkWidget *self, repo_add_window *window){ gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->storage_filter)); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->repo_filter)); @@ -382,9 +446,11 @@ repo_add_window *yon_repo_add_window_new(){ 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_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->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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); return window; } @@ -489,6 +555,45 @@ void yon_config_load_update(main_window *widgets){ yon_char_parsed_free(storages,size); } +void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ + gtk_list_store_clear(widgets->RepoFileList); + GtkTreeIter iter,itar; + GtkTreeModel *model=NULL; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){ + GtkTreePath *path = gtk_tree_model_get_path(model,&iter); + int depth = gtk_tree_path_get_depth(path); + char *target; + gtk_tree_model_get(model, &iter,3,&target,-1); + switch (depth){ + case 1:{ + + } + break; + case 2:{ + + } + break; + case 3:{ + char *packages; + int size; + yon_window_config_get_parameter("package_info",target,&packages,YON_TYPE_STRING); + if (!yon_char_is_empty(packages)){ + config_str parsed = yon_char_parse(packages,&size,","); + for (int i=0;iRepoFileList,&itar); + char *name = yon_char_new(parsed[i]); + char *temp = yon_char_divide_search(name,"-",-1); + free(name); + name=temp; + gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); + } + } + } + break; + } + } +} + main_window *yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); @@ -517,6 +622,7 @@ main_window *yon_main_window_complete(main_window *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); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 13ae7fa..17c0833 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -3,7 +3,16 @@ - + + + + + + + + + + True False @@ -490,9 +499,43 @@ True True PackagesList + both + + + Type + + + + 0 + + + + + + + Name + + + + 1 + + + + + + + Path + + + + 2 + + + + diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 2373121..36df70a 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -14,13 +14,9 @@ - - - - - + - + @@ -334,7 +330,7 @@ True True - RepoPackagesStore + RepoFileList False @@ -345,13 +341,13 @@ - 0 + 2 - 1 + 3 From bc7eb468176623299b8b65c51f8a03ee52639426 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 17 May 2024 18:06:16 +0600 Subject: [PATCH 06/82] Add pakcage window fixes --- source/ubl-settings-repomanager.c | 126 ++++++++++++++++++----------- source/ubl-settings-repomanager.h | 5 ++ ubl-settings-repomanager-add.glade | 2 + 3 files changed, 88 insertions(+), 45 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 4979239..34f92e3 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -71,7 +71,7 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ } yon_char_parsed_free(repos_list,repos_size); } else { - yon_window_config_add_custom_parameter(path,"storage_info","",YON_TYPE_STRING); + yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); } } } @@ -93,7 +93,7 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); - yon_window_config_add_custom_parameter(path,"storage_info","",YON_TYPE_STRING); + yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); } } yon_storage_config_update(window); @@ -166,7 +166,7 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ if (yon_char_parsed_check_exist(old_repos_parsed,old_repos_size,child_path)==-1){ yon_char_parsed_add_or_create_if_exists(old_repos_parsed,&old_repos_size,child_path); } - yon_window_config_add_custom_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); + yon_window_config_add_instant_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); yon_char_parsed_free(old_repos_parsed,old_repos_size); yon_launch(create_storage_command(path, new_repo)); int size; @@ -191,7 +191,7 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ } } closedir(current_dir); - yon_window_config_add_custom_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); + yon_window_config_add_instant_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); } } yon_char_parsed_free(dirs,size); @@ -264,6 +264,9 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_show(window->MainWindow); } +//repo-move window + + //repo-add window section gboolean yon_storage_filter_func(GtkTreeModel *model, GtkTreeIter *iter, @@ -275,6 +278,7 @@ gboolean yon_storage_filter_func(GtkTreeModel *model, } 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; @@ -348,19 +352,17 @@ void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window * if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ char *curpath; gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&curpath,-1); - char *packages; - yon_window_config_get_parameter("package_info",curpath,&packages,YON_TYPE_STRING); - if (!yon_char_is_empty(packages)){ int size; - config_str parsed = yon_char_parse(packages,&size,","); + config_str parsed = yon_file_ls(curpath,&size); for (int i=0;iPackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,1,parsed[i],2,full_path_package,-1); - free(full_path_package); + if (strstr(parsed[i],".tar.")&&!strstr(parsed[i],".files.")&&!strstr(parsed[i],".db.")&&!strstr(parsed[i],".sig")){ + char *full_path_package = yon_char_unite(curpath,"/",parsed[i],NULL); + char *name = yon_char_new(parsed[i]); + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,1,parsed[i],2,full_path_package,3,0,-1); + free(full_path_package); + } } - } } } } @@ -376,7 +378,7 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ if (responce == GTK_RESPONSE_ACCEPT){ char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); char *path; - GtkTreeIter iter,itar; + 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,3,&path,-1); char *packages; @@ -389,17 +391,45 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ char *name = yon_char_new(current); free(yon_char_divide(name,yon_char_find_last(name,'/'))); if (yon_char_parsed_check_exist(parsed,size,current)==-1){ - gtk_list_store_append(window->PackagesList,&itar); - gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,-1); + char *repo_store_path = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,repo_store_path); + char *repo_name; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&repo_name,-1); + char *repo_pack = yon_char_divide(repo_name,yon_char_find_last(repo_name,'/')); + yon_debug_output("%s\n",add_packages_command(repo_pack,repo_name,current)); + if (!system(add_packages_command(repo_pack,repo_name,current))){ + gtk_list_store_append(window->PackagesList,&itar); + gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,3,1,-1); + yon_char_parsed_add_or_create_if_exists(parsed,&size,name); + yon_window_config_add_instant_parameter(path,"package_info",yon_char_parsed_to_string(parsed,size,","),YON_TYPE_STRING); + } } } } gtk_widget_destroy(dialog); } -void on_remove_package(){ +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 *arch = (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,arch); + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&arch,-1); + 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,&repo,3,&path,-1); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&itar)){ + char *cur_name, *cur_path; + gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&itar,1,&cur_name,2,&cur_path,-1); + char *command = remove_packages_command(arch,repo,cur_name); + yon_debug_output("%s\n",command); + yon_launch(command); + on_add_target_package_selection_changed(window->ArchitectureCombo,window); + } } void on_add_selection_changed(GtkWidget *self, repo_add_window *window){ @@ -436,13 +466,15 @@ repo_add_window *yon_repo_add_window_new(){ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); - window->tree_copy = gtk_tree_store_new(6,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING); + 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); window->storage_filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->repo_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->arch_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->package_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->tree_copy)); + window->added_packages_archs = NULL; + window->removed_packages_archs = NULL; 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); @@ -477,6 +509,15 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ 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->StorageCombo),path,current); + } + } gtk_widget_show(window->MainWindow); } @@ -520,32 +561,16 @@ void yon_config_load_update(main_window *widgets){ free(yon_char_divide(nm,yon_char_find_last(nm,'/'))); gtk_tree_store_append(widgets->RepoList,&itar,&iter); gtk_tree_store_set(widgets->RepoList,&itar,3,name_parsed[j],2,nm,-1); - free(nm); int size; config_str dirs = yon_file_list_dirs(name_parsed[j],&size); for (int k=0;kRepoList,&iter,&itar); - gtk_tree_store_set(widgets->RepoList,&iter,2,dirs[k],3,arch_path,-1); - - if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){ - config_str final = NULL; - int final_size=0; - DIR *current_dir = opendir(arch_path); - struct dirent* cur_dir; - while ((cur_dir=readdir(current_dir))){ - if (strlen(cur_dir->d_name)>8){ - char *extension = yon_char_new(cur_dir->d_name); - free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4)); - if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){ - yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name); - } - } - } - closedir(current_dir); - yon_window_config_add_custom_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,size,","),YON_TYPE_STRING); + if (strcmp(dirs[k],"pool")&&strcmp(dirs[k],nm)){ + char *arch_path = yon_char_unite(name_parsed[j],"/",dirs[k],NULL); + gtk_tree_store_append(widgets->RepoList,&iter,&itar); + gtk_tree_store_set(widgets->RepoList,&iter,2,dirs[k],3,arch_path,-1); } } + free(nm); } yon_char_parsed_free(name_parsed,parsed_size); } @@ -566,29 +591,40 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ gtk_tree_model_get(model, &iter,3,&target,-1); switch (depth){ case 1:{ + int lvlsize; + config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,2); + for (int i=0;iRepoFileList,&itar); + gtk_list_store_set(widgets->RepoFileList,&itar,1,level[i],-1); + } } break; case 2:{ + int lvlsize; + config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,3); + for (int i=0;iRepoFileList,&itar); + gtk_list_store_set(widgets->RepoFileList,&itar,1,level[i],-1); + } } break; case 3:{ char *packages; int size; - yon_window_config_get_parameter("package_info",target,&packages,YON_TYPE_STRING); - if (!yon_char_is_empty(packages)){ - config_str parsed = yon_char_parse(packages,&size,","); + config_str parsed = yon_file_ls(target,&size); for (int i=0;iRepoFileList,&itar); char *name = yon_char_new(parsed[i]); - char *temp = yon_char_divide_search(name,"-",-1); + char *temp = yon_char_divide_search(name,".",-1); free(name); name=temp; gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); + } } } - } break; } } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index e778b0c..0fe750a 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -45,6 +45,8 @@ typedef char* string; #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) #define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL) +#define add_packages_command(path,name,packages_path) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"' ",packages_path,NULL) +#define remove_packages_command(path,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -d '", path,"' ",packages_path,NULL) string version_application; @@ -104,6 +106,9 @@ typedef struct { GtkTreeModel *repo_filter; GtkTreeModel *arch_filter; GtkTreeModel *package_filter; + + dictionary *added_packages_archs; + dictionary *removed_packages_archs; } repo_add_window; typedef struct { diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 17c0833..97caa61 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -11,6 +11,8 @@ + + From c393c7afbd4c36ff32c93f81931f3b1469bef2a2 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 21 May 2024 15:50:28 +0600 Subject: [PATCH 07/82] Package movement WIP --- gresource.xml | 1 + source/CMakeLists.txt | 1 + source/ubl-settings-repomanager.c | 294 +++++++++++++++++---- source/ubl-settings-repomanager.h | 12 + ubl-settings-repomanager-add.glade | 11 - ubl-settings-repomanager-filechooser.glade | 100 +++++-- 6 files changed, 338 insertions(+), 81 deletions(-) diff --git a/gresource.xml b/gresource.xml index 162aec7..eb85a99 100644 --- a/gresource.xml +++ b/gresource.xml @@ -5,6 +5,7 @@ ubl-settings-repomanager-add.glade ubl-settings-repomanager-configuration.glade ubl-settings-repomanager-repo-block.glade + ubl-settings-repomanager-filechooser.glade ubl-settings-repomanager.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index a5251e3..1fe07f1 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -38,6 +38,7 @@ set(DEPENDFILES ../ubl-settings-repomanager.glade ../ubl-settings-repomanager-add.glade ../ubl-settings-repomanager-configuration.glade + ../ubl-settings-repomanager-filechooser.glade ../ubl-settings-repomanager-repo-block.glade ../gresource.xml ../ubl-settings-repomanager-banner.png diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 34f92e3..4ed4894 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -41,7 +41,31 @@ void yon_storage_config_update(storage_config_window *window){ } } -//storage-configure window section +gboolean yon_gtk_tree_iter_get_from_combo_box_id(GtkComboBox *combo, GtkTreeModel *model, GtkTreeIter *iter){ + g_return_val_if_fail(GTK_IS_COMBO_BOX(combo),0); + g_return_val_if_fail(GTK_IS_TREE_MODEL(model),0); + const char *id = gtk_combo_box_get_active_id(combo); + if (yon_char_is_empty(id)) return 0; + gtk_tree_model_get_iter_from_string(model,iter,id); + return 1; +} + +// filechooser window section + +file_chooser_window *yon_file_chooser_window_new(){ + file_chooser_window *window = malloc(sizeof(file_chooser_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_filechooser_config); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + 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); + + return window; +} + +// storage-configure window section void on_storage_open(GtkWidget *self, storage_config_window *window){ GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); @@ -367,47 +391,96 @@ void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window * } } -void on_add_package(GtkWidget *self, repo_add_window *window){ - GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,ACCEPT_LABEL,GTK_RESPONSE_ACCEPT,NULL); - gtk_widget_show(dialog); - GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(filter,"*.tar.*"); - gtk_file_filter_set_name(filter,"*.tar.*"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); - int responce = gtk_dialog_run(GTK_DIALOG(dialog)); - if (responce == GTK_RESPONSE_ACCEPT){ - char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); - char *path; - 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,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)); - for (int i=0;iRepositoryCombo)); - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,repo_store_path); - char *repo_name; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&repo_name,-1); - char *repo_pack = yon_char_divide(repo_name,yon_char_find_last(repo_name,'/')); - yon_debug_output("%s\n",add_packages_command(repo_pack,repo_name,current)); - if (!system(add_packages_command(repo_pack,repo_name,current))){ - gtk_list_store_append(window->PackagesList,&itar); - gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,3,1,-1); - yon_char_parsed_add_or_create_if_exists(parsed,&size,name); - yon_window_config_add_instant_parameter(path,"package_info",yon_char_parsed_to_string(parsed,size,","),YON_TYPE_STRING); +void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ + GtkWidget *RepoCombo = NULL; + GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); + RepoCombo = (GtkWidget*)g_list_nth_data(list,3); + g_list_free(list); + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(RepoCombo)); + 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(RepoCombo),child_id,target); + } +} + +void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ + GtkWidget *ArchCombo = NULL; + GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); + ArchCombo = (GtkWidget*)g_list_nth_data(list,5); + g_list_free(list); + 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); + } + +} + +void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ + +} + +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; + 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,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;iRepositoryCombo)); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,repo_store_path); + char *repo_name; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&repo_name,-1); + char *repo_pack = yon_char_divide(repo_name,yon_char_find_last(repo_name,'/')); + yon_debug_output("%s\n",add_packages_command(repo_pack,repo_name,current)); + if (!system(add_packages_command(repo_pack,repo_name,current))){ + gtk_list_store_append(window->PackagesList,&itar); + gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,3,1,-1); + yon_char_parsed_add_or_create_if_exists(parsed,&size,name); + yon_window_config_add_instant_parameter(path,"package_info",yon_char_parsed_to_string(parsed,size,","),YON_TYPE_STRING); - } } } } - gtk_widget_destroy(dialog); + gtk_widget_destroy(dialog->Window); +} + +void on_add_package(GtkWidget *self, repo_add_window *window){ + file_chooser_window *dialog = yon_file_chooser_window_new(); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),TITLE_LABEL,icon_path,"filechooserWindow"); + gtk_widget_show(dialog->Window); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.pkg.tar*"); + 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); } void on_remove_package(GtkWidget *self, repo_add_window *window){ @@ -473,16 +546,11 @@ repo_add_window *yon_repo_add_window_new(){ window->arch_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); window->package_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->tree_copy)); - window->added_packages_archs = NULL; - window->removed_packages_archs = NULL; - 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->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - 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); + + window->added_packages_archs = NULL; + window->removed_packages_archs = NULL; return window; } @@ -500,9 +568,128 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current); } } + + 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_subwindow_close),NULL); + 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); gtk_widget_show(window->MainWindow); } +void on_folder_changed(GtkFileChooser *self, file_chooser_window *dialog){ + 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); + } +} + +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,2,files[k],-1); + } + } + } else { + GtkTreeIter iter; + gtk_list_store_append(window->PackagesList,&iter); + gtk_list_store_set(window->PackagesList,&iter,2,path,-1); + + } + } + 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->MoveTargetStorageEntry,0); + gtk_widget_set_sensitive(window->MoveTargetRepoEntry,0); + gtk_widget_set_sensitive(window->MoveTargetArchEntry,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_window_new(); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow"); + 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,-1); + yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry),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); + gtk_widget_show(dialog->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->MoveTargetStorageEntry,1); + gtk_widget_set_sensitive(window->MoveTargetRepoEntry,1); + gtk_widget_set_sensitive(window->MoveTargetArchEntry,1); + } +} + +void on_move_accept(GtkWidget *self, repo_add_window *window){ + int size = 0; + config_str packages = NULL; + GtkTreeIter iter,itar; + for_iter(GTK_TREE_MODEL(window->PackagesList),&iter){ + char *target; + gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&iter,3,&target,-1); + if (!yon_char_is_empty(target)){ + yon_char_parsed_add_or_create_if_exists(packages,&size,target); + } + if (size){ + 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,source_repo, target_repo, yon_char_parsed_to_string(packages,size," ")); + system(command); + } + } +} + void 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),TITLE_LABEL,icon_path,"move-repo-window"); @@ -515,9 +702,22 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ 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_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); } } + gtk_widget_destroy(gtk_widget_get_parent(window->StorageCombo)); + 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->MoveTargetStorageEntry),"changed",G_CALLBACK(on_move_storage_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),window); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 0fe750a..6bd8f42 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -25,6 +25,7 @@ #define glade_path_repo_add "/com/ublinux/ui/ubl-settings-repomanager-add.glade" #define glade_path_storage_config "/com/ublinux/ui/ubl-settings-repomanager-configuration.glade" #define glade_path_repo_block "/com/ublinux/ui/ubl-settings-repomanager-repo-block.glade" +#define glade_path_filechooser_config "/com/ublinux/ui/ubl-settings-repomanager-filechooser.glade" #define banner_path "/com/ublinux/images/ubl-settings-repomanager-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-repomanager.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) @@ -48,6 +49,8 @@ typedef char* string; #define add_packages_command(path,name,packages_path) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"' ",packages_path,NULL) #define remove_packages_command(path,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -d '", path,"' ",packages_path,NULL) +#define yon_move_packages_command(storage, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,NULL) + string version_application; char *local; @@ -131,6 +134,15 @@ typedef struct { GtkTreeModel *StorageFilter; } storage_config_window; +typedef struct { + GtkWidget *Window; + GtkWidget *CancelButton; + GtkWidget *ChooseButton; + GtkWidget *NameEntry; + GtkWidget *FileChooserWidget; + char *root_path; +} file_chooser_window; + main_window *setup_window(); void yon_storage_config_update(storage_config_window *window); \ No newline at end of file diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 97caa61..314e922 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -505,17 +505,6 @@ - - - Type - - - - 0 - - - - Name diff --git a/ubl-settings-repomanager-filechooser.glade b/ubl-settings-repomanager-filechooser.glade index 51e6354..cd8524e 100644 --- a/ubl-settings-repomanager-filechooser.glade +++ b/ubl-settings-repomanager-filechooser.glade @@ -12,51 +12,105 @@ False com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic - + False - dialog - + True + + True False vertical - 2 - - + + + True False - end + vertical - - Cancel + + + + + False + True + 0 + + + + + True + False + 5 + vertical + 5 + + True - True - True - image2 + False - True + False True - 0 + 1 - - Choose + True - True - True - image1 + False + 5 + 5 + 5 + + + True + True + + + True + True + 0 + + + + + Cancel + True + True + True + image2 + + + False + True + 1 + + + + + Choose + True + True + True + image1 + + + False + True + 2 + + - True + False True - 1 + 2 False - False - 0 + True + 1 From b0c5b137253f76e08f6f94c8d89dc394767b5bf7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 21 May 2024 18:02:49 +0600 Subject: [PATCH 08/82] Package movement fixes --- source/ubl-settings-repomanager.c | 27 ++++++++++++--------------- ubl-settings-repomanager-add.glade | 1 + 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 4ed4894..ad79537 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -392,28 +392,25 @@ void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window * } void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ - GtkWidget *RepoCombo = NULL; - GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); - RepoCombo = (GtkWidget*)g_list_nth_data(list,3); - g_list_free(list); - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(RepoCombo)); + 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(RepoCombo),child_id,target); + 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_move_repo_changed(GtkWidget *self, repo_add_window *window){ GtkWidget *ArchCombo = NULL; - GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); - ArchCombo = (GtkWidget*)g_list_nth_data(list,5); - g_list_free(list); + 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)); @@ -616,7 +613,6 @@ void on_move_add_accept(GtkWidget *self, dictionary *dict){ gtk_widget_set_sensitive(window->MoveSourceRepoEntry,0); gtk_widget_set_sensitive(window->MoveSourceArchEntry,0); - gtk_widget_set_sensitive(window->MoveTargetStorageEntry,0); gtk_widget_set_sensitive(window->MoveTargetRepoEntry,0); gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); } @@ -660,7 +656,6 @@ void on_move_remove_package(GtkWidget *self, repo_add_window *window){ gtk_widget_set_sensitive(window->MoveSourceRepoEntry,1); gtk_widget_set_sensitive(window->MoveSourceArchEntry,1); - gtk_widget_set_sensitive(window->MoveTargetStorageEntry,1); gtk_widget_set_sensitive(window->MoveTargetRepoEntry,1); gtk_widget_set_sensitive(window->MoveTargetArchEntry,1); } @@ -671,11 +666,14 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ config_str packages = NULL; GtkTreeIter iter,itar; for_iter(GTK_TREE_MODEL(window->PackagesList),&iter){ - char *target; - gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&iter,3,&target,-1); + 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){ 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); @@ -685,9 +683,9 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ 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,source_repo, target_repo, yon_char_parsed_to_string(packages,size," ")); + yon_debug_output("%s\n",command); system(command); } - } } void on_move_clicked(GtkWidget *self, main_window *widgets){ @@ -711,7 +709,6 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ 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->MoveTargetStorageEntry),"changed",G_CALLBACK(on_move_storage_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); diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 314e922..09d695c 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -278,6 +278,7 @@ True + False False From 8760346e8fb08243d662c2c012cd3404ee5accf6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 22 May 2024 09:48:53 +0600 Subject: [PATCH 09/82] Fixed startup repos loading bug --- source/ubl-settings-repomanager.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index ad79537..29f4243 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -674,18 +674,18 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ free(target); } } - if (size){ - 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,source_repo, target_repo, yon_char_parsed_to_string(packages,size," ")); - yon_debug_output("%s\n",command); - system(command); - } + if (size){ + 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,source_repo, target_repo, yon_char_parsed_to_string(packages,size," ")); + yon_debug_output("%s\n",command); + system(command); + } } void on_move_clicked(GtkWidget *self, main_window *widgets){ @@ -763,8 +763,8 @@ void yon_config_load_update(main_window *widgets){ for (int k=0;kRepoList,&iter,&itar); - gtk_tree_store_set(widgets->RepoList,&iter,2,dirs[k],3,arch_path,-1); + gtk_tree_store_append(widgets->RepoList,&childiter,&itar); + gtk_tree_store_set(widgets->RepoList,&childiter,2,dirs[k],3,arch_path,-1); } } free(nm); From fa9844e5098a3207b6a152dec41a37007252f8ac Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 22 May 2024 17:36:01 +0600 Subject: [PATCH 10/82] Pakcage movement fixes --- source/ubl-settings-repomanager.c | 84 +++++++++++++++++++++++++----- source/ubl-settings-repomanager.h | 6 +-- ubl-settings-repomanager-add.glade | 2 + 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 29f4243..5be8681 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -411,6 +411,8 @@ void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ GtkWidget *ArchCombo = NULL; ArchCombo = self==window->MoveSourceRepoEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; + + yon_debug_output("%s\n","repo"); 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)); @@ -422,21 +424,45 @@ void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ 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); } + yon_debug_output("%s\n","repo 2"); } 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 *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_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; + 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,3,&path,-1); + 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; @@ -452,8 +478,9 @@ void on_add_accept(GtkWidget *self, dictionary *dict){ char *repo_name; gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&repo_name,-1); char *repo_pack = yon_char_divide(repo_name,yon_char_find_last(repo_name,'/')); - yon_debug_output("%s\n",add_packages_command(repo_pack,repo_name,current)); - if (!system(add_packages_command(repo_pack,repo_name,current))){ + char *command = add_packages_command(repo_pack,arch_name,repo_name,current); + yon_debug_output("%s\n",command); + if (!system(command)){ gtk_list_store_append(window->PackagesList,&itar); gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,3,1,-1); yon_char_parsed_add_or_create_if_exists(parsed,&size,name); @@ -482,20 +509,24 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ 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 *arch = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + 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,arch); - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&arch,-1); + 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); - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&repo,3,&path,-1); 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); + char *temp = yon_char_divide(path,yon_char_find_last(path,'/')); + free(path); + path=temp; + free(yon_char_divide(path,yon_char_find_last(path,'/'))); char *cur_name, *cur_path; gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&itar,1,&cur_name,2,&cur_path,-1); - char *command = remove_packages_command(arch,repo,cur_name); + char *command = remove_packages_command(storage,path,repo,cur_name); yon_debug_output("%s\n",command); yon_launch(command); on_add_target_package_selection_changed(window->ArchitectureCombo,window); @@ -509,6 +540,16 @@ void on_add_selection_changed(GtkWidget *self, repo_add_window *window){ gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->package_filter)); } +void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ + 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); + } else { + gtk_widget_set_sensitive(window->RemoveButton,0); + } +} + 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); @@ -545,6 +586,7 @@ repo_add_window *yon_repo_add_window_new(){ gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(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; @@ -657,7 +699,6 @@ void on_move_remove_package(GtkWidget *self, repo_add_window *window){ gtk_widget_set_sensitive(window->MoveSourceArchEntry,1); gtk_widget_set_sensitive(window->MoveTargetRepoEntry,1); - gtk_widget_set_sensitive(window->MoveTargetArchEntry,1); } } @@ -675,6 +716,7 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ } } 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; @@ -682,10 +724,11 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ 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,source_repo, target_repo, yon_char_parsed_to_string(packages,size," ")); + 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); system(command); } + on_subwindow_close(window->MainWindow); } void on_move_clicked(GtkWidget *self, main_window *widgets){ @@ -720,8 +763,23 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ void 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),TITLE_LABEL,icon_path,"remove-repo-window"); - gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"add-repo-window"); + 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); + } + } + + 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_subwindow_close),NULL); + 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); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 6bd8f42..d5683b2 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -46,10 +46,10 @@ typedef char* string; #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) #define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL) -#define add_packages_command(path,name,packages_path) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"' ",packages_path,NULL) -#define remove_packages_command(path,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -d '", path,"' ",packages_path,NULL) +#define add_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager add -r '",name,"' -a '",arch,"' -d '", path,"' ",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 yon_move_packages_command(storage, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,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) string version_application; diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 09d695c..7891137 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -438,6 +438,7 @@ True + False True True image2 @@ -454,6 +455,7 @@ True + False True True image1 From 311bc9070543311523e55fffdb8aeee67c1890e4 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 22 May 2024 18:21:57 +0600 Subject: [PATCH 11/82] Early remove of packages implementation --- source/ubl-settings-repomanager.c | 34 ++++++++++++++++++++++++++++--- source/ubl-settings-repomanager.h | 2 ++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 5be8681..4fafc4b 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -761,6 +761,34 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_show(window->MainWindow); } +void on_remove_accept(GtkWidget *self, repo_add_window *window){ + GtkTreeModel *model; + GtkTreeIter iter; + 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); + + } + GtkTreeIter iter; + int size; + 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 *command = yon_delete_packages_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," ")); + yon_debug_output("%s\n",command); + system(command); + } +} + void 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),TITLE_LABEL,icon_path,"add-repo-window"); @@ -777,9 +805,9 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ 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_subwindow_close),NULL); - 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->AddButton),"clicked",G_CALLBACK(on_remove_accept),NULL); + 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); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index d5683b2..102ed6c 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -50,6 +50,8 @@ typedef char* string; #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 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) + string version_application; From 1d576f43a755e1e6adae347f574f6001118a9b78 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 23 May 2024 14:58:09 +0600 Subject: [PATCH 12/82] Storage configuration minor rework --- source/ubl-settings-repomanager.c | 139 +++++++++++++------ source/ubl-settings-repomanager.h | 5 + ubl-settings-repomanager-configuration.glade | 22 +-- 3 files changed, 105 insertions(+), 61 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 4fafc4b..e5a0520 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -11,10 +11,26 @@ void on_repo_removed(GtkWidget *self,storage_config_window *window){ char *repo = (char*)gtk_entry_get_text(GTK_ENTRY(g_list_nth_data(list,0))); GtkTreeIter iter, itar; char *storage; - gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - gtk_tree_store_remove(GTK_TREE_STORE(window->storages_copy),&itar); + char *id = (char*)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(window->storages_copy),&iter,id); + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){ + char *target; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,2,&target,-1); + if (!strcmp(target,repo)){ + gtk_tree_store_remove(window->storages_copy,&itar); + break; + } + } + } yon_storage_config_update(window); + // gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); + // gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + // if (yon_gtk_tree_store_find_full(GTK_TREE_MODEL(window->storages_copy),&itar,2,repo)){ + // gtk_tree_store_remove(GTK_TREE_STORE(window->storages_copy),&itar); + // yon_storage_config_update(window); + // } } void yon_storage_config_update(storage_config_window *window){ @@ -22,14 +38,14 @@ void yon_storage_config_update(storage_config_window *window){ for (int i=0;iStoragePathCombo),&iter)){ - gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&childiter,&itar)){ + GtkTreeIter iter,itar; + if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->storages_copy),&iter)){ + + if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter)){ int valid = 1; - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&childiter)){ + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){ char *repo; - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&childiter,2,&repo,-1); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,2,&repo,-1); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_block); GtkWidget *box = yon_gtk_builder_get_widget(builder,"MainBox"); gtk_box_pack_start(GTK_BOX(window->ReposBox),box,0,0,0); @@ -41,15 +57,6 @@ void yon_storage_config_update(storage_config_window *window){ } } -gboolean yon_gtk_tree_iter_get_from_combo_box_id(GtkComboBox *combo, GtkTreeModel *model, GtkTreeIter *iter){ - g_return_val_if_fail(GTK_IS_COMBO_BOX(combo),0); - g_return_val_if_fail(GTK_IS_TREE_MODEL(model),0); - const char *id = gtk_combo_box_get_active_id(combo); - if (yon_char_is_empty(id)) return 0; - gtk_tree_model_get_iter_from_string(model,iter,id); - return 1; -} - // filechooser window section file_chooser_window *yon_file_chooser_window_new(){ @@ -268,7 +275,6 @@ 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); - gtk_combo_box_set_model(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->storages_copy)); return window; } @@ -277,9 +283,13 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ storage_config_window *window = yon_storage_config_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"storage-configuration-window"); gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); - window->StorageFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(window->storages_copy),NULL); - gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(window->StorageFilter),yon_storage_filter_func,widgets,NULL); - gtk_combo_box_set_model(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->StorageFilter)); + GtkTreeIter iter,itar; + for_iter(window->storages_copy,&iter){ + char *storage; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&iter,3,&storage,-1); + char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),id,storage); + } dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); @@ -292,9 +302,7 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ //repo-add window section -gboolean yon_storage_filter_func(GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data){ +gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data){ GtkTreeIter parent; if (gtk_tree_model_iter_parent(model, &parent, iter)) return 0; @@ -636,14 +644,20 @@ void on_move_add_accept(GtkWidget *self, dictionary *dict){ for (int k=0;kPackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,2,files[k],-1); + 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); + yon_char_remove_last_symbol(name[0],'\n'); gtk_list_store_append(window->PackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,2,path,-1); + gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,path,-1); } } @@ -672,7 +686,7 @@ void on_move_add_package(GtkWidget *self, repo_add_window *window){ 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,-1); - yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry),GTK_TREE_MODEL(window->tree_copy),&itar); + 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); @@ -761,10 +775,45 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_show(window->MainWindow); } +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_window_new(); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow"); + 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); + gtk_widget_show(dialog->Window); + } +} + +void on_remove_arch_selection_changed(GtkWidget *self, repo_add_window *window){ + 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_remove_accept(GtkWidget *self, repo_add_window *window){ GtkTreeModel *model; GtkTreeIter iter; - char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + 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)); @@ -772,20 +821,18 @@ void on_remove_accept(GtkWidget *self, repo_add_window *window){ 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); - - } - GtkTreeIter iter; - int size; - 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 *command = yon_delete_packages_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," ")); - yon_debug_output("%s\n",command); - system(command); + int size; + 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 *command = yon_delete_packages_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," ")); + yon_debug_output("%s\n",command); + system(command); + } } } @@ -804,9 +851,9 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ 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),NULL); - g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_move_add_package),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),window); + 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); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 102ed6c..555bb19 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -52,6 +52,9 @@ typedef char* string; #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_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL) + +#define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) string version_application; @@ -147,4 +150,6 @@ typedef struct { main_window *setup_window(); +void yon_storage_config_update(storage_config_window *window); + void yon_storage_config_update(storage_config_window *window); \ No newline at end of file diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index 92f28f7..cd8823d 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -28,12 +28,6 @@ False com.ublinux.libublsettingsui-gtk3.increase-symbolic - - - - - - 450 300 @@ -88,17 +82,9 @@ - + True False - liststore1 - 0 - - - - 3 - - True @@ -364,4 +350,10 @@ + + + + + + From d1f3a4ab6309091604087ee36c3725692c742ffe Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 24 May 2024 10:23:02 +0600 Subject: [PATCH 13/82] Fixed crashes at storage window --- source/ubl-settings-repomanager.c | 119 +++++++++++++++++++++++------- source/ubl-settings-repomanager.h | 11 ++- source/ubl-strings.h | 4 +- ubl-settings-repomanager.css | 4 + 4 files changed, 109 insertions(+), 29 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e5a0520..9a6c3f9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -39,8 +39,9 @@ void yon_storage_config_update(storage_config_window *window){ gtk_widget_destroy((GtkWidget*)g_list_nth_data(children,i)); } GtkTreeIter iter,itar; - if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->storages_copy),&iter)){ - + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id); if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter)){ int valid = 1; for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){ @@ -82,15 +83,18 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ if (!yon_char_is_empty(path)){ GtkTreeIter iter, itar; gtk_tree_store_append(window->storages_copy,&iter,NULL); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); char *name = yon_char_new(path); free(yon_char_divide(name,yon_char_find_last(name,'/'))); gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); char *repos=NULL; int repos_size=0; yon_window_config_get_parameter("storage_info",path,&repos,YON_TYPE_STRING); + g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_gtk_combo_box_text_find(window->StoragePathCombo,path); + g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); if (!yon_char_is_empty(repos)){ config_str repos_list = yon_char_parse(repos,&repos_size,","); for (int i=0;istorages_copy,&iter,NULL); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); char *name = yon_char_new(path); free(yon_char_divide(name,yon_char_find_last(name,'/'))); gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); + char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); + g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_gtk_combo_box_text_find(window->StoragePathCombo,path); + g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); } @@ -138,11 +145,25 @@ void on_storage_disable(GtkWidget *self, storage_config_window *window){ data->data=NULL; GtkTreeIter iter,itar; if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ - if (yon_confirmation_dialog_call(self,data)){ - char *storage; - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,0,&storage,-1); + if (yon_confirmation_dialog_call(self,data)){GtkTreeIter itar; + char *storage; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;istorages_copy,&itar); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); + } } yon_storage_config_update(window); } @@ -153,22 +174,26 @@ void on_storage_remove(GtkWidget *self, storage_config_window *window){ data->function=NULL; data->data=NULL; if (yon_confirmation_dialog_call(self,data)){ - GtkTreeIter iter,itar; + GtkTreeIter itar; char *storage; - gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); - char *repos; - yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); - int repo_size; - config_str repo_list = yon_char_parse(repos,&repo_size,","); - for (int i=0;iStoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;istorages_copy,&itar); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); } - if (repo_size) - yon_char_parsed_free(repo_list,repo_size); - yon_window_config_erase_custom_parameter(storage,"storage_info"); - rmdir(storage); } yon_storage_config_update(window); } @@ -182,8 +207,9 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ return; } GtkTreeIter iter,itar, childiter; - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ - gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); char *path; gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&path,-1); char *child_path = yon_char_unite(path,"/",new_repo,NULL); @@ -616,6 +642,9 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ } } + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + 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); @@ -761,6 +790,10 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetStorageEntry),path,current); } } + + 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_widget_destroy(gtk_widget_get_parent(window->StorageCombo)); 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); @@ -848,6 +881,8 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current); } } + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); 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); @@ -870,6 +905,9 @@ void config_init(){ main_config.lock_load_global=0; main_config.lock_save_global=0; main_config.lock_save_local=0; + main_config.signs=NULL; + main_config.signs_size=0; + yon_sign_list_update(); } void yon_config_load_update(main_window *widgets){ @@ -960,6 +998,32 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ } } +void yon_combo_box_text_set_signs(GtkComboBoxText *target){ + yon_sign_list_update(); + g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target)); + gtk_combo_box_text_remove_all(target); + gtk_combo_box_text_append_text(target,DO_NOT_SIGN_LABEL); + for (int i=0;i'); + gtk_combo_box_text_append(target,temp,main_config.signs[i]); + free(temp); + } +} + +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); + for (int i=0;iMoveButton),"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); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 555bb19..e08dc05 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -56,6 +56,7 @@ typedef char* string; #define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) +#define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) string version_application; char *local; @@ -64,6 +65,8 @@ typedef struct { template_config_fields GtkTreeStore *tree_store; int lock_root; + config_str signs; + int signs_size; } config; typedef struct { @@ -152,4 +155,10 @@ main_window *setup_window(); void yon_storage_config_update(storage_config_window *window); -void yon_storage_config_update(storage_config_window *window); \ No newline at end of file +void yon_storage_config_update(storage_config_window *window); + +void yon_sign_list_update(); + +void yon_combo_box_text_set_signs(GtkComboBoxText *target); + +void on_storage_changed(GtkWidget *self, storage_config_window *window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 61ef52f..a9d5c59 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -69,4 +69,6 @@ #define DISABLE_CONFIRMATION_LABEL _("Are you sure want to disable?") -#define REMOVE_CONFIRMATION_LABEL _("Are you sure want to remove?") \ No newline at end of file +#define REMOVE_CONFIRMATION_LABEL _("Are you sure want to remove?") + +#define DO_NOT_SIGN_LABEL _("Do not sign") \ No newline at end of file diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css index 1ca94fe..af0b6cc 100644 --- a/ubl-settings-repomanager.css +++ b/ubl-settings-repomanager.css @@ -134,6 +134,10 @@ background:transparent; margin-right: 2px; } +.spinner_image{ + -gtk-icon-transform: scale(2); +} + treeview row:nth-child(odd) { background-color: #000000; } treeview row:nth-child(even) { background-color: #ffffff; } \ No newline at end of file From 2f56f046195000574ac2e2b2ea6c43cc26133d79 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 24 May 2024 18:28:17 +0600 Subject: [PATCH 14/82] Added signing for storage configuration window and package removal window --- source/ubl-settings-repomanager.c | 59 +++++++++++++++++++++++-------- source/ubl-settings-repomanager.h | 9 ++++- ubl-settings-repomanager.glade | 2 ++ 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 9a6c3f9..c808c2d 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -33,6 +33,34 @@ void on_repo_removed(GtkWidget *self,storage_config_window *window){ // } } +void on_repo_sign_changed(GtkWidget *self, storage_config_window *window){ + GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); + const char *sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(g_list_nth_data(list,2))); + char *target_repo = (char*)gtk_entry_get_text(GTK_ENTRY(g_list_nth_data(list,0))); + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (!yon_char_is_empty(id)){ + GtkTreeIter iter,itar; + int size; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id); + char *storage_path; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&iter,3,&storage_path,-1); + config_str repos = yon_tree_store_get_all_at_level(window->storages_copy,&iter,&size,2,2); + int found = yon_char_parsed_check_exist(repos,size,target_repo); + if (found>-1){ + char *child_id = yon_char_unite((char*)id,":",yon_char_from_int(found),NULL); + if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,child_id)){ + if (!yon_char_is_empty(sign)){ + gtk_tree_store_set(window->storages_copy,&itar,6,1,5,sign,-1); + if (!system(yon_sign_repo(storage_path,target_repo,sign))){ + gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget*)g_list_nth_data(list,2)),0); + } + }else + gtk_tree_store_set(window->storages_copy,&itar,6,-1,5,NULL,-1); + } + } + } +} + void yon_storage_config_update(storage_config_window *window){ GList *children = gtk_container_get_children(GTK_CONTAINER(window->ReposBox)); for (int i=0;iReposBox),box,0,0,0); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(gtk_builder_get_object(builder,"SignatureCombo"))); + gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(builder,"SignatureCombo")),0); g_signal_connect(gtk_builder_get_object(builder,"SignatureButton"),"clicked",G_CALLBACK(on_repo_signed),window); g_signal_connect(gtk_builder_get_object(builder,"RepoRemoveButton"),"clicked",G_CALLBACK(on_repo_removed),window); + g_signal_connect(gtk_builder_get_object(builder,"SignatureCombo"),"changed",G_CALLBACK(on_repo_sign_changed),window); gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder,"RepoNameEntry")),repo); } } @@ -291,7 +322,7 @@ storage_config_window *yon_storage_config_window_new(){ window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); - window->storages_copy = gtk_tree_store_new(6,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING); + window->storages_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->storages_copy); gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->storages_copy)); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); @@ -301,6 +332,7 @@ 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); + return window; } @@ -350,7 +382,6 @@ config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *par 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); - free(append); } gtk_tree_path_free(path); } @@ -567,13 +598,6 @@ void on_remove_package(GtkWidget *self, repo_add_window *window){ } } -void on_add_selection_changed(GtkWidget *self, repo_add_window *window){ - gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->storage_filter)); - gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->repo_filter)); - gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->arch_filter)); - gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->package_filter)); -} - void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ GtkTreeModel *model; GtkTreeIter iter; @@ -613,10 +637,6 @@ repo_add_window *yon_repo_add_window_new(){ 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); - window->storage_filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); - window->repo_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); - window->arch_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); - window->package_filter=gtk_tree_model_filter_new(GTK_TREE_MODEL(window->tree_copy),NULL); gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->tree_copy)); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); @@ -642,6 +662,7 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ } } + 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)); @@ -791,6 +812,7 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ } } + 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)); @@ -862,7 +884,13 @@ void on_remove_accept(GtkWidget *self, repo_add_window *window){ yon_char_parsed_add_or_create_if_exists(packages,&size,target); } if (size){ - char *command = yon_delete_packages_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," ")); + char *sign = 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,yon_char_parsed_to_string(packages,size," "),sign); + } yon_debug_output("%s\n",command); system(command); } @@ -881,8 +909,10 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ 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_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); 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); @@ -999,7 +1029,6 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ } void yon_combo_box_text_set_signs(GtkComboBoxText *target){ - yon_sign_list_update(); g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target)); gtk_combo_box_text_remove_all(target); gtk_combo_box_text_append_text(target,DO_NOT_SIGN_LABEL); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index e08dc05..7c99f3c 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -51,12 +51,17 @@ typedef char* string; #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) #define yon_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL) #define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) + +#define yon_sign_package(storage,repo,arch,target,sign) yon_char_unite("repo-manager add -r '",repo,"' -a '",arch,"' -d '", storage,"' -S '",sign,"' ",target,NULL) +#define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -r '",repo,"' -d '", storage,"' -S '",sign,"'",NULL) + string version_application; char *local; @@ -161,4 +166,6 @@ void yon_sign_list_update(); void yon_combo_box_text_set_signs(GtkComboBoxText *target); -void on_storage_changed(GtkWidget *self, storage_config_window *window); \ No newline at end of file +void on_storage_changed(GtkWidget *self, storage_config_window *window); + +config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level); \ No newline at end of file diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 36df70a..62bd7b8 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -34,6 +34,8 @@ + + From de445aa212c34833c9178113db93ee9ad08810c8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 May 2024 11:35:39 +0600 Subject: [PATCH 15/82] Added package signing --- source/ubl-settings-repomanager.c | 134 +++++++++++++++++++++--------- source/ubl-settings-repomanager.h | 8 +- source/ubl-strings.h | 4 +- 3 files changed, 104 insertions(+), 42 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index c808c2d..476d201 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -95,6 +95,7 @@ file_chooser_window *yon_file_chooser_window_new(){ file_chooser_window *window = malloc(sizeof(file_chooser_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_filechooser_config); window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); 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"); @@ -434,26 +435,11 @@ void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *win void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){ gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList)); - char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); - 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)){ - char *curpath; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&curpath,-1); - int size; - config_str parsed = yon_file_ls(curpath,&size); - for (int i=0;iPackagesList,&iter); - gtk_list_store_set(window->PackagesList,&iter,1,parsed[i],2,full_path_package,3,0,-1); - free(full_path_package); - } - } - } - } + 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){ @@ -535,26 +521,25 @@ void on_add_accept(GtkWidget *self, dictionary *dict){ GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget)); for (int i=0;iRepositoryCombo)); - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,repo_store_path); - char *repo_name; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&repo_name,-1); - char *repo_pack = yon_char_divide(repo_name,yon_char_find_last(repo_name,'/')); - char *command = add_packages_command(repo_pack,arch_name,repo_name,current); - yon_debug_output("%s\n",command); - if (!system(command)){ - gtk_list_store_append(window->PackagesList,&itar); - gtk_list_store_set(window->PackagesList,&itar,1,name,2,current,3,1,-1); - yon_char_parsed_add_or_create_if_exists(parsed,&size,name); - yon_window_config_add_instant_parameter(path,"package_info",yon_char_parsed_to_string(parsed,size,","),YON_TYPE_STRING); - + int name_size; + config_str name = yon_config_load(yon_get_package_name_from_filename(current),&name_size); + yon_char_remove_last_symbol(name[0],'\n'); + 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); + 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){ @@ -596,6 +581,11 @@ void on_remove_package(GtkWidget *self, repo_add_window *window){ yon_launch(command); on_add_target_package_selection_changed(window->ArchitectureCombo,window); } + 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){ @@ -608,6 +598,53 @@ void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ } } + +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*); + + GtkTreeIter iter, itar; + char *storage; + 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)){ + 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)); + gtk_widget_destroy(window->MainWindow); + } else { + + } + } +} + 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); @@ -666,10 +703,14 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + 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_add_target_package_selection_changed),window); - g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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); gtk_widget_show(window->MainWindow); @@ -705,6 +746,10 @@ void on_move_add_accept(GtkWidget *self, dictionary *dict){ 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'); gtk_list_store_append(window->PackagesList,&iter); gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,path,-1); @@ -721,6 +766,12 @@ void on_move_add_accept(GtkWidget *self, dictionary *dict){ 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); + } } } @@ -735,9 +786,7 @@ void on_move_add_package(GtkWidget *self, repo_add_window *window){ 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,-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_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; @@ -763,6 +812,11 @@ void on_move_remove_package(GtkWidget *self, repo_add_window *window){ 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); + } } } @@ -884,7 +938,7 @@ void on_remove_accept(GtkWidget *self, repo_add_window *window){ yon_char_parsed_add_or_create_if_exists(packages,&size,target); } if (size){ - char *sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)); + 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," ")); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 7c99f3c..60896e3 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -47,6 +47,9 @@ typedef char* string; #define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL) #define add_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager add -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL) +#define add_packages_sign_command(path,arch,name,repo_sign,pack_sign,packages_path) yon_char_unite("repo-manager add -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 -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 -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 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) @@ -149,6 +152,7 @@ typedef struct { typedef struct { GtkWidget *Window; + GtkWidget *StatusBox; GtkWidget *CancelButton; GtkWidget *ChooseButton; GtkWidget *NameEntry; @@ -168,4 +172,6 @@ void yon_combo_box_text_set_signs(GtkComboBoxText *target); void on_storage_changed(GtkWidget *self, storage_config_window *window); -config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level); \ No newline at end of file +config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level); + +void on_remove_arch_selection_changed(GtkWidget *self, repo_add_window *window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index a9d5c59..b7b6961 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -71,4 +71,6 @@ #define REMOVE_CONFIRMATION_LABEL _("Are you sure want to remove?") -#define DO_NOT_SIGN_LABEL _("Do not sign") \ No newline at end of file +#define DO_NOT_SIGN_LABEL _("Do not sign") + +#define PACKAGE_NAME_ERROR_LABEL _("Package name error - package has incorrect name pattern") \ No newline at end of file From e2657c6894ff5dc2f63a61797ba4554385f54adf Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 27 May 2024 17:34:10 +0600 Subject: [PATCH 16/82] Minor improvements --- source/ubl-settings-repomanager.c | 21 ++++++++++++++++++++- source/ubl-settings-repomanager.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 476d201..170c2d5 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -547,7 +547,7 @@ void on_add_package(GtkWidget *self, repo_add_window *window){ yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),TITLE_LABEL,icon_path,"filechooserWindow"); gtk_widget_show(dialog->Window); GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(filter,"*.pkg.tar*"); + 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); @@ -645,6 +645,15 @@ void on_add_packages_accept(GtkWidget *self, dictionary *dict){ } } +void on_repo_sign_load(GtkWidget *self, repo_add_window *window){ + GtkTreeIter iter; + yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(self),GTK_TREE_MODEL(window->tree_copy),&iter); + char *sign; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,5,&sign,-1); + if (!yon_char_is_empty(sign)) + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepoSignCombo),sign); +} + 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); @@ -703,6 +712,9 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ 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); @@ -713,6 +725,7 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ 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); gtk_widget_show(window->MainWindow); } @@ -869,6 +882,8 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ 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)); g_signal_connect(G_OBJECT(window->MoveSourceStorageEntry),"changed",G_CALLBACK(on_move_storage_changed),window); @@ -881,6 +896,7 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ 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),window); + g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_repo_sign_load),window); gtk_widget_show(window->MainWindow); } @@ -966,6 +982,8 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ 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)); g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); @@ -974,6 +992,7 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_remove_accept),window); 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); gtk_widget_show(window->MainWindow); } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 60896e3..e1a41ff 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -65,6 +65,8 @@ typedef char* string; #define yon_sign_package(storage,repo,arch,target,sign) yon_char_unite("repo-manager add -r '",repo,"' -a '",arch,"' -d '", storage,"' -S '",sign,"' ",target,NULL) #define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -r '",repo,"' -d '", storage,"' -S '",sign,"'",NULL) +#define get_package_info_command(filename) yon_char_unite("pacman -Q --info --file ",filename," |sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL) + string version_application; char *local; From 3c0c3f0bd42b6b41e0d912f1f02e2e436e59741a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 28 May 2024 18:06:14 +0600 Subject: [PATCH 17/82] WIP key creation window --- Makefile | 33 +-- crypt-key.csv | 7 + gresource.xml | 1 + source/CMakeLists.txt | 1 + source/ubl-settings-repomanager.c | 62 ++++- source/ubl-settings-repomanager.h | 25 +- source/ubl-strings.h | 2 + ubl-settings-repomanager-key.glade | 403 +++++++++++++++++++++++++++++ 8 files changed, 514 insertions(+), 20 deletions(-) create mode 100644 crypt-key.csv create mode 100644 ubl-settings-repomanager-key.glade diff --git a/Makefile b/Makefile index 84477f0..54fea27 100644 --- a/Makefile +++ b/Makefile @@ -112,29 +112,30 @@ install: check uninstall msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ done @for SIZE in 16 32 48; do \ - install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \ - rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + 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"; \ done - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-symbolic.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-green-symbolic.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-red-symbolic.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-symbolic.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-symbolic.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-green-symbolic.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg" + @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 -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}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ + [ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/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}/usr/share/applications" ] && touch "${DESTDIR}/usr/share/applications" &>/dev/null || true; \ fi @echo "Install: OK" diff --git a/crypt-key.csv b/crypt-key.csv new file mode 100644 index 0000000..d95b0a8 --- /dev/null +++ b/crypt-key.csv @@ -0,0 +1,7 @@ +KEY_NAME;KEY_DESCRIPTION +RSA;RSA/RSA +DSA ElGamal;DSA/ELG +DSA (sign only);DSA +RSA (sign only);RSA +GOST R 34.10-2012;GOST3410-2012 +GOST R 34.10-2001;GOST3410-2001 \ No newline at end of file diff --git a/gresource.xml b/gresource.xml index eb85a99..2434328 100644 --- a/gresource.xml +++ b/gresource.xml @@ -6,6 +6,7 @@ ubl-settings-repomanager-configuration.glade ubl-settings-repomanager-repo-block.glade ubl-settings-repomanager-filechooser.glade + ubl-settings-repomanager-key.glade ubl-settings-repomanager.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 1fe07f1..9ee5702 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -39,6 +39,7 @@ set(DEPENDFILES ../ubl-settings-repomanager-add.glade ../ubl-settings-repomanager-configuration.glade ../ubl-settings-repomanager-filechooser.glade + ../ubl-settings-repomanager-key.glade ../ubl-settings-repomanager-repo-block.glade ../gresource.xml ../ubl-settings-repomanager-banner.png diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 170c2d5..eb824d2 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -93,7 +93,7 @@ void yon_storage_config_update(storage_config_window *window){ file_chooser_window *yon_file_chooser_window_new(){ file_chooser_window *window = malloc(sizeof(file_chooser_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_filechooser_config); + 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->ChooseButton = yon_gtk_builder_get_widget(builder,"ChooseButton"); @@ -1126,6 +1126,49 @@ void on_ubl_settings_update_launch(){ yon_launch_app_with_arguments("ubl-settings-update",NULL); } +void on_calendar_open(GtkWidget *self,key_creation_window *window){ + yon_calendar_popover_open(GTK_ENTRY(window->ExpireEntry),self); +} + +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"); + + 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); + + int size; + config_str encription_keys = yon_file_open(key_encription_path,&size); + + for (int i=1;iEncryptionCombo),parsed[0]); + yon_char_parsed_free(parsed,parsed_size); + } + 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),TITLE_LABEL,icon_path,"key-create-window"); + gtk_widget_show(window->Window); +} + main_window *yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); @@ -1148,6 +1191,21 @@ main_window *yon_main_window_complete(main_window *widgets){ widgets->RepoList = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); widgets->RepoFileList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoFileList")); widgets->RepoPackagesTre = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoPackagesTre")); + { + widgets->KeyMenuItem = gtk_menu_item_new(); + gtk_menu_shell_prepend(GTK_MENU_SHELL(gtk_widget_get_parent(widgets->AboutMenuItem)),widgets->KeyMenuItem); + GtkWidget *icon = gtk_image_new_from_icon_name(key_icon_name,GTK_ICON_SIZE_BUTTON); + GtkWidget *label = gtk_label_new(KEY_LABEL); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + gtk_box_pack_start(GTK_BOX(box),icon,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(widgets->KeyMenuItem),box); + gtk_widget_show_all(widgets->KeyMenuItem); + 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); + } main_config.tree_store = widgets->RepoList; g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets); @@ -1156,7 +1214,7 @@ main_window *yon_main_window_complete(main_window *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); - + yon_calendar_set_date_orientation(1); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index e1a41ff..5fd151b 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -25,7 +25,8 @@ #define glade_path_repo_add "/com/ublinux/ui/ubl-settings-repomanager-add.glade" #define glade_path_storage_config "/com/ublinux/ui/ubl-settings-repomanager-configuration.glade" #define glade_path_repo_block "/com/ublinux/ui/ubl-settings-repomanager-repo-block.glade" -#define glade_path_filechooser_config "/com/ublinux/ui/ubl-settings-repomanager-filechooser.glade" +#define glade_path_filechooser "/com/ublinux/ui/ubl-settings-repomanager-filechooser.glade" +#define glade_path_key "/com/ublinux/ui/ubl-settings-repomanager-key.glade" #define banner_path "/com/ublinux/images/ubl-settings-repomanager-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-repomanager.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) @@ -38,9 +39,12 @@ #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-repomanager" + +#define key_icon_name "com.ublinux.libublsettingsui-gtk3.key-symbolic" + +#define key_encription_path "/usr/share/ubl-settings-repomanager/csv/crypt-key.csv" typedef char* string; -#define get_package_info_command(filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL) #define get_saved_package_info_command(path,filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file $(find \"",path,"\" -name \"*",filename,"*\" -not -name *.sig |head -n 1)|sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL) #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) @@ -92,6 +96,7 @@ typedef struct { GtkWidget *SearchEntry; GtkWidget *RepoPackagesTree; GtkWidget *InformationLabel; + GtkWidget *KeyMenuItem; GtkTreeStore *RepoList; GtkListStore *RepoFileList; GtkListStore *RepoPackagesTre; @@ -162,6 +167,22 @@ typedef struct { char *root_path; } file_chooser_window; +typedef struct { + GtkWidget *Window; + GtkWidget *StatusBox; + GtkWidget *HeadLabel; + GtkWidget *NameEntry; + GtkWidget *EmailEntry; + GtkWidget *CommentsEntry; + GtkWidget *EncryptionCombo; + GtkWidget *KeyStrengthSpin; + GtkWidget *ExpireCombo; + GtkWidget *ExpireEntry; + GtkWidget *ExpireButton; + GtkWidget *CancelButton; + GtkWidget *AddButton; +} key_creation_window; + main_window *setup_window(); void yon_storage_config_update(storage_config_window *window); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index b7b6961..eed5bd8 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -9,6 +9,8 @@ #define PROJECT_HOME_LABEL _("Project Home Page") #define NOTHING_CHOSEN_LABEL _("Nothing were chosen") +#define KEY_LABEL _("Key creation") + #define LOAD_SUCCESS_LABEL _("Repository data has been loaded successfully") #define SAVE_SUCCESS_LABEL _("Saving has succeeded") diff --git a/ubl-settings-repomanager-key.glade b/ubl-settings-repomanager-key.glade new file mode 100644 index 0000000..01bc6bb --- /dev/null +++ b/ubl-settings-repomanager-key.glade @@ -0,0 +1,403 @@ + + + + + + + 99999999 + 1 + 10 + + + True + False + com.ublinux.libublsettingsui-gtk3.calendar-symbolic + 3 + + + 500 + False + True + com.ublinux.ubl-settings-repomanager + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Name: + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + False + Email: + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Commentary: + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + False + Encryption type: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + + + True + False + key strength (in bits): + + + False + True + 0 + + + + + True + True + adjustment1 + + + True + True + 1 + + + + + False + True + 2 + + + + + True + False + 5 + + + True + False + Expires: + + + False + True + 0 + + + + + True + False + 0 + + timeless + until + + + + False + True + 1 + + + + + True + True + + + True + True + 2 + + + + + True + True + True + image1 + + + + False + True + 3 + + + + + False + True + 3 + + + + + + + + + True + False + Key additional configuration + + + + + False + True + 2 + + + + + False + True + 0 + + + + + True + True + 1 + + + + + + + True + False + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + Cancel + True + True + True + + + 1 + + + + + Add + True + True + True + + + end + 2 + + + + + + From b3e483f26f7dc690a0811fa5ad2cb6dfca3c613d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 29 May 2024 18:07:18 +0600 Subject: [PATCH 18/82] Information output for packages, localisation updates --- crypt-key.csv | 14 ++-- source/ubl-settings-repomanager.c | 61 +++++++++++++- source/ubl-settings-repomanager.h | 39 ++++++++- source/ubl-strings.h | 57 ++++++++++++- ubl-settings-repomanager-filechooser.glade | 3 +- ubl-settings-repomanager-key.glade | 93 ++++++++++++++++++++-- ubl-settings-repomanager-repo-block.glade | 2 + ubl-settings-repomanager.glade | 29 ++++++- 8 files changed, 273 insertions(+), 25 deletions(-) diff --git a/crypt-key.csv b/crypt-key.csv index d95b0a8..5c8e385 100644 --- a/crypt-key.csv +++ b/crypt-key.csv @@ -1,7 +1,7 @@ -KEY_NAME;KEY_DESCRIPTION -RSA;RSA/RSA -DSA ElGamal;DSA/ELG -DSA (sign only);DSA -RSA (sign only);RSA -GOST R 34.10-2012;GOST3410-2012 -GOST R 34.10-2001;GOST3410-2001 \ No newline at end of file +KEY_NAME;KEY_DESCRIPTION;KEY_ALGO_NAME +RSA;RSA/RSA;RSA +DSA ElGamal;DSA/ELG;ELG +DSA (sign only);DSA;DSA +RSA (sign only);RSA;RSA +GOST R 34.10-2012;GOST3410-2012;GOST3410-2012 +GOST R 34.10-2001;GOST3410-2001;GOST3410-2001 \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index eb824d2..3df66ed 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -51,7 +51,7 @@ void on_repo_sign_changed(GtkWidget *self, storage_config_window *window){ if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,child_id)){ if (!yon_char_is_empty(sign)){ gtk_tree_store_set(window->storages_copy,&itar,6,1,5,sign,-1); - if (!system(yon_sign_repo(storage_path,target_repo,sign))){ + if (system(yon_sign_repo(storage_path,target_repo,sign))){ gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget*)g_list_nth_data(list,2)),0); } }else @@ -61,7 +61,7 @@ void on_repo_sign_changed(GtkWidget *self, storage_config_window *window){ } } -void yon_storage_config_update(storage_config_window *window){ +void yon_storage_config_update(storage_config_window *window){ GList *children = gtk_container_get_children(GTK_CONTAINER(window->ReposBox)); for (int i=0;iInformationLabel),""); + GtkTreeIter iter,itar; + GtkTreeModel *model, *model2; + 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)),&model2,&itar); + switch (gtk_tree_store_iter_depth(widgets->RepoList,&itar)){ + case 0: + break; + case 1: + break; + case 2: + char *path, *filename; + gtk_tree_model_get(model,&iter,3,&filename,-1); + gtk_tree_model_get(model2,&itar,3,&path,-1); + int size; + config_str parsed = yon_config_load(get_package_info_command(yon_char_unite(path,"/",filename,NULL)),&size); + char *full = yon_char_parsed_to_string(parsed,size,""); + gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),full); + yon_char_parsed_free(parsed,size); + free(full); + break; + } + } +} + void yon_combo_box_text_set_signs(GtkComboBoxText *target){ g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target)); gtk_combo_box_text_remove_all(target); @@ -1130,6 +1156,30 @@ 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)); + char *expire = NULL; + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ExpireCombo))==1){ + expire = yon_char_from_int(yon_calendar_get_last_date()); + } + const char *password = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); + const char *password_confirm = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); + if (yon_char_is_empty(password)&&yon_char_is_empty(password_confirm)){ + system(yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); + } else if (!strcmp(password,password_confirm)){ + system(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); + return; + } + 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); @@ -1146,18 +1196,22 @@ key_creation_window *yon_key_creation_window_new(){ 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"); 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[0]); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->EncryptionCombo),parsed[2],parsed[0]); yon_char_parsed_free(parsed,parsed_size); } return window; @@ -1214,6 +1268,7 @@ main_window *yon_main_window_complete(main_window *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); yon_calendar_set_date_orientation(1); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 5fd151b..b02abe4 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -67,9 +67,39 @@ typedef char* string; #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) #define yon_sign_package(storage,repo,arch,target,sign) yon_char_unite("repo-manager add -r '",repo,"' -a '",arch,"' -d '", storage,"' -S '",sign,"' ",target,NULL) -#define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -r '",repo,"' -d '", storage,"' -S '",sign,"'",NULL) - -#define get_package_info_command(filename) yon_char_unite("pacman -Q --info --file ",filename," |sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL) +#define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage,"' --sign-repo='",sign,"'",NULL) + +#define get_package_info_command(filename) yon_char_unite("pacman -Q --info --file ",filename," |sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g' -e 's/^ /\\t/g'",NULL) + +#define yon_generate_key_command(type,name,email,strength,comment,expire,password) yon_char_unite("gpg --batch --gen-key < - + + True False diff --git a/ubl-settings-repomanager-key.glade b/ubl-settings-repomanager-key.glade index 01bc6bb..07621c5 100644 --- a/ubl-settings-repomanager-key.glade +++ b/ubl-settings-repomanager-key.glade @@ -4,9 +4,11 @@ - 99999999 - 1 - 10 + 1024 + 4096 + 2048 + 512 + 512 True @@ -235,6 +237,7 @@ True True adjustment1 + 2048 True @@ -272,8 +275,8 @@ False 0 - timeless - until + Timeless + Until @@ -318,6 +321,78 @@ 3 + + + True + False + 5 + + + True + False + Password: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 2 + + + + + False + True + 4 + + + + + True + False + 5 + + + True + False + Password confirmation: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 2 + + + + + False + True + 5 + + @@ -360,7 +435,7 @@ True False - Repository manager + Key creation @@ -400,4 +475,10 @@ + + + + + + diff --git a/ubl-settings-repomanager-repo-block.glade b/ubl-settings-repomanager-repo-block.glade index 9d02791..a1682ac 100644 --- a/ubl-settings-repomanager-repo-block.glade +++ b/ubl-settings-repomanager-repo-block.glade @@ -57,6 +57,7 @@ True True True + Sign repo image1 - - - False - True - 0 - - - - - True - True - True - image1 - - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 0.019999999552965164 - in - - - True - False - 5 - 5 - 5 - - - True - False - 5 - - - True - True - in - - - True - True - - - - - - - - True - True - 0 - - - - - True - True - in - - - True - False - - - True - False - True - 0 - 0 - - - - - - - True - True - 1 - - - - - - - - - True - False - Package (-s) to add - - - - - True - True - 1 - - - - - True - True - 3 - - - - - True - True - 1 - - - - - - - True - False - - - True - False - Repository manager - - - - - - - - True - False - 32 - com.ublinux.ubl-settings-repomanager - - - - - Cancel - True - True - True - - - 1 - - - - - Add - True - True - True - - - end - 2 - - - - - - diff --git a/ubl-settings-repomanager.desktop b/ubl-settings-repomanager.desktop index cac9fb5..58b8580 100644 --- a/ubl-settings-repomanager.desktop +++ b/ubl-settings-repomanager.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Encoding=UTF-8 -Name=ubl-settings-repomanager +Name=Repository manager Name[ru]=Менеджер репозиториев GenericName=ubl-settings-repomanager GenericName[ru]=Менеджер репозиториев diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot index 4b035ef..3eb1de3 100644 --- a/ubl-settings-repomanager.pot +++ b/ubl-settings-repomanager.pot @@ -17,320 +17,410 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-strings.h:1 -msgid "Version:" -msgstr "" - #: source/ubl-strings.h:2 -msgid "ubl-settings-repomanager version:" -msgstr "" - -#: source/ubl-strings.h:2 -msgid "Usage:" -msgstr "" - -#: source/ubl-strings.h:2 -msgid "[OPTIONS]" -msgstr "" - -#: source/ubl-strings.h:2 -msgid "Options:" +msgid "Repository manager" msgstr "" -#: source/ubl-strings.h:2 -msgid "Show this help" +#: source/ubl-strings.h:3 +msgid "Repository management and configuring" msgstr "" -#: source/ubl-strings.h:2 -msgid "Show package version" +#: source/ubl-strings.h:5 +msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/ubl-strings.h:2 -msgid "Lock this help menu" +#: source/ubl-strings.h:6 +msgid "" +"You will be redirected to documentation website where documentation is\n" +"translated and supported by community." msgstr "" -#: source/ubl-strings.h:2 -msgid "Lock configuration saving" +#: source/ubl-strings.h:7 +msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:2 -msgid "Lock local configration saving" +#: source/ubl-strings.h:8 +msgid "Open documentation" msgstr "" -#: source/ubl-strings.h:2 -msgid "Lock global configration saving" +#: source/ubl-strings.h:9 +msgid "Project Home Page" msgstr "" -#: source/ubl-strings.h:2 -msgid "Lock global configration loading" +#: source/ubl-strings.h:10 +msgid "Nothing were chosen" msgstr "" -#: source/ubl-strings.h:4 -msgid "" -"Warning! Application was launched without root - root-dependent actions are " -"locked" +#: source/ubl-strings.h:12 +msgid "Information" msgstr "" -#: source/ubl-strings.h:6 -msgid "Repository manager" +#: source/ubl-strings.h:14 source/ubl-strings.h:36 +msgid "Key creation" msgstr "" -#: source/ubl-strings.h:7 -msgid "Repository management and configuring" +#: source/ubl-strings.h:15 +msgid "Email:" msgstr "" -#: source/ubl-strings.h:8 -msgid "Operation succeeded" +#: source/ubl-strings.h:16 +msgid "Key additional configuration" msgstr "" -#: source/ubl-strings.h:10 -msgid "About" +#: source/ubl-strings.h:17 +msgid "Commentary:" msgstr "" -#: source/ubl-strings.h:11 -msgid "Documentation" +#: source/ubl-strings.h:18 +msgid "Encryption type:" msgstr "" -#: source/ubl-strings.h:13 -msgid "Save to local configuration" +#: source/ubl-strings.h:19 +msgid "key strength (in bits):" msgstr "" -#: source/ubl-strings.h:14 -msgid "Save to global configuration" +#: source/ubl-strings.h:20 +msgid "Expires:" msgstr "" -#: source/ubl-strings.h:15 -msgid "Save configuration" +#: source/ubl-strings.h:21 +msgid "Password:" msgstr "" -#: source/ubl-strings.h:16 -msgid "Save" +#: source/ubl-strings.h:22 +msgid "Password confirmation:" msgstr "" -#: source/ubl-strings.h:18 -msgid "Load local configuration" +#: source/ubl-strings.h:23 +msgid "Timeless" msgstr "" -#: source/ubl-strings.h:19 -msgid "Load global configuration" +#: source/ubl-strings.h:24 +msgid "Until" msgstr "" -#: source/ubl-strings.h:20 -msgid "Load" +#: source/ubl-strings.h:26 +msgid "Add" msgstr "" -#: source/ubl-strings.h:22 -msgid "Cancel" +#: source/ubl-strings.h:28 +msgid "Update" msgstr "" -#: source/ubl-strings.h:24 -msgid "Would you like to read documentation in the Web?" +#: source/ubl-strings.h:29 +msgid "Configure storages" msgstr "" -#: source/ubl-strings.h:25 -msgid "" -"You will be redirected to documentation website where documentation is\n" -"translated and supported by community." +#: source/ubl-strings.h:30 +msgid "Add packages" msgstr "" -#: source/ubl-strings.h:26 -msgid "Always redirect to online documentation" +#: source/ubl-strings.h:31 +msgid "Move packages" msgstr "" -#: source/ubl-strings.h:27 -msgid "Open documentation" +#: source/ubl-strings.h:32 +msgid "Remove packages" msgstr "" -#: source/ubl-strings.h:28 -msgid "Project Home Page" +#: source/ubl-strings.h:33 +msgid "Open ubl-settings-update" msgstr "" -#: source/ubl-strings.h:29 -msgid "Nothing were chosen" +#: source/ubl-strings.h:35 +msgid "Empty important field" msgstr "" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:38 msgid "Repository data has been loaded successfully" msgstr "" -#: source/ubl-strings.h:33 +#: source/ubl-strings.h:40 msgid "Saving has succeeded" msgstr "" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:42 msgid "General" msgstr "" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:43 msgid "Publication" msgstr "" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:44 msgid "Trusted repository" msgstr "" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:45 msgid "Server type:" msgstr "" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:46 msgid "IP adress:" msgstr "" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:47 msgid "Port:" msgstr "" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:48 msgid "Publish" msgstr "" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:49 msgid "Code name:" msgstr "" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:50 msgid "Branch:" msgstr "" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:51 source/ubl-strings.h:69 msgid "Architecture:" msgstr "" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:52 msgid "Components:" msgstr "" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:53 msgid "Signature:" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:54 msgid "Sign" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:56 +msgid "Sign repo" +msgstr "" + +#: source/ubl-strings.h:57 +msgid "Remove repo" +msgstr "" + +#: source/ubl-strings.h:58 +msgid "Manage storages" +msgstr "" + +#: source/ubl-strings.h:59 +msgid "Storage:" +msgstr "" + +#: source/ubl-strings.h:60 +msgid "Open existing" +msgstr "" + +#: source/ubl-strings.h:61 +msgid "Create new" +msgstr "" + +#: source/ubl-strings.h:62 +msgid "Disable" +msgstr "" + +#: source/ubl-strings.h:63 +msgid "Delete" +msgstr "" + +#: source/ubl-strings.h:64 +msgid "Add repo" +msgstr "" + +#: source/ubl-strings.h:65 +msgid "Repository (-ies)" +msgstr "" + +#: source/ubl-strings.h:66 +msgid "Accept" +msgstr "" + +#: source/ubl-strings.h:68 +msgid "Repository:" +msgstr "" + +#: source/ubl-strings.h:70 +msgid "Source" +msgstr "" + +#: source/ubl-strings.h:71 +msgid "Target" +msgstr "" + +#: source/ubl-strings.h:72 +msgid "Packages sign:" +msgstr "" + +#: source/ubl-strings.h:73 +msgid "Repository sign:" +msgstr "" + +#: source/ubl-strings.h:74 +msgid "Package (-s) to add" +msgstr "" + +#: source/ubl-strings.h:75 +msgid "Name" +msgstr "" + +#: source/ubl-strings.h:76 +msgid "Path" +msgstr "" + +#: source/ubl-strings.h:77 source/ubl-strings.h:96 +msgid "Remove package" +msgstr "" + +#: source/ubl-strings.h:78 source/ubl-strings.h:95 +msgid "Add package" +msgstr "" + +#: source/ubl-strings.h:84 +msgid "Choose" +msgstr "" + +#: source/ubl-strings.h:85 +msgid "Cancel" +msgstr "" + +#: source/ubl-strings.h:87 msgid "Open or create repository" msgstr "" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:88 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:89 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:90 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:91 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:92 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:93 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:94 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:57 -msgid "Add package" -msgstr "" - -#: source/ubl-strings.h:58 -msgid "Remove package" -msgstr "" - -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:97 msgid "Open" msgstr "" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:99 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:101 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:102 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:103 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:104 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:105 msgid "Choose repository or package to sign" msgstr "" -#: source/ubl-strings.h:69 +#: source/ubl-strings.h:107 msgid "Name:" msgstr "" -#: source/ubl-strings.h:70 +#: source/ubl-strings.h:108 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:71 +#: source/ubl-strings.h:109 msgid "< Type branch name >" msgstr "" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:110 msgid "Name must be filled!" msgstr "" -#: source/ubl-strings.h:73 +#: source/ubl-strings.h:111 msgid "Choose path for new repository" msgstr "" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:113 msgid "Choose repository folder" msgstr "" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:114 msgid "Choose repository" msgstr "" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:116 msgid "Absent" msgstr "" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:117 msgid "Dependences:" msgstr "" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:118 msgid "Digital signature" msgstr "" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:120 msgid "package" msgstr "" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:121 msgid "repository" msgstr "" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:122 msgid "This package already exists in that repository" msgstr "" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:123 msgid "This repository has already been added" -msgstr "" \ No newline at end of file +msgstr "" + +#: source/ubl-strings.h:125 +msgid "Close" +msgstr "" + +#: source/ubl-strings.h:127 +msgid "Are you sure want to disable?" +msgstr "" + +#: source/ubl-strings.h:129 +msgid "Are you sure want to remove?" +msgstr "" + +#: source/ubl-strings.h:131 +msgid "Do not sign" +msgstr "" + +#: source/ubl-strings.h:133 +msgid "Package name error - package has incorrect name pattern" +msgstr "" + +#: source/ubl-strings.h:135 +msgid "Passwords do not match" +msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index 5522979..ee55e45 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -17,220 +17,291 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-strings.h:1 -msgid "Version:" -msgstr "Версия:" - -#: source/ubl-strings.h:2 -msgid "ubl-settings-repomanager version:" -msgstr "Версия ubl-settings-repomanager: " - -#: source/ubl-strings.h:2 -msgid "Usage:" -msgstr "Использование:" - -#: source/ubl-strings.h:2 -msgid "[OPTIONS]" -msgstr "[АРГУМЕНТЫ]" - -#: source/ubl-strings.h:2 -msgid "Options:" -msgstr "Аргументы:" - #: source/ubl-strings.h:2 -msgid "Show this help" -msgstr "Показать параметры справки" - -#: source/ubl-strings.h:2 -msgid "Show package version" -msgstr "Показать текущую версию" - -#: source/ubl-strings.h:2 -msgid "Lock this help menu" -msgstr "Блокировка вызова справки" - -#: source/ubl-strings.h:2 -msgid "Lock configuration saving" -msgstr "Блокировка сохранения локальной и глобальной конфигурации" - -#: source/ubl-strings.h:2 -msgid "Lock local configration saving" -msgstr "Блокировка сохранения локальной конфигурации" +msgid "Repository manager" +msgstr "Менеджер репозиториев" -#: source/ubl-strings.h:2 -msgid "Lock global configration saving" -msgstr "Блокировка сохранения глобальной конфигурации" +#: source/ubl-strings.h:3 +msgid "Repository management and configuring" +msgstr "Настройка параметров и управление репозиториями системы" -#: source/ubl-strings.h:2 -msgid "Lock global configration loading" -msgstr "Блокировка загрузки глобальной конфигурации" +#: source/ubl-strings.h:5 +msgid "Would you like to read documentation in the Web?" +msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:4 +#: source/ubl-strings.h:6 msgid "" -"Warning! Application was launched without root - root-dependent actions are " -"locked" +"You will be redirected to documentation website where documentation is\n" +"translated and supported by community." msgstr "" -"Внимание! Приложение было запущено без прав суперпользователя - действия, " -"требующие их наличия заблокированы" - -#: source/ubl-strings.h:6 -msgid "Repository manager" -msgstr "Менеджер репозиториев" +"Вы будете перенаправлены на сайт с документацией где страницы помощи\n" +"переводятся и поддерживаются сообществом." #: source/ubl-strings.h:7 -msgid "Repository management and configuring" -msgstr "Настройка параметров и управление репозиториями системы" +msgid "Always redirect to online documentation" +msgstr "Всегда перенаправлять" #: source/ubl-strings.h:8 -msgid "Operation succeeded" -msgstr "Операция завершена" +msgid "Open documentation" +msgstr "Прочитать справку" -#: source/ubl-strings.h:10 -msgid "About" -msgstr "О программе" +#: source/ubl-strings.h:9 +msgid "Project Home Page" +msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:11 -msgid "Documentation" -msgstr "Справка" +#: source/ubl-strings.h:10 +msgid "Nothing were chosen" +msgstr "Ничего не было выбрано" -#: source/ubl-strings.h:13 -msgid "Save to local configuration" -msgstr "Сохранить в локальную конфигурацию" +#: source/ubl-strings.h:12 +msgid "Information" +msgstr "Информация" -#: source/ubl-strings.h:14 -msgid "Save to global configuration" -msgstr "Сохранить в глобальную конфигурацию" +#: source/ubl-strings.h:14 source/ubl-strings.h:36 +msgid "Key creation" +msgstr "Создание ключа" #: source/ubl-strings.h:15 -msgid "Save configuration" -msgstr "Сохранить конфигурацию" +msgid "Email:" +msgstr "Адрес электронной почты:" #: source/ubl-strings.h:16 -msgid "Save" -msgstr "Сохранить" +msgid "Key additional configuration" +msgstr "Дополнительные параметры ключа" + +#: source/ubl-strings.h:17 +msgid "Commentary:" +msgstr "Комментарий:" #: source/ubl-strings.h:18 -msgid "Load local configuration" -msgstr "Загрузить локальную конфигуруцию" +msgid "Encryption type:" +msgstr "Тип шифрования:" #: source/ubl-strings.h:19 -msgid "Load global configuration" -msgstr "Загрузить глобальную конфигурацию" +msgid "key strength (in bits):" +msgstr "Стойкость ключа (в битах):" #: source/ubl-strings.h:20 -msgid "Load" -msgstr "Загрузить" +msgid "Expires:" +msgstr "Срок действия:" + +#: source/ubl-strings.h:21 +msgid "Password:" +msgstr "Пароль:" #: source/ubl-strings.h:22 -msgid "Cancel" -msgstr "Отмена" +msgid "Password confirmation:" +msgstr "Подтверждение пароля:" -#: source/ubl-strings.h:24 -msgid "Would you like to read documentation in the Web?" -msgstr "Вы хотите прочитать справку в Сети?" +#: source/ubl-strings.h:23 +msgid "Timeless" +msgstr "Бессрочный" -#: source/ubl-strings.h:25 -msgid "" -"You will be redirected to documentation website where documentation is\n" -"translated and supported by community." -msgstr "" -"Вы будете перенаправлены на сайт с документацией где страницы помощи\n" -"переводятся и поддерживаются сообществом." +#: source/ubl-strings.h:24 +msgid "Until" +msgstr "До" #: source/ubl-strings.h:26 -msgid "Always redirect to online documentation" -msgstr "Всегда перенаправлять" - -#: source/ubl-strings.h:27 -msgid "Open documentation" -msgstr "Прочитать справку" +msgid "Add" +msgstr "Добавить" #: source/ubl-strings.h:28 -msgid "Project Home Page" -msgstr "Домашняя страница проекта" +msgid "Update" +msgstr "Обновить" #: source/ubl-strings.h:29 -msgid "Nothing were chosen" -msgstr "Ничего не было выбрано" +msgid "Configure storages" +msgstr "Редактировать хранилища" + +#: source/ubl-strings.h:30 +msgid "Add packages" +msgstr "Добавить пакеты" #: source/ubl-strings.h:31 +msgid "Move packages" +msgstr "Переместить пакеты" + +#: source/ubl-strings.h:32 +msgid "Remove packages" +msgstr "Удалить пакеты" + +#: source/ubl-strings.h:33 +msgid "Open ubl-settings-update" +msgstr "Открыть ubl-settings-update" + +#: source/ubl-strings.h:35 +msgid "Empty important field" +msgstr "Пустое важное поле" + +#: source/ubl-strings.h:38 msgid "Repository data has been loaded successfully" msgstr "Информация о пакетах успешно загружена" -#: source/ubl-strings.h:33 -#, fuzzy +#: source/ubl-strings.h:40 msgid "Saving has succeeded" msgstr "Успешно сохранено" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:42 msgid "General" msgstr "Общие" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:43 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:44 msgid "Trusted repository" msgstr "Доверенный репозиторий" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:45 msgid "Server type:" msgstr "Тип сервера:" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:46 msgid "IP adress:" msgstr "IP-адрес:" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:47 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:48 msgid "Publish" msgstr "Опубликовать" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:49 msgid "Code name:" msgstr "Кодовое имя:" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:50 msgid "Branch:" msgstr "Ветка:" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:51 source/ubl-strings.h:69 msgid "Architecture:" msgstr "Архитектура:" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:52 msgid "Components:" msgstr "Компоненты" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:53 msgid "Signature:" msgstr "Подпись:" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:54 msgid "Sign" msgstr "Подписать" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:56 +msgid "Sign repo" +msgstr "Подписать репозиторий" + +#: source/ubl-strings.h:57 +msgid "Remove repo" +msgstr "Удалить репозиторий" + +#: source/ubl-strings.h:58 +msgid "Manage storages" +msgstr "Управление хранилищами" + +#: source/ubl-strings.h:59 +msgid "Storage:" +msgstr "Хранилище:" + +#: source/ubl-strings.h:60 +msgid "Open existing" +msgstr "Открыть существующее хранилище" + +#: source/ubl-strings.h:61 +msgid "Create new" +msgstr "Создать" + +#: source/ubl-strings.h:62 +msgid "Disable" +msgstr "Отключить" + +#: source/ubl-strings.h:63 +msgid "Delete" +msgstr "Удалить" + +#: source/ubl-strings.h:64 +msgid "Add repo" +msgstr "Добавить репозиторий" + +#: source/ubl-strings.h:65 +msgid "Repository (-ies)" +msgstr "Рупозиторий (-ии)" + +#: source/ubl-strings.h:66 +msgid "Accept" +msgstr "Принять" + +#: source/ubl-strings.h:68 +msgid "Repository:" +msgstr "Репозиторий:" + +#: source/ubl-strings.h:70 +msgid "Source" +msgstr "Источник" + +#: source/ubl-strings.h:71 +msgid "Target" +msgstr "Назначение" + +#: source/ubl-strings.h:72 +msgid "Packages sign:" +msgstr "Подпись пакетов:" + +#: source/ubl-strings.h:73 +msgid "Repository sign:" +msgstr "Подпись репозитория:" + +#: source/ubl-strings.h:74 +msgid "Package (-s) to add" +msgstr "Пакет(-ы) лоя добавления" + +#: source/ubl-strings.h:75 +msgid "Name" +msgstr "Имя" + +#: source/ubl-strings.h:76 +msgid "Path" +msgstr "Путь" + +#: source/ubl-strings.h:77 source/ubl-strings.h:96 +msgid "Remove package" +msgstr "Удалить пакет" + +#: source/ubl-strings.h:78 source/ubl-strings.h:95 +msgid "Add package" +msgstr "Добавить пакет" + +#: source/ubl-strings.h:84 +msgid "Choose" +msgstr "Выбрать" + +#: source/ubl-strings.h:85 +msgid "Cancel" +msgstr "Отмена" + +#: source/ubl-strings.h:87 msgid "Open or create repository" msgstr "Открыть или создать репозиторий" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:88 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:89 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:90 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:91 msgid "" "Add/Remove repository from\n" "local package sources" @@ -238,106 +309,130 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:92 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:93 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:94 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:57 -msgid "Add package" -msgstr "Добавить пакет" - -#: source/ubl-strings.h:58 -msgid "Remove package" -msgstr "Удалить пакет" - -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:97 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:99 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:101 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:102 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:103 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:104 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:105 msgid "Choose repository or package to sign" msgstr "Выберите репозиторий или пакет для подписи" -#: source/ubl-strings.h:69 +#: source/ubl-strings.h:107 msgid "Name:" msgstr "Название:" -#: source/ubl-strings.h:70 +#: source/ubl-strings.h:108 msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:71 +#: source/ubl-strings.h:109 msgid "< Type branch name >" msgstr "< Введите название ветки >" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:110 msgid "Name must be filled!" msgstr "Введите название!" -#: source/ubl-strings.h:73 +#: source/ubl-strings.h:111 msgid "Choose path for new repository" msgstr "Выбрать расположение нового репозитория" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:113 msgid "Choose repository folder" msgstr "Выбрать директорию для репозитория" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:114 msgid "Choose repository" msgstr "Выбрать репозиторий" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:116 msgid "Absent" msgstr "Отсутствует" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:117 msgid "Dependences:" msgstr "Зависит от:" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:118 msgid "Digital signature" msgstr "Цифровая подпись" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:120 msgid "package" msgstr "пакет" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:121 msgid "repository" msgstr "репозиторий" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:122 msgid "This package already exists in that repository" msgstr "Этот пакет уже присутствует в выбранном репозитории" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:123 msgid "This repository has already been added" -msgstr "Этот репозиторий уже был добавлен" \ No newline at end of file +msgstr "Этот репозиторий уже был добавлен" + +#: source/ubl-strings.h:125 +msgid "Close" +msgstr "Закрыть" + +#: source/ubl-strings.h:127 +msgid "Are you sure want to disable?" +msgstr "" +"Внимание! Вы хотите отключить хранилище от управления менеджером " +"репозиториев. При этом будет прекращено управление самим хранилищем и " +"вложенными репозиториями!\n" +"\n" +"Примечание: в дальнейшем Вы можете заново подключить хранилище и управлять " +"им." + +#: source/ubl-strings.h:129 +msgid "Are you sure want to remove?" +msgstr "" +"Внимание! Вы ходите удалить хранилище При этом хранилище и вложенные " +"репозитории будут безвозвратно удалены!" + +#: source/ubl-strings.h:131 +msgid "Do not sign" +msgstr "Не подписывать" + +#: source/ubl-strings.h:133 +msgid "Package name error - package has incorrect name pattern" +msgstr "Ошибка имени пакета - некорректное имя пакета" + +#: source/ubl-strings.h:135 +msgid "Passwords do not match" +msgstr "Пароли не совпадают" From 2ff2919c14c5a37dd0d9ee962e70a633f874b0b8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 10:21:29 +0600 Subject: [PATCH 20/82] Fixed file chooser icon for storage window --- source/ubl-settings-repomanager.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index aae2afd..1666fc9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -109,6 +109,7 @@ file_chooser_window *yon_file_chooser_window_new(){ void on_storage_open(GtkWidget *self, storage_config_window *window){ GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),TITLE_LABEL,icon_path,"file_chooser"); int responce = gtk_dialog_run(GTK_DIALOG(dialog)); if (responce == GTK_RESPONSE_ACCEPT){ char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); @@ -148,6 +149,7 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ void on_storage_create(GtkWidget *self, storage_config_window *window){ GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),TITLE_LABEL,icon_path,"file_chooser"); int responce = gtk_dialog_run(GTK_DIALOG(dialog)); if (responce == GTK_RESPONSE_ACCEPT){ char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); From 8a98fefbc8b21b740bb4645292308dc6af4858dc Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 10:51:36 +0600 Subject: [PATCH 21/82] Added info at add, move and remove windows --- source/ubl-settings-repomanager.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 1666fc9..c061812 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -465,7 +465,6 @@ void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ GtkWidget *ArchCombo = NULL; ArchCombo = self==window->MoveSourceRepoEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; - yon_debug_output("%s\n","repo"); 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)); @@ -477,7 +476,6 @@ void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ 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); } - yon_debug_output("%s\n","repo 2"); } @@ -591,10 +589,19 @@ void on_remove_package(GtkWidget *self, repo_add_window *window){ } 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); } From 4603c352ba24c76a2e8cb5ddb10ade92591ae2d1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 10:54:04 +0600 Subject: [PATCH 22/82] Removed test repo viewer --- source/ubl-settings-repomanager.c | 4 ---- ubl-settings-repomanager-add.glade | 25 -------------------- ubl-settings-repomanager-configuration.glade | 25 -------------------- 3 files changed, 54 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index c061812..91f2b10 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -324,10 +324,8 @@ storage_config_window *yon_storage_config_window_new(){ window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox"); window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); - window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); window->storages_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->storages_copy); - gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(window->storages_copy)); 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); @@ -688,11 +686,9 @@ repo_add_window *yon_repo_add_window_new(){ window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); - window->TestTree = yon_gtk_builder_get_widget(builder,"TestTree"); 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); - gtk_tree_view_set_model(GTK_TREE_VIEW(window->TestTree),GTK_TREE_MODEL(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); diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index b49d144..bd92d2c 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -591,31 +591,6 @@ 5 - - - True - True - - - - - - column - - - - 2 - - - - - - - False - True - 6 - - True diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index cd8823d..67e0f96 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -275,31 +275,6 @@ 1 - - - True - True - - - - - - column - - - - 2 - - - - - - - False - True - 2 - - From fa626a02259c3ed06a9159ee1be864d82eb3f377 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 14:10:35 +0600 Subject: [PATCH 23/82] Added ability to choose multiple packages in file chooser --- source/ubl-settings-repomanager.c | 58 ++++++++++++++-------- ubl-settings-repomanager-add.glade | 2 + ubl-settings-repomanager-filechooser.glade | 1 + ubl-settings-repomanager.glade | 1 + 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 91f2b10..a57e747 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -414,7 +414,7 @@ void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *win 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)){ + 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)){ @@ -430,7 +430,21 @@ void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *win } } } - } + 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){ @@ -522,6 +536,10 @@ void on_add_accept(GtkWidget *self, dictionary *dict){ if (yon_char_parsed_check_exist(parsed,size,current)==-1){ int name_size; config_str name = yon_config_load(yon_get_package_name_from_filename(current),&name_size); + if (name_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 (name_size<=0){ yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); @@ -568,16 +586,7 @@ void on_remove_package(GtkWidget *self, repo_add_window *window){ 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); - char *temp = yon_char_divide(path,yon_char_find_last(path,'/')); - free(path); - path=temp; - free(yon_char_divide(path,yon_char_find_last(path,'/'))); - char *cur_name, *cur_path; - gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&itar,1,&cur_name,2,&cur_path,-1); - char *command = remove_packages_command(storage,path,repo,cur_name); - yon_debug_output("%s\n",command); - yon_launch(command); - on_add_target_package_selection_changed(window->ArchitectureCombo,window); + 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); @@ -726,6 +735,7 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ 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); @@ -991,6 +1001,7 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + 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); @@ -1090,16 +1101,21 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ char *packages; int size; config_str parsed = yon_file_ls(target,&size); - for (int i=0;iRepoFileList,&itar); - char *name = yon_char_new(parsed[i]); - char *temp = yon_char_divide_search(name,".",-1); - free(name); - name=temp; - gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); - } + for (int i=0;iRepoFileList,&itar); + char *name = yon_char_unite(target,"/",parsed[i]); + config_str load = yon_config_load(yon_get_package_name_from_filename(name),&load_size); + yon_char_remove_last_symbol(load[i],'\n'); + char *temp = load[0]; + free(name); + name=temp; + gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); + free(name); + yon_char_parsed_free(load,load_size); } + } } break; } diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index bd92d2c..68e8ec6 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -372,6 +372,7 @@ True + False False @@ -408,6 +409,7 @@ True + False False diff --git a/ubl-settings-repomanager-filechooser.glade b/ubl-settings-repomanager-filechooser.glade index 663b617..d5a5480 100644 --- a/ubl-settings-repomanager-filechooser.glade +++ b/ubl-settings-repomanager-filechooser.glade @@ -47,6 +47,7 @@ True False + True False diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 68a06e5..ceb9c22 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -280,6 +280,7 @@ edit-find-symbolic False False + Pakcage search False From f46f2582fb4ca54fcc985a8aa516a3c66e61732a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 14:23:41 +0600 Subject: [PATCH 24/82] Crash fix --- source/ubl-settings-repomanager.c | 20 +++++++++++--------- source/ubl-strings.h | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index a57e747..53ac7cf 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -53,6 +53,7 @@ void on_repo_sign_changed(GtkWidget *self, storage_config_window *window){ gtk_tree_store_set(window->storages_copy,&itar,6,1,5,sign,-1); if (system(yon_sign_repo(storage_path,target_repo,sign))){ gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget*)g_list_nth_data(list,2)),0); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),REPO_SIGN_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); } }else gtk_tree_store_set(window->storages_copy,&itar,6,-1,5,NULL,-1); @@ -1104,16 +1105,17 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ for (int i=0;iRepoFileList,&itar); - char *name = yon_char_unite(target,"/",parsed[i]); + char *name = yon_char_unite(target,"/",parsed[i],NULL); config_str load = yon_config_load(yon_get_package_name_from_filename(name),&load_size); - yon_char_remove_last_symbol(load[i],'\n'); - char *temp = load[0]; - free(name); - name=temp; - gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); - free(name); - yon_char_parsed_free(load,load_size); + if (load_size>0){ + gtk_list_store_append(widgets->RepoFileList,&itar); + yon_char_remove_last_symbol(load[0],'\n'); + char *temp = load[0]; + free(name); + name=temp; + gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); + yon_char_parsed_free(load,load_size); + } } } } diff --git a/source/ubl-strings.h b/source/ubl-strings.h index fa725bd..7526660 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -77,7 +77,7 @@ #define REMOVE_PACKAGE_LABEL _("Remove package") #define ADD_PACKAGE_LABEL _("Add package") -// #define ACCEPT_LABEL _("Accept") +#define REPO_SIGN_ERROR_LABEL _("Repository sign failed - repository has no packages") // #define ACCEPT_LABEL _("Accept") // #define ACCEPT_LABEL _("Accept") From 084c998b76d67d71418cc85ef109db28e884f0f5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 14:25:17 +0600 Subject: [PATCH 25/82] Localisation fix --- ubl-settings-repomanager_ru.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index ee55e45..a0552f8 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -259,7 +259,7 @@ msgstr "Подпись репозитория:" #: source/ubl-strings.h:74 msgid "Package (-s) to add" -msgstr "Пакет(-ы) лоя добавления" +msgstr "Пакет(-ы) для добавления" #: source/ubl-strings.h:75 msgid "Name" From a9ca1bc784616b5358cfc101297630d555b6fc31 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 15:26:03 +0600 Subject: [PATCH 26/82] Localisation fix --- ubl-settings-repomanager_ru.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index a0552f8..18c01e0 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -231,7 +231,7 @@ msgstr "Добавить репозиторий" #: source/ubl-strings.h:65 msgid "Repository (-ies)" -msgstr "Рупозиторий (-ии)" +msgstr "Репозиторий (-ии)" #: source/ubl-strings.h:66 msgid "Accept" From 31cd1069d364d15aa69bdc759ba28e23ec665dda Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 15:28:15 +0600 Subject: [PATCH 27/82] New status messages --- source/ubl-settings-repomanager.c | 98 +++++++++++++++++-------------- source/ubl-strings.h | 6 +- ubl-settings-repomanager.pot | 96 ++++++++++++++++++------------ ubl-settings-repomanager_ru.po | 96 ++++++++++++++++++------------ 4 files changed, 174 insertions(+), 122 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 53ac7cf..e49fd5c 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -622,43 +622,47 @@ void on_add_packages_accept(GtkWidget *self, dictionary *dict){ GtkTreeIter iter, itar; char *storage; - 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," ")); + 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); } - yon_debug_output("%s\n",command); - if (!system(command)){ - 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)); - gtk_widget_destroy(window->MainWindow); + 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)){ + 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)); + gtk_widget_destroy(window->MainWindow); + yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } } else { - + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); } + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); } } @@ -873,9 +877,13 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ 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); - system(command); + if (!system(command)){ + yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + on_subwindow_close(window->MainWindow); + } + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); } - on_subwindow_close(window->MainWindow); } void on_move_clicked(GtkWidget *self, main_window *widgets){ @@ -978,9 +986,16 @@ void on_remove_accept(GtkWidget *self, repo_add_window *window){ command = yon_delete_packages_sign_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," "),sign); } yon_debug_output("%s\n",command); - system(command); + if (system(command)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + gtk_widget_destroy(window->MainWindow); + } + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + } + }else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); } - } } void on_remove_clicked(GtkWidget *self, main_window *widgets){ @@ -1311,9 +1326,6 @@ main_window *yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->RepoFileTree),"cursor-changed",G_CALLBACK(on_package_selection_changed),widgets); yon_calendar_set_date_orientation(1); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); - - - /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ /* Localisation | Локализация */ @@ -1340,9 +1352,7 @@ int main(int argc, char *argv[]){ char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); yon_window_config_load(path); yon_config_load_update((main_window*)widgets); - if (getuid()!=0){ - yon_ubl_status_box_render("",BACKGROUND_IMAGE_SUCCESS_TYPE); - } + yon_ubl_status_box_render(DATA_LOADED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); gtk_main(); return 0; } \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 7526660..1ec1c44 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -78,8 +78,10 @@ #define ADD_PACKAGE_LABEL _("Add package") #define REPO_SIGN_ERROR_LABEL _("Repository sign failed - repository has no packages") -// #define ACCEPT_LABEL _("Accept") -// #define ACCEPT_LABEL _("Accept") +#define DATA_LOADED_LABEL _("Data has been loaded") +#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") #define CHOOSE_LABEL _("Choose") #define CANCEL_LABEL _("Cancel") diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot index 3eb1de3..53fb173 100644 --- a/ubl-settings-repomanager.pot +++ b/ubl-settings-repomanager.pot @@ -267,160 +267,180 @@ msgstr "" msgid "Path" msgstr "" -#: source/ubl-strings.h:77 source/ubl-strings.h:96 +#: source/ubl-strings.h:77 source/ubl-strings.h:98 msgid "Remove package" msgstr "" -#: source/ubl-strings.h:78 source/ubl-strings.h:95 +#: source/ubl-strings.h:78 source/ubl-strings.h:97 msgid "Add package" msgstr "" +#: source/ubl-strings.h:80 +msgid "Repository sign failed - repository has no packages" +msgstr "" + +#: source/ubl-strings.h:81 +msgid "Data has been loaded" +msgstr "" + +#: source/ubl-strings.h:82 +msgid "Packages were added successfully" +msgstr "" + +#: source/ubl-strings.h:83 +msgid "Packages were removed successfully" +msgstr "" + #: source/ubl-strings.h:84 +msgid "Packages were moved successfully" +msgstr "" + +#: source/ubl-strings.h:86 msgid "Choose" msgstr "" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:87 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:89 msgid "Open or create repository" msgstr "" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:90 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:91 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:92 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:93 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:94 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:95 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:96 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:99 msgid "Open" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:101 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:103 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:104 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:105 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:106 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:107 msgid "Choose repository or package to sign" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:109 msgid "Name:" msgstr "" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:110 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:111 msgid "< Type branch name >" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:112 msgid "Name must be filled!" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:113 msgid "Choose path for new repository" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:115 msgid "Choose repository folder" msgstr "" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:116 msgid "Choose repository" msgstr "" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:118 msgid "Absent" msgstr "" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:119 msgid "Dependences:" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:120 msgid "Digital signature" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:122 msgid "package" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:123 msgid "repository" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:124 msgid "This package already exists in that repository" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:125 msgid "This repository has already been added" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:127 msgid "Close" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:129 msgid "Are you sure want to disable?" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:131 msgid "Are you sure want to remove?" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:133 msgid "Do not sign" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:135 msgid "Package name error - package has incorrect name pattern" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:137 msgid "Passwords do not match" msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index 18c01e0..962cf27 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -269,39 +269,59 @@ msgstr "Имя" msgid "Path" msgstr "Путь" -#: source/ubl-strings.h:77 source/ubl-strings.h:96 +#: source/ubl-strings.h:77 source/ubl-strings.h:98 msgid "Remove package" msgstr "Удалить пакет" -#: source/ubl-strings.h:78 source/ubl-strings.h:95 +#: source/ubl-strings.h:78 source/ubl-strings.h:97 msgid "Add package" msgstr "Добавить пакет" +#: source/ubl-strings.h:80 +msgid "Repository sign failed - repository has no packages" +msgstr "Ошибка подписи репозитория - репозиторий не содержит пакетов" + +#: source/ubl-strings.h:81 +msgid "Data has been loaded" +msgstr "Данные загружены" + +#: source/ubl-strings.h:82 +msgid "Packages were added successfully" +msgstr "Пакеты успешно добавлены" + +#: source/ubl-strings.h:83 +msgid "Packages were removed successfully" +msgstr "Пакеты успешно удалены" + #: source/ubl-strings.h:84 +msgid "Packages were moved successfully" +msgstr "Пакеты успешно перемещены" + +#: source/ubl-strings.h:86 msgid "Choose" msgstr "Выбрать" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:87 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:89 msgid "Open or create repository" msgstr "Открыть или создать репозиторий" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:90 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:91 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:92 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:93 msgid "" "Add/Remove repository from\n" "local package sources" @@ -309,107 +329,107 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:94 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:95 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:96 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:99 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:101 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:103 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:104 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:105 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:106 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:107 msgid "Choose repository or package to sign" msgstr "Выберите репозиторий или пакет для подписи" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:109 msgid "Name:" msgstr "Название:" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:110 msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:111 msgid "< Type branch name >" msgstr "< Введите название ветки >" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:112 msgid "Name must be filled!" msgstr "Введите название!" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:113 msgid "Choose path for new repository" msgstr "Выбрать расположение нового репозитория" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:115 msgid "Choose repository folder" msgstr "Выбрать директорию для репозитория" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:116 msgid "Choose repository" msgstr "Выбрать репозиторий" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:118 msgid "Absent" msgstr "Отсутствует" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:119 msgid "Dependences:" msgstr "Зависит от:" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:120 msgid "Digital signature" msgstr "Цифровая подпись" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:122 msgid "package" msgstr "пакет" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:123 msgid "repository" msgstr "репозиторий" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:124 msgid "This package already exists in that repository" msgstr "Этот пакет уже присутствует в выбранном репозитории" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:125 msgid "This repository has already been added" msgstr "Этот репозиторий уже был добавлен" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:127 msgid "Close" msgstr "Закрыть" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:129 msgid "Are you sure want to disable?" msgstr "" "Внимание! Вы хотите отключить хранилище от управления менеджером " @@ -419,20 +439,20 @@ msgstr "" "Примечание: в дальнейшем Вы можете заново подключить хранилище и управлять " "им." -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:131 msgid "Are you sure want to remove?" msgstr "" "Внимание! Вы ходите удалить хранилище При этом хранилище и вложенные " "репозитории будут безвозвратно удалены!" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:133 msgid "Do not sign" msgstr "Не подписывать" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:135 msgid "Package name error - package has incorrect name pattern" msgstr "Ошибка имени пакета - некорректное имя пакета" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:137 msgid "Passwords do not match" msgstr "Пароли не совпадают" From 166f06f9b56210ff95d2e46042ad96728b5fd563 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 15:49:46 +0600 Subject: [PATCH 28/82] Added new status messages --- source/ubl-settings-repomanager.c | 16 +++--- source/ubl-strings.h | 3 ++ ubl-settings-repomanager.pot | 88 ++++++++++++++++++------------- ubl-settings-repomanager_ru.po | 88 ++++++++++++++++++------------- 4 files changed, 111 insertions(+), 84 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e49fd5c..924bfae 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -25,12 +25,6 @@ void on_repo_removed(GtkWidget *self,storage_config_window *window){ } } yon_storage_config_update(window); - // gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - // gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - // if (yon_gtk_tree_store_find_full(GTK_TREE_MODEL(window->storages_copy),&itar,2,repo)){ - // gtk_tree_store_remove(GTK_TREE_STORE(window->storages_copy),&itar); - // yon_storage_config_update(window); - // } } void on_repo_sign_changed(GtkWidget *self, storage_config_window *window){ @@ -299,6 +293,7 @@ void on_storage_accept(GtkWidget *self, dictionary *dict){ 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)); on_subwindow_close(self); + yon_ubl_status_box_render(STORAGES_SAVED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } gboolean yon_storage_filter_func(GtkTreeModel *model, @@ -1223,14 +1218,19 @@ void on_key_generate_accept(GtkWidget *self, key_creation_window* window){ } 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)){ - system(yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); + ex_status = system(yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); } else if (!strcmp(password,password_confirm)){ - system(yon_generate_key_command(type,name,email,strength,comment,expire,password)); + ex_status = system(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); 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_SUCCESS_TYPE); gtk_widget_destroy(window->Window); yon_sign_list_update(); } diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 1ec1c44..59b03fe 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -82,6 +82,9 @@ #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") +#define STORAGES_SAVED_LABEL _("Storages were saved") +#define KEY_CREATION_SUCCESS_LABEL _("Key was successfully created") +#define KEY_CREATION_FAILURE_LABEL _("Key creation failed") #define CHOOSE_LABEL _("Choose") #define CANCEL_LABEL _("Cancel") diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot index 53fb173..790d7b5 100644 --- a/ubl-settings-repomanager.pot +++ b/ubl-settings-repomanager.pot @@ -267,11 +267,11 @@ msgstr "" msgid "Path" msgstr "" -#: source/ubl-strings.h:77 source/ubl-strings.h:98 +#: source/ubl-strings.h:77 source/ubl-strings.h:101 msgid "Remove package" msgstr "" -#: source/ubl-strings.h:78 source/ubl-strings.h:97 +#: source/ubl-strings.h:78 source/ubl-strings.h:100 msgid "Add package" msgstr "" @@ -295,152 +295,164 @@ msgstr "" msgid "Packages were moved successfully" msgstr "" +#: source/ubl-strings.h:85 +msgid "Storages were saved" +msgstr "" + #: source/ubl-strings.h:86 -msgid "Choose" +msgid "Key was successfully created" msgstr "" #: source/ubl-strings.h:87 -msgid "Cancel" +msgid "Key creation failed" msgstr "" #: source/ubl-strings.h:89 -msgid "Open or create repository" +msgid "Choose" msgstr "" #: source/ubl-strings.h:90 +msgid "Cancel" +msgstr "" + +#: source/ubl-strings.h:92 +msgid "Open or create repository" +msgstr "" + +#: source/ubl-strings.h:93 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:94 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:95 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:96 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:97 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:98 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:99 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:102 msgid "Open" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:104 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:106 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:107 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:108 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:109 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:110 msgid "Choose repository or package to sign" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:112 msgid "Name:" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:113 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:114 msgid "< Type branch name >" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:115 msgid "Name must be filled!" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:116 msgid "Choose path for new repository" msgstr "" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:118 msgid "Choose repository folder" msgstr "" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:119 msgid "Choose repository" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:121 msgid "Absent" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:122 msgid "Dependences:" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:123 msgid "Digital signature" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:125 msgid "package" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:126 msgid "repository" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:127 msgid "This package already exists in that repository" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:128 msgid "This repository has already been added" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:130 msgid "Close" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:132 msgid "Are you sure want to disable?" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:134 msgid "Are you sure want to remove?" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:136 msgid "Do not sign" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:138 msgid "Package name error - package has incorrect name pattern" msgstr "" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:140 msgid "Passwords do not match" msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index 962cf27..f070f71 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -269,11 +269,11 @@ msgstr "Имя" msgid "Path" msgstr "Путь" -#: source/ubl-strings.h:77 source/ubl-strings.h:98 +#: source/ubl-strings.h:77 source/ubl-strings.h:101 msgid "Remove package" msgstr "Удалить пакет" -#: source/ubl-strings.h:78 source/ubl-strings.h:97 +#: source/ubl-strings.h:78 source/ubl-strings.h:100 msgid "Add package" msgstr "Добавить пакет" @@ -297,31 +297,43 @@ msgstr "Пакеты успешно удалены" msgid "Packages were moved successfully" msgstr "Пакеты успешно перемещены" +#: source/ubl-strings.h:85 +msgid "Storages were saved" +msgstr "Сохранено" + #: source/ubl-strings.h:86 +msgid "Key was successfully created" +msgstr "Ключ был успешно создан" + +#: source/ubl-strings.h:87 +msgid "Key creation failed" +msgstr "Ошибка создания ключа" + +#: source/ubl-strings.h:89 msgid "Choose" msgstr "Выбрать" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:90 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:92 msgid "Open or create repository" msgstr "Открыть или создать репозиторий" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:93 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:94 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:95 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:96 msgid "" "Add/Remove repository from\n" "local package sources" @@ -329,107 +341,107 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:97 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:98 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:99 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:102 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:104 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:106 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:107 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:108 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:109 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:110 msgid "Choose repository or package to sign" msgstr "Выберите репозиторий или пакет для подписи" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:112 msgid "Name:" msgstr "Название:" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:113 msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:114 msgid "< Type branch name >" msgstr "< Введите название ветки >" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:115 msgid "Name must be filled!" msgstr "Введите название!" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:116 msgid "Choose path for new repository" msgstr "Выбрать расположение нового репозитория" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:118 msgid "Choose repository folder" msgstr "Выбрать директорию для репозитория" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:119 msgid "Choose repository" msgstr "Выбрать репозиторий" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:121 msgid "Absent" msgstr "Отсутствует" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:122 msgid "Dependences:" msgstr "Зависит от:" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:123 msgid "Digital signature" msgstr "Цифровая подпись" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:125 msgid "package" msgstr "пакет" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:126 msgid "repository" msgstr "репозиторий" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:127 msgid "This package already exists in that repository" msgstr "Этот пакет уже присутствует в выбранном репозитории" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:128 msgid "This repository has already been added" msgstr "Этот репозиторий уже был добавлен" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:130 msgid "Close" msgstr "Закрыть" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:132 msgid "Are you sure want to disable?" msgstr "" "Внимание! Вы хотите отключить хранилище от управления менеджером " @@ -439,20 +451,20 @@ msgstr "" "Примечание: в дальнейшем Вы можете заново подключить хранилище и управлять " "им." -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:134 msgid "Are you sure want to remove?" msgstr "" "Внимание! Вы ходите удалить хранилище При этом хранилище и вложенные " "репозитории будут безвозвратно удалены!" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:136 msgid "Do not sign" msgstr "Не подписывать" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:138 msgid "Package name error - package has incorrect name pattern" msgstr "Ошибка имени пакета - некорректное имя пакета" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:140 msgid "Passwords do not match" msgstr "Пароли не совпадают" From f5ae000c700647214de9dd923fd771f26d7a9f17 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 15:55:11 +0600 Subject: [PATCH 29/82] Saving of storages at window closing --- source/ubl-settings-repomanager.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 924bfae..0899251 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -292,6 +292,7 @@ void on_storage_accept(GtkWidget *self, dictionary *dict){ 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(); on_subwindow_close(self); yon_ubl_status_box_render(STORAGES_SAVED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } From bbf315f0799febec64867fed9b33d2a55a714b64 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 16:05:56 +0600 Subject: [PATCH 30/82] Renamed button at remove window; Fix for remove window status message --- source/ubl-settings-repomanager.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 0899251..d505a43 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -874,7 +874,7 @@ void on_move_accept(GtkWidget *self, repo_add_window *window){ 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_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_render(PACKAGES_MOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); on_subwindow_close(window->MainWindow); } } else { @@ -982,16 +982,18 @@ void on_remove_accept(GtkWidget *self, repo_add_window *window){ command = yon_delete_packages_sign_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," "),sign); } yon_debug_output("%s\n",command); - if (system(command)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - gtk_widget_destroy(window->MainWindow); + if (!system(command)){ + yon_ubl_status_box_render(PACKAGES_MOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } } else { yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; } }else { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - } + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_TO_SAVE_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + gtk_widget_destroy(window->MainWindow); } void on_remove_clicked(GtkWidget *self, main_window *widgets){ @@ -1013,6 +1015,8 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo)); + gtk_button_set_label(GTK_BUTTON(window->AddButton),REMOVE_PACKAGES_TOOLTIP_LABEL); + 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); From 912ea54293fd56c1e5cda8672896b003b86db2d1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 16:15:48 +0600 Subject: [PATCH 31/82] Added search for packages --- source/ubl-settings-repomanager.c | 2 ++ ubl-settings-repomanager-add.glade | 1 + ubl-settings-repomanager.glade | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index d505a43..cbd80b9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -1332,6 +1332,8 @@ main_window *yon_main_window_complete(main_window *widgets){ yon_calendar_set_date_orientation(1); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); + gtk_tree_view_set_search_entry(GTK_TREE_VIEW(widgets->RepoFileTree),GTK_ENTRY(widgets->SearchEntry)); + /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ /* Localisation | Локализация */ gtk_widget_show(widgets->Window); diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade index 68e8ec6..2377c20 100644 --- a/ubl-settings-repomanager-add.glade +++ b/ubl-settings-repomanager-add.glade @@ -506,6 +506,7 @@ True True PackagesList + 1 both diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index ceb9c22..09a9a63 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -299,7 +299,7 @@ True RepoFileList False - 0 + 1 @@ -341,6 +341,7 @@ True RepoFileList False + 1 From 4d9e1286f31f6498880c0906e6e58a87d4e068a2 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 30 May 2024 16:18:01 +0600 Subject: [PATCH 32/82] Changed tooltip for 'System update' button --- source/ubl-strings.h | 2 +- ubl-settings-repomanager.glade | 2 +- ubl-settings-repomanager.pot | 2 +- ubl-settings-repomanager_ru.po | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 59b03fe..d35d7e0 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -30,7 +30,7 @@ #define ADD_PACKAGES_TOOLTP_LABEL _("Add packages") #define MOVE_PACKAGES_TOOLTIP_LABEL _("Move packages") #define REMOVE_PACKAGES_TOOLTIP_LABEL _("Remove packages") -#define LAUNCH_UBL_SETTINGS_UPDATE_TOOLTIP_LABEL _("Open ubl-settings-update") +#define LAUNCH_UBL_SETTINGS_UPDATE_TOOLTIP_LABEL _("System update") #define EMPTY_IMPORTANT_LABEL _("Empty important field") #define KEY_LABEL _("Key creation") diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 09a9a63..5373317 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -178,7 +178,7 @@ True True True - Open ubl-settings-update + System update image6 + + + False + True + 1 + + + + + False + True + 1 + @@ -215,46 +268,6 @@ 0 - - - True - False - 5 - - - True - True - - - True - True - 0 - - - - - True - True - True - Add repository - image5 - - - - False - True - 1 - - - - - False - True - 1 - - From 6b85c066670e12059f758dc41054e91cf10a915c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Jun 2024 17:38:17 +0600 Subject: [PATCH 56/82] Moved command to header file --- source/ubl-settings-repomanager.c | 2 +- source/ubl-settings-repomanager.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 59b41c8..12570ce 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -1405,7 +1405,7 @@ void yon_sign_list_update(){ } void on_ubl_settings_update_launch(){ - yon_launch_app_with_arguments("ubl-settings-update",NULL); + yon_launch_app_with_arguments(ubl_settings_update_command,NULL); } void on_calendar_open(GtkWidget *self,key_creation_window *window){ diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index f1e9fd5..8a004a5 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -58,6 +58,8 @@ typedef char* string; #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) +#define ubl_settings_update_command "ubl-settings-update" + #define yon_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL) #define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) From 7831d06566d7218cff23eda29aea9c744de5a39e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 3 Jun 2024 17:39:18 +0600 Subject: [PATCH 57/82] Added padding --- ubl-settings-repomanager.glade | 1 + 1 file changed, 1 insertion(+) diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index c725dcd..c924304 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -388,6 +388,7 @@ True False + 8 5 5 5 From dc3b50ccb65dd38de31c1385bed06b10b7700700 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 4 Jun 2024 17:07:44 +0600 Subject: [PATCH 58/82] Added top table navigation --- source/ubl-settings-repomanager.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 12570ce..8d32628 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -1209,7 +1209,7 @@ void yon_config_load_update(main_window *widgets){ char *name = yon_char_new(storages[i]); free(yon_char_divide(name,yon_char_find_last(name,'/'))); gtk_tree_store_append(widgets->RepoList,&iter,NULL); - gtk_tree_store_set(widgets->RepoList,&iter,2,name,3,storages[i],-1); + gtk_tree_store_set(widgets->RepoList,&iter,1,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)){ @@ -1219,14 +1219,14 @@ void yon_config_load_update(main_window *widgets){ char *nm = yon_char_new(name_parsed[j]); free(yon_char_divide(nm,yon_char_find_last(nm,'/'))); gtk_tree_store_append(widgets->RepoList,&itar,&iter); - gtk_tree_store_set(widgets->RepoList,&itar,3,name_parsed[j],2,nm,-1); + gtk_tree_store_set(widgets->RepoList,&itar,1,document_no_edits,3,name_parsed[j],2,nm,-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,2,dirs[k],3,arch_path,-1); + gtk_tree_store_set(widgets->RepoList,&childiter,1,folder_no_edits,2,dirs[k],3,arch_path,-1); } } free(nm); @@ -1509,6 +1509,23 @@ void on_tree_view_activate(GtkWidget *self, GtkTreePath* path, GtkTreeViewColumn } +void on_repo_item_activate(GtkWidget *self, GtkTreePath *path, GtkTreeViewColumn *column, main_window *widgets){ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)); + gtk_tree_selection_get_selected(tree_selection,&model,&iter); + if (gtk_tree_store_iter_depth(GTK_TREE_STORE(widgets->RepoList),&iter)<2){ + char *path_id = gtk_tree_model_get_string_from_iter(model,&iter); + char *target_id = gtk_tree_path_to_string(path); + char *selection = yon_char_unite(path_id,":",target_id,NULL); + GtkTreePath *new_selection = gtk_tree_path_new_from_string(selection); + gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),new_selection); + gtk_tree_selection_select_path(tree_selection,new_selection); + // on_package_selection_changed(NULL,widgets); + g_signal_emit_by_name(G_OBJECT(widgets->ReposTree),"cursor-changed",widgets,G_TYPE_NONE,NULL); + } +} + main_window *yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); @@ -1556,6 +1573,7 @@ main_window *yon_main_window_complete(main_window *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); g_signal_connect(G_OBJECT(widgets->ReposTree),"row-activated",G_CALLBACK(on_tree_view_activate),widgets); + g_signal_connect(G_OBJECT(widgets->RepoFileTree),"row-activated",G_CALLBACK(on_repo_item_activate),widgets); yon_calendar_set_date_orientation(1); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); From 0b73b848365ad7195188f3ca2b6243cc9c5a8454 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 4 Jun 2024 17:52:59 +0600 Subject: [PATCH 59/82] Signature getting for repository --- source/ubl-settings-repomanager.c | 37 +++++++++++++++++++++++++++++-- source/ubl-settings-repomanager.h | 6 +++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 8d32628..47cffb3 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -1268,6 +1268,38 @@ config_str yon_tree_store_repo_get_archs(GtkTreeStore *target, GtkTreeIter *repo return final; } +char *yon_signature_get(GtkTreeView *target, GtkTreeIter *iter){ + GtkTreeIter itar; + GtkTreeModel *model = gtk_tree_view_get_model(target); + char *full_path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model),iter); + int size; + config_str parsed = yon_char_parse(full_path,&size,":"); + if (size==2){ + char *storage_path = parsed[0]; + char *repo_path = yon_char_unite(parsed[0],":",parsed[1],NULL); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model),&itar,storage_path); + char *path; + gtk_tree_model_get(GTK_TREE_MODEL(model),&itar,3,&path,-1); + char *repo; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model),&itar,repo_path); + gtk_tree_model_get(GTK_TREE_MODEL(model),&itar,2,&repo,-1); + int status_size; + config_str status = yon_config_load(yon_repo_get_signature(path,repo),&status_size); + char *final_string = NULL; + if (status_size>4){ + final_string = yon_char_unite(status[0],status[1],status[2],status[3],NULL); + } + free(full_path); + free(path); + free(repo); + yon_char_parsed_free(parsed,size); + yon_char_parsed_free(status,status_size); + + return final_string; + } + return NULL; +} + void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),""); gtk_list_store_clear(widgets->RepoFileList); @@ -1304,7 +1336,8 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ int size, arch_size; config_str archs = yon_tree_store_repo_get_archs(widgets->RepoList,&iter,&arch_size); char *archs_string = yon_char_parsed_to_string(archs,arch_size,", "); - char *info = get_repo_info_label(name,archs_string); + char *sign = yon_signature_get(GTK_TREE_VIEW(widgets->ReposTree),&iter); + char *info = get_repo_info_label(name,archs_string,sign); gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),info); int lvlsize; config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,3); @@ -1323,7 +1356,7 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itor,&iter); char *trg; gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itor,2,&trg,-1); - char *info = get_arch_info_label(trg,name,"",""); + char *info = get_arch_info_label(trg,name); gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),info); char *packages; int size; diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 8a004a5..172d71f 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -60,6 +60,8 @@ typedef char* string; #define ubl_settings_update_command "ubl-settings-update" +#define yon_repo_get_signature(path, repo) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," .",NULL) + #define yon_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL) #define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) @@ -73,9 +75,9 @@ typedef char* string; #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_repo_info_label(repos, archs) yon_char_unite(REPO_NAME_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) -#define get_arch_info_label(repos, archs,sign,sign_status) yon_char_unite(REPO_NAME_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,"\n\n",SIGNATURE_LABEL," ",sign,"\n\n",SIGN_STATUS_LABEL,": ",sign_status,NULL) +#define get_arch_info_label(repos, archs) yon_char_unite(REPO_NAME_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,NULL) #define yon_generate_key_command(type,name,email,strength,comment,expire,password) yon_char_unite("gpg --batch --gen-key < Date: Wed, 5 Jun 2024 11:24:56 +0600 Subject: [PATCH 60/82] Package loading rework; Moved but not linked packages now outputs at lower tree view --- source/ubl-settings-repomanager.c | 41 +++++++++++++++++++------------ source/ubl-settings-repomanager.h | 9 +++++-- ubl-settings-repomanager.glade | 18 ++++++++++---- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 47cffb3..14add2d 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -1360,21 +1360,28 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),info); char *packages; int size; - config_str parsed = yon_file_ls(target,&size); + char *repo = yon_char_divide(target,yon_char_find_last(target,'/')); + char *storage = yon_char_divide(repo,yon_char_find_last(repo,'/')); + char *command = yon_get_packages_command(storage,repo,target); + yon_debug_output("%s\n",command); + config_str parsed = yon_config_load(command,&size); for (int i=0;i0){ - gtk_list_store_append(widgets->RepoFileList,&itar); - yon_char_remove_last_symbol(load[0],'\n'); - char *temp = load[0]; - free(name); - name=temp; - gtk_list_store_set(widgets->RepoFileList,&itar,1,name,3,parsed[i],-1); - yon_char_parsed_free(load,load_size); + int line_size; + yon_char_remove_last_symbol(parsed[i],'\n'); + config_str line = yon_char_parse(parsed[i],&line_size,":"); + if (line[0][0]!='-'&&line[0][1]!='\0'){ + int load_size; + char *name = yon_char_unite(target,"/",parsed[i],NULL); + config_str load = yon_config_load(yon_get_package_name_from_filename(name),&load_size); + if (load_size>0){ + yon_char_remove_last_symbol(load[0],'\n'); + gtk_list_store_append(widgets->RepoFileList,&itar); + gtk_list_store_set(widgets->RepoFileList,&itar,0,line[1][0]!='-'&&line[1][1]!='\0'? document_added : "",1,line[0],2,line[1],-1); + yon_char_parsed_free(load,load_size); } + } else { + gtk_list_store_append(widgets->RepoPackagesList,&itar); + gtk_list_store_set(widgets->RepoPackagesList,&itar,0,document_deleted,1,line[1],-1); } } free(info); @@ -1403,10 +1410,12 @@ void on_package_selection_changed(GtkWidget *self, main_window *widgets){ break; case 2: char *path, *filename; - gtk_tree_model_get(model,&iter,3,&filename,-1); + gtk_tree_model_get(model,&iter,2,&filename,-1); gtk_tree_model_get(model2,&itar,3,&path,-1); int size; - config_str parsed = yon_config_load(get_package_info_command(yon_char_unite(path,"/",filename,NULL)),&size); + char *command = get_package_info_command(yon_char_unite(path,"/",filename,NULL)); + yon_debug_output("%s\n",command); + config_str parsed = yon_config_load(command,&size); char *full = yon_char_parsed_to_string(parsed,size,""); gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),full); yon_char_parsed_free(parsed,size); @@ -1580,7 +1589,7 @@ main_window *yon_main_window_complete(main_window *widgets){ widgets->RepoList = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); widgets->RepoFileList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoFileList")); - widgets->RepoPackagesTre = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoPackagesTre")); + widgets->RepoPackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoPackageList")); { widgets->KeyMenuItem = gtk_menu_item_new(); gtk_menu_shell_prepend(GTK_MENU_SHELL(gtk_widget_get_parent(widgets->AboutMenuItem)),widgets->KeyMenuItem); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 172d71f..6cb71ce 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -42,6 +42,9 @@ #define key_icon_name "com.ublinux.libublsettingsui-gtk3.key-symbolic" +#define package_linked_icon "com.ublinux.ubl-settings-repomanager.package-linked-symbolic" +#define package_unlinked_icon "com.ublinux.ubl-settings-repomanager.package-unlinked-symbolic" + #define key_encription_path "/usr/share/ubl-settings-repomanager/csv/crypt-key.csv" typedef char* string; @@ -60,7 +63,9 @@ typedef char* string; #define ubl_settings_update_command "ubl-settings-update" -#define yon_repo_get_signature(path, repo) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," .",NULL) +#define yon_get_packages_command(path,repo,arch) yon_char_unite("repo-manager show --quiet -d ",path," -a ",arch," -r ",repo," | sed -E 's/(\\S+)(\\s+)(\\S+)/\\1:\\3/g'",NULL) + +#define yon_repo_get_signature(path, repo) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," . 2>&1 | cut -d: -f2 |sed -E 's/ *//g'",NULL) #define yon_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL) @@ -138,7 +143,7 @@ typedef struct { GtkWidget *KeyMenuItem; GtkTreeStore *RepoList; GtkListStore *RepoFileList; - GtkListStore *RepoPackagesTre; + GtkListStore *RepoPackagesList; } main_window; typedef struct { diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index c924304..f1c515f 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -14,12 +14,18 @@ - - + + + + + + + + @@ -110,7 +116,7 @@ True True True - Configure storages + Manage storages image2