From: Olaf Wintermann Date: Sun, 22 Jun 2025 08:56:48 +0000 (+0200) Subject: add box and grid container X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=f240b063962df25173e614977780ac4f8cee7eb2;p=rssreader.git add box and grid container --- 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 index 0000000..7d6f66d --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/Container.java @@ -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 index 0000000..d0a0606 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java @@ -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); + } +} diff --git a/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java index 197eabf..e183dbd 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java @@ -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); } diff --git a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java index 60e37e2..efef508 100644 --- a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java +++ b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java @@ -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(); }