add expander container (GTK) newapi

Sun, 27 Oct 2024 09:01:46 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 27 Oct 2024 09:01:46 +0100
branch
newapi
changeset 354
baf9bcc98d87
parent 353
ae999e3346a9
child 355
4db3ecd4d1ea

add expander container (GTK)

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/container.c file | annotate | diff | comparison | revisions
ui/gtk/container.h file | annotate | diff | comparison | revisions
ui/gtk/toolkit.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Sun Oct 27 08:53:32 2024 +0100
+++ b/application/main.c	Sun Oct 27 09:01:46 2024 +0100
@@ -308,7 +308,17 @@
         }
         
         ui_tab(obj, "Tab 6") {
-            ui_scrolledwindow(obj, .style_class = "ui_test", .fill = UI_ON) {
+            ui_scrolledwindow(obj, .fill = UI_ON) {
+                ui_expander(obj, .label = "Expander", .margin = 10, .spacing = 10) {
+                    ui_label(obj, .label = "Test");
+                    ui_button(obj, .label = "Button");
+                }
+                
+                ui_frame(obj, .label = "Frame", .margin = 10, .spacing = 10) {
+                    ui_label(obj, .label = "Test");
+                    ui_button(obj, .label = "Button");
+                }
+                
                 for(int i=0;i<100;i++) {
                     char labelstr[32];
                     snprintf(labelstr, 32, "button %d", i);
--- a/ui/gtk/container.c	Sun Oct 27 08:53:32 2024 +0100
+++ b/ui/gtk/container.c	Sun Oct 27 09:01:46 2024 +0100
@@ -253,6 +253,27 @@
     FRAME_SET_CHILD(ct->widget, widget);
 }
 
+UiContainer* ui_expander_container(UiObject *obj, GtkWidget *expander) {
+    UiContainer *ct = cxCalloc(
+            obj->ctx->allocator,
+            1,
+            sizeof(UiContainer));
+    ct->widget = expander;
+    ct->add = ui_expander_container_add;
+    return ct;
+}
+
+void ui_expander_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+    EXPANDER_SET_CHILD(ct->widget, widget);
+}
+
+void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+    // TODO: check if the widget implements GtkScrollable
+    SCROLLEDWINDOW_SET_CHILD(ct->widget, widget);
+    ui_reset_layout(ct->layout);
+    ct->current = widget;
+}
+
 UiContainer* ui_scrolledwindow_container(UiObject *obj, GtkWidget *scrolledwindow) {
     UiContainer *ct = cxCalloc(
             obj->ctx->allocator,
@@ -263,13 +284,6 @@
     return ct;
 }
 
-void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
-    // TODO: check if the widget implements GtkScrollable
-    SCROLLEDWINDOW_SET_CHILD(ct->widget, widget);
-    ui_reset_layout(ct->layout);
-    ct->current = widget;
-}
-
 UiContainer* ui_tabview_container(UiObject *obj, GtkWidget *tabview) {
     UiTabViewContainer *ct = cxCalloc(
             obj->ctx->allocator,
@@ -383,10 +397,32 @@
         newobj->widget = frame;
         newobj->container = ui_frame_container(obj, frame);
     }
+    current->container->add(current->container, frame, FALSE);
+    uic_obj_add(obj, newobj);
     
     return frame;
 }
 
+UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs args) {
+    UiObject* current = uic_current_obj(obj);
+    UI_APPLY_LAYOUT1(current, args);
+    
+    GtkWidget *expander = gtk_expander_new(args.label);
+    gtk_expander_set_expanded(GTK_EXPANDER(expander), args.isexpanded);
+    UiObject *newobj = uic_object_new(obj, expander);
+    GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin);
+    if(sub) {
+        EXPANDER_SET_CHILD(expander, sub);
+    } else {
+        newobj->widget = expander;
+        newobj->container = ui_expander_container(obj, expander);
+    }
+    current->container->add(current->container, expander, FALSE);
+    uic_obj_add(obj, newobj);
+    
+    return expander;
+}
+
 
 UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) {
     UiObject* current = uic_current_obj(obj);
--- a/ui/gtk/container.h	Sun Oct 27 08:53:32 2024 +0100
+++ b/ui/gtk/container.h	Sun Oct 27 09:01:46 2024 +0100
@@ -158,6 +158,9 @@
 UiContainer* ui_frame_container(UiObject *obj, GtkWidget *frame);
 void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
 
+UiContainer* ui_expander_container(UiObject *obj, GtkWidget *expander);
+void ui_expander_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+
 UiContainer* ui_scrolledwindow_container(UiObject *obj, GtkWidget *scrolledwindow);
 void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
 
--- a/ui/gtk/toolkit.h	Sun Oct 27 08:53:32 2024 +0100
+++ b/ui/gtk/toolkit.h	Sun Oct 27 09:01:46 2024 +0100
@@ -67,6 +67,7 @@
 #define SCROLLEDWINDOW_SET_CHILD(sw, child) gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), child)
 #define SCROLLEDWINDOW_GET_CHILD(sw) gtk_scrolled_window_get_child(GTK_SCROLLED_WINDOW(sw))
 #define FRAME_SET_CHILD(frame, child) gtk_frame_set_child(GTK_FRAME(frame), child)
+#define EXPANDER_SET_CHILD(expander, child) gtk_expander_set_child(GTK_EXPANDER(expander), child)
 #define WIDGET_ADD_CSS_CLASS(w, cssclass) gtk_widget_add_css_class(w, cssclass)
 #define WIDGET_REMOVE_CSS_CLASS(w, cssclass) gtk_widget_remove_css_class(w, cssclass)
 #else
@@ -82,6 +83,7 @@
 #define SCROLLEDWINDOW_SET_CHILD(sw, child) gtk_container_add(GTK_CONTAINER(sw), child)
 #define SCROLLEDWINDOW_GET_CHILD(sw) gtk_bin_get_child(GTK_BIN(sw))
 #define FRAME_SET_CHILD(frame, child) gtk_container_add(GTK_CONTAINER(frame), child)
+#define EXPANDER_SET_CHILD(expander, child) gtk_container_add(GTK_CONTAINER(expander), child)
 #define WIDGET_ADD_CSS_CLASS(w, cssclass) gtk_style_context_add_class(gtk_widget_get_style_context(w), cssclass)
 #define WIDGET_REMOVE_CSS_CLASS(w, cssclass) gtk_style_context_remove_class(gtk_widget_get_style_context(w), cssclass)
 #endif

mercurial