]> uap-core.de Git - rssreader.git/commitdiff
fix sourcelist
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 13 Jul 2025 08:54:05 +0000 (10:54 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 13 Jul 2025 08:54:05 +0000 (10:54 +0200)
ui-java/src/main/java/de/unixwork/ui/ListFuncs.java
ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java
ui-java/src/main/java/de/unixwork/ui/SubList.java
ui-java/src/main/java/de/unixwork/ui/Toolkit.java
ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java
ui-java/src/test/java/de/unixwork/ui/demo/Main.java

index 0f2c1ae91cc29fcae9b16de48f535647ddf643a4..48e8b8aabcb8eae59259f6ef1eddb551b9b626c2 100644 (file)
@@ -76,7 +76,7 @@ public class ListFuncs {
         list_get_iter = linker.downcallHandle(ui_list_get_iter_addr, sigm_m);
         list_set_iter = linker.downcallHandle(ui_list_set_iter_addr, sigm_mm);
 
-        srclist_new = linker.downcallHandle(ui_srclist_new_addr, sigm_m);
+        srclist_new = linker.downcallHandle(ui_srclist_new_addr, sigm_mm);
         srclist_add = linker.downcallHandle(ui_srclist_add_addr, sigv_mm);
         srclist_insert = linker.downcallHandle(ui_srclist_insert_addr, sigv_mim);
         srclist_remove = linker.downcallHandle(ui_srclist_remove_addr, sigv_mi);
index ce55734b770aba12d248e3939647aa7d873050e0..ede0a662515a2a1f069a144ad8d45bdac4a7818f 100644 (file)
@@ -29,7 +29,7 @@ public class SourceListBuilder<T> extends AbstractWidgetBuilder {
     public SourceListBuilder(UiObject obj, MethodHandle widgetConstructor) {
         this.obj = obj;
         this.widgetConstructor = widgetConstructor;
-        this.argsFree = ArgFuncs.getInstance().list_args_free;
+        this.argsFree = ArgFuncs.getInstance().sourcelist_args_free;
     }
 
     public SourceListBuilder<T> fill(boolean fill) {
@@ -169,6 +169,8 @@ public class SourceListBuilder<T> extends AbstractWidgetBuilder {
             ui.sourcelist_args_set_getvalue_func.invoke(args, Toolkit.getInstance().sourceListGetValue);
             MemorySegment userdata = obj.registerSubListValueConverter(getvalue);
             ui.sourcelist_args_set_getvalue_userdata.invoke(args, userdata);
+        } else {
+            throw new IllegalArgumentException("getvalue must be set");
         }
 
         return args;
index f83ddf86333c3e6251df7e3d235221a59a551ee0..2acf719cc91e48703af2014f35b33b6ed0b13495 100644 (file)
@@ -22,6 +22,7 @@ public class SubList<T> {
         try(Arena arena = Arena.ofConfined()) {
             MemorySegment sublist = (MemorySegment) ui.sublist_new.invoke();
             if(value != null) {
+                MemorySegment vp = value.valuePtr;
                 ui.sublist_set_value.invoke(sublist, value.valuePtr);
             }
             if(varname != null) {
index c12ee79d3e18647d1f45a7bf4babf5337eaa0e3f..6f7fee714a70af375190d6e00994fc4e1ec28430 100644 (file)
@@ -143,6 +143,7 @@ public class Toolkit {
                     Toolkit.class,
                     "sourceListGetValue",
                     MethodType.methodType(void.class,
+                            MemorySegment.class,
                             MemorySegment.class,
                             MemorySegment.class,
                             int.class,
@@ -162,6 +163,7 @@ public class Toolkit {
             sourceListGetValue = linker.upcallStub(
                     scGetValue,
                     FunctionDescriptor.ofVoid(
+                            ValueLayout.ADDRESS,
                             ValueLayout.ADDRESS,
                             ValueLayout.ADDRESS,
                             ValueLayout.JAVA_INT,
@@ -381,22 +383,14 @@ public class Toolkit {
         if(userdata == MemorySegment.NULL) {
             return MemorySegment.NULL;
         }
+        // userdata: contains the context ptr and converter index
         userdata = userdata.reinterpret(16); // long[2]
         long ctxPtr = userdata.getAtIndex(ValueLayout.JAVA_LONG, 0);
         long converterIndex = userdata.getAtIndex(ValueLayout.JAVA_LONG, 1);
 
         ListFuncs listfuncs = ListFuncs.getInstance();
 
-        MemorySegment listdata = null; // long[2]
-        try {
-            listdata = ((MemorySegment)listfuncs.list_get_data.invoke(list)).reinterpret(16);
-        } catch (Throwable e) {
-            throw new RuntimeException(e);
-        }
-        long listCtxPtr = listdata.getAtIndex(ValueLayout.JAVA_LONG, 0);
-        long listIndex = listdata.getAtIndex(ValueLayout.JAVA_LONG, 1);
-        Context listCtx = Toolkit.getInstance().getContext(listCtxPtr);
-        UiList uilist = listCtx.getList((int)listIndex);
+        UiList uilist = Toolkit.listPtrToObject(list);
 
         Object listElm = null;
         try {
@@ -416,8 +410,8 @@ public class Toolkit {
         return MemorySegment.NULL;
     }
 
-    public static void sourceListGetValue(MemorySegment sublistData, MemorySegment rowData, int index, MemorySegment out_item, MemorySegment userdata) {
-        if(userdata == MemorySegment.NULL || sublistData == MemorySegment.NULL) {
+    public static void sourceListGetValue(MemorySegment list, MemorySegment sublistData, MemorySegment rowData, int index, MemorySegment out_item, MemorySegment userdata) {
+        if(userdata == MemorySegment.NULL || list == MemorySegment.NULL) {
             return;
         }
 
@@ -428,18 +422,7 @@ public class Toolkit {
         Context ctx = Toolkit.getInstance().getContext(ctxPtr);
         SubListValueConverter conv = ctx.getSubListValueConverter((int)converterIndex);
 
-        ListFuncs listfuncs = ListFuncs.getInstance();
-
-        MemorySegment listdata = null; // long[2]
-        try {
-            listdata = ((MemorySegment)listfuncs.list_get_data.invoke(sublistData)).reinterpret(16);
-        } catch (Throwable e) {
-            throw new RuntimeException(e);
-        }
-        long listCtxPtr = listdata.getAtIndex(ValueLayout.JAVA_LONG, 0);
-        long listIndex = listdata.getAtIndex(ValueLayout.JAVA_LONG, 1);
-        Context listCtx = Toolkit.getInstance().getContext(listCtxPtr);
-        UiList uilist = listCtx.getList((int)listIndex);
+        UiList uilist = Toolkit.listPtrToObject(list);
 
         ToolkitFuncs ui = ToolkitFuncs.getInstance();
         try(Arena arena = Arena.ofShared()) {
@@ -470,4 +453,21 @@ public class Toolkit {
 
         }
     }
+
+    // converts a C toolkit UiList* pointer to a java UiList object
+    protected static UiList listPtrToObject(MemorySegment list) {
+        ListFuncs listfuncs = ListFuncs.getInstance();
+
+        MemorySegment listdata = null; // long[2]
+        try {
+            listdata = ((MemorySegment)listfuncs.list_get_data.invoke(list)).reinterpret(16);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+
+        long listCtxPtr = listdata.getAtIndex(ValueLayout.JAVA_LONG, 0);
+        long listIndex = listdata.getAtIndex(ValueLayout.JAVA_LONG, 1);
+        Context listCtx = Toolkit.getInstance().getContext(listCtxPtr);
+        return listCtx.getList((int)listIndex);
+    }
 }
index b3d160648309308abcd7d35df609075589c5f71a..cdf81272cb32a17e7aac3f5575bd0180f3940da0 100644 (file)
@@ -60,7 +60,7 @@ public class ToolkitFuncs {
     public MethodHandle free;
 
     private ToolkitFuncs(Linker linker, SymbolLookup lib) {
-        // void* func(void*)
+        FunctionDescriptor sigm = FunctionDescriptor.of(ValueLayout.ADDRESS);
         FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
         FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS);
         FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
@@ -138,7 +138,7 @@ public class ToolkitFuncs {
         event_get_int = linker.downcallHandle(event_get_int_addr, sigi_m);
         event_get_set = linker.downcallHandle(event_get_set_addr, sigi_m);
 
-        sublist_new = linker.downcallHandle(sublist_new_addr, sigm_m);
+        sublist_new = linker.downcallHandle(sublist_new_addr, sigm);
         sublist_set_value = linker.downcallHandle(sublist_set_value_addr, sigv_mm);
         sublist_set_varname = linker.downcallHandle(sublist_set_varname_addr, sigv_mm);
         sublist_set_header = linker.downcallHandle(sublist_set_header_addr, sigv_mm);
@@ -160,7 +160,7 @@ public class ToolkitFuncs {
         range_new = linker.downcallHandle(range_new_addr, sigm_mm);
         generic_new = linker.downcallHandle(generic_new_addr, sigm_mm);
         list_new =  linker.downcallHandle(list_new_addr, sigm_mm);
-        list_new2 =  linker.downcallHandle(list_new2_addr, FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS));
+        list_new2 =  linker.downcallHandle(list_new2_addr, FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS));
 
         string_set = linker.downcallHandle(string_set_addr, sigv_mm);
         string_get = linker.downcallHandle(string_get_addr, sigm_m);
index 7ee6b525c438292b3811a76ba816e408d873b47e..19f453c322f6ccce60ba7ca5e4fe3286104def44 100644 (file)
@@ -22,8 +22,24 @@ public class Main implements Application{
         mylist.add("Test3");
         mylist.add("Test4");
 
-        MyDocument doc = new MyDocument();
+        UiSourceList src = window.sourcelist("src");
+        UiList<String> sublist1 = window.list();
+        sublist1.add("Item 1");
+        sublist1.add("Item 2");
+        sublist1.add("Item 3");
+        SubList<String> sub = new SubList<>();
+        sub.setValue(sublist1);
+        sub.setHeader("Header");
+        src.add(sub);
 
+        //MyDocument doc = new MyDocument();
+
+        ListView.<String>sourcelist(window).dynamicSublists(src).fill(true).getvalue((elm) -> {
+            return new SubListItem(elm);
+        }).create();
+
+
+        /*
         Button.button(window).label("Click Me").onClick(event -> {
             System.out.println("Clicked");
         }).create();
@@ -42,6 +58,7 @@ public class Main implements Application{
                 }).create();
             });
         }
+        */
 
         window.show();
     }