]> uap-core.de Git - rssreader.git/commitdiff
add Toolbar
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 7 Jul 2025 18:57:25 +0000 (20:57 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 7 Jul 2025 18:57:25 +0000 (20:57 +0200)
ui-java/src/main/java/de/unixwork/ui/MenuFuncs.java
ui-java/src/main/java/de/unixwork/ui/Toolbar.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/ToolbarPosition.java [new file with mode: 0644]
ui-java/src/test/java/de/unixwork/ui/demo/Main.java

index c4ce98b6613883c9af3d8f495f90dbac7cc72f4c..0894ed409619de13580ec5e3cd00614df422dfa3 100644 (file)
@@ -17,9 +17,18 @@ public class MenuFuncs {
     public MethodHandle menu_separator;
     public MethodHandle menu_itemlist_create;
 
+    public MethodHandle toolbar_item_create;
+    public MethodHandle toolbar_toggleitem_create;
+    public MethodHandle toolbar_menu_create;
+    public MethodHandle toolbar_add_default;
+
     private MenuFuncs(Linker linker, SymbolLookup lib) {
         // void func(void*)
         FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS);
+        // void func(void*, void*)
+        FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+        // void func(void*, int)
+        FunctionDescriptor sigv_mi = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_INT);
         // void func()
         FunctionDescriptor sigv = FunctionDescriptor.ofVoid();
         // int func()
@@ -36,6 +45,11 @@ public class MenuFuncs {
         MemorySegment ui_menu_separator_addr = lib.find("ui_menuseparator").orElseThrow();
         MemorySegment ui_menu_itemlist_create_addr = lib.find("ui_menu_itemlist_create").orElseThrow();
 
+        MemorySegment ui_toolbar_item_create_addr = lib.find("ui_toolbar_item_create").orElseThrow();
+        MemorySegment ui_toolbar_toggleitem_create_addr = lib.find("ui_toolbar_toggleitem_create").orElseThrow();
+        MemorySegment ui_toolbar_menu_create_addr = lib.find("ui_toolbar_menu_create").orElseThrow();
+        MemorySegment ui_toolbar_add_default_addr = lib.find("ui_toolbar_add_default").orElseThrow();
+
         menu_end = linker.downcallHandle(ui_menu_end_addr, sigv);
         menu_close = linker.downcallHandle(ui_menu_close_addr, sigv);
         menu_is_open = linker.downcallHandle(ui_menu_is_open_addr, sigi);
@@ -46,6 +60,11 @@ public class MenuFuncs {
         menu_radioitem_create = linker.downcallHandle(ui_menu_radioitem_create_addr, sigv_m);
         menu_separator = linker.downcallHandle(ui_menu_separator_addr, sigv);
         menu_itemlist_create = linker.downcallHandle(ui_menu_itemlist_create_addr, sigv_m);
+
+        toolbar_item_create = linker.downcallHandle(ui_toolbar_item_create_addr, sigv_mm);
+        toolbar_toggleitem_create = linker.downcallHandle(ui_toolbar_toggleitem_create_addr, sigv_mm);
+        toolbar_menu_create = linker.downcallHandle(ui_toolbar_menu_create_addr, sigv_mm);
+        toolbar_add_default = linker.downcallHandle(ui_toolbar_add_default_addr, sigv_mi);
     }
 
     static MenuFuncs getInstance() {
diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolbar.java b/ui-java/src/main/java/de/unixwork/ui/Toolbar.java
new file mode 100644 (file)
index 0000000..6f7795d
--- /dev/null
@@ -0,0 +1,57 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+
+public class Toolbar {
+    public static void iconItem(String name, String icon, EventHandler onClick) {
+        item(name, null, icon, onClick);
+    }
+
+    public static void item(String name, String label, EventHandler onClick) {
+        item(name, label, null, onClick);
+    }
+
+    public static void item(String name, String label, String icon, EventHandler onClick) {
+        MenuFuncs ui = MenuFuncs.getInstance();
+        ArgFuncs a = ArgFuncs.getInstance();
+        Toolkit toolkit = Toolkit.getInstance();
+        Arena arena = toolkit.getStaticArena();
+        try {
+            MemorySegment args = (MemorySegment) a.toolbar_item_args_new.invoke();
+            if(label != null) {
+                MemorySegment cstr = arena.allocateFrom(label);
+                a.toolbar_item_args_set_label.invoke(args, cstr);
+            }
+            if(icon != null) {
+                MemorySegment cstr = arena.allocateFrom(icon);
+                a.toolbar_item_args_set_icon.invoke(args, cstr);
+            }
+            if(onClick != null) {
+                EventWrapper event = new EventWrapper(onClick);
+
+                // set toolkit args
+                a.toolbar_item_args_set_onclick.invoke(args, event.getCallback());
+                a.toolbar_item_args_set_onclickdata.invoke(args, event.getUserData());
+            }
+            MemorySegment itemName = arena.allocateFrom(name);
+            ui.toolbar_item_create.invoke(itemName, args);
+            a.toolbar_item_args_free.invoke(args);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void addDefault(String name, ToolbarPosition position) {
+        int pos = position.ordinal();
+
+        MenuFuncs ui = MenuFuncs.getInstance();
+        Toolkit toolkit = Toolkit.getInstance();
+        try (Arena arena = Arena.ofConfined()) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.toolbar_add_default.invoke(cstr, pos);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/ToolbarPosition.java b/ui-java/src/main/java/de/unixwork/ui/ToolbarPosition.java
new file mode 100644 (file)
index 0000000..069ed6d
--- /dev/null
@@ -0,0 +1,7 @@
+package de.unixwork.ui;
+
+public enum ToolbarPosition {
+    LEFT,
+    CENTER,
+    RIGHT
+}
index 60bc75d44a4eddb381698e9c77a0f1fe0ab47082..7ee6b525c438292b3811a76ba816e408d873b47e 100644 (file)
@@ -60,6 +60,11 @@ public class Main implements Application{
             });
         });
 
+        Toolbar.item("open", "Open", event -> {
+            System.out.println("Toolbar Open");
+        });
+        Toolbar.addDefault("open", ToolbarPosition.LEFT);
+
         Toolkit.runApplication(new Main());
     }
 }