]> uap-core.de Git - note.git/commitdiff
only attach notes when they are not already selected
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 13 Jun 2026 10:19:50 +0000 (12:19 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 13 Jun 2026 10:19:50 +0000 (12:19 +0200)
application/src/notebook.rs
ui-rs/src/ui/list.rs
ui/gtk/list.c
ui/gtk/window.c

index 884e350e72a3b9aebeb224e00eb7b33ac7bf099a..16aded1537c1c78ee933ee7ed7ef422b59648049 100644 (file)
@@ -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();
 
index 11a9cc143d4123283a2a1bfcf153d04724553044..5236170ea5ba81bc7a9faa7bd1cb169e78f65367 100644 (file)
@@ -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<F>(&mut self, f: F) -> &mut Self
index 70ecc3b42b6a38698c6a845b733294538a414607..d1d08e5c7dcf3ebf96bfecc9e63cdc9d8b5b43bb 100644 (file)
@@ -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);
index 8c54114993490e388122048ac07e8d27f72911a9..f19eb0b42528195788b16769a4ac8fb5e92562fa 100644 (file)
@@ -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) {