allow unselection in gtk4 listview

Fri, 22 Aug 2025 10:10:22 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 22 Aug 2025 10:10:22 +0200
changeset 701
6fdec085c385
parent 700
7032f69a325c
child 702
71d62990b016

allow unselection in gtk4 listview

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
--- a/application/main.c	Wed Aug 20 16:59:53 2025 +0200
+++ b/application/main.c	Fri Aug 22 10:10:22 2025 +0200
@@ -198,6 +198,7 @@
     UiList *items;
     UiGeneric *web;
     UiString *list_input;
+    UiList *list11;
 } MyDocument;
 
 MyDocument *doc1;
@@ -336,6 +337,11 @@
     
     doc->list_input = ui_string_new(docctx, "list_input");
     
+    doc->list11 = ui_list_new(docctx, "list11");
+    ui_list_append(doc->list11, "Item 1");
+    ui_list_append(doc->list11, "Item 2");
+    ui_list_append(doc->list11, "Item 3");
+    
     //doc->text = ui_text_new(docctx, "text");
     return doc;
 }
@@ -505,6 +511,20 @@
     doc->list2->update(doc->list2, 1);
 }
 
+static void action_list_selection(UiEvent *event, void *userdata) {
+    UiListSelection *sel = event->eventdata;
+    printf("list selection[%d]\n", sel->count);
+    for(int i=0;i<sel->count;i++) {
+        printf("[%d]: %d\n", i, sel->rows[i]);
+    }
+    printf("\n");
+}
+
+static void action_list_activate(UiEvent *event, void *userdata) {
+    printf("activate\n");
+    action_list_selection(event, userdata);
+}
+
 void application_startup(UiEvent *event, void *data) {
     // global list
     UiContext *global = ui_global_context();
@@ -681,6 +701,11 @@
                 ui_newline(obj);
             }
         }
+        ui_tab(obj, "Tab 11") {
+            ui_grid(obj, .margin = 10, .rowspacing = 10, .columnspacing = 10, .fill = TRUE) {
+                ui_listview(obj, .varname = "list11", .multiselection = FALSE,  .onselection = action_list_selection, .onactivate = action_list_activate, .hexpand = TRUE, .hfill = TRUE, .vexpand = TRUE, .vfill = TRUE);
+            }
+        }
     }
     
     /*
--- a/ui/gtk/list.c	Wed Aug 20 16:59:53 2025 +0200
+++ b/ui/gtk/list.c	Fri Aug 22 10:10:22 2025 +0200
@@ -200,6 +200,8 @@
         selection_model = GTK_SELECTION_MODEL(gtk_multi_selection_new(G_LIST_MODEL(liststore)));
     } else {
         selection_model = GTK_SELECTION_MODEL(gtk_single_selection_new(G_LIST_MODEL(liststore)));
+        gtk_single_selection_set_can_unselect(GTK_SINGLE_SELECTION(selection_model), TRUE);
+        gtk_single_selection_set_autoselect(GTK_SINGLE_SELECTION(selection_model), FALSE);
     }
     g_signal_connect(selection_model, "selection-changed", G_CALLBACK(ui_listview_selection_changed), listview);
     return selection_model;

mercurial