From: Olaf Wintermann Date: Wed, 1 Oct 2025 12:45:51 +0000 (+0200) Subject: add splitview window X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=b088228c1d4b9bbabbfc161c6d3457c1d3232bd7;p=rssreader.git add splitview window --- 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 247ffef..01865f6 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Container.java +++ b/ui-java/src/main/java/de/unixwork/ui/Container.java @@ -98,4 +98,14 @@ public class Container implements AutoCloseable { ContainerFuncs ui = ContainerFuncs.getInstance(); return new SidebarBuilder(obj, ui.sidebar_create); } + + public static SidebarBuilder leftPanel(UiObject obj) { + ContainerFuncs ui = ContainerFuncs.getInstance(); + return new SidebarBuilder(obj, ui.left_panel_create); + } + + public static SidebarBuilder rightPanel(UiObject obj) { + ContainerFuncs ui = ContainerFuncs.getInstance(); + return new SidebarBuilder(obj, ui.right_panel_create); + } } 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 d2b9e4f..7495fa6 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java @@ -15,6 +15,8 @@ public class ContainerFuncs { public MethodHandle tabview_create; public MethodHandle headerbar_create; public MethodHandle sidebar_create; + public MethodHandle left_panel_create; + public MethodHandle right_panel_create; public MethodHandle itemlist_create; public MethodHandle hsplitpane_create; public MethodHandle vsplitpane_create; @@ -41,6 +43,8 @@ public class ContainerFuncs { MemorySegment ui_tabview_create_addr = lib.find("ui_tabview_create").orElseThrow(); MemorySegment ui_headerbar_create_addr = lib.find("ui_headerbar_create").orElseThrow(); MemorySegment ui_sidebar_create_addr = lib.find("ui_sidebar_create").orElseThrow(); + MemorySegment ui_left_panel_create_addr = lib.find("ui_left_panel_create").orElseThrow(); + MemorySegment ui_right_panel_create_addr = lib.find("ui_right_panel_create").orElseThrow(); MemorySegment ui_itemlist_create_addr = lib.find("ui_itemlist_create").orElseThrow(); MemorySegment ui_hsplitpane_create_addr = lib.find("ui_hsplitpane_create").orElseThrow(); MemorySegment ui_vsplitpane_create_addr = lib.find("ui_vsplitpane_create").orElseThrow(); @@ -60,6 +64,8 @@ public class ContainerFuncs { tabview_create = linker.downcallHandle(ui_tabview_create_addr, sigm_mm); headerbar_create = linker.downcallHandle(ui_headerbar_create_addr, sigm_mm); sidebar_create = linker.downcallHandle(ui_sidebar_create_addr, sigm_mm); + left_panel_create = linker.downcallHandle(ui_left_panel_create_addr, sigm_mm); + right_panel_create = linker.downcallHandle(ui_right_panel_create_addr, sigm_mm); itemlist_create = linker.downcallHandle(ui_itemlist_create_addr, sigm_mm); hsplitpane_create = linker.downcallHandle(ui_hsplitpane_create_addr, sigm_mm); vsplitpane_create = linker.downcallHandle(ui_vsplitpane_create_addr, sigm_mm); diff --git a/ui-java/src/main/java/de/unixwork/ui/UiObject.java b/ui-java/src/main/java/de/unixwork/ui/UiObject.java index 4b49d1e..befd149 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiObject.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiObject.java @@ -67,6 +67,10 @@ public class UiObject extends Context { return UiObjectFuncs.instance.simpleWindow(title); } + public static UiObject createSplitViewWindow(String title, boolean sidebar) { + return UiObjectFuncs.instance.splitviewWindow(title, sidebar); + } + public static void setDefaultWindowSize(int width, int height) { try { UiObjectFuncs.instance.ui_window_default_size.invoke(width, height); diff --git a/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java b/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java index f849018..61082d7 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java @@ -10,6 +10,7 @@ class UiObjectFuncs { public MethodHandle ui_close; public MethodHandle ui_window; public MethodHandle ui_sidebar_window; + public MethodHandle ui_splitview_window; public MethodHandle ui_simple_window; public MethodHandle ui_dialog_window_create; public MethodHandle ui_dialog_create; @@ -30,11 +31,13 @@ class UiObjectFuncs { FunctionDescriptor sigv_mimm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_INT, ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigv_mmmm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigv_mii = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_INT, ValueLayout.JAVA_INT); + FunctionDescriptor sigm_mb = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_BOOLEAN); MemorySegment ui_show_addr = lib.find("ui_show").orElseThrow(); MemorySegment ui_close_addr = lib.find("ui_close").orElseThrow(); MemorySegment ui_window_addr = lib.find("ui_window").orElseThrow(); MemorySegment ui_sidebar_window_addr = lib.find("ui_sidebar_window").orElseThrow(); + MemorySegment ui_splitview_window_addr = lib.find("ui_splitview_window").orElseThrow(); MemorySegment ui_simple_window_addr = lib.find("ui_simple_window").orElseThrow(); MemorySegment ui_dialog_window_create_addr = lib.find("ui_dialog_window_create").orElseThrow(); MemorySegment ui_dialog_create_addr = lib.find("ui_dialog_create").orElseThrow(); @@ -48,6 +51,7 @@ class UiObjectFuncs { ui_close = linker.downcallHandle(ui_close_addr, sigv_m); ui_window = linker.downcallHandle(ui_window_addr, sigm_mm); ui_sidebar_window = linker.downcallHandle(ui_sidebar_window_addr, sigm_mm); + ui_splitview_window = linker.downcallHandle(ui_splitview_window_addr, sigm_mb); ui_simple_window = linker.downcallHandle(ui_simple_window_addr, sigm_mm); ui_dialog_window_create = linker.downcallHandle(ui_dialog_window_create_addr, sigm_mm); ui_dialog_create = linker.downcallHandle(ui_dialog_create_addr, sigv_mm); @@ -95,6 +99,22 @@ class UiObjectFuncs { return createWindow(title, ui_sidebar_window); } + UiObject splitviewWindow(String title, boolean sidebar) { + MemorySegment obj = null; + Toolkit toolkit = Toolkit.getInstance(); + toolkit.setIsObjRegEnabled(false); // see createWindow for details + try (Arena arena = Arena.ofConfined()) { + MemorySegment cstr = arena.allocateFrom(title); + obj = (MemorySegment) ui_splitview_window.invoke(cstr, sidebar); + } catch (Throwable e) { + toolkit.setIsObjRegEnabled(true); + throw new RuntimeException(e); + } + toolkit.setIsObjRegEnabled(true); + + return new UiObject(obj); + } + UiObject dialogWindow(MemorySegment parent, MemorySegment args) { MemorySegment obj = null; Toolkit toolkit = Toolkit.getInstance(); 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 dfe8670..4f87014 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 @@ -670,6 +670,54 @@ class Toplevel(obj: UiObject) { return container.create(ui) } + fun leftPanel( + name: String? = null, + styleClass: String? = null, + margin: Int = -1, + spacing: Int = -1, + ui: ContainerUI? = null + ): UiWidget { + val container = Container.leftPanel(this@Toplevel.ui) + 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 rightPanel( + name: String? = null, + styleClass: String? = null, + margin: Int = -1, + spacing: Int = -1, + ui: ContainerUI? = null + ): UiWidget { + val container = Container.rightPanel(this@Toplevel.ui) + 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, diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt index 4eefe33..35e119f 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt @@ -35,6 +35,16 @@ fun sidebarWindow(title: String, width: Int = 0, height: Int = 0, ui: (Toplevel. return toplevel } +fun splitViewWindow(title: String, sidebar: Boolean = false, width: Int = 0, height: Int = 0, ui: (Toplevel.() -> Unit)? = null): Toplevel { + val obj = UiObject.createSplitViewWindow(title, sidebar) + if(width > 0 && height > 0) { + obj.setSize(width, height) + } + val toplevel = Toplevel(obj) + ui?.invoke(toplevel) + return toplevel +} + fun dialog( parent: UiObject, title: String? = null,