From 1bd32feb76aabef2720e14a88942bf3af817d079 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 18 Jul 2025 17:59:44 +0600 Subject: [PATCH] Added bootload slide menu --- gresource.xml | 3 + source/ubinstall-gtk-bootloader.c | 208 ++++++++++++++++++++++++++++++ ubinstall-gtk-menu-item.glade | 73 +++++++++++ ubinstall-gtk-menu.glade | 203 +++++++++++++++++++++++++++++ 4 files changed, 487 insertions(+) create mode 100644 ubinstall-gtk-menu-item.glade create mode 100644 ubinstall-gtk-menu.glade diff --git a/gresource.xml b/gresource.xml index 7c8474c..73c5f37 100644 --- a/gresource.xml +++ b/gresource.xml @@ -8,6 +8,9 @@ ubinstall-gtk-documentation.glade ubinstall-gtk-log-view.glade ubinstall-gtk-warning.glade + ubinstall-gtk-user.glade + ubinstall-gtk-menu.glade + ubinstall-gtk-menu-item.glade ubinstall-gtk.css diff --git a/source/ubinstall-gtk-bootloader.c b/source/ubinstall-gtk-bootloader.c index 367d126..c412aad 100644 --- a/source/ubinstall-gtk-bootloader.c +++ b/source/ubinstall-gtk-bootloader.c @@ -24,4 +24,212 @@ int yon_bootloader_save(main_window *widgets){ // yon_config_remove_by_key(); } return 1; +} +void on_menu_chosen(GtkWidget *, yon_menu_item *item){ + if (strcmp(item->target,DEFAULT_MENU_ITEM_LABEL)){ + gtk_entry_set_text(GTK_ENTRY(item->widgets->BootloadDefaultOSEntry),item->target); + } else { + gtk_entry_set_text(GTK_ENTRY(item->widgets->BootloadDefaultOSEntry),DEFAULT_MENU_ITEM_LABEL); + } + GdkDisplay *display = gdk_display_get_default(); + GdkSeat *seat = gdk_display_get_default_seat(display); + if (item->window->seat_grab) + gdk_seat_ungrab(seat); + else + gtk_grab_remove(item->window->MenuWindow); + gtk_widget_destroy(item->window->MenuWindow); + +} + +void on_submenu_open(GtkWidget *,yon_menu_item *item){ + yon_menu_window *window = item->window; + + dictionary *dact = NULL; + for_dictionaries(dact,item->children){ + yon_menu_item *child = yon_dictionary_get_data(dact,yon_menu_item*); + gtk_widget_hide(child->NextIconButton); + gtk_list_box_insert(GTK_LIST_BOX(window->ChildrenListBox),child->MenuItemBox,-1); + g_signal_connect(G_OBJECT(child->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),dact->data); + + } + gtk_revealer_set_reveal_child(GTK_REVEALER(item->window->ItemsRevealer),0); + gtk_revealer_set_reveal_child(GTK_REVEALER(item->window->ChildrenRevealer),1); + gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ChildrenRevealer)),window->ChildrenRevealer,1,1,0,GTK_PACK_START); + gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ItemsRevealer)),window->ItemsRevealer,0,0,0,GTK_PACK_START); + yon_on_revealer_switched(window); + g_signal_connect(G_OBJECT(window->MenuWindow),"size-allocate",G_CALLBACK(on_menu_window_size_reallocated),window); + +} + +yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets){ + yon_menu_window *window = yon_menu_window_new(); + gtk_window_set_transient_for(GTK_WINDOW(window->MenuWindow),GTK_WINDOW(widgets->MainWindow)); + { + yon_menu_item *item = yon_menu_item_new(); + item->widgets=widgets; + item->window=window; + item->children=NULL; + gtk_label_set_text(GTK_LABEL(item->MenuTextLabel),DEFAULT_MENU_ITEM_LABEL); + item->target=yon_char_new(DEFAULT_MENU_ITEM_LABEL); + gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemBox,-1); + yon_dictionary_add_or_create_if_exists_with_data(window->menu_items,DEFAULT_MENU_ITEM_LABEL,item); + gtk_widget_show(item->MenuItemBox); + gtk_widget_hide(item->NextIconButton); + g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),item); + } + int size; + config_str parsed = yon_config_load(get_menus_entry_command,&size); + for (int i=0;i"); + dictionary * cur_item = NULL; + if (param_size==2&&(cur_item=yon_dictionary_get(&window->menu_items,parameter[0]))){ + yon_menu_item *item = (yon_menu_item*)cur_item->data; + yon_menu_item *item_child = yon_menu_item_new(); + gtk_widget_hide(item_child->NextIconButton); + gtk_label_set_text(GTK_LABEL(item_child->MenuTextLabel),parameter[1]); + item_child->target=yon_char_new(parsed[i]); + gtk_widget_show(item_child->MenuItemBox); + yon_dictionary_add_or_create_if_exists_with_data(item->children,parameter[1],item_child); + item_child->widgets=widgets; + item_child->window=window; + + } else { + yon_menu_item *item = yon_menu_item_new(); + item->widgets=widgets; + item->window=window; + gtk_label_set_text(GTK_LABEL(item->MenuTextLabel),parameter[0]); + item->target=yon_char_new(parsed[i]); + gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemBox,-1); + yon_dictionary_add_or_create_if_exists_with_data(window->menu_items,parameter[0],item); + gtk_widget_show(item->MenuItemBox); + if (param_size==2){ + yon_menu_item *item_child = yon_menu_item_new(); + gtk_widget_show(item->NextIconButton); + gtk_widget_hide(item_child->NextIconButton); + gtk_label_set_text(GTK_LABEL(item_child->MenuTextLabel),parameter[1]); + item_child->target=yon_char_new(parsed[i]); + gtk_widget_show(item_child->MenuItemBox); + item_child->widgets=widgets; + item_child->window=window; + g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_submenu_open),item); + yon_dictionary_add_or_create_if_exists_with_data(item->children,parameter[1],item_child); + } else { + gtk_widget_hide(item->NextIconButton); + g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),item); + } + } + + } + gtk_window_set_transient_for(GTK_WINDOW(window->MenuWindow), GTK_WINDOW(widgets->MainWindow)); + + int x,y,width; + gtk_widget_realize(window->MenuWindow); + gdk_window_get_position(gtk_widget_get_window(widgets->BootloadDefaulOSButton),&x,&y); + gtk_widget_translate_coordinates(widgets->BootloadDefaulOSButton,widgets->MainWindow,x,y,&window->button_pos_x,&window->button_pos_y); + gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,NULL); + GtkAllocation alloc; + gtk_widget_get_allocation(widgets->BootloadDefaulOSButton, &alloc); + gtk_window_get_position(GTK_WINDOW(widgets->MainWindow),&x,&y); + gtk_window_move(GTK_WINDOW(window->MenuWindow),window->button_pos_x-width,window->button_pos_y); + gtk_widget_show(window->MenuWindow); + GdkGrabStatus status = gdk_seat_grab(gdk_display_get_default_seat(gdk_display_get_default()),gtk_widget_get_window(window->MenuWindow),GDK_SEAT_CAPABILITY_POINTER,TRUE,NULL,NULL,NULL,NULL); + if (status != GDK_GRAB_SUCCESS) { + window->seat_grab=0; + gtk_grab_add(window->MenuWindow); + } else { + window->seat_grab=1; + } + return window; +} + +gboolean on_menu_clicked(GtkWidget *, GdkEventButton *event, yon_menu_window *window){ + int x,y,width,height; + gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,&height); + gtk_window_get_position(GTK_WINDOW(window->MenuWindow),&x,&y); + if (event->x_rooty_rootx_root>x+width||event->y_root>y+height){ + + GdkDisplay *display = gdk_display_get_default(); + GdkSeat *seat = gdk_display_get_default_seat(display); + if (window->seat_grab) + gdk_seat_ungrab(seat); + else + gtk_grab_remove(window->MenuWindow); + gtk_widget_destroy(window->MenuWindow); + } + return 1; + +} + +gboolean yon_on_revealer_switched (yon_menu_window *window){ + if (gtk_revealer_get_reveal_child(GTK_REVEALER(window->ItemsRevealer))){ + gtk_widget_hide(window->ChildrenRevealer); + gtk_widget_show(window->ItemsRevealer); + } else { + gtk_widget_hide(window->ItemsRevealer); + gtk_widget_show(window->ChildrenRevealer); + + } + return G_SOURCE_REMOVE; +} + +void on_children_clean(GtkWidget*, yon_menu_window *window){ + GList *list = gtk_container_get_children(GTK_CONTAINER(window->ChildrenListBox)); + list = g_list_last(list); + for (guint i=0;idata)); + g_object_ref(G_OBJECT(item->data)); + gtk_container_remove(GTK_CONTAINER(list->data),GTK_WIDGET(item->data)); + gtk_widget_destroy(GTK_WIDGET(list->data)); + g_list_free(item); + list=list->prev; + } + + gtk_revealer_set_reveal_child(GTK_REVEALER(window->ItemsRevealer),1); + gtk_revealer_set_reveal_child(GTK_REVEALER(window->ChildrenRevealer),0); + gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ItemsRevealer)),window->ItemsRevealer,1,1,0,GTK_PACK_START); + yon_on_revealer_switched(window); + g_signal_connect(G_OBJECT(window->MenuWindow),"size-allocate",G_CALLBACK(on_menu_window_size_reallocated),window); + gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ChildrenRevealer)),window->ChildrenRevealer,0,0,0,GTK_PACK_START); + +} + +void on_menu_window_size_reallocated(GtkWidget *self,GtkAllocation *,yon_menu_window *window){ + + + int x,y,width; + gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,NULL); + gtk_window_get_position(GTK_WINDOW(gtk_window_get_transient_for(GTK_WINDOW(window->MenuWindow))),&x,&y); + gtk_window_move(GTK_WINDOW(window->MenuWindow),window->button_pos_x-width,window->button_pos_y); + g_signal_handlers_disconnect_by_func(self,on_menu_window_size_reallocated,window); +} + + yon_menu_window *yon_menu_window_new(){ + yon_menu_window *window = new(yon_menu_window); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_menu_window); + window->MenuWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->ItemsRevealer = yon_gtk_builder_get_widget(builder,"ItemsRevealer"); + window->BackButton = yon_gtk_builder_get_widget(builder,"BackButton"); + window->ItemsListBox = yon_gtk_builder_get_widget(builder,"ItemsListBox"); + window->ChildrenRevealer = yon_gtk_builder_get_widget(builder,"ChildrenRevealer"); + window->ChildrenListBox = yon_gtk_builder_get_widget(builder,"ChildrenListBox"); + + window->menu_items=NULL; + + g_signal_connect(G_OBJECT(window->BackButton),"clicked",G_CALLBACK(on_children_clean),window); + g_signal_connect(G_OBJECT(window->MenuWindow),"button-press-event",G_CALLBACK(on_menu_clicked),window); + return window; +} + +yon_menu_item *yon_menu_item_new(){ + yon_menu_item *item = new(yon_menu_item); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_menu_item); + item->MenuItemBox = yon_gtk_builder_get_widget(builder,"MenuItemBox"); + item->MenuButton = yon_gtk_builder_get_widget(builder,"MenuButton"); + item->MenuTextLabel = yon_gtk_builder_get_widget(builder,"MenuTextLabel"); + item->NextIconButton = yon_gtk_builder_get_widget(builder,"NextIconButton"); + item->children=NULL; + + return item; } \ No newline at end of file diff --git a/ubinstall-gtk-menu-item.glade b/ubinstall-gtk-menu-item.glade new file mode 100644 index 0000000..c9d988a --- /dev/null +++ b/ubinstall-gtk-menu-item.glade @@ -0,0 +1,73 @@ + + + + + + + True + False + + + True + True + True + + + True + False + 5 + + + True + False + label + + + False + True + 0 + + + + + True + True + False + True + menu1 + right + + + + + + + False + True + end + 1 + + + + + + + + True + True + 0 + + + + + True + False + + diff --git a/ubinstall-gtk-menu.glade b/ubinstall-gtk-menu.glade new file mode 100644 index 0000000..a4205a7 --- /dev/null +++ b/ubinstall-gtk-menu.glade @@ -0,0 +1,203 @@ + + + + + + + 450 + 250 + False + False + True + 450 + com.ublinux.ubl-settings-bootloader + True + True + False + + + True + False + 0 + in + + + True + False + 5 + 5 + 5 + 5 + + + True + False + none + True + + + True + True + never + 50 + 200 + + + True + False + + + True + False + none + + + True + False + OS options were not found + + + + + + + + + + + + + True + True + 0 + + + + + False + none + + + True + False + vertical + 5 + + + True + True + True + + + True + False + 5 + + + True + True + False + True + left + + + + + + + False + True + 0 + + + + + True + False + Back + + + False + True + 1 + + + + + + + + False + True + 0 + + + + + True + True + never + 50 + 175 + + + True + False + + + True + False + none + + + True + False + Children options were not found + + + + + + + + + True + True + 1 + + + + + + + False + True + 1 + + + + + + + + + + + + +