]> uap-core.de Git - rssreader.git/commitdiff
add context menu builder
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 2 Sep 2025 18:54:30 +0000 (20:54 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 2 Sep 2025 18:54:30 +0000 (20:54 +0200)
ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java
ui-java/src/main/java/de/unixwork/ui/Menu.java
ui-java/src/main/java/de/unixwork/ui/TableViewBuilder.java

index b6faf6097c4e3212cb1d2b92e314a9f5a893264b..501b945566c892bc6584402070d6e68b7c560676 100644 (file)
@@ -27,9 +27,12 @@ public class ListViewBuilder<T> 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<T> extends AbstractWidgetBuilder {
         return this;
     }
 
+    public ListViewBuilder<T> contextmenu(Menu menu) {
+        this.contextMenu = menu;
+        return this;
+    }
+
     public ListViewBuilder<T> onActivate(EventHandler onActivate) {
         this.onActivate = onActivate;
         return this;
@@ -227,7 +235,23 @@ public class ListViewBuilder<T> 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);
+            }
+        }
+    }
 }
index a18dcd2cca7e7e99818813d083de40dba911f18b..152eb0771f760503f9a32b7625dca851af57b76c 100644 (file)
@@ -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);
+        }
+    }
 }
 
index 544eacc300cafa31c55f8208eea8202854f9a4c2..43684fdb299c7d113a007c4c6273fb3a8b7067cf 100644 (file)
@@ -27,11 +27,14 @@ public class TableViewBuilder<T> 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<T> extends AbstractWidgetBuilder {
         return this;
     }
 
+    public TableViewBuilder<T> contextmenu(Menu menu) {
+        this.contextMenu = menu;
+        return this;
+    }
+
     public TableViewBuilder<T> onActivate(EventHandler onActivate) {
         this.onActivate = onActivate;
         return this;
@@ -233,23 +241,23 @@ public class TableViewBuilder<T> 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);
             }
         }
-        */
     }
 }