From: Olaf Wintermann Date: Sun, 13 Jul 2025 08:54:05 +0000 (+0200) Subject: fix sourcelist X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=5bc0b33e5dea1e560d711b0cba712953cddc4d91;p=rssreader.git fix sourcelist --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java index 0f2c1ae..48e8b8a 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java @@ -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); diff --git a/ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java b/ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java index ce55734..ede0a66 100644 --- a/ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java @@ -29,7 +29,7 @@ public class SourceListBuilder 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 fill(boolean fill) { @@ -169,6 +169,8 @@ public class SourceListBuilder 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; diff --git a/ui-java/src/main/java/de/unixwork/ui/SubList.java b/ui-java/src/main/java/de/unixwork/ui/SubList.java index f83ddf8..2acf719 100644 --- a/ui-java/src/main/java/de/unixwork/ui/SubList.java +++ b/ui-java/src/main/java/de/unixwork/ui/SubList.java @@ -22,6 +22,7 @@ public class SubList { 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) { diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java index c12ee79..6f7fee7 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -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); + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java index b3d1606..cdf8127 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -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); 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 7ee6b52..19f453c 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 @@ -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 sublist1 = window.list(); + sublist1.add("Item 1"); + sublist1.add("Item 2"); + sublist1.add("Item 3"); + SubList sub = new SubList<>(); + sub.setValue(sublist1); + sub.setHeader("Header"); + src.add(sub); + //MyDocument doc = new MyDocument(); + + ListView.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(); }