From: Olaf Wintermann Date: Wed, 13 Aug 2025 17:55:44 +0000 (+0200) Subject: add frame/expander X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=rssreader.git add frame/expander --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java index 422e882..7a31b64 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -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); diff --git a/ui-java/src/main/java/de/unixwork/ui/Container.java b/ui-java/src/main/java/de/unixwork/ui/Container.java index 8929ae3..fbf76ef 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Container.java +++ b/ui-java/src/main/java/de/unixwork/ui/Container.java @@ -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 index 0000000..26342b2 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/FrameBuilder.java @@ -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(); + } +} diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt index e365b51..a2ec59a 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt @@ -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,