From: Olaf Wintermann Date: Tue, 2 Sep 2025 18:54:30 +0000 (+0200) Subject: add context menu builder X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=d656f712eca0fc8a627e6b6dc22fa2f83d2fc2f4;p=rssreader.git add context menu builder --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java index b6faf60..501b945 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java @@ -27,9 +27,12 @@ public class ListViewBuilder extends AbstractWidgetBuilder { private EventHandler onDragComplete; private EventHandler onDrop; private boolean multiselection; + private Menu contextMenu; // TODO: contextmenu private int[] states; + MemorySegment menuBuilder; + public ListViewBuilder(UiObject obj, MethodHandle widgetConstructor) { this.obj = obj; this.widgetConstructor = widgetConstructor; @@ -107,6 +110,11 @@ public class ListViewBuilder extends AbstractWidgetBuilder { return this; } + public ListViewBuilder contextmenu(Menu menu) { + this.contextMenu = menu; + return this; + } + public ListViewBuilder onActivate(EventHandler onActivate) { this.onActivate = onActivate; return this; @@ -227,7 +235,23 @@ public class ListViewBuilder extends AbstractWidgetBuilder { ui.list_args_set_ondrop.invoke(args, event.getCallback()); ui.list_args_set_ondropdata.invoke(args, event.getUserData()); } + if (contextMenu != null) { + menuBuilder = contextMenu.createMenuBuilder(); + ui.list_args_set_contextmenu.invoke(args, menuBuilder); + } return args; } + + void freeArgs() { + super.freeArgs(); + if(menuBuilder != null) { + MenuFuncs ui = MenuFuncs.getInstance(); + try { + ui.menubuilder_free.invoke(menuBuilder); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/Menu.java b/ui-java/src/main/java/de/unixwork/ui/Menu.java index a18dcd2..152eb07 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Menu.java +++ b/ui-java/src/main/java/de/unixwork/ui/Menu.java @@ -2,6 +2,7 @@ package de.unixwork.ui; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; +import java.lang.foreign.ValueLayout; import java.util.LinkedList; public class Menu extends MenuElement { @@ -44,5 +45,22 @@ public class Menu extends MenuElement { } } } + + protected MemorySegment createMenuBuilder() { + MenuFuncs ui = MenuFuncs.getInstance(); + + try(Arena arena = Arena.ofConfined()) { + MemorySegment menuBuilderPtr = arena.allocate(ValueLayout.JAVA_LONG, 1); + ui.contextmenu_builder.invoke(menuBuilderPtr); + MemorySegment menuBuilder = MemorySegment.ofAddress(menuBuilderPtr.get(ValueLayout.JAVA_LONG, 0)); + for(var item : items) { + item.create(); + } + ui.menu_end.invoke(); + return menuBuilder; + } catch (Throwable e) { + throw new RuntimeException(e); + } + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/TableViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TableViewBuilder.java index 544eacc..43684fd 100644 --- a/ui-java/src/main/java/de/unixwork/ui/TableViewBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/TableViewBuilder.java @@ -27,11 +27,14 @@ public class TableViewBuilder extends AbstractWidgetBuilder { private EventHandler onDragComplete; private EventHandler onDrop; private boolean multiselection; + private Menu contextMenu; // TODO: contextmenu private int[] states; private MemorySegment modelPtr; + MemorySegment menuBuilder; + public TableViewBuilder(UiObject obj, MethodHandle widgetConstructor) { this.obj = obj; this.widgetConstructor = widgetConstructor; @@ -114,6 +117,11 @@ public class TableViewBuilder extends AbstractWidgetBuilder { return this; } + public TableViewBuilder contextmenu(Menu menu) { + this.contextMenu = menu; + return this; + } + public TableViewBuilder onActivate(EventHandler onActivate) { this.onActivate = onActivate; return this; @@ -233,23 +241,23 @@ public class TableViewBuilder extends AbstractWidgetBuilder { ui.list_args_set_ondrop.invoke(args, event.getCallback()); ui.list_args_set_ondropdata.invoke(args, event.getUserData()); } + if (contextMenu != null) { + menuBuilder = contextMenu.createMenuBuilder(); + ui.list_args_set_contextmenu.invoke(args, menuBuilder); + } return args; } void freeArgs() { super.freeArgs(); - // currently, ui_table_create does not copy the model - // therefore we can't free it here - /* - ToolkitFuncs ui = ToolkitFuncs.getInstance(); - if(model != null) { + if(menuBuilder != null) { + MenuFuncs ui = MenuFuncs.getInstance(); try { - ui.model_free.invoke(obj.getCtx(), modelPtr); + ui.menubuilder_free.invoke(menuBuilder); } catch (Throwable e) { throw new RuntimeException(e); } } - */ } }