From: Olaf Wintermann Date: Sat, 13 Jun 2026 10:19:50 +0000 (+0200) Subject: only attach notes when they are not already selected X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=note.git only attach notes when they are not already selected --- diff --git a/application/src/notebook.rs b/application/src/notebook.rs index 884e350..16aded1 100644 --- a/application/src/notebook.rs +++ b/application/src/notebook.rs @@ -77,14 +77,15 @@ impl Notebook { } pub fn select_note_from(&mut self, from: NoteSelectFrom) -> Option<()> { - self.detach_current_note(); - self.selected_note = None; - self.selected_index = None; - let mut add_to_nav = false; let (selected_index, note) = match from { NoteSelectFrom::ListSelection(s) => { let index = s.selected_index()?; + if let Some(current_selection) = self.selected_index { + if current_selection == index { + return None + } + } self.detach_current_note(); let note = s.selected_element_mut(self.notes.data_mut())?; add_to_nav = true; @@ -92,12 +93,18 @@ impl Notebook { }, NoteSelectFrom::NavigationItem(nav) => { let index = self.find_note(&nav.note_id?)?; + if let Some(current_selection) = self.selected_index { + if current_selection == index { + return None + } + } self.detach_current_note(); self.notes.select_with_event(index as i32, false); let note = self.notes.data_mut().get_mut(index)?; (index, note) } }; + self.selected_index = Some(selected_index); let is_new = note.is_new(); diff --git a/ui-rs/src/ui/list.rs b/ui-rs/src/ui/list.rs index 11a9cc1..5236170 100644 --- a/ui-rs/src/ui/list.rs +++ b/ui-rs/src/ui/list.rs @@ -566,6 +566,7 @@ impl<'a, T, E> TableViewBuilder<'a, T, E> { ui_list_args_set_onactivate_action(self.args, cstr.as_ptr()); } self + } pub fn onselection(&mut self, f: F) -> &mut Self diff --git a/ui/gtk/list.c b/ui/gtk/list.c index 70ecc3b..d1d08e5 100644 --- a/ui/gtk/list.c +++ b/ui/gtk/list.c @@ -515,7 +515,9 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) { } // event handling + printf("test\n"); if(args->onactivate || args->onactivate_action) { + printf("signal connect activate\n"); // columnview and listview can use the same callback function, because // the first parameter (which is technically a different pointer type) // is ignored @@ -725,7 +727,7 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { } // event handling - if(args->onactivate) { + if(args->onactivate || args->onactivate_action) { g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), tableview); } if(args->contextmenu) { @@ -875,6 +877,7 @@ void ui_dropdown_notify(GtkWidget *dropdown, GObject *pspec, gpointer userdata) void ui_columnview_activate(void *ignore, guint position, gpointer userdata) { + printf("columnview activate\n"); UiListView *view = userdata; if(view->selection.count == 0) { listview_update_selection(view); diff --git a/ui/gtk/window.c b/ui/gtk/window.c index 8c54114..f19eb0b 100644 --- a/ui/gtk/window.c +++ b/ui/gtk/window.c @@ -286,27 +286,29 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi g_object_set_data(G_OBJECT(obj->widget), "ui_window_splitview", content); g_object_set_data(G_OBJECT(obj->widget), "ui_left_panel", vbox); g_object_set_data(G_OBJECT(obj->widget), "ui_right_panel", right_vbox); + g_object_set_data(G_OBJECT(obj->widget), "ui_left_panel_top", toolbar_view); + g_object_set_data(G_OBJECT(obj->widget), "ui_right_panel_top", right_panel); } - + GtkWidget *content_box = vbox; - + if(sidebar) { GtkWidget *splitview = adw_overlay_split_view_new(); adw_application_window_set_content(ADW_APPLICATION_WINDOW(obj->widget), splitview); - + GtkWidget *sidebar_toolbar_view = adw_toolbar_view_new(); adw_overlay_split_view_set_sidebar(ADW_OVERLAY_SPLIT_VIEW(splitview), sidebar_toolbar_view); headerbar_sidebar = adw_header_bar_new(); adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), headerbar_sidebar); - + adw_overlay_split_view_set_content(ADW_OVERLAY_SPLIT_VIEW(splitview), content); - + g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_toolbar_view); } else { adw_application_window_set_content(ADW_APPLICATION_WINDOW(obj->widget), content); } - + const char *show_title = ui_get_property("ui.gtk.window.showtitle"); if(show_title) { if(!strcmp(show_title, "main") && sidebar) { @@ -333,10 +335,10 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), TRUE); } } - + adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(toolbar_view), headerbar_main); g_object_set_data(G_OBJECT(obj->widget), "ui_headerbar", headerbar_main); - + if(!simple) { ui_fill_headerbar(obj, headerbar_sidebar, headerbar_main, headerbar_right); } @@ -364,7 +366,7 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi //GtkWidget *hb = ui_create_headerbar(obj); //gtk_window_set_titlebar(GTK_WINDOW(obj->widget), hb); } - + GtkWidget *content_box = ui_gtk_vbox_new(0); WINDOW_SET_CONTENT(obj->widget, vbox); if(sidebar || splitview) { @@ -375,30 +377,32 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_vbox); gtk_paned_set_position(GTK_PANED(paned), 200); } - + if(splitview) { GtkWidget *content_paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); gtk_paned_set_position(GTK_PANED(content_paned), splitview_pos); PANED_SET_CHILD2(paned, content_paned); - + GtkWidget *right_content_box = ui_gtk_vbox_new(0); PANED_SET_CHILD1(content_paned, content_box); PANED_SET_CHILD2(content_paned, right_content_box); - + g_object_set_data(G_OBJECT(obj->widget), "ui_window_splitview", content_paned); g_object_set_data(G_OBJECT(obj->widget), "ui_left_panel", content_box); g_object_set_data(G_OBJECT(obj->widget), "ui_right_panel", right_content_box); + g_object_set_data(G_OBJECT(obj->widget), "ui_left_panel_top", content_box); + g_object_set_data(G_OBJECT(obj->widget), "ui_right_panel_top", right_content_box); } else { PANED_SET_CHILD2(paned, content_box); } - + BOX_ADD_EXPAND(GTK_BOX(vbox), paned); } else { BOX_ADD_EXPAND(GTK_BOX(vbox), content_box); } - + #endif - + // window content // the content has a (TODO: not yet) configurable frame // TODO: really? why @@ -406,7 +410,7 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi GtkWidget *frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); - + // content vbox GtkWidget *content_box = ui_gtk_vbox_new(0); gtk_container_add(GTK_CONTAINER(frame), content_box); @@ -414,7 +418,7 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi */ UiContainer *container = ui_box_container(obj, content_box, UI_CONTAINER_VBOX); uic_object_push_container(obj, container); - + nwindows++; return obj; } @@ -478,9 +482,9 @@ void ui_splitview_window_use_property(UiBool enable) { UIEXPORT void ui_splitview_window_set_visible(UiObject *obj, int pane, UiBool visible) { GtkWidget *panel = NULL; if(pane == 0) { - panel = g_object_get_data(G_OBJECT(obj->widget), "ui_left_panel"); + panel = g_object_get_data(G_OBJECT(obj->widget), "ui_left_panel_top"); } else if(pane == 1) { - panel = g_object_get_data(G_OBJECT(obj->widget), "ui_right_panel"); + panel = g_object_get_data(G_OBJECT(obj->widget), "ui_right_panel_top"); } if(panel == NULL) {