]> uap-core.de Git - rssreader.git/commitdiff
add dialog/dialog window
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 20 Jul 2025 16:31:29 +0000 (18:31 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 20 Jul 2025 16:31:29 +0000 (18:31 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/Dialog.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/DialogWindowBuilder.java [new file with mode: 0644]
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 f3c1a65b272cb4695711504dc77d6f6641a34580..e1881ff532e80f679e5d049980c2a5c9d0e0c343 100644 (file)
@@ -13,7 +13,7 @@ class MainWindow {
 
             sidebar {
                 vbox(fill = true) {
-                    sourcelist { elm: Object ->
+                    sourcelist(fill = true) { elm: Object ->
                         val item = SubListItem()
                         item.label = "todo"
                         item
@@ -24,15 +24,14 @@ class MainWindow {
                 }
             }
 
-
-            hsplitpane(initialPosition = 300) {
-                vbox {
+            hsplitpane(fill = true, initialPosition = 300) {
+                vbox(fill = true) {
                     listview<String>(varname = "items", fill = true) { elm, col ->
                         "todo"
                     }
                 }
 
-                vbox {
+                vbox(fill = true) {
                     webview(varname = "webview", fill = true)
                 }
             }
index ad5b37ac23092e9c23231a2716cdf691b9412746..422e8821c877c6abb335b66518552300e5ecff5d 100644 (file)
@@ -6,6 +6,39 @@ import java.lang.invoke.MethodHandle;
 class ArgFuncs {
     static ArgFuncs instance;
 
+    MethodHandle dialog_args_new;
+    MethodHandle dialog_args_set_title;
+    MethodHandle dialog_args_set_content;
+    MethodHandle dialog_args_set_button1_label;
+    MethodHandle dialog_args_set_button2_label;
+    MethodHandle dialog_args_set_closebutton_label;
+    MethodHandle dialog_args_set_input_value;
+    MethodHandle dialog_args_set_input;
+    MethodHandle dialog_args_set_password;
+    MethodHandle dialog_args_set_result;
+    MethodHandle dialog_args_set_resultdata;
+    MethodHandle dialog_args_free;
+
+    MethodHandle dialogwindow_args_new;
+    MethodHandle dialogwindow_args_set_modal;
+    MethodHandle dialogwindow_args_set_titlebar_buttons;
+    MethodHandle dialogwindow_args_set_show_closebutton;
+    MethodHandle dialogwindow_args_set_title;
+    MethodHandle dialogwindow_args_set_lbutton1;
+    MethodHandle dialogwindow_args_set_lbutton2;
+    MethodHandle dialogwindow_args_set_rbutton3;
+    MethodHandle dialogwindow_args_set_rbutton4;
+    MethodHandle dialogwindow_args_set_lbutton1_states;
+    MethodHandle dialogwindow_args_set_lbutton2_states;
+    MethodHandle dialogwindow_args_set_rbutton3_states;
+    MethodHandle dialogwindow_args_set_rbutton4_states;
+    MethodHandle dialogwindow_args_set_default_button;
+    MethodHandle dialogwindow_args_set_width;
+    MethodHandle dialogwindow_args_set_height;
+    MethodHandle dialogwindow_args_set_onclick;
+    MethodHandle dialogwindow_args_set_onclickdata;
+    MethodHandle dialogwindow_args_free;
+
     MethodHandle menuitem_args_new;
     MethodHandle menuitem_args_set_label;
     MethodHandle menuitem_args_set_stockid;
@@ -316,6 +349,39 @@ class ArgFuncs {
         FunctionDescriptor sigv_mi = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_INT);
         FunctionDescriptor sigv_md = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_DOUBLE);
 
+        MemorySegment ui_dialog_args_new_addr =  lib.find("ui_dialog_args_new").orElseThrow();
+        MemorySegment ui_dialog_args_set_title_addr =  lib.find("ui_dialog_args_set_title").orElseThrow();
+        MemorySegment ui_dialog_args_set_content_addr =  lib.find("ui_dialog_args_set_content").orElseThrow();
+        MemorySegment ui_dialog_args_set_button1_label_addr =  lib.find("ui_dialog_args_set_button1_label").orElseThrow();
+        MemorySegment ui_dialog_args_set_button2_label_addr =  lib.find("ui_dialog_args_set_button2_label").orElseThrow();
+        MemorySegment ui_dialog_args_set_closebutton_label_addr =  lib.find("ui_dialog_args_set_closebutton_label").orElseThrow();
+        MemorySegment ui_dialog_args_set_input_value_addr =  lib.find("ui_dialog_args_set_input_value").orElseThrow();
+        MemorySegment ui_dialog_args_set_input_addr =  lib.find("ui_dialog_args_set_input").orElseThrow();
+        MemorySegment ui_dialog_args_set_password_addr =  lib.find("ui_dialog_args_set_password").orElseThrow();
+        MemorySegment ui_dialog_args_set_result_addr =  lib.find("ui_dialog_args_set_result").orElseThrow();
+        MemorySegment ui_dialog_args_set_resultdata_addr =  lib.find("ui_dialog_args_set_resultdata").orElseThrow();
+        MemorySegment ui_dialog_args_free_addr =  lib.find("ui_dialog_args_free").orElseThrow();
+
+        MemorySegment ui_dialogwindow_args_new_addr =  lib.find("ui_dialogwindow_args_new").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_modal_addr =  lib.find("ui_dialogwindow_args_set_modal").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_titlebar_buttons_addr =  lib.find("ui_dialogwindow_args_set_titlebar_buttons").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_show_closebutton_addr =  lib.find("ui_dialogwindow_args_set_show_closebutton").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_title_addr =  lib.find("ui_dialogwindow_args_set_title").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_lbutton1_addr =  lib.find("ui_dialogwindow_args_set_lbutton1").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_lbutton2_addr =  lib.find("ui_dialogwindow_args_set_lbutton2").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_rbutton3_addr =  lib.find("ui_dialogwindow_args_set_rbutton3").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_rbutton4_addr =  lib.find("ui_dialogwindow_args_set_rbutton4").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_lbutton1_states_addr =  lib.find("ui_dialogwindow_args_set_lbutton1_states").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_lbutton2_states_addr =  lib.find("ui_dialogwindow_args_set_lbutton2_states").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_rbutton3_states_addr =  lib.find("ui_dialogwindow_args_set_rbutton3_states").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_rbutton4_states_addr =  lib.find("ui_dialogwindow_args_set_rbutton4_states").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_default_button_addr =  lib.find("ui_dialogwindow_args_set_default_button").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_width_addr =  lib.find("ui_dialogwindow_args_set_width").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_height_addr =  lib.find("ui_dialogwindow_args_set_height").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_onclick_addr =  lib.find("ui_dialogwindow_args_set_onclick").orElseThrow();
+        MemorySegment ui_dialogwindow_args_set_onclickdata_addr =  lib.find("ui_dialogwindow_args_set_onclickdata").orElseThrow();
+        MemorySegment ui_dialogwindow_args_free_addr =  lib.find("ui_dialogwindow_args_free").orElseThrow();
+
         MemorySegment ui_menuitem_args_new_addr = lib.find("ui_menuitem_args_new").orElseThrow();
         MemorySegment ui_menuitem_args_set_label_addr = lib.find("ui_menuitem_args_set_label").orElseThrow();
         MemorySegment ui_menuitem_args_set_stockid_addr = lib.find("ui_menuitem_args_set_stockid").orElseThrow();
@@ -617,6 +683,39 @@ class ArgFuncs {
         MemorySegment ui_webview_args_set_groups_addr = lib.find("ui_webview_args_set_groups").orElseThrow();
         MemorySegment ui_webview_args_free_addr = lib.find("ui_webview_args_free").orElseThrow();
 
+        dialog_args_new = linker.downcallHandle(ui_dialog_args_new_addr, sigm);
+        dialog_args_set_title = linker.downcallHandle(ui_dialog_args_set_title_addr, sigv_mm);
+        dialog_args_set_content = linker.downcallHandle(ui_dialog_args_set_content_addr, sigv_mm);
+        dialog_args_set_button1_label = linker.downcallHandle(ui_dialog_args_set_button1_label_addr, sigv_mm);
+        dialog_args_set_button2_label = linker.downcallHandle(ui_dialog_args_set_button2_label_addr, sigv_mm);
+        dialog_args_set_closebutton_label = linker.downcallHandle(ui_dialog_args_set_closebutton_label_addr, sigv_mm);
+        dialog_args_set_input_value = linker.downcallHandle(ui_dialog_args_set_input_value_addr, sigv_mm);
+        dialog_args_set_input = linker.downcallHandle(ui_dialog_args_set_input_addr, sigv_mb);
+        dialog_args_set_password = linker.downcallHandle(ui_dialog_args_set_password_addr, sigv_mb);
+        dialog_args_set_result = linker.downcallHandle(ui_dialog_args_set_result_addr, sigv_mm);
+        dialog_args_set_resultdata = linker.downcallHandle(ui_dialog_args_set_resultdata_addr, sigv_mm);
+        dialog_args_free = linker.downcallHandle(ui_dialog_args_free_addr, sigv_m);
+
+        dialogwindow_args_new = linker.downcallHandle(ui_dialogwindow_args_new_addr, sigm);
+        dialogwindow_args_set_modal = linker.downcallHandle(ui_dialogwindow_args_set_modal_addr, sigv_mi);
+        dialogwindow_args_set_titlebar_buttons = linker.downcallHandle(ui_dialogwindow_args_set_titlebar_buttons_addr, sigv_mi);
+        dialogwindow_args_set_show_closebutton = linker.downcallHandle(ui_dialogwindow_args_set_show_closebutton_addr, sigv_mi);
+        dialogwindow_args_set_title = linker.downcallHandle(ui_dialogwindow_args_set_title_addr, sigv_mm);
+        dialogwindow_args_set_lbutton1 = linker.downcallHandle(ui_dialogwindow_args_set_lbutton1_addr, sigv_mm);
+        dialogwindow_args_set_lbutton2 = linker.downcallHandle(ui_dialogwindow_args_set_lbutton2_addr, sigv_mm);
+        dialogwindow_args_set_rbutton3 = linker.downcallHandle(ui_dialogwindow_args_set_rbutton3_addr, sigv_mm);
+        dialogwindow_args_set_rbutton4 = linker.downcallHandle(ui_dialogwindow_args_set_rbutton4_addr, sigv_mm);
+        dialogwindow_args_set_lbutton1_states = linker.downcallHandle(ui_dialogwindow_args_set_lbutton1_states_addr, sigv_mm);
+        dialogwindow_args_set_lbutton2_states = linker.downcallHandle(ui_dialogwindow_args_set_lbutton2_states_addr, sigv_mm);
+        dialogwindow_args_set_rbutton3_states = linker.downcallHandle(ui_dialogwindow_args_set_rbutton3_states_addr, sigv_mm);
+        dialogwindow_args_set_rbutton4_states = linker.downcallHandle(ui_dialogwindow_args_set_rbutton4_states_addr, sigv_mm);
+        dialogwindow_args_set_default_button = linker.downcallHandle(ui_dialogwindow_args_set_default_button_addr, sigv_mi);
+        dialogwindow_args_set_width = linker.downcallHandle(ui_dialogwindow_args_set_width_addr, sigv_mi);
+        dialogwindow_args_set_height = linker.downcallHandle(ui_dialogwindow_args_set_height_addr, sigv_mi);
+        dialogwindow_args_set_onclick = linker.downcallHandle(ui_dialogwindow_args_set_onclick_addr, sigv_mm);
+        dialogwindow_args_set_onclickdata = linker.downcallHandle(ui_dialogwindow_args_set_onclickdata_addr, sigv_mm);
+        dialogwindow_args_free = linker.downcallHandle(ui_dialogwindow_args_free_addr, sigv_m);
+
         menuitem_args_new = linker.downcallHandle(ui_menuitem_args_new_addr, sigm);
         menuitem_args_set_label = linker.downcallHandle(ui_menuitem_args_set_label_addr, sigv_mm);
         menuitem_args_set_stockid = linker.downcallHandle(ui_menuitem_args_set_stockid_addr, sigv_mm);
diff --git a/ui-java/src/main/java/de/unixwork/ui/Dialog.java b/ui-java/src/main/java/de/unixwork/ui/Dialog.java
new file mode 100644 (file)
index 0000000..1ffe25d
--- /dev/null
@@ -0,0 +1,113 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+
+public class Dialog {
+    private UiObject parent;
+
+    private String title;
+    private String content;
+    private String button1Label;
+    private String button2Label;
+    private String closeButtonLabel;
+    private String inputValue;
+    private boolean input;
+    private boolean password;
+    private EventHandler resultHandler;
+
+    public Dialog(UiObject parent) {
+        this.parent = parent;
+    }
+
+    public Dialog title(String title) {
+        this.title = title;
+        return this;
+    }
+
+    public Dialog content(String content) {
+        this.content = content;
+        return this;
+    }
+
+    public Dialog button1Label(String button1Label) {
+        this.button1Label = button1Label;
+        return this;
+    }
+
+    public Dialog button2Label(String button2Label) {
+        this.button2Label = button2Label;
+        return this;
+    }
+
+    public Dialog closeButtonLabel(String closeButtonLabel) {
+        this.closeButtonLabel = closeButtonLabel;
+        return this;
+    }
+
+    public Dialog inputValue(String inputValue) {
+        this.inputValue = inputValue;
+        return this;
+    }
+
+    public Dialog input(boolean input) {
+        this.input = input;
+        return this;
+    }
+
+    public Dialog password(boolean password) {
+        this.password = password;
+        return this;
+    }
+
+    public Dialog resultHandler(EventHandler resultHandler) {
+        this.resultHandler = resultHandler;
+        return this;
+    }
+
+    public void show() {
+        ArgFuncs ui = ArgFuncs.getInstance();
+        try(Arena arena = Arena.ofConfined()) {
+            MemorySegment args = (MemorySegment) ui.dialog_args_new.invoke();
+
+            if(title != null) {
+                MemorySegment cstr = arena.allocateFrom(title);
+                ui.dialog_args_set_title.invoke(args, cstr);
+            }
+            if(content != null) {
+                MemorySegment cstr = arena.allocateFrom(content);
+                ui.dialog_args_set_content.invoke(args, cstr);
+            }
+            if(button1Label != null) {
+                MemorySegment cstr = arena.allocateFrom(button1Label);
+                ui.dialog_args_set_button1_label.invoke(args, cstr);
+            }
+            if(button2Label != null) {
+                MemorySegment cstr = arena.allocateFrom(button2Label);
+                ui.dialog_args_set_button2_label.invoke(args, cstr);
+            }
+            if(closeButtonLabel != null) {
+                MemorySegment cstr = arena.allocateFrom(closeButtonLabel);
+                ui.dialog_args_set_closebutton_label.invoke(args, cstr);
+            }
+            if(inputValue != null) {
+                MemorySegment cstr = arena.allocateFrom(inputValue);
+                ui.dialog_args_set_input_value.invoke(args, cstr);
+            }
+            ui.dialog_args_set_input.invoke(args, input);
+            ui.dialog_args_set_password.invoke(args, password);
+            if(resultHandler != null) {
+                EventWrapper event = new EventWrapper(resultHandler);
+                ui.dialog_args_set_result.invoke(args, event.getCallback());
+                ui.dialog_args_set_resultdata.invoke(args, event.getUserData());
+            }
+
+            // create dialog
+            UiObjectFuncs.instance.ui_dialog_create.invoke(parent.ptr, args);
+
+            ui.dialog_args_free.invoke(args);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/DialogWindowBuilder.java b/ui-java/src/main/java/de/unixwork/ui/DialogWindowBuilder.java
new file mode 100644 (file)
index 0000000..dc39ab1
--- /dev/null
@@ -0,0 +1,141 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+
+public class DialogWindowBuilder {
+    private UiObject parent;
+
+    private int modal;
+    private int titlebarButtons;
+    private int showCloseButton;
+
+    private String title;
+    private String lbutton1;
+    private String lbutton2;
+    private String rbutton3;
+    private String rbutton4;
+    private int defaultButton;
+    private int width;
+    private int height;
+    private EventHandler onClick;
+
+    public DialogWindowBuilder(UiObject parent) {
+        this.parent = parent;
+    }
+
+    public DialogWindowBuilder modal(boolean modal) {
+        this.modal = modal ? 1 : 2; // UiTri: default, on, off
+        return this;
+    }
+
+    public DialogWindowBuilder titlebarButtons(boolean showButtons) {
+        this.titlebarButtons = showButtons ? 1 : 2;
+        return this;
+    }
+
+    public DialogWindowBuilder showCloseButton(boolean showCloseButton) {
+        this.showCloseButton = showCloseButton ? 1 : 2;
+        return this;
+    }
+
+    public DialogWindowBuilder title(String title) {
+        this.title = title;
+        return this;
+    }
+
+    public DialogWindowBuilder lbutton1(String label) {
+        this.lbutton1 = label;
+        return this;
+    }
+
+    public DialogWindowBuilder lbutton2(String label) {
+        this.lbutton2 = label;
+        return this;
+    }
+
+    public DialogWindowBuilder rbutton3(String label) {
+        this.rbutton3 = label;
+        return this;
+    }
+
+    public DialogWindowBuilder rbutton4(String label) {
+        this.rbutton4 = label;
+        return this;
+    }
+
+    public DialogWindowBuilder defaultButton(int defaultButton) {
+        this.defaultButton = defaultButton;
+        return this;
+    }
+
+    public DialogWindowBuilder width(int width) {
+        this.width = width;
+        return this;
+    }
+
+    public DialogWindowBuilder height(int height) {
+        this.height = height;
+        return this;
+    }
+
+    public DialogWindowBuilder size(int width, int height) {
+        this.width = width;
+        this.height = height;
+        return this;
+    }
+
+    public DialogWindowBuilder onClick(EventHandler onClick) {
+        this.onClick = onClick;
+        return this;
+    }
+
+    public UiObject create() {
+        ArgFuncs ui = ArgFuncs.getInstance();
+        try(Arena arena = Arena.ofConfined()) {
+            MemorySegment args = (MemorySegment) ui.dialogwindow_args_new.invoke();
+
+            ui.dialogwindow_args_set_modal.invoke(args, modal);
+            ui.dialogwindow_args_set_titlebar_buttons.invoke(args, titlebarButtons);
+            ui.dialogwindow_args_set_show_closebutton.invoke(args, showCloseButton);
+
+            if(title != null) {
+                MemorySegment cstr = arena.allocateFrom(title);
+                ui.dialogwindow_args_set_title.invoke(args, cstr);
+            }
+
+            if (lbutton1 != null) {
+                MemorySegment cstr = arena.allocateFrom(lbutton1);
+                ui.dialogwindow_args_set_lbutton1.invoke(args, cstr);
+            }
+            if (lbutton2 != null) {
+                MemorySegment cstr = arena.allocateFrom(lbutton2);
+                ui.dialogwindow_args_set_lbutton2.invoke(args, cstr);
+            }
+            if (rbutton3 != null) {
+                MemorySegment cstr = arena.allocateFrom(rbutton3);
+                ui.dialogwindow_args_set_rbutton3.invoke(args, cstr);
+            }
+            if (rbutton4 != null) {
+                MemorySegment cstr = arena.allocateFrom(rbutton4);
+                ui.dialogwindow_args_set_rbutton4.invoke(args, cstr);
+            }
+
+            ui.dialogwindow_args_set_default_button.invoke(args, defaultButton);
+            ui.dialogwindow_args_set_width.invoke(args, width);
+            ui.dialogwindow_args_set_height.invoke(args, height);
+
+            if(onClick != null) {
+                EventWrapper event = new EventWrapper(onClick);
+                ui.dialogwindow_args_set_onclick.invoke(args, event.getCallback());
+                ui.dialogwindow_args_set_onclickdata.invoke(args, event.getUserData());
+            }
+
+            UiObject obj = UiObjectFuncs.instance.dialogWindow(parent.ptr, args);
+            ui.dialogwindow_args_free.invoke(args);
+            return obj;
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
index 014e5a41caa879221ce6fcdf765e9f05456ba86c..efe702c80af01705bd5dc316da329dca8605a3d8 100644 (file)
@@ -10,22 +10,31 @@ class UiObjectFuncs {
     public MethodHandle ui_window;
     public MethodHandle ui_sidebar_window;
     public MethodHandle ui_simple_window;
+    public MethodHandle ui_dialog_window_create;
+    public MethodHandle ui_dialog_create;
+
 
     private UiObjectFuncs(Linker linker, SymbolLookup lib) {
         // void* func(void*, void*)
         FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
         // void func(void*)
         FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS);
+        // void func(void*, void*)
+        FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
 
         MemorySegment ui_show_addr = lib.find("ui_show").orElseThrow();
         MemorySegment ui_window_addr = lib.find("ui_window").orElseThrow();
         MemorySegment ui_sidebar_window_addr = lib.find("ui_sidebar_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();
 
         ui_show = linker.downcallHandle(ui_show_addr, sigv_m);
         ui_window = linker.downcallHandle(ui_window_addr, sigm_mm);
         ui_sidebar_window = linker.downcallHandle(ui_sidebar_window_addr, sigm_mm);
         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);
     }
 
     // must be called by the Toolkit constructor
@@ -65,6 +74,22 @@ class UiObjectFuncs {
         return createWindow(title, ui_sidebar_window);
     }
 
+    UiObject dialogWindow(MemorySegment parent, MemorySegment args) {
+        MemorySegment obj = null;
+        Toolkit toolkit = Toolkit.getInstance();
+        // see createWindow for details
+        toolkit.setIsObjRegEnabled(false);
+        try {
+            obj = (MemorySegment) ui_dialog_window_create.invoke(parent, args);
+        } catch (Throwable e) {
+            toolkit.setIsObjRegEnabled(true);
+            throw new RuntimeException(e);
+        }
+        toolkit.setIsObjRegEnabled(true);
+
+        return new UiObject(obj);
+    }
+
     void show(UiObject obj) {
         try {
             ui_show.invoke(obj.ptr);
index 20bfbb96cd2cb181173226bea8216a1207acfe60..d337cb31197e2cd1d69a31c8b3ca4140ba28b59c 100644 (file)
@@ -56,6 +56,9 @@ class Toplevel(obj: UiObject) {
         rowspacing: Int = -1,
         ui: ContainerUI? = null
     ): UiWidget {
+        if(fill) {
+            container.fill(true)
+        }
         if(hexpand) {
             container.hexpand(true)
         }
@@ -251,6 +254,9 @@ class Toplevel(obj: UiObject) {
             Container.vsplitview(this@Toplevel.ui)
         }
 
+        if(fill) {
+            container.fill(true)
+        }
         if(hexpand) {
             container.hexpand(true)
         }
@@ -390,7 +396,6 @@ class Toplevel(obj: UiObject) {
         ui: ContainerUI? = null
     ): UiWidget {
         val container = Container.sidebar(this@Toplevel.ui)
-
         if(margin > 0) {
             container.margin(margin)
         }
index d3fe17f137d64c575543a6db79086019f7f893bc..a1c048f1f5bb1c6af7662918ac9e31520bdf7eb2 100644 (file)
@@ -1,5 +1,8 @@
 package de.unixwork.ui.kotlin
 
+import de.unixwork.ui.Dialog
+import de.unixwork.ui.DialogWindowBuilder
+import de.unixwork.ui.EventHandler
 import de.unixwork.ui.UiObject
 
 fun window(title: String, ui: (Toplevel.() -> Unit)?): Toplevel {
@@ -22,3 +25,91 @@ fun sidebarWindow(title: String, ui: (Toplevel.() -> Unit)?): Toplevel {
     ui?.invoke(toplevel)
     return toplevel
 }
+
+fun dialog(
+    parent: UiObject,
+    title: String? = null,
+    content: String? = null,
+    button1Label: String? = null,
+    button2Label: String? = null,
+    closeButtonLabel: String? = null,
+    inputValue: String? = null,
+    input: Boolean = false,
+    password: Boolean = false,
+    result: EventHandler? = null
+) {
+    val dialog = Dialog(parent)
+    title?.let {
+        dialog.title(it)
+    }
+    content?.let {
+        dialog.content(it)
+    }
+    button1Label?.let {
+        dialog.button1Label(it)
+    }
+    button2Label?.let {
+        dialog.button2Label(it)
+    }
+    closeButtonLabel?.let {
+        dialog.closeButtonLabel(it)
+    }
+    inputValue?.let {
+        dialog.inputValue(it)
+    }
+    dialog.input(input)
+    dialog.password(password)
+    result?.let {
+        dialog.resultHandler(result)
+    }
+    dialog.show()
+}
+
+fun dialogWindow(
+    parent: UiObject,
+    modal: Boolean? = null,
+    titlebarButtons: Boolean? = null,
+    showCloseButton: Boolean? = null,
+    lbutton1: String? = null,
+    lbutton2: String? = null,
+    rbutton3: String? = null,
+    rbutton4: String? = null,
+    defaultButton: Int = 0,
+    width: Int = 0,
+    height: Int = 0,
+    onClick: EventHandler? = null,
+    ui: (Toplevel.() -> Unit)?): Toplevel
+{
+    val builder = DialogWindowBuilder(parent)
+    modal?.let {
+        builder.modal(it)
+    }
+    titlebarButtons?.let {
+        builder.titlebarButtons(it)
+    }
+    showCloseButton?.let {
+        builder.showCloseButton(it)
+    }
+    lbutton1?.let {
+        builder.lbutton1(it)
+    }
+    lbutton2?.let {
+        builder.lbutton2(it)
+    }
+    rbutton3?.let {
+        builder.rbutton3(it)
+    }
+    rbutton4?.let {
+        builder.rbutton4(it)
+    }
+    builder.defaultButton(defaultButton)
+    builder.width(width)
+    builder.height(height)
+    onClick?.let {
+        builder.onClick(it)
+    }
+
+    val toplevel = Toplevel(builder.create())
+    ui?.invoke(toplevel)
+    return toplevel
+}