]> uap-core.de Git - rssreader.git/commitdiff
add box and grid container
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 22 Jun 2025 08:56:48 +0000 (10:56 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 22 Jun 2025 08:56:48 +0000 (10:56 +0200)
ui-java/src/main/java/de/unixwork/ui/Container.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java
ui-java/src/test/java/de/unixwork/ui/demo/Main.java

diff --git a/ui-java/src/main/java/de/unixwork/ui/Container.java b/ui-java/src/main/java/de/unixwork/ui/Container.java
new file mode 100644 (file)
index 0000000..7d6f66d
--- /dev/null
@@ -0,0 +1,45 @@
+package de.unixwork.ui;
+
+public class Container implements AutoCloseable {
+    private UiObject object;
+    private UiWidget widget;
+    private boolean isClosed;
+
+    protected Container(UiObject obj, UiWidget widget) {
+        this.object = obj;
+        this.widget = widget;
+    }
+
+    public UiWidget getWidget() {
+        return widget;
+    }
+
+    public boolean isClosed() {
+        return isClosed;
+    }
+
+    public void close() {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        try {
+            ui.container_begin_close.invoke(object.ptr);
+            ui.container_finish.invoke(object.ptr);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static ContainerBuilder vbox(UiObject obj) {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        return new ContainerBuilder(obj, ui.vbox_create);
+    }
+
+    public static ContainerBuilder hbox(UiObject obj) {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        return new ContainerBuilder(obj, ui.hbox_create);
+    }
+
+    public static ContainerBuilder grid(UiObject obj) {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        return new ContainerBuilder(obj, ui.grid_create);
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java
new file mode 100644 (file)
index 0000000..d0a0606
--- /dev/null
@@ -0,0 +1,191 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+import java.lang.invoke.MethodHandle;
+
+public class ContainerBuilder extends AbstractWidgetBuilder{
+    private boolean fill;
+    private boolean hexpand;
+    private boolean vexpand;
+    private boolean hfill;
+    private boolean vfill;
+    private boolean overrideDefaults;
+    private boolean defhexpand;
+    private boolean defvexpand;
+    private boolean defhfill;
+    private boolean defvfill;
+    private int colspan;
+    private int rowspan;
+    private String name;
+    private String styleClass;
+    private int margin;
+    private int spacing;
+    private int columnspacing;
+    private int rowspacing;
+
+    public ContainerBuilder(UiObject obj, MethodHandle widgetConstructor) {
+        this.obj = obj;
+        this.widgetConstructor = widgetConstructor;
+    }
+
+    public ContainerBuilder fill(boolean fill) {
+        this.fill = fill;
+        return this;
+    }
+
+    public ContainerBuilder hexpand(boolean hexpand) {
+        this.hexpand = hexpand;
+        return this;
+    }
+
+    public ContainerBuilder vexpand(boolean vexpand) {
+        this.vexpand = vexpand;
+        return this;
+    }
+
+    public ContainerBuilder hfill(boolean hfill) {
+        this.hfill = hfill;
+        return this;
+    }
+
+    public ContainerBuilder vfill(boolean vfill) {
+        this.vfill = vfill;
+        return this;
+    }
+
+    public ContainerBuilder overrideDefaults(boolean overrideDefaults) {
+        this.overrideDefaults = overrideDefaults;
+        return this;
+    }
+
+    public ContainerBuilder defaultHExpand(boolean defaultHExpand) {
+        this.hexpand = defaultHExpand;
+        return this;
+    }
+
+    public ContainerBuilder defaultVExpand(boolean defaultVExpand) {
+        this.vexpand = defaultVExpand;
+        return this;
+    }
+
+    public ContainerBuilder defaultHfill(boolean defaultHfill) {
+        this.hfill = defaultHfill;
+        return this;
+    }
+
+    public  ContainerBuilder defaultVfill(boolean defaultVfill) {
+        this.defvfill = defaultVfill;
+        return this;
+    }
+
+    public ContainerBuilder colspan(int colspan) {
+        this.colspan = colspan;
+        return this;
+    }
+
+    public ContainerBuilder rowspan(int rowspan) {
+        this.rowspan = rowspan;
+        return this;
+    }
+
+    public ContainerBuilder name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public ContainerBuilder styleClass(String styleClass) {
+        this.styleClass = styleClass;
+        return this;
+    }
+
+    public ContainerBuilder margin(int margin) {
+        this.margin = margin;
+        return this;
+    }
+
+    public ContainerBuilder spacing(int sacing) {
+        this.spacing = sacing;
+        return this;
+    }
+
+    public ContainerBuilder columnspacing(int columnspacing) {
+        this.columnspacing = columnspacing;
+        return this;
+    }
+
+    public ContainerBuilder rowspacing(int rowspacing) {
+        this.rowspacing = rowspacing;
+        return this;
+    }
+
+    @Override
+    public MemorySegment createArgs(Arena arena) throws Throwable {
+        ArgFuncs ui = ArgFuncs.getInstance();
+
+        MemorySegment args = (MemorySegment)ui.container_args_new.invoke();
+        if(fill) {
+            // TODO: implement after toolkit fill refactoring
+        }
+        if(hexpand) {
+            ui.container_args_set_hexpand.invoke(args, hexpand);
+        }
+        if(vexpand) {
+            ui.container_args_set_vexpand.invoke(args, vexpand);
+        }
+        if(hfill) {
+            ui.container_args_set_hfill.invoke(args, hfill);
+        }
+        if(vfill) {
+            ui.container_args_set_vfill.invoke(args, vfill);
+        }
+        if(overrideDefaults) {
+            ui.container_args_set_override_defaults.invoke(args, overrideDefaults);
+        }
+        if(defhexpand) {
+            ui.container_args_set_def_hexpand.invoke(args, defhexpand);
+        }
+        if(defvexpand) {
+            ui.container_args_set_def_vexpand.invoke(args, defvexpand);
+        }
+        if(defhfill) {
+            ui.container_args_set_def_hfill.invoke(args, defhfill);
+        }
+        if(defvfill) {
+            ui.container_args_set_def_vfill.invoke(args, defvfill);
+        }
+        if(colspan > 0) {
+            ui.container_args_set_colspan.invoke(args, colspan);
+        }
+        if(rowspan > 0) {
+            ui.container_args_set_rowspan.invoke(args, rowspan);
+        }
+        if(name != null) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.container_args_set_name.invoke(args, cstr);
+        }
+        if(styleClass != null) {
+            MemorySegment cstr = arena.allocateFrom(styleClass);
+            ui.container_args_set_style_class.invoke(args, cstr);
+        }
+        if(margin > 0) {
+            ui.container_args_set_margin.invoke(args, margin);
+        }
+        if(spacing > 0) {
+            ui.container_args_set_spacing.invoke(args, spacing);
+        }
+        if(columnspacing > 0) {
+            ui.container_args_set_columnspacing.invoke(args, columnspacing);
+        }
+        if(rowspacing > 0) {
+            ui.container_args_set_rowspacing.invoke(args, rowspacing);
+        }
+
+        return args;
+    }
+
+    public Container createContainer() {
+        UiWidget w = create();
+        return new Container(obj, w);
+    }
+}
index 197eabf6d09ecfdd0b79c5eb70e24165c5d4e70b..e183dbd78de17277c2bb9debf5f09ec2bb129b0d 100644 (file)
@@ -25,7 +25,8 @@ public class ContainerFuncs {
     private ContainerFuncs(Linker linker, SymbolLookup lib) {
         FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
         FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
-        FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+        FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS);
+        FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS);
 
         MemorySegment ui_vbox_create_addr = lib.find("ui_vbox_create").orElseThrow();
         MemorySegment ui_hbox_create_addr = lib.find("ui_hbox_create").orElseThrow();
@@ -37,7 +38,7 @@ public class ContainerFuncs {
         MemorySegment ui_headerbar_create_addr = lib.find("ui_headerbar_create").orElseThrow();
         MemorySegment ui_sidebar_create_addr = lib.find("ui_sidebar_create").orElseThrow();
         MemorySegment ui_itemlist_create_addr = lib.find("ui_itemlist_create").orElseThrow();
-        MemorySegment ui_hsplitpane_create_addr = lib.find("ui_hslpitpane_create").orElseThrow();
+        MemorySegment ui_hsplitpane_create_addr = lib.find("ui_hsplitpane_create").orElseThrow();
         MemorySegment ui_vsplitpane_create_addr = lib.find("ui_vsplitpane_create").orElseThrow();
 
         MemorySegment ui_container_begin_close = lib.find("ui_container_begin_close").orElseThrow();
@@ -56,7 +57,7 @@ public class ContainerFuncs {
         hsplitpane_create = linker.downcallHandle(ui_hsplitpane_create_addr, sigm_mm);
         vsplitpane_create = linker.downcallHandle(ui_vsplitpane_create_addr, sigm_mm);
 
-        container_begin_close = linker.downcallHandle(ui_container_begin_close, sigm_m);
+        container_begin_close = linker.downcallHandle(ui_container_begin_close, sigv_m);
         container_finish = linker.downcallHandle(ui_container_finish, sigi_m);
     }
 
index 60e37e2bfb3965063babcd854ab2ca0f57400730..efef50820f0ac44f0e6f1efdabdf654f9e1ec1c9 100644 (file)
@@ -2,6 +2,8 @@ package de.unixwork.ui.demo;
 
 import de.unixwork.ui.*;
 
+import static java.awt.SystemColor.window;
+
 public class Main implements Application{
     public void startup() {
         UiObject window = UiObject.createWindow("Test Window");
@@ -11,6 +13,13 @@ public class Main implements Application{
         Button.checkbox(window).label("Checkbox").create();
         Button.radioButton(window).label("Radio Button 1").varname("radiobutton").create();
         Button.radioButton(window).label("Radio Button 2").varname("radiobutton").create();
+
+        try(Container c = Container.hbox(window).spacing(10).createContainer()) {
+            Button.button(window).label("B1").create();
+            Button.button(window).label("B2").create();
+            Button.button(window).label("B3").create();
+        }
+
         window.show();
     }