]> uap-core.de Git - rssreader.git/commitdiff
add splitview window
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 1 Oct 2025 12:45:51 +0000 (14:45 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 1 Oct 2025 12:45:51 +0000 (14:45 +0200)
ui-java/src/main/java/de/unixwork/ui/Container.java
ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java
ui-java/src/main/java/de/unixwork/ui/UiObject.java
ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt

index 247ffef1a80bb384e3831e8c79a4673f30aee59b..01865f6adcfa14fd92026e793c3c63516cb02269 100644 (file)
@@ -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);
+    }
 }
index d2b9e4f8d0976b3d522039b71abc527c559fa73c..7495fa6be7703c72e0c7c2e807d3aeb749c5cc71 100644 (file)
@@ -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);
index 4b49d1e49a093a2422e9c1124ea4c2f82d0278ab..befd149a55c36022031f6817f343ab18aadd0aa4 100644 (file)
@@ -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);
index f849018c660f62a17a6e32c27cf916142c24e25c..61082d7ee5a9f5efc9c4f28f65e209a7bd2c50b7 100644 (file)
@@ -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();
index dfe86702ce7e15da5ac3211c85f182a96bfd6df3..4f8701476df826896640af1a7d8fea9c4ea68b80 100644 (file)
@@ -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,
index 4eefe33a1e535884b33be709a029ff7baba838d1..35e119fb28175134f77d30c6c558768a0ad6f0cc 100644 (file)
@@ -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,