ui/gtk/container.c

branch
newapi
changeset 332
7e7c05af8f3a
parent 331
cdad8b7e83db
--- a/ui/gtk/container.c	Tue Oct 08 22:53:27 2024 +0200
+++ b/ui/gtk/container.c	Wed Oct 09 21:43:11 2024 +0200
@@ -361,24 +361,60 @@
 }
 
 
+static int stack_set_page(GtkWidget *stack, int index) {
+    GtkSelectionModel *pages = gtk_stack_get_pages(GTK_STACK(stack));
+    GListModel *list = G_LIST_MODEL(pages);
+    GtkStackPage *page = g_list_model_get_item(list, index);
+    if(page) {
+        gtk_stack_set_visible_child(GTK_STACK(stack), gtk_stack_page_get_child(page));
+    } else {
+        fprintf(stderr, "UI Error: ui_stack_set value out of bounds\n");
+        return -1;
+    }
+    return index;
+}
+
 void ui_stack_tab_select(UIWIDGET tabview, int tab) {
-    
+    stack_set_page(tabview, tab);
 }
 
 void ui_stack_tab_remove(UIWIDGET tabview, int tab) {
-    
+    GtkStack *stack = GTK_STACK(tabview);
+    GtkWidget *current = gtk_stack_get_visible_child(stack);
+    GtkSelectionModel *pages = gtk_stack_get_pages(stack);
+    GListModel *list = G_LIST_MODEL(pages);
+    GtkStackPage *page = g_list_model_get_item(list, tab);
+    if(page) {
+        gtk_stack_remove(stack, gtk_stack_page_get_child(page));
+    }
 }
 
 void ui_stack_tab_add(UIWIDGET widget, int index, const char *name, UIWIDGET child) {
-    GtkStackPage *page = gtk_stack_add_titled(GTK_STACK(widget), child, name, name);
+    (void)gtk_stack_add_titled(GTK_STACK(widget), child, name, name);
 }
 
 int64_t ui_stack_get(UiInteger *i) {
-    
+    GtkStack *stack = GTK_STACK(i->obj);
+    GtkWidget *current = gtk_stack_get_visible_child(stack);
+    GtkSelectionModel *pages = gtk_stack_get_pages(stack);
+    GListModel *list = G_LIST_MODEL(pages);
+    int nitems = g_list_model_get_n_items(list);
+    for(int p=0;p<nitems;p++) {
+        GtkStackPage *page = g_list_model_get_item(list, p);
+        GtkWidget *child = gtk_stack_page_get_child(page);
+        if(child == current) {
+            i->value = p;
+            break;
+        }
+    }
+    return i->value;
 }
 
 void ui_stack_set(UiInteger *i, int64_t value) {
-    
+    GtkWidget *widget = i->obj;
+    if(stack_set_page(widget, value) >= 0) {
+        i->value = value;
+    }
 }
 
 
@@ -451,7 +487,7 @@
         UiInteger *i = var->value;
         i->get = getfunc;
         i->set = setfunc;
-        i->obj = widget;
+        i->obj = data_widget;
     }
     
     g_object_set_data(G_OBJECT(widget), "ui_tabview", data);

mercurial