add tabview onchange callback (GTK)

Tue, 03 Jun 2025 20:13:30 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 03 Jun 2025 20:13:30 +0200
changeset 604
0afad58e3078
parent 602
9f3ff50da302
child 605
488a2caebc0c

add tabview onchange callback (GTK)

ui/gtk/container.c file | annotate | diff | comparison | revisions
ui/gtk/container.h file | annotate | diff | comparison | revisions
ui/ui/container.h file | annotate | diff | comparison | revisions
--- a/ui/gtk/container.c	Fri May 30 17:55:57 2025 +0200
+++ b/ui/gtk/container.c	Tue Jun 03 20:13:30 2025 +0200
@@ -689,6 +689,52 @@
     return g_object_get_data(G_OBJECT(tabview), "ui_tabview");
 }
 
+static void tabview_switch_page(
+        GtkNotebook *self,
+        GtkWidget *page,
+        guint page_num,
+        gpointer userdata)
+{
+    UiGtkTabView *tabview = userdata;
+    if(!tabview->onchange) {
+        return;
+    }
+    
+    UiEvent event;
+    event.obj = tabview->obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    event.set = ui_get_setop();
+    event.eventdata = NULL;
+    event.intval = page_num;
+    
+    tabview->onchange(&event, tabview->onchange);
+}
+
+#if GTK_CHECK_VERSION(3, 10, 0)
+
+static void tabview_stack_changed(
+        GObject *object,
+        GParamSpec *pspec,
+        UiGtkTabView *tabview)
+{
+    if(!tabview->onchange) {
+        return;
+    }
+    
+    UiEvent event;
+    event.obj = tabview->obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    event.set = ui_get_setop();
+    event.eventdata = NULL;
+    event.intval = 0;
+    
+    tabview->onchange(&event, tabview->onchange);
+}
+
+#endif
+
 typedef int64_t(*ui_tabview_get_func)(UiInteger*);
 typedef void (*ui_tabview_set_func)(UiInteger*, int64_t);
 
@@ -715,6 +761,7 @@
             GtkWidget *sidebar = gtk_stack_sidebar_new();
             BOX_ADD(widget, sidebar);
             GtkWidget *stack = gtk_stack_new();
+            g_signal_connect(stack, "notify::visible-child", G_CALLBACK(tabview_stack_changed), data);
             gtk_stack_set_transition_type (GTK_STACK(stack), GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN);
             gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(sidebar), GTK_STACK(stack));
             BOX_ADD_EXPAND(widget, stack);
@@ -734,6 +781,11 @@
         case UI_TABVIEW_INVISIBLE: /* fall through */
         case UI_TABVIEW_NAVIGATION_TOP2: {
             widget = gtk_notebook_new();
+            g_signal_connect(
+                    widget,
+                    "clicked",
+                    G_CALLBACK(tabview_switch_page),
+                    data);
             data_widget = widget;
             data->select_tab = ui_notebook_tab_select;
             data->remove_tab = ui_notebook_tab_remove;
--- a/ui/gtk/container.h	Fri May 30 17:55:57 2025 +0200
+++ b/ui/gtk/container.h	Tue Jun 03 20:13:30 2025 +0200
@@ -122,6 +122,8 @@
     int spacing;
     int columnspacing;
     int rowspacing;
+    ui_callback onchange;
+    void *onchangedata;
 } UiGtkTabView;
 
 
--- a/ui/ui/container.h	Fri May 30 17:55:57 2025 +0200
+++ b/ui/ui/container.h	Tue Jun 03 20:13:30 2025 +0200
@@ -116,6 +116,8 @@
     const char *style_class;
 
     UiTabViewType tabview;
+    ui_callback onchange;
+    void *onchangedata;
 
     UiSubContainerType subcontainer;
     

mercurial