diff --git a/.gitignore b/.gitignore index db6e033..767f93e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,11 @@ .vscode/ *# -ubl-settings-TEMPLATE +ubl-settings-repomanager +ubl-settings-repo-back/ubl-settings-repo-back *~ build/ compile/ -terminal-commands/ \ No newline at end of file +terminal-commands/ +source/ubl-cmake.h +.BUILD.md +.updatebuild.sh \ No newline at end of file diff --git a/Makefile b/Makefile index 23b99ae..3a308b0 100644 --- a/Makefile +++ b/Makefile @@ -8,23 +8,25 @@ MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) CMAKE_COMMAND = cmake CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile -#CMAKE_SOURCE_DIR = ./source -#CMAKE_BUILD_DIR = ./compile -FILE_VERSION = VERSION.md DEPENDS = /bin/cmake -PREFIX ?= /usr +PREFIX ?= /usr/local PKGNAME = $(MAKEFILE_DIR) -#PKGNAME = ubl-settings-manager +FILE_VER = source/${PKGNAME}.h default_target: all -.PHONY: all init depend debug prepare check build uninstall install clean up_ver help +.PHONY: all init depend debug prepare check build uninstall install clean help all: init build init: @echo "Initialize ..."; \ - sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-repomanager.h; \ + if [ -d ".git" ]; then \ + LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \ + else \ + LATEST_TAG="Development"; \ + fi; \ + sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: @@ -35,8 +37,8 @@ depend: exit 1; \ fi; \ done; \ + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B${CMAKE_BUILD_DIR} --check-build-system CMakeFiles/Makefile.cmake 1 || exit 1; \ echo "Check depends: OK" -# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 debug: @echo "Debug ..." @@ -63,7 +65,7 @@ check: build: depend prepare @echo "Build ..."; \ - make --directory=${CMAKE_BUILD_DIR}; \ + $(MAKE_COMMAND) --directory=${CMAKE_BUILD_DIR}; \ echo "Build: OK" uninstall: @@ -88,9 +90,13 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" - @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/${PKGNAME}-banner.png" - @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}" - @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-green-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-red-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-green-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-red-symbolic.svg" + @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ @@ -112,28 +118,29 @@ install: check uninstall 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"; \ done - @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" @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 -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" - @install -dm755 "${DESTDIR}/etc/xdg" - @install -dm755 "${DESTDIR}${PREFIX}/share/applications" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" - @install -dm755 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images} - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}-windows.glade" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css" - @install -dm755 -d "${DESTDIR}${PREFIX}/share/${PKGNAME}/images" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "${PKGNAME}-banner.png" @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}.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" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ fi @echo "Install: OK" + @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." @@ -144,14 +151,6 @@ clean: echo "Clean: OK"; \ fi -up_ver: - @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ - MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ - MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ - VER="$${MAJOR}.$$(($${MINOR}+1))"; \ - sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ - echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" - help: @echo "The following are some of the valid targets for this Makefile:"; \ echo "... all (the default if no target is provided)"; \ @@ -161,5 +160,4 @@ help: echo "... compile"; \ echo "... install"; \ echo "... uninstall"; \ - echo "... clean"; \ - echo "... up_ver" + echo "... clean" \ No newline at end of file diff --git a/README.md b/README.md index ca5f2a3..a9e1fda 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ubl-settings-repomanager # Выполнить # Build -In order to build ubl-settings-TEMPLATE you will need: +In order to build ubl-settings-repomanager you will need: - CMake - C compiler diff --git a/VERSION.md b/VERSION.md deleted file mode 100644 index 12ebd01..0000000 --- a/VERSION.md +++ /dev/null @@ -1 +0,0 @@ -VERSION 1.0 diff --git a/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg new file mode 100644 index 0000000..76ab9d2 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg new file mode 100644 index 0000000..1233c4d --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.document-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-symbolic.svg new file mode 100644 index 0000000..a0b2a8d --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg new file mode 100644 index 0000000..9373086 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg new file mode 100644 index 0000000..9373086 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg new file mode 100644 index 0000000..9373086 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gresource.xml b/gresource.xml new file mode 100644 index 0000000..7b4904a --- /dev/null +++ b/gresource.xml @@ -0,0 +1,13 @@ + + + + ubl-settings-repomanager.glade + ubl-settings-repomanager-windows.glade + + + ubl-settings-repomanager.css + + + ubl-settings-repomanager-banner.png + + \ No newline at end of file diff --git a/screenshot/screensgot.png b/screenshot/screensgot.png new file mode 100644 index 0000000..723457c Binary files /dev/null and b/screenshot/screensgot.png differ diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 1e12993..2ef3c2a 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) @@ -21,13 +26,49 @@ endif() configure_file(ubl-cmake.in ubl-cmake.h) +file(COPY ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h DESTINATION ./) + +set(GRESOURCE_C resources.c) +set(GRESOURCE_XML gresource.xml) + +find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED) +add_custom_target(GLADE ubl-settings-repomanager.glade) + +set(DEPENDFILES + ../ubl-settings-repomanager.glade + ../ubl-settings-repomanager-windows.glade + ../gresource.xml + ../ubl-settings-repomanager-banner.png + ../ubl-settings-repomanager.css + ) + +file(COPY ${DEPENDFILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +add_custom_command( + OUTPUT ${GRESOURCE_C} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${GLIB_COMPILE_RESOURCES} + ARGS + --generate-source + --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} + ${GRESOURCE_XML} + VERBATIM + MAIN_DEPENDENCY ${GRESOURCE_XML} + DEPENDS + ${GLADE} +) +add_custom_target( + dummy-resource + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} +) #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ -O2 -pipe -fno-plt -fexceptions \ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ - -fstack-clash-protection -fcf-protection -g") + -fstack-clash-protection -fcf-protection") + set(SOURCE_FILES ubl-settings-repomanager.c @@ -35,15 +76,22 @@ set(SOURCE_FILES ubl-strings.h ubl-utils.h ubl-utils.c - ubl-cmake.h) + ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h + ) set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} +# ${VTE291_LIBRARIES} pthread) -add_executable(${PROJECT_NAME} ${SOURCE_FILES}) +add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR}) -install(TARGETS ubl-settings-repomanager DESTINATION bin) \ No newline at end of file +set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} + PROPERTIES GENERATED TRUE +) +install(TARGETS ${PROJECT_NAME} DESTINATION bin) +add_dependencies(${PROJECT_NAME} dummy-resource) \ No newline at end of file diff --git a/source/ubl-cmake.h b/source/ubl-cmake.h deleted file mode 120000 index 967149f..0000000 --- a/source/ubl-cmake.h +++ /dev/null @@ -1 +0,0 @@ -/home/superadmin/Документы/ubl-settings-repomanager/compile/ubl-cmake.h \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index ff794a9..e191871 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -30,7 +30,7 @@ void yon_open_browser(GtkWidget *self, char *link){ */ void on_open_documentation_confirmation(GtkWidget *self, char *link){ if (main_config.always_open_documentation==0){ - GtkBuilder *builder = gtk_builder_new_from_file(glade_path); + 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"); @@ -84,7 +84,7 @@ void on_link(GtkWidget *self, char* uri, gpointer user_data){ * Присоединять к сигналу "activate" кнопки справки типа MenuItem. */ void on_about(){ - GtkBuilder *builder=gtk_builder_new_from_file(glade_path); + 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"); @@ -98,44 +98,101 @@ void on_about(){ gtk_widget_show(window); } -void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - GtkTreeIter *iter=NULL; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,iter)){ - char *codeName,*branch,*version,*architecture,*components,*signature,*ipAdress,*port; - int serverType=0,trusted=0,published=0; - gtk_tree_model_get(model,iter,3,&codeName,4,&branch,5,&version,6,&architecture,7,&components,8,&signature,9,&trusted,10,&serverType,11,&ipAdress,12,&port,13,published,-1); - // gtk_label_set_text(GTK_LABEL(widgets->srgbe),) +void on_save(){ + char *command = "repo-manager"; + char *remove_command=NULL; + char *add_command=NULL; + char *remove_flagged = NULL; + char *add_flagged = NULL; + char *origin_flagged = NULL; + char *name_flagged = NULL; + GtkTreeIter iter, childIter; + 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)){ + remove_flagged = NULL; + add_flagged = NULL; + int repostatus=0; + gboolean renamed=0; + char *old_name=NULL; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,1,&name_flagged,3,&origin_flagged,4,&repostatus,6,&old_name,7,&renamed,-1); + + // if (!strstr(name_flagged,".db.tar.gz")) name_flagged = yon_char_append(name_flagged,".db.tar.gz"); + remove_command = yon_char_unite(command," remove -d ", origin_flagged, " -r ", name_flagged, NULL); + add_command = yon_char_unite(command," add -d ", origin_flagged, " -r ", name_flagged, NULL); + int 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)){ + int status = 0,deleted = 0; + char *path=NULL; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,3,&path,4,&status,5,&deleted,-1); + gtk_tree_store_set(main_config.tree_store,&childIter,4,0,5,0,-1); + if (status==-1) { remove_flagged = yon_char_unite(remove_flagged ? yon_char_append(remove_flagged,",") : " -p ",path,NULL); /*gtk_tree_store_remove(main_config.tree_store,&childIter);*/} + else if (status == 1&&deleted==0) { add_flagged = yon_char_unite(add_flagged ? yon_char_append(add_flagged,",") : " -p ",path,NULL);gtk_tree_store_set(main_config.tree_store,&childIter,0,"com.ublinux.ubl-settings-repomanager.document-symbolic",-1); } + + } + if (origin_flagged) + remove_command = remove_flagged ? yon_char_unite(remove_command,remove_flagged,NULL) : NULL; + add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : add_command; + printf("%s\n%s\n",remove_command,add_command); + if (remove_command) system(remove_command); + if (add_command) system(add_command); } } -int yon_add_branches(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, void *dct){ - printf("%d\n",1); - dictionary *dict=(dictionary*)dct; - 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*); +void on_search(GtkCellEditable *self, main_window *widgets){ + GtkTreeIter iter, childIter; char *name=NULL; - gtk_tree_model_get(model,iter,0,&name,-1); - if(name){ - printf("%s\n",name); - GtkTreeIter ITER,iters; - if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&ITER)){ - gtk_tree_store_append(main_config.tree_store,&iters,&ITER); - gtk_tree_store_set(main_config.tree_store,&iters,1,name,-1); + 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); + } +} + +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; + int serverType=0,trusted=0,published=0; + gtk_tree_model_get(model,&iter,11,&codeName,12,&version,13,&architecture,-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 : ""); } - return 0; +} + +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; } 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*); - char *name = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry))); + if (!window->path){ yon_ubl_status_box_render(CHOOSE_PATH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); return;} + char *name=NULL; + + name = window->path; + window->path = yon_char_divide(name,yon_char_find_last(window->path, '/')); if (!name||strcmp(name,"")!=0){ - on_close_subwindow(self); GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); - gtk_tree_store_set(main_config.tree_store,iter,2,window->BranchesListStore,-1); - gtk_tree_model_foreach(GTK_TREE_MODEL(window->BranchesListStore),yon_add_branches,dict); + gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.folder-green-symbolic",2,window->BranchesListStore,3,window->path,-1); yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } else { yon_ubl_status_box_render(EMPTY_NAME_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -156,28 +213,27 @@ void on_branch_add(GtkCellRendererText *self, char*path,char *new_text, repo_cre } } +char *on_choose_repo_folder(GtkWidget *self,repo_create_window *window){ + GtkFileFilter *file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*db.tar.gz"); + GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); + 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){ - GtkBuilder *builder = gtk_builder_new_from_file(glade_repo_path); repo_create_window *window = new(repo_create_window); - window->Window=yon_gtk_builder_get_widget(builder,"repoCreateWindow"); - window->NameEntry=yon_gtk_builder_get_widget(builder,"repoNameEntry"); - window->CancelButton=yon_gtk_builder_get_widget(builder,"repoCancelButton"); - window->SaveButton=yon_gtk_builder_get_widget(builder,"repoSaveButton"); - window->BranchesTree=yon_gtk_builder_get_widget(builder,"curRepoEditTree"); - window->BranchCell=GTK_CELL_RENDERER(gtk_builder_get_object(builder,"branchTextCell")); - window->BranchesListStore=GTK_LIST_STORE(gtk_builder_get_object(builder,"curRepoEditList")); - gtk_widget_show(window->Window); - GtkTreeIter iter; - gtk_list_store_append(window->BranchesListStore,&iter); - dictionary *dict = yon_dictionary_create_with_data("",widgets); - dict = yon_dictionary_create_with_data_connected(dict,"",window); - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(window->BranchCell),"placeholder-text",val); - g_value_set_string(val,TYPE_BRANCH_NAME_LABEL); - g_object_set_property(G_OBJECT(window->BranchCell),"placeholder-text",val); - g_signal_connect(G_OBJECT(window->BranchCell),"edited",G_CALLBACK(on_branch_add),window); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_repo_add_new),dict); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + 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){ @@ -196,7 +252,7 @@ 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_file(glade_repo_path); + 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"); @@ -205,31 +261,39 @@ void on_repo_configure(GtkWidget *self, main_window *widgets){ 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_create_with_data("",widgets); - dict = yon_dictionary_create_with_data_connected(dict,"",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); - // GtkListStore *branches; - // gtk_tree_model_get(model,&iter,2,branches,-1); - // gtk_tree_view_set_model(GTK_TREE_VIEW(window->BranchesTree),GTK_TREE_MODEL(branches)); } 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; + 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_store_set(main_config.tree_store,&iter,1,name,-1); + gtk_tree_model_get(model,&iter,1,&oldname,4,&status,-1); + if (status==0) + gtk_tree_store_set(main_config.tree_store,&iter,1,name,6,oldname,7,1,-1); + else if (status==1) + gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1); } on_close_subwindow(self); } void on_repo_load_local(GtkWidget *self, main_window *widgets){ + GtkFileFilter *file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*db.tar.gz"); 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); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ @@ -248,60 +312,42 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP GtkTreeIter iter,parentIter; GdkPixbuf *icon = NULL; 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){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); } - else if (type==YON_REPO_LINE_BRANCH_TYPE){ - icon = NULL; - if (gtk_tree_model_iter_parent(model,&iter,&parentIter)){ - GtkTreeIter branch; - if (!gtk_tree_model_iter_parent(model,&branch,&iter)){ - gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&iter); - } else { - gtk_tree_store_append(main_config.tree_store,&iter,&branch); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&iter); - } - } else { - gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&iter); - } - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } - else if (type==YON_REPO_LINE_FILE_TYPE){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"network-server-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); - if (gtk_tree_model_iter_parent(model,&iter,&parentIter)){ - GtkTreeIter branch; - if (gtk_tree_model_iter_parent(model,&branch,&iter)){ + GtkTreeIter branch; + icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.follder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){ GtkTreeIter repo; - if (!gtk_tree_model_iter_parent(model,&repo,&branch)){ - gtk_tree_store_append(main_config.tree_store,&branch,&iter); - gtk_tree_store_set(main_config.tree_store,&branch,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&branch); - } + gtk_tree_store_append(main_config.tree_store,&iter,&branch); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + retIter = gtk_tree_iter_copy(&iter); + } else { gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); } yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } else yon_ubl_status_box_render(CHOOSE_BRANCH_PACK_LABEL,BACKGROUND_IMAGE_FAIL_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){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else { @@ -316,12 +362,15 @@ void yon_repo_remove_package(main_window *widgets){ 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)){ - GtkTreeIter parentparent; - if (gtk_tree_model_iter_parent(model,&parentparent,&iterparent)){ - gtk_tree_store_remove(main_config.tree_store,&iter); + // gtk_tree_store_remove(main_config.tree_store,&iter); + int status = 0; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,4,&status,-1); + if (status != 1){ + gtk_tree_store_set(main_config.tree_store,&iter,4,-1,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0,"com.ublinux.ubl-settings-repomanager.document-red-symbolic",-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); - } + }else yon_ubl_status_box_render(CHOOSE_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } } @@ -330,39 +379,35 @@ void yon_repo_remove(main_window *widgets){ 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){ - gtk_tree_store_remove(main_config.tree_store,&iter); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + gtk_tree_store_set(main_config.tree_store,&iter,4,-1,0,"com.ublinux.ubl-settings-repomanager.folder-red-symbolic",-1); }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); } -void yon_repo_configure(main_window *widgets){ - GtkBuilder *builder = gtk_builder_new_from_file(glade_repo_path); - 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)){ - GtkTreeIter parentparent; - if (gtk_tree_model_iter_parent(model,&parentparent,&iterparent)){ - 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_add_file(main_window *widgets){ + + GtkFileFilter *file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*.pkg.tar.zst"); + gtk_file_filter_set_name(file_filter,"*.pkg.tar.zst"); 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); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - while (1){ - char *ret = yon_char_divide_search(filename,"/",-1); - if (strcmp(ret,filename)==0) break; + FILE *file = popen(yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |grep -E \"Name|Version|Architecture\" |sed -e 's/ *//g'",NULL),"r"); + char *cur_string=g_malloc0(sizeof(char)*4096); + char *packname=NULL, *packver=NULL, *packarch=NULL; + while (fgets(cur_string,4096,file)){ + cur_string = yon_char_divide_search(cur_string,"\n",-1); + char *p = yon_char_divide_search(cur_string,":",-1); + if (strstr(p,"Name")) packname = yon_char_new(cur_string); + else if (strstr(p,"Version")) packver = yon_char_new(cur_string); + else if (strstr(p,"Architecture")) packarch = yon_char_new(cur_string); } - yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); + GtkTreeIter *iter = yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); + gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.document-green-symbolic",11,packname,12,packver,13,packarch,-1); + } on_close_subwindow(chooser); @@ -391,7 +436,7 @@ void config_init(){ main_window *setup_window(){ /* Widgets getting | Получение виджетов */ main_window *widgets = malloc(sizeof(main_window)); - GtkBuilder *builder = gtk_builder_new_from_file(glade_path); + 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"); @@ -417,8 +462,8 @@ main_window *setup_window(){ widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); - widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); - widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + // widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); + // widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem"); widgets->GeneralTabLabel = yon_gtk_builder_get_widget(builder,"GeneralTabLabel"); widgets->PublicationTabLabel = yon_gtk_builder_get_widget(builder,"PublicationTabLabel"); @@ -455,8 +500,18 @@ main_window *setup_window(){ widgets->ComponentsInfoLabel = yon_gtk_builder_get_widget(builder,"ComponentsInfoLabel"); 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,"SignatureInfoLabel"); + widgets->Finder = yon_gtk_builder_get_widget(builder,"RepoFinder"); + 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); // yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); + widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); // yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + + 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); @@ -484,9 +539,12 @@ main_window *setup_window(){ 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->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_all(widgets->Window); + gtk_widget_show(widgets->Window); return widgets; @@ -497,7 +555,8 @@ int main(int argc, char *argv[]){ textdomain (LocaleName); config_init(); int option_index=0; - int show_help=0; + int show_help=0; + int debug_mode=0; { struct option long_options[] = { {"help", 0, 0, 'h'}, @@ -510,10 +569,11 @@ int main(int argc, char *argv[]){ {"socket-id", 1, 0, 's'}, {"socket-ext-id", 1,0, 'e'}, {"socket-trd-id", 1,0, 't'}, + {"debug", 0,0, 'd'}, { NULL, 0, NULL, 0 } }; for (int i=0;iHeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); + yon_ubl_header_setup_resource(widgets->HeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); - if (yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel)) + yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); yon_ubl_status_box_render(TITLE_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); GtkCssProvider *css=gtk_css_provider_new(); - gtk_css_provider_load_from_path(css,CssPath,NULL); + 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_STYLE_PROVIDER(css), + -1); gtk_main(); } \ No newline at end of file diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 3e6fa30..2b44ec4 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -8,7 +8,9 @@ #include #include #include -#include "ubl-cmake.h" +#include +#include +#include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include #endif @@ -18,10 +20,11 @@ #define _(String) gettext(String) -#define glade_path "/usr/share/ubl-settings-repomanager/ui/ubl-settings-repomanager.glade" -#define glade_repo_path "/usr/share/ubl-settings-repomanager/ui/ubl-settings-repomanager-windows.glade" -#define banner_path "/usr/share/ubl-settings-repomanager/images/ubl-settings-repomanager-banner.png" -#define CssPath "/usr/share/ubl-settings-repomanager/css/ubl-settings-repomanager.css" +#define glade_path "/com/ublinux/ui/ubl-settings-repomanager.glade" +#define glade_repo_path "/com/ublinux/ui/ubl-settings-repomanager-windows.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("/home/",yon_ubl_root_user_get(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-repomanager" @@ -113,6 +116,7 @@ typedef struct { GtkWidget *SignatureLabel; GtkWidget *SignatureInfoLabel; GtkWidget *Finder; + GtkWidget *SaveButton; } main_window; typedef struct { @@ -122,8 +126,11 @@ typedef struct { GtkWidget *CancelButton; GtkWidget *SaveButton; GtkCellRenderer *BranchCell; + GtkWidget *repoChooseFolderButton; GtkListStore *BranchesListStore; + GtkWidget *PathLabel; + char *path; } repo_create_window; typedef struct { diff --git a/source/ubl-strings.h b/source/ubl-strings.h index f32e589..f516e5f 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -3,13 +3,16 @@ #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") @@ -23,7 +26,14 @@ #define PROJECT_HOME_LABEL _("Project Home Page") #define NOTHING_CHOSEN_LABEL _("Nothing were chosen") +#define GLOBAL_LOAD_SUCCESS_LABEL _("Global configuration loading succseeded.") +#define LOCAL_LOAD_SUCCESS_LABEL _("Local configuration loading succseeded.") +#define LOAD_FAILED_LABEL _("Config loading failed") +#define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.") +#define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.") +#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.") +#define SAVE_FAILED_LABEL #define GLOBAL_LOAD_SUCCESS _("Global configuration loading succseeded.") #define LOCAL_LOAD_SUCCESS _("Local configuration loading succseeded.") @@ -66,4 +76,5 @@ #define NAME_LABEL _("Name:") #define BRANCHES_LABEL _("Branches:") #define TYPE_BRANCH_NAME_LABEL _("< Type branch name >") -#define EMPTY_NAME_LABEL _("Name must be filled!") \ No newline at end of file +#define EMPTY_NAME_LABEL _("Name must be filled!") +#define CHOOSE_PATH_LABEL _("Choose path for new repository") \ No newline at end of file diff --git a/source/ubl-utils.c b/source/ubl-utils.c index ec125cf..44d839c 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -2,11 +2,13 @@ // dictionary functions -/**[EN] - * yon_dictionary_create_empty(): +/**yon_dictionary_create_empty(): + * [EN] * Creates and returns empty dictionary + * [RU] + * Создаёт и возвращает пустой словарь. */ -dictionary *yon_dictionary_create_empty() +dictionary *yon_dictionary_new() { dictionary *dict = malloc(sizeof(dictionary)); dict->data = NULL; @@ -18,34 +20,129 @@ dictionary *yon_dictionary_create_empty() 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; +} + +/**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; +} + +/** 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; +} + +/**int yon_dictionary_empty(dictionary *dict) + * [EN] + * + * [RU] + * Очищает элемент словаря [dict] от данных +*/ +int yon_dictionary_empty(dictionary *dict){ + dict->data=NULL; + dict->data_type=DICTIONARY_OTHER_TYPE; +} + +/**yon_dictionary_switch_to_last(dictionary **dict) + * [EN] + * + * [RU] + * Переключает словарь [dict] на последний элемент. +*/ void yon_dictionary_switch_to_last(dictionary **dict) { - if ((*dict)->next != NULL) - for ((*dict) = (*dict)->first; (*dict)->next != NULL; (*dict) = (*dict)->next) - { - } + dictionary *dct=NULL, *dact=*dict; + for_dictionaries(dct,dact); } -dictionary *yon_dictionary_create_conneced(dictionary *targetdict) +/**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_create_empty(); + 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) { - dictionary *dct = NULL; - for (dct = dict->first; dct->next != NULL; dct = dct->next) - { - } - return dct; + if (dict->next){ + dictionary *dct = NULL; + for_dictionaries(dct,dict); + return dct; + } else return dict; } -dictionary *yon_dictionary_switch_places(dictionary *dict, int aim) +/**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) { @@ -146,6 +243,13 @@ dictionary *yon_dictionary_switch_places(dictionary *dict, int aim) } } +/**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) @@ -154,6 +258,12 @@ void yon_dictionary_make_first(dictionary *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; @@ -172,9 +282,15 @@ void yon_dictionary_make_nth(dictionary *dict, int nth) dct->prev = dict; } -dictionary *yon_dictionary_create_with_data(char *key, void *data) +/**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_create_empty(); + dictionary *dct = yon_dictionary_new(); dct->key = yon_char_new(key); dct->data = data; dct->data_type = DICTIONARY_OTHER_TYPE; @@ -199,15 +315,28 @@ void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipul return NULL; } -dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data) +/**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_create_conneced(dict); + 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); @@ -217,7 +346,14 @@ dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect) return toconnect; } -dictionary *yon_dictionary_find(dictionary **dict, char *key) +/**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) @@ -231,6 +367,12 @@ dictionary *yon_dictionary_find(dictionary **dict, char *key) return NULL; } +/**yon_dictionary_rip(dictionary *dict) + * [EN] + * + * [RU] + * Вырезает элемент из словаря и возвращает вырезанный элемент. +*/ dictionary *yon_dictionary_rip(dictionary *dict) { if (!dict->next&&!dict->prev) return NULL; @@ -266,6 +408,12 @@ dictionary *yon_dictionary_rip(dictionary *dict) } } +/**yon_dictionary_get_nth(dictionary *dict, int place) + * [EN] + * + * [RU] + * Возвращает [place]-й элемент словаря [dict] +*/ dictionary *yon_dictionary_get_nth(dictionary *dict, int place) { if (dict){ @@ -289,7 +437,7 @@ dictionary *yon_dictionary_get_nth(dictionary *dict, int place) * * creates new char string by combining two char strings. */ -char *yon_char_get_augumented(char *source, char *append) +char *yon_char_append(char *source, char *append) { if (source && append) { @@ -321,8 +469,12 @@ char *yon_char_new(char *chr) return NULL; } -// char *yon_char_unite(char *source, ...) - +/**yon_char_unite(char *source, ...) + * [En] + * + * [RU] + * Объединяет строку [source] со всеми строками, написанными в [...] +*/ char *yon_char_unite(char *source, ...){ va_list arglist; char *new_char=NULL; @@ -331,15 +483,15 @@ char *yon_char_unite(char *source, ...){ va_start(arglist,source); unite_char = va_arg(arglist,char*); while(unite_char){ - new_char = yon_char_get_augumented(new_char,unite_char); + new_char = yon_char_append(new_char,unite_char); unite_char = va_arg(arglist,char*); } va_end(arglist); return new_char; } -/**[EN] - * +/**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) @@ -350,8 +502,9 @@ char *yon_cut(char *source, int size, int startpos) memcpy(cut, source + startpos, size); return cut; } -/**[EN] - * + +/**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. @@ -369,6 +522,12 @@ char *yon_char_divide(char *source, int dividepos) 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; @@ -383,7 +542,8 @@ int yon_char_find_count(char *source, char *find){ return i; } -/**[EN] +/**yon_char_divide_search(char *source, char *dividepos, int delete_divider) + * [EN] * char *yon_char_divide_search(char *source, char *dividepos, int delete_divider) * searches string [dividepos] in [source] string and divides it, * returning left part of divided string and @@ -415,7 +575,8 @@ char *yon_char_divide_search(char *source, char *dividepos, int delete_divider) } } -/**[EN] +/**yon_char_from_int(int int_to_convert) + * [EN] * char *yon_char_from_int(int int_to_convert) * converts int to char*. * @@ -427,15 +588,21 @@ char *yon_char_from_int(int int_to_convert) { int i = 1; float convert_check = (float)int_to_convert; - for (i = 1; convert_check > 10; i++) + for (i = 1; convert_check >= 10; i++) { convert_check = convert_check / 10; } - char *ch = malloc(i * sizeof(char) + 1); + 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){ char *final=NULL; char *temp=NULL; @@ -444,15 +611,15 @@ char *yon_char_replace(char *source, char *find, char*replace){ 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_get_augumented(temp,replace); - source=yon_char_get_augumented(temp,final+1); + temp=yon_char_append(temp,replace); + source=yon_char_append(temp,final+1); } return source; } } -/**[EN] - * char **yon_char_parse(char *parameters, int *size, char *divider) +/**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 @@ -478,37 +645,59 @@ char **yon_char_parse(char *parameters, int *size, char *divider){ } -char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete){ +/**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)-2); - int sz=0; - for (int i=0;i<*size-2;i++){ - if (i!=item_to_delete){ + 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]); - sz++; } - + else if (flag == 1 && i!=item_to_delete) { + new_char_parsed[i-1]=yon_char_new(char_string[i]); + } } - *size=sz; + (*size)=(*size)-1; return new_char_parsed; } -/**[EN] - * +/**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); + char *path = yon_char_append(DesktopPath, de->d_name); file = fopen(path, "r"); if (strlen(de->d_name) > 9) { @@ -664,15 +919,197 @@ apps *yon_apps_get_by_name(apps *applist, char *name, int size) return NULL; }; -config_str yon_config_load(char *command, int *str_len) -{ +//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[1000]; - memset(str, 0, 1000); - while (fgets(str, 1000, output)) + char str[4096]; + memset(str, 0, 4096); + while (fgets(str, 4096, output)) { if (strcmp(str, "") != 0) { @@ -680,7 +1117,7 @@ config_str yon_config_load(char *command, int *str_len) // printf("%s\n", str); output_strings[i] = NULL; output_strings[i] = yon_char_new(str); - memset(str, 0, 1000); + memset(str, 0, 4096); i++; } } @@ -693,22 +1130,54 @@ config_str yon_config_load(char *command, int *str_len) } } -/**[EN] - * int yon_config_save(char *command) +/**int yon_config_save(char *command) + * [EN] * Saves config with [command] * [RU] + * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: + * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" */ -int yon_config_save(char *command) -{ - FILE *output = popen(command, "r"); - return 1; +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; } -/**[EN] - * char *yon_config_get_parameter(config parameters, int size, char *param) - * Gets parameter from parameter list; +/**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) { @@ -735,66 +1204,34 @@ char *yon_config_get_parameter(config_str parameters, int size, char *param) return NULL; } -/**[EN] - * Parses, modifies and connects string to use it as one of arguments, - * sended to ubconfig. - * - * [RU] - */ -char *yon_config_make_save_parameter_with_multiple_arguments(char *parameter_string, char *config_parameter, char *divider){ - char *final=""; - int done=0; - char *cur=yon_char_new(parameter_string); - yon_char_divide_search(cur,"=",1); - char *cur_param=NULL; - while (cur_param=yon_char_divide_search(cur,",",1)){ - if (done==0){ - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"="), yon_char_get_augumented(cur_param,", "))); - done=1; - } else { - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"+="), yon_char_get_augumented(cur_param,", "))); - } - } - if (cur&&strcmp(cur,"")!=0) - if (done==0) - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"="), yon_char_get_augumented(cur,", "))); - else - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"+="), yon_char_get_augumented(cur,", "))); - return final; -} -// terminal-using functions -int yon_launch_app(char *name) -{ - char *path = name; - thread_output *thread = malloc(sizeof(thread_output)); - thread->command = path; - thread->exitcode = malloc(sizeof(int)); - pthread_t thread_id; - pthread_create(&thread_id, NULL, (void *)yon_launch, thread); - return *thread->exitcode; -}; +// 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_get_augumented("/usr/bin/", name); - path = yon_char_get_augumented(path, " "); - path = yon_char_get_augumented(path, args); + char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); pthread_t thread_id; - thread_output *thread = malloc(sizeof(thread_output)); - thread->command = path; - thread->exitcode = malloc(sizeof(int)); - pthread_create(&thread_id, NULL, (void *)yon_launch, thread); - return *thread->exitcode; + char *command = NULL; + command = path; + pthread_create(&thread_id, NULL, (void *)yon_launch, command); }; -int yon_launch(thread_output *thread) +/**yon_launch(char *command) + * [EN] + * Execute command [command] + * [RU] + * Выполнить команду [command] +*/ +void yon_launch(char *command) { - int a = 0; - a = system(thread->command); - *thread->exitcode = a; - return *thread->exitcode; + system(command); } // Gtk functions @@ -807,6 +1244,13 @@ 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] @@ -819,27 +1263,37 @@ static render_data render; * после завершения работы терминала вызывается функция [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); - g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(on_terminal_done), widgets); + 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, - install_command, + commands, NULL, 0, NULL, NULL, NULL, -1, NULL, - NULL, - NULL); + child_ready, + install_command); vte_pty_spawn_async(pty, NULL, - install_command, + commands, NULL, 0, NULL, NULL, @@ -848,15 +1302,217 @@ void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, voi NULL, NULL, NULL); - vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100); + 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(widgets->TerminalRevealer); + 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 -int yon_gtk_combo_box_fill(GtkWidget *combo, config_str parameters,int size){ + // Window config functions + + #define check_window_config_setup if(__yon_window_config_target_window) + + struct { + int x; + int y; + int width; + int height; + int fullscreen; + } __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); + 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; + config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); + char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); + 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); + 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); + } + +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;ifirst; dct != NULL; dct = dct->next) - { - gtk_box_pack_start(GTK_BOX(destination), (GtkWidget *)dct->data, expand, fill, padding); +/**yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...) + * [EN] + * + * [RU] + * Добвляет [destination] все виджеты, прописанные после [padding]. Добавление происходит с начала контейнера. + * [expand] - расширяемость выделенного для виджетов места + * [fill] - заполнять ли виджетом всё ему выделенное место + * [padding] - отступ од других элементов +*/ +int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...){ + va_list args; + va_start(args,padding); + GtkWidget *widget = va_arg(args,GtkWidget*); + while (widget){ + gtk_box_pack_start(GTK_BOX(destination), widget, expand, fill, padding); } + va_end(args); return 1; - }else return 0; } -int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding) -{ - for (dictionary *dct = dict->first; dct != NULL; dct = dct->next) - { - gtk_box_pack_end(GTK_BOX(destination), (GtkWidget *)dct->data, expand, fill, padding); - } +/**yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...) + * [EN] + * + * [RU] + * Добвляет в [destination] все виджеты, прописанные после [padding]. Добавление происходит с конца контейнера. + * [expand] - расширяемость выделенного для виджетов места + * [fill] - заполнять ли виджетом всё ему выделенное место + * [padding] - отступ од других элементов +*/ +int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...){ + va_list args; + va_start(args,padding); + GtkWidget *widget = va_arg(args,GtkWidget*); + while (widget){ + gtk_box_pack_end(GTK_BOX(destination), widget, expand, fill, padding); + } + va_end(args); return 1; } + void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) { gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); gtk_image_set_from_file(GTK_IMAGE(Image), image_path); } +void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) +{ + gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); + gtk_image_set_from_resource(GTK_IMAGE(Image), image_path); +} + int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label) { if(icon&&box&&label){ @@ -915,9 +1605,6 @@ int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label) } else return 0; } -/** - * -*/ void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) { render_data data = render; @@ -944,7 +1631,6 @@ void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) 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); } diff --git a/source/ubl-utils.h b/source/ubl-utils.h index 5b7eb82..e3eaa0f 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -7,11 +7,13 @@ #include #include #include +#include +#include #include #include #include -#include "ubl-cmake.h" +#include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include #endif @@ -22,32 +24,19 @@ #define new(type) malloc(sizeof(type)) #define new_arr(type,size) malloc(sizeof(type)*size) -#define yon_ubl_set_config_save_data_pointer(command) config_commands.config_save_data = command - -#define yon_ubl_load_global_config(command, size_pointer) yon_config_load(command, size_pointer) -#define yon_ubl_load_local_config(command, size_pointer) yon_config_load(command, size_pointer) -#define yon_ubl_save_global_config(command) yon_config_save(command) -#define yon_ubl_save_local_config(command) yon_config_save(command) - -#define for_liststore_each(liststore) GtkTreeIter iter;\ -for (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore),&iter);gtk_list_store_iter_is_valid(liststore,&iter);gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore),&iter)) typedef enum { #ifdef __GTK_H__ DICTIONARY_GTK_WIDGETS_TYPE, #endif - DICTIONARY_OTHER_TYPE + DICTIONARY_OTHER_TYPE=0, + DICTIONARY_CHAR_TYPE, + DICTIONARY_INT_TYPE, + DICTIONARY_BOOL_TYPE, } DICT_TYPE; -typedef struct -{ - char *command; - int *exitcode; -} thread_output; - - typedef struct dictionary { char *key; @@ -56,6 +45,7 @@ typedef struct dictionary struct dictionary *prev; struct dictionary *first; DICT_TYPE data_type; + int flag1; } dictionary; typedef struct apps @@ -70,6 +60,15 @@ typedef struct apps } 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) @@ -83,28 +82,36 @@ typedef char** config_str; * [type] - тип данных, хранящихся в словаре [dictionary]. */ #define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data) -#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_create_with_data(key,data); \ - else dict=yon_dictionary_create_with_data_connected(dict,key,data);} -dictionary *yon_dictionary_create_empty(); +/**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_create_conneced(dictionary *targetdict); +dictionary *yon_dictionary_append(dictionary *targetdict); dictionary *yon_dictionary_get_last(dictionary *dict); -dictionary *yon_dictionary_switch_places(dictionary *dict, int aim); +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_create_with_data(char *key, void *data); +dictionary *yon_dictionary_new_with_data(char *key, void *data); -dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, 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_find(dictionary **dict, char *key); +dictionary *yon_dictionary_get(dictionary **dict, char *key); dictionary *yon_dictionary_rip(dictionary *dict); @@ -114,7 +121,7 @@ void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(vo // char functions -char *yon_char_get_augumented(char *source, char *append); +char *yon_char_append(char *source, char *append); char *yon_char_new(char *chr); @@ -132,7 +139,7 @@ char *yon_char_replace(char *source, char *find, char*replace); char **yon_char_parse(char *parameters, int *size, char *divider); -char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete); +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); @@ -140,10 +147,20 @@ 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 (config_str old, int *old_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(); // 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); @@ -152,31 +169,49 @@ 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(char *command); +int yon_config_save_registered(char *command); char *yon_config_get_parameter(config_str parameters, int size, char *param); -char *yon_config_make_save_parameter_with_multiple_arguments(char *parameter_string, char *config_parameter, char *divider); +int yon_config_load_register(char *command); -// terminal-using functions +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_launch_app(char *name); +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); -int yon_launch(thread_output *thread); +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 +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]. @@ -193,11 +228,9 @@ typedef struct GtkListStore *List; } expander_icon_view; -// GtkWidget *yon_gtk_app_chooser_apps_create(); - -// dictionary *yon_gtk_app_chooser_create(); +void yon_window_config_setup(GtkWindow *window); -// expander_icon_view yon_gtk_icon_view_expander_create(GtkWidget *pack, ...); +int yon_window_config_load(char *path); int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); @@ -205,8 +238,9 @@ 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(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding); -int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding); +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, ...); @@ -290,10 +324,13 @@ void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type); * [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 diff --git a/ubl-settings-repomanager b/ubl-settings-repomanager deleted file mode 100755 index 94d87e0..0000000 Binary files a/ubl-settings-repomanager and /dev/null differ diff --git a/ubl-settings-repomanager-windows.glade b/ubl-settings-repomanager-windows.glade index b94c777..98d4bbd 100644 --- a/ubl-settings-repomanager-windows.glade +++ b/ubl-settings-repomanager-windows.glade @@ -87,6 +87,46 @@ 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 @@ -94,7 +134,6 @@ 5 - True False Branches: 0 @@ -109,7 +148,7 @@ False True - 1 + 2 @@ -129,7 +168,6 @@ False - True True curRepoEditList False @@ -154,7 +192,6 @@ @@ -342,7 +379,6 @@ 5 - True False Branches: 0 @@ -377,14 +413,15 @@ False - True True curRepoEditList False 0 False - + + none + diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css index 8687d4a..547dcda 100644 --- a/ubl-settings-repomanager.css +++ b/ubl-settings-repomanager.css @@ -48,17 +48,23 @@ background:transparent; } .menuitemtop *{ margin:2px 2px 0 2px; - padding: 5px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 5px 0px 3px 5px; */ border:transparent; } .menuitemmiddle *{ margin:0 2px 0 2px; - padding: 3px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 3px 5px; */ border:transparent; } .menuitembottom *{ margin:0 2px 2px 2px; - padding: 3px 10px 5px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 5px 5px; */ } .menuitemtop:hover { background:@theme_bg_color; @@ -83,19 +89,25 @@ background:transparent; } .menuitemtop:hover* { margin:2px 2px 0 2px; - padding: 5px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 5px 0 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } .menuitemmiddle:hover* { - margin:0 2px 0 2px; - padding: 3px 10px 3px 5px; + margin:0 2px 0px 2px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } .menuitembottom:hover* { margin:0 2px 2px 2px; - padding: 3px 10px 5px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 5px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index f680b6c..8043960 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -193,11 +193,33 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + + + + + + + + + + + + + + + + + + + + + + + @@ -210,11 +232,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False document-new-symbolic - - True - False - document-edit-symbolic - True False @@ -238,28 +255,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False - preferences-other-symbolic + system-run-symbolic True False user-trash-symbolic - - True - False - system-shutdown-symbolic - - - True - False - document-send-symbolic - - - True - False - emblem-synchronizing-symbolic - True False @@ -491,28 +493,6 @@ translated and supported by community. False False False - - - True - False - Documentation - True - - - - - - True - False - About - - - True @@ -704,20 +684,148 @@ translated and supported by community. - + True - False - 5 + True + 395 + True True False - vertical + 5 + 5 5 - + True False + vertical + 5 + + + True + False + + + False + True + 0 + + + + + True + True + True + Create repository + image1 + + + + False + True + 1 + + + + + True + True + True + Open existing repository + image2 + + + + False + True + 2 + + + + + True + True + True + Configure repository + image3 + + + + False + True + 3 + + + + + True + True + True + Delete repository + image4 + + + + False + True + 4 + + + + + True + False + + + False + True + 5 + + + + + True + True + True + Add package + image11 + + + + False + True + 11 + + + + + True + True + True + Remove package + image12 + + + + False + True + 12 + + False @@ -726,263 +834,584 @@ translated and supported by community. - + True - True - True - Create repository - image1 + 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 + + + + + + + + + + + + + + + - False + True True 1 + + + False + True + + + + + True + True + 5 + 5 + False - - True - True - True - Open existing repository - image2 - - - - False - True - 2 - - - - + True - True - True - Configure repository - image3 - + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + 5 + + + True + False + 20 + + + True + False + Code name: + 0 + + + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 0 + + + + + False + 20 + + + True + False + Branch: + 0 + + + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + 20 + + + True + False + Version: + 0 + + + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + 20 + + + True + False + Architecture: + 0 + + + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 3 + + + + + False + 20 + + + True + False + Components: + 0 + + + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 4 + + + + + False + 20 + + + True + False + Signature: + 0 + + + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 5 + + - - False - True - 3 - - - + + True - True - True - Delete repository - image4 - + False + General - False - True - 4 + False - + 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 + + - False - True - 5 + 1 - - + + True - True - True - Add/Remove repository from -local package sources - image6 - + False + Publication - False - True - 6 - - - - - True - True - True - Enable/disable repository publish - image5 - - - - False - True - 7 - - - - - True - False - - - False - True - 8 - - - - - True - True - True - Check dependences - image7 - - - - False - True - 9 - - - - - True - True - True - Sign ripository - image10 - - - - False - True - 10 - - - - - True - True - True - Add package - image11 - - - - False - True - 11 - - - - - True - True - True - Remove package - image12 - - - - False - True - 12 + 1 + False - False - True - 0 - - - - - True - False - 0 - in - - - True - False - 5 - 5 - 5 - 5 - - - True - True - RepoStore - False - treeviewcolumn2 - - - - - - column - - - - - column - - - - 0 - - - - - - 1 - - - - - - - - - - - - - - True - True - 1 + True + True @@ -999,499 +1428,6 @@ local package sources 0 - - - True - True - - - True - False - 5 - 5 - 5 - 5 - vertical - 5 - - - True - False - 20 - - - True - False - Code name: - 0 - - - - - - False - True - 0 - - - - - True - False - extend - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 20 - - - True - False - Branch: - 0 - - - - - - False - True - 0 - - - - - True - False - stable - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 20 - - - True - False - Version: - 0 - - - - - - False - True - 0 - - - - - True - False - 2204 - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - 20 - - - True - False - Architecture: - 0 - - - - - - False - True - 0 - - - - - True - False - amd64 - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - 20 - - - True - False - Components: - 0 - - - - - - False - True - 0 - - - - - True - False - main contrib non-free - - - False - True - 1 - - - - - False - True - 4 - - - - - True - False - 20 - - - True - False - Signature: - 0 - - - - - - False - True - 0 - - - - - True - False - signed - - - False - True - 1 - - - - - False - True - 5 - - - - - - - True - False - General - - - False - - - - - True - False - 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 - 192.168.1.110 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - 5 - - - True - False - Port: - 0 - - - False - True - 0 - - - - - True - True - 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 - - - - - True - True - 1 - - True @@ -1555,7 +1491,6 @@ local package sources False - True True False True @@ -1617,9 +1552,23 @@ local package sources False True + end 1 + + + Save + True + True + True + + + False + True + 2 + + end @@ -1628,7 +1577,6 @@ local package sources - True False @@ -1685,28 +1633,4 @@ local package sources - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot index d9e7cb6..96993f6 100644 --- a/ubl-settings-repomanager.pot +++ b/ubl-settings-repomanager.pot @@ -73,214 +73,230 @@ msgstr "" msgid "Repository management and configuring" msgstr "" -#: source/ubl-strings.h:7 +#: source/ubl-strings.h:6 +msgid "Operation succeeded" +msgstr "" + +#: source/ubl-strings.h:9 msgid "About" msgstr "" -#: source/ubl-strings.h:8 +#: source/ubl-strings.h:10 msgid "Documentation" msgstr "" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:12 msgid "Save to local configuration" msgstr "" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:13 msgid "Save to global configuration" msgstr "" -#: source/ubl-strings.h:11 +#: source/ubl-strings.h:14 msgid "Save configuration" msgstr "" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:15 msgid "Save" msgstr "" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:17 msgid "Load local configuration" msgstr "" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:18 msgid "Load global configuration" msgstr "" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:19 msgid "Load" msgstr "" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:21 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:23 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:24 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:25 msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:26 msgid "Open documentation" msgstr "" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:27 msgid "Project Home Page" msgstr "" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:28 msgid "Nothing were chosen" msgstr "" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:30 source/ubl-strings.h:38 msgid "Global configuration loading succseeded." msgstr "" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:31 source/ubl-strings.h:39 msgid "Local configuration loading succseeded." msgstr "" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 +msgid "Config loading failed" +msgstr "" + +#: source/ubl-strings.h:34 source/ubl-strings.h:41 msgid "Local and global configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:35 source/ubl-strings.h:42 msgid "Global configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:36 source/ubl-strings.h:43 msgid "Local configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:45 msgid "General" msgstr "" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:46 msgid "Publication" msgstr "" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:47 msgid "Trusted repository" msgstr "" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:48 msgid "Server type:" msgstr "" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:49 msgid "IP adress:" msgstr "" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:50 msgid "Port:" msgstr "" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:51 msgid "Publish" msgstr "" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:52 msgid "Code name:" msgstr "" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:53 msgid "Branch:" msgstr "" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:54 msgid "Architecture:" msgstr "" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:55 msgid "Components:" msgstr "" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:56 msgid "Signature:" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:58 msgid "Create repository" msgstr "" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:59 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:60 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:61 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:62 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:63 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:64 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:65 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:66 msgid "Add package" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:67 msgid "Remove package" msgstr "" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:68 msgid "Open" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:70 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:72 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:73 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:74 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:75 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:77 msgid "Name:" msgstr "" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:78 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:79 msgid "< Type branch name >" msgstr "" + +#: source/ubl-strings.h:80 +msgid "Name must be filled!" +msgstr "" + +#: source/ubl-strings.h:81 +msgid "Choose path for new repository" +msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index 579cc0f..9143c52 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -74,51 +74,56 @@ msgstr "Менеджер репозиториев" msgid "Repository management and configuring" msgstr "Настройка параметров и управление репозиториями системы" -#: source/ubl-strings.h:7 +#: source/ubl-strings.h:6 +#, fuzzy +msgid "Operation succeeded" +msgstr "Операция завершена" + +#: source/ubl-strings.h:9 msgid "About" msgstr "О программе" -#: source/ubl-strings.h:8 +#: source/ubl-strings.h:10 msgid "Documentation" msgstr "Справка" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:12 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:13 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/ubl-strings.h:11 +#: source/ubl-strings.h:14 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:15 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:17 msgid "Load local configuration" msgstr "Загрузить локальную конфигуруцию" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:18 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:19 msgid "Load" msgstr "Загрузить" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:21 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:23 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:24 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -126,107 +131,111 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:25 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:26 msgid "Open documentation" msgstr "Прочитать справку" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:27 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:28 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:30 source/ubl-strings.h:38 msgid "Global configuration loading succseeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:31 source/ubl-strings.h:39 msgid "Local configuration loading succseeded." msgstr "Успешно загружена локальная конфигурация" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 +msgid "Config loading failed" +msgstr "" + +#: source/ubl-strings.h:34 source/ubl-strings.h:41 msgid "Local and global configuration saving succseeded." msgstr "Успешно записаны локальная и глобальная конфигурация" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:35 source/ubl-strings.h:42 msgid "Global configuration saving succseeded." msgstr "Успешно записана глобальная конфигурация" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:36 source/ubl-strings.h:43 msgid "Local configuration saving succseeded." msgstr "Успешно записана локальная конфигурация" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:45 msgid "General" msgstr "Общие" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:46 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:47 msgid "Trusted repository" msgstr "Доверенный репозиторий" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:48 msgid "Server type:" msgstr "Тип сервера:" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:49 msgid "IP adress:" msgstr "IP-адрес:" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:50 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:51 msgid "Publish" msgstr "Опубликовать" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:52 msgid "Code name:" msgstr "Кодовое имя:" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:53 msgid "Branch:" msgstr "Ветка:" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:54 msgid "Architecture:" msgstr "Архитектура:" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:55 msgid "Components:" msgstr "Компоненты" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:56 msgid "Signature:" msgstr "Подпись" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:58 msgid "Create repository" msgstr "Создать репозиторий" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:59 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:60 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:61 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:62 msgid "" "Add/Remove repository from\n" "local package sources" @@ -234,59 +243,68 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:63 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:64 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:65 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:66 msgid "Add package" msgstr "Добавить пакет" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:67 msgid "Remove package" msgstr "Удалить пакет" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:68 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:70 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:72 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:73 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:74 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:75 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:77 msgid "Name:" msgstr "Название:" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:78 #, fuzzy msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:79 msgid "< Type branch name >" msgstr "< Введите название ветки >" + +#: source/ubl-strings.h:80 +msgid "Name must be filled!" +msgstr "Введите название!" + +#: source/ubl-strings.h:81 +#, fuzzy +msgid "Choose path for new repository" +msgstr "Выбрать расположение нового репозитория"