]> uap-core.de Git - rssreader.git/commitdiff
add frame/expander main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 13 Aug 2025 17:55:44 +0000 (19:55 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 13 Aug 2025 17:55:44 +0000 (19:55 +0200)
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/Container.java
ui-java/src/main/java/de/unixwork/ui/FrameBuilder.java [new file with mode: 0644]
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt

index 422e8821c877c6abb335b66518552300e5ecff5d..7a31b64763cacb0dbb86e89050086576bb6d7875 100644 (file)
@@ -110,6 +110,25 @@ class ArgFuncs {
     MethodHandle container_args_set_rowspacing;
     MethodHandle container_args_free;
 
+    MethodHandle frame_args_new;
+    MethodHandle frame_args_set_fill;
+    MethodHandle frame_args_set_hexpand;
+    MethodHandle frame_args_set_vexpand;
+    MethodHandle frame_args_set_hfill;
+    MethodHandle frame_args_set_vfill;
+    MethodHandle frame_args_set_override_defaults;
+    MethodHandle frame_args_set_colspan;
+    MethodHandle frame_args_set_rowspan;
+    MethodHandle frame_args_set_name;
+    MethodHandle frame_args_set_style_class;
+    MethodHandle frame_args_set_margin;
+    MethodHandle frame_args_set_spacing;
+    MethodHandle frame_args_set_columnspacing;
+    MethodHandle frame_args_set_rowspacing;
+    MethodHandle frame_args_set_expanded;
+    MethodHandle frame_args_set_label;
+    MethodHandle frame_args_free;
+
     MethodHandle splitpane_args_new;
     MethodHandle splitpane_args_set_fill;
     MethodHandle splitpane_args_set_hexpand;
@@ -453,6 +472,25 @@ class ArgFuncs {
         MemorySegment ui_container_args_set_rowspacing_addr = lib.find("ui_container_args_set_rowspacing").orElseThrow();
         MemorySegment ui_container_args_free_addr = lib.find("ui_container_args_free").orElseThrow();
 
+        MemorySegment ui_frame_args_new_addr = lib.find("ui_frame_args_new").orElseThrow();
+        MemorySegment ui_frame_args_set_fill_addr = lib.find("ui_frame_args_set_fill").orElseThrow();
+        MemorySegment ui_frame_args_set_hexpand_addr = lib.find("ui_frame_args_set_hexpand").orElseThrow();
+        MemorySegment ui_frame_args_set_vexpand_addr = lib.find("ui_frame_args_set_vexpand").orElseThrow();
+        MemorySegment ui_frame_args_set_hfill_addr = lib.find("ui_frame_args_set_hfill").orElseThrow();
+        MemorySegment ui_frame_args_set_vfill_addr = lib.find("ui_frame_args_set_vfill").orElseThrow();
+        MemorySegment ui_frame_args_set_override_defaults_addr = lib.find("ui_frame_args_set_override_defaults").orElseThrow();
+        MemorySegment ui_frame_args_set_colspan_addr = lib.find("ui_frame_args_set_colspan").orElseThrow();
+        MemorySegment ui_frame_args_set_rowspan_addr = lib.find("ui_frame_args_set_rowspan").orElseThrow();
+        MemorySegment ui_frame_args_set_name_addr = lib.find("ui_frame_args_set_name").orElseThrow();
+        MemorySegment ui_frame_args_set_style_class_addr = lib.find("ui_frame_args_set_style_class").orElseThrow();
+        MemorySegment ui_frame_args_set_margin_addr = lib.find("ui_frame_args_set_margin").orElseThrow();
+        MemorySegment ui_frame_args_set_spacing_addr = lib.find("ui_frame_args_set_spacing").orElseThrow();
+        MemorySegment ui_frame_args_set_columnspacing_addr = lib.find("ui_frame_args_set_columnspacing").orElseThrow();
+        MemorySegment ui_frame_args_set_rowspacing_addr = lib.find("ui_frame_args_set_rowspacing").orElseThrow();
+        MemorySegment ui_frame_args_set_expanded_addr = lib.find("ui_frame_args_set_expanded").orElseThrow();
+        MemorySegment ui_frame_args_set_label_addr = lib.find("ui_frame_args_set_label").orElseThrow();
+        MemorySegment ui_frame_args_free_addr = lib.find("ui_frame_args_free").orElseThrow();
+
         MemorySegment ui_splitpane_args_new_addr = lib.find("ui_splitpane_args_new").orElseThrow();
         MemorySegment ui_splitpane_args_set_fill_addr = lib.find("ui_splitpane_args_set_fill").orElseThrow();
         MemorySegment ui_splitpane_args_set_hexpand_addr = lib.find("ui_splitpane_args_set_hexpand").orElseThrow();
@@ -787,6 +825,25 @@ class ArgFuncs {
         container_args_set_rowspacing = linker.downcallHandle(ui_container_args_set_rowspacing_addr, sigv_mi);
         container_args_free = linker.downcallHandle(ui_container_args_free_addr, sigv_m);
 
+        frame_args_new =  linker.downcallHandle(ui_frame_args_new_addr, sigm);
+        frame_args_set_fill = linker.downcallHandle(ui_frame_args_set_fill_addr, sigv_mb);
+        frame_args_set_hexpand = linker.downcallHandle(ui_frame_args_set_hexpand_addr, sigv_mb);
+        frame_args_set_vexpand = linker.downcallHandle(ui_frame_args_set_vexpand_addr, sigv_mb);
+        frame_args_set_hfill = linker.downcallHandle(ui_frame_args_set_hfill_addr, sigv_mb);
+        frame_args_set_vfill = linker.downcallHandle(ui_frame_args_set_vfill_addr, sigv_mb);
+        frame_args_set_override_defaults = linker.downcallHandle(ui_frame_args_set_override_defaults_addr, sigv_mb);
+        frame_args_set_colspan = linker.downcallHandle(ui_frame_args_set_colspan_addr, sigv_mi);
+        frame_args_set_rowspan = linker.downcallHandle(ui_frame_args_set_rowspan_addr, sigv_mi);
+        frame_args_set_name = linker.downcallHandle(ui_frame_args_set_name_addr, sigv_mm);
+        frame_args_set_style_class = linker.downcallHandle(ui_frame_args_set_style_class_addr, sigv_mm);
+        frame_args_set_margin = linker.downcallHandle(ui_frame_args_set_margin_addr, sigv_mi);
+        frame_args_set_spacing = linker.downcallHandle(ui_frame_args_set_spacing_addr, sigv_mi);
+        frame_args_set_columnspacing = linker.downcallHandle(ui_frame_args_set_columnspacing_addr, sigv_mi);
+        frame_args_set_rowspacing = linker.downcallHandle(ui_frame_args_set_rowspacing_addr, sigv_mi);
+        frame_args_set_expanded = linker.downcallHandle(ui_frame_args_set_expanded_addr, sigv_mb);
+        frame_args_set_label = linker.downcallHandle(ui_frame_args_set_label_addr, sigv_mm);
+        frame_args_free = linker.downcallHandle(ui_frame_args_free_addr, sigv_m);
+
         splitpane_args_new =  linker.downcallHandle(ui_splitpane_args_new_addr, sigm);
         splitpane_args_set_fill = linker.downcallHandle(ui_splitpane_args_set_fill_addr, sigv_mb);
         splitpane_args_set_hexpand = linker.downcallHandle(ui_splitpane_args_set_hexpand_addr, sigv_mb);
index 8929ae3dc7a6e6fe82faac1ab990e73ebf3509a0..fbf76ef5bc69cbdf65107e320bd4e320bdd5c3b8 100644 (file)
@@ -52,6 +52,16 @@ public class Container implements AutoCloseable {
         }
     }
 
+    public static FrameBuilder frame(UiObject obj) {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        return new FrameBuilder(obj, ui.frame_create);
+    }
+
+    public static FrameBuilder expander(UiObject obj) {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        return new FrameBuilder(obj, ui.expander_create);
+    }
+
     public static SplitPaneBuilder hsplitview(UiObject obj) {
         ContainerFuncs ui = ContainerFuncs.getInstance();
         return new SplitPaneBuilder(obj, ui.hsplitpane_create);
diff --git a/ui-java/src/main/java/de/unixwork/ui/FrameBuilder.java b/ui-java/src/main/java/de/unixwork/ui/FrameBuilder.java
new file mode 100644 (file)
index 0000000..26342b2
--- /dev/null
@@ -0,0 +1,181 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+import java.lang.invoke.MethodHandle;
+
+public class FrameBuilder extends AbstractWidgetBuilder{
+    private boolean fill;
+    private boolean hexpand;
+    private boolean vexpand;
+    private boolean hfill;
+    private boolean vfill;
+    private boolean overrideDefaults;
+    private int colspan;
+    private int rowspan;
+    private String name;
+    private String styleClass;
+    private int margin;
+    private int spacing;
+    private int columnspacing;
+    private int rowspacing;
+    private boolean isexpanded;
+    private String label;
+
+    public FrameBuilder(UiObject obj, MethodHandle widgetConstructor) {
+        this.obj = obj;
+        this.widgetConstructor = widgetConstructor;
+    }
+
+    public FrameBuilder fill(boolean fill) {
+        this.fill = fill;
+        return this;
+    }
+
+    public FrameBuilder hexpand(boolean hexpand) {
+        this.hexpand = hexpand;
+        return this;
+    }
+
+    public FrameBuilder vexpand(boolean vexpand) {
+        this.vexpand = vexpand;
+        return this;
+    }
+
+    public FrameBuilder hfill(boolean hfill) {
+        this.hfill = hfill;
+        return this;
+    }
+
+    public FrameBuilder vfill(boolean vfill) {
+        this.vfill = vfill;
+        return this;
+    }
+
+    public FrameBuilder overrideDefaults(boolean overrideDefaults) {
+        this.overrideDefaults = overrideDefaults;
+        return this;
+    }
+
+    public FrameBuilder colspan(int colspan) {
+        this.colspan = colspan;
+        return this;
+    }
+
+    public FrameBuilder rowspan(int rowspan) {
+        this.rowspan = rowspan;
+        return this;
+    }
+
+    public FrameBuilder name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public FrameBuilder styleClass(String styleClass) {
+        this.styleClass = styleClass;
+        return this;
+    }
+
+    public FrameBuilder margin(int margin) {
+        this.margin = margin;
+        return this;
+    }
+
+    public FrameBuilder spacing(int sacing) {
+        this.spacing = sacing;
+        return this;
+    }
+
+    public FrameBuilder columnspacing(int columnspacing) {
+        this.columnspacing = columnspacing;
+        return this;
+    }
+
+    public FrameBuilder rowspacing(int rowspacing) {
+        this.rowspacing = rowspacing;
+        return this;
+    }
+    
+    public FrameBuilder isexpanded(boolean isexpanded) {
+        this.isexpanded = isexpanded;
+        return this;
+    }
+    
+    public FrameBuilder label(String label) {
+        this.label = label;
+        return this;
+    }
+
+    @Override
+    public MemorySegment createArgs(Arena arena) throws Throwable {
+        ArgFuncs ui = ArgFuncs.getInstance();
+
+        args = (MemorySegment)ui.frame_args_new.invoke();
+        if(fill) {
+            ui.frame_args_set_fill.invoke(args, fill);
+        }
+        if(hexpand) {
+            ui.frame_args_set_hexpand.invoke(args, hexpand);
+        }
+        if(vexpand) {
+            ui.frame_args_set_vexpand.invoke(args, vexpand);
+        }
+        if(hfill) {
+            ui.frame_args_set_hfill.invoke(args, hfill);
+        }
+        if(vfill) {
+            ui.frame_args_set_vfill.invoke(args, vfill);
+        }
+        if(overrideDefaults) {
+            ui.frame_args_set_override_defaults.invoke(args, overrideDefaults);
+        }
+        if(colspan > 0) {
+            ui.frame_args_set_colspan.invoke(args, colspan);
+        }
+        if(rowspan > 0) {
+            ui.frame_args_set_rowspan.invoke(args, rowspan);
+        }
+        if(name != null) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.frame_args_set_name.invoke(args, cstr);
+        }
+        if(styleClass != null) {
+            MemorySegment cstr = arena.allocateFrom(styleClass);
+            ui.frame_args_set_style_class.invoke(args, cstr);
+        }
+        if(margin > 0) {
+            ui.frame_args_set_margin.invoke(args, margin);
+        }
+        if(spacing > 0) {
+            ui.frame_args_set_spacing.invoke(args, spacing);
+        }
+        if(columnspacing > 0) {
+            ui.frame_args_set_columnspacing.invoke(args, columnspacing);
+        }
+        if(rowspacing > 0) {
+            ui.frame_args_set_rowspacing.invoke(args, rowspacing);
+        }
+        if(isexpanded) {
+            ui.frame_args_set_expanded.invoke(args, isexpanded);
+        }
+        if(label != null) {
+            MemorySegment cstr = arena.allocateFrom(label);
+            ui.frame_args_set_label.invoke(args, cstr);
+        }
+
+        return args;
+    }
+
+    public Container createContainer() {
+        UiWidget w = create();
+        return new Container(obj, w);
+    }
+
+    public UiWidget create(ContainerUI ui) {
+        Container container = createContainer();
+        ui.callback();
+        container.close();
+        return container.getWidget();
+    }
+}
index e365b51f51631ddd39835dd17dcaabedc5f53afb..a2ec59a156eb512dfb0dd156516bc88ec31fc64c 100644 (file)
@@ -6,6 +6,7 @@ import de.unixwork.ui.Container
 import de.unixwork.ui.ContainerBuilder
 import de.unixwork.ui.ContainerUI
 import de.unixwork.ui.EventHandler
+import de.unixwork.ui.FrameBuilder
 import de.unixwork.ui.LabelBuilder
 import de.unixwork.ui.LabelStyle
 import de.unixwork.ui.ListValueConverter
@@ -235,6 +236,153 @@ class Toplevel(obj: UiObject) {
         Container.newline(this@Toplevel.ui)
     }
 
+
+    private fun createFrame(
+        container: FrameBuilder,
+        fill: Boolean = false,
+        hexpand: Boolean = false,
+        vexpand: Boolean = false,
+        hfill: Boolean = false,
+        vfill: Boolean = false,
+        overrideDefaults: Boolean = false,
+        colspan: Int = -1,
+        rowspan: Int = -1,
+        name: String? = null,
+        styleClass: String? = null,
+        margin: Int = -1,
+        spacing: Int = -1,
+        columnspacing: Int = -1,
+        rowspacing: Int = -1,
+        expanded: Boolean = false,
+        label: String? = null,
+        ui: ContainerUI? = null
+    ): UiWidget {
+        if(fill) {
+            container.fill(true)
+        }
+        if(hexpand) {
+            container.hexpand(true)
+        }
+        if(vexpand) {
+            container.vexpand(true)
+        }
+        if(hfill) {
+            container.hfill(true)
+        }
+        if(vfill) {
+            container.vfill(true)
+        }
+        if(overrideDefaults) {
+            container.overrideDefaults(true)
+        }
+        if(colspan > 0) {
+            container.colspan(colspan)
+        }
+        if(rowspan > 0) {
+            container.rowspan(rowspan)
+        }
+        if(margin > 0) {
+            container.margin(margin)
+        }
+        if(spacing > 0) {
+            container.spacing(spacing)
+        }
+        if(columnspacing > 0) {
+            container.columnspacing(columnspacing)
+        }
+        if(rowspacing > 0) {
+            container.rowspacing(rowspacing)
+        }
+        if(expanded) {
+            container.isexpanded(true)
+        }
+        if(label != null) {
+            container.label(label)
+        }
+
+        return container.create(ui)
+    }
+
+    fun frame(
+        fill: Boolean = false,
+        hexpand: Boolean = false,
+        vexpand: Boolean = false,
+        hfill: Boolean = false,
+        vfill: Boolean = false,
+        overrideDefaults: Boolean = false,
+        colspan: Int = -1,
+        rowspan: Int = -1,
+        name: String? = null,
+        styleClass: String? = null,
+        margin: Int = -1,
+        spacing: Int = -1,
+        columnspacing: Int = -1,
+        rowspacing: Int = -1,
+        label: String? = null,
+        ui: ContainerUI? = null
+    ): UiWidget {
+        return createFrame(
+            container = Container.frame(this@Toplevel.ui),
+            fill = fill,
+            hexpand = hexpand,
+            vexpand = vexpand,
+            hfill = hfill,
+            vfill = vfill,
+            overrideDefaults = overrideDefaults,
+            colspan = colspan,
+            rowspan = rowspan,
+            name = name,
+            styleClass = styleClass,
+            margin = margin,
+            spacing = spacing,
+            columnspacing = columnspacing,
+            rowspacing = rowspacing,
+            label = label,
+            ui = ui
+        )
+    }
+
+    fun expander(
+        fill: Boolean = false,
+        hexpand: Boolean = false,
+        vexpand: Boolean = false,
+        hfill: Boolean = false,
+        vfill: Boolean = false,
+        overrideDefaults: Boolean = false,
+        colspan: Int = -1,
+        rowspan: Int = -1,
+        name: String? = null,
+        styleClass: String? = null,
+        margin: Int = -1,
+        spacing: Int = -1,
+        columnspacing: Int = -1,
+        rowspacing: Int = -1,
+        expanded: Boolean = false,
+        label: String? = null,
+        ui: ContainerUI? = null
+    ): UiWidget {
+        return createFrame(
+            container = Container.expander(this@Toplevel.ui),
+            fill = fill,
+            hexpand = hexpand,
+            vexpand = vexpand,
+            hfill = hfill,
+            vfill = vfill,
+            overrideDefaults = overrideDefaults,
+            colspan = colspan,
+            rowspan = rowspan,
+            name = name,
+            styleClass = styleClass,
+            margin = margin,
+            spacing = spacing,
+            columnspacing = columnspacing,
+            rowspacing = rowspacing,
+            expanded = expanded,
+            label = label,
+            ui = ui
+        )
+    }
+
     private fun createSplitpane(
         horizontal: Boolean,
         fill: Boolean = false,