From 678dcb378575a71796951d6e948ddd4d193d5eee Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 11 Jul 2025 21:00:50 +0200 Subject: [PATCH] add sidebar --- .../main/java/de/unixwork/ui/ArgFuncs.java | 21 ++++++ .../main/java/de/unixwork/ui/Container.java | 5 ++ .../java/de/unixwork/ui/SidebarBuilder.java | 72 +++++++++++++++++++ .../kotlin/de/unixwork/ui/kotlin/Toplevel.kt | 25 +++++++ 4 files changed, 123 insertions(+) create mode 100644 ui-java/src/main/java/de/unixwork/ui/SidebarBuilder.java 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 1343975..55e8a99 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -98,6 +98,13 @@ class ArgFuncs { MethodHandle splitpane_args_set_max_panes; MethodHandle splitpane_args_free; + MethodHandle sidebar_args_new; + MethodHandle sidebar_args_set_name; + MethodHandle sidebar_args_set_style_class; + MethodHandle sidebar_args_set_margin; + MethodHandle sidebar_args_set_spacing; + MethodHandle sidebar_args_free; + MethodHandle button_args_new; MethodHandle button_args_set_fill; MethodHandle button_args_set_hexpand; @@ -274,6 +281,13 @@ class ArgFuncs { MemorySegment ui_splitpane_args_set_max_panes_addr = lib.find("ui_splitpane_args_set_max_panes").orElseThrow(); MemorySegment ui_splitpane_args_free_addr = lib.find("ui_splitpane_args_free").orElseThrow(); + MemorySegment ui_sidebar_args_new_addr = lib.find("ui_sidebar_args_new").orElseThrow(); + MemorySegment ui_sidebar_args_set_name_addr = lib.find("ui_sidebar_args_set_name").orElseThrow(); + MemorySegment ui_sidebar_args_set_style_class_addr = lib.find("ui_sidebar_args_set_style_class").orElseThrow(); + MemorySegment ui_sidebar_args_set_margin_addr = lib.find("ui_sidebar_args_set_margin").orElseThrow(); + MemorySegment ui_sidebar_args_set_spacing_addr = lib.find("ui_sidebar_args_set_spacing").orElseThrow(); + MemorySegment ui_sidebar_args_free_addr = lib.find("ui_sidebar_args_free").orElseThrow(); + MemorySegment ui_button_args_new_addr = lib.find("ui_button_args_new").orElseThrow(); MemorySegment ui_button_args_set_fill_addr = lib.find("ui_button_args_set_fill").orElseThrow(); MemorySegment ui_button_args_set_hexpand_addr = lib.find("ui_button_args_set_hexpand").orElseThrow(); @@ -442,6 +456,13 @@ class ArgFuncs { splitpane_args_set_max_panes = linker.downcallHandle(ui_splitpane_args_set_max_panes_addr, sigv_mi); splitpane_args_free = linker.downcallHandle(ui_splitpane_args_free_addr, sigv_m); + sidebar_args_new = linker.downcallHandle(ui_sidebar_args_new_addr, sigm); + sidebar_args_set_name = linker.downcallHandle(ui_sidebar_args_set_name_addr, sigv_mm); + sidebar_args_set_style_class = linker.downcallHandle(ui_sidebar_args_set_style_class_addr, sigv_mm); + sidebar_args_set_margin = linker.downcallHandle(ui_sidebar_args_set_margin_addr, sigv_mi); + sidebar_args_set_spacing = linker.downcallHandle(ui_sidebar_args_set_spacing_addr, sigv_mi); + sidebar_args_free = linker.downcallHandle(ui_sidebar_args_free_addr, sigv_m); + button_args_new = linker.downcallHandle(ui_button_args_new_addr, sigm); button_args_set_fill = linker.downcallHandle(ui_button_args_set_fill_addr, sigm); button_args_set_hexpand = linker.downcallHandle(ui_button_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 2afbbe3..8929ae3 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Container.java +++ b/ui-java/src/main/java/de/unixwork/ui/Container.java @@ -61,4 +61,9 @@ public class Container implements AutoCloseable { ContainerFuncs ui = ContainerFuncs.getInstance(); return new SplitPaneBuilder(obj, ui.vsplitpane_create); } + + public static SidebarBuilder sidebar(UiObject obj) { + ContainerFuncs ui = ContainerFuncs.getInstance(); + return new SidebarBuilder(obj, ui.sidebar_create); + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/SidebarBuilder.java b/ui-java/src/main/java/de/unixwork/ui/SidebarBuilder.java new file mode 100644 index 0000000..1778ecf --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/SidebarBuilder.java @@ -0,0 +1,72 @@ +package de.unixwork.ui; + +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.invoke.MethodHandle; + +public class SidebarBuilder extends AbstractWidgetBuilder{ + private String name; + private String styleClass; + private int margin; + private int spacing; + + public SidebarBuilder(UiObject obj, MethodHandle widgetConstructor) { + this.obj = obj; + this.widgetConstructor = widgetConstructor; + } + + public SidebarBuilder name(String name) { + this.name = name; + return this; + } + + public SidebarBuilder styleClass(String styleClass) { + this.styleClass = styleClass; + return this; + } + + public SidebarBuilder margin(int margin) { + this.margin = margin; + return this; + } + + public SidebarBuilder spacing(int sacing) { + this.spacing = sacing; + return this; + } + + @Override + public MemorySegment createArgs(Arena arena) throws Throwable { + ArgFuncs ui = ArgFuncs.getInstance(); + + args = (MemorySegment)ui.sidebar_args_new.invoke(); + if(name != null) { + MemorySegment cstr = arena.allocateFrom(name); + ui.sidebar_args_set_name.invoke(args, cstr); + } + if(styleClass != null) { + MemorySegment cstr = arena.allocateFrom(styleClass); + ui.sidebar_args_set_style_class.invoke(args, cstr); + } + if(margin > 0) { + ui.sidebar_args_set_margin.invoke(args, margin); + } + if(spacing > 0) { + ui.sidebar_args_set_spacing.invoke(args, spacing); + } + + 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 c7938f4..c9e2862 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 @@ -375,6 +375,31 @@ class Toplevel(obj: UiObject) { ) } + fun sidebar( + name: String? = null, + styleClass: String? = null, + margin: Int = -1, + spacing: Int = -1, + ui: ContainerUI? = null + ): UiWidget { + val container = Container.sidebar(obj) + + if(margin > 0) { + container.margin(margin) + } + if(spacing > 0) { + container.spacing(spacing) + } + if(name != null) { + container.name(name) + } + if(styleClass != null) { + container.styleClass(styleClass) + } + + return container.create(ui) + } + fun button( label: String? = null, stockId: String? = null, -- 2.47.3