From: Olaf Wintermann Date: Mon, 7 Jul 2025 18:57:25 +0000 (+0200) Subject: add Toolbar X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=325d421d89156d9655eeaca291a7030e71e4977e;p=rssreader.git add Toolbar --- diff --git a/ui-java/src/main/java/de/unixwork/ui/MenuFuncs.java b/ui-java/src/main/java/de/unixwork/ui/MenuFuncs.java index c4ce98b..0894ed4 100644 --- a/ui-java/src/main/java/de/unixwork/ui/MenuFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/MenuFuncs.java @@ -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 index 0000000..6f7795d --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/Toolbar.java @@ -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 index 0000000..069ed6d --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/ToolbarPosition.java @@ -0,0 +1,7 @@ +package de.unixwork.ui; + +public enum ToolbarPosition { + LEFT, + CENTER, + RIGHT +} diff --git a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java index 60bc75d..7ee6b52 100644 --- a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java +++ b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java @@ -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()); } }