From: Olaf Wintermann Date: Sat, 18 Oct 2025 10:43:57 +0000 (+0200) Subject: make sourcelist headers selectable X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=d512a97e31a5b0a250df7c0f5e889dc2840a60be;p=rssreader.git make sourcelist headers selectable --- diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt index 43cd8c1..7fd2791 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -44,10 +44,14 @@ class MainWindow() { sourcelist( fill = true, varname = "feeds", + headerIsItem = true, onActivate = { event -> val evt = event.subListEventData currentSublistIndex = evt.sublistIndex currentFeedIndex = evt.rowIndex + if(evt.rowIndex == -1) { + return@sourcelist + } try { val feed = sourceList.groups[evt.sublistIndex].feeds[evt.rowIndex] feed?.let { @@ -64,11 +68,13 @@ class MainWindow() { } } ) - { elm: FeedCollection -> + { elm: FeedCollection?, i, sublist -> val item = SubListItem() - item.label = elm.name - if(elm.unreadItemsCount > 0 && elm.itemStateMode != 2) { - item.badge = elm.unreadItemsCount.toString() + elm?.let { + item.label = it.name + if(it.unreadItemsCount > 0 && it.itemStateMode != 2) { + item.badge = it.unreadItemsCount.toString() + } } item } 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 ca9cb08..f0ae1df 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java @@ -32,6 +32,7 @@ public class ListFuncs { public MethodHandle srclist_remove; public MethodHandle srclist_clear; public MethodHandle srclist_size; + public MethodHandle srclist_generate_sublist_num_data; public MethodHandle listview_create; public MethodHandle table_create; @@ -75,6 +76,7 @@ public class ListFuncs { MemorySegment ui_srclist_remove_addr = lib.find("ui_srclist_remove").orElseThrow(); MemorySegment ui_srclist_clear_addr = lib.find("ui_srclist_clear").orElseThrow(); MemorySegment ui_srclist_size_addr = lib.find("ui_srclist_size").orElseThrow(); + MemorySegment ui_srclist_generate_sublist_num_data_addr = lib.find("ui_srclist_generate_sublist_num_data").orElseThrow(); MemorySegment ui_listview_create_addr = lib.find("ui_listview_create").orElseThrow(); MemorySegment ui_table_create_addr = lib.find("ui_table_create").orElseThrow(); @@ -107,6 +109,7 @@ public class ListFuncs { srclist_remove = linker.downcallHandle(ui_srclist_remove_addr, sigv_mi); srclist_clear = linker.downcallHandle(ui_srclist_remove_addr, sigv_m); srclist_size = linker.downcallHandle(ui_srclist_size_addr, sigi_m); + srclist_generate_sublist_num_data = linker.downcallHandle(ui_srclist_generate_sublist_num_data_addr, sigv_m); listview_create = linker.downcallHandle(ui_listview_create_addr, sigm_mm); table_create = linker.downcallHandle(ui_table_create_addr, sigm_mm); 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 54d2e36..e83d885 100644 --- a/ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java @@ -22,6 +22,7 @@ public class SourceListBuilder extends AbstractWidgetBuilder { private String name; private String styleClass; private Menu contextMenu; + private boolean headerIsItem; private int[] states; private List sublists; @@ -155,6 +156,11 @@ public class SourceListBuilder extends AbstractWidgetBuilder { return this; } + public SourceListBuilder headerIsItem(boolean headerIsItem) { + this.headerIsItem = headerIsItem; + return this; + } + public MemorySegment createArgs(Arena arena) throws Throwable { ArgFuncs ui = ArgFuncs.getInstance(); @@ -240,6 +246,9 @@ public class SourceListBuilder extends AbstractWidgetBuilder { menuBuilder = contextMenu.createMenuBuilder(); ui.sourcelist_args_set_contextmenu.invoke(args, menuBuilder); } + if (headerIsItem) { + ui.sourcelist_args_set_header_is_item.invoke(args, headerIsItem); + } return args; } diff --git a/ui-java/src/main/java/de/unixwork/ui/SubListValueConverter.java b/ui-java/src/main/java/de/unixwork/ui/SubListValueConverter.java index 615ada0..890e932 100644 --- a/ui-java/src/main/java/de/unixwork/ui/SubListValueConverter.java +++ b/ui-java/src/main/java/de/unixwork/ui/SubListValueConverter.java @@ -2,5 +2,5 @@ package de.unixwork.ui; @FunctionalInterface public interface SubListValueConverter { - public SubListItem getValue(T elm); + public SubListItem getValue(T elm, int index, int sublistIndex); } 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 23742e4..7591882 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -582,6 +582,8 @@ public class Toolkit { return; } + int sublistIndex = (int)sublistData.address(); + userdata = userdata.reinterpret(16); // long[2] long ctxPtr = userdata.getAtIndex(ValueLayout.JAVA_LONG, 0); long converterIndex = userdata.getAtIndex(ValueLayout.JAVA_LONG, 1); @@ -594,8 +596,8 @@ public class Toolkit { ToolkitFuncs ui = ToolkitFuncs.getInstance(); try(Arena arena = Arena.ofShared()) { - Object listElm = uilist.get((int) index); - SubListItem item = conv.getValue(listElm); + Object listElm = index >= 0 ? uilist.get((int) index) : null; + SubListItem item = conv.getValue(listElm, index, sublistIndex); if(item.icon != null) { MemorySegment cstr = arena.allocateFrom(item.icon); @@ -636,7 +638,7 @@ public class Toolkit { ui.sublist_item_set_badge.invoke(out_item, cstr); } } catch (Throwable e) { - + e.printStackTrace(); } } diff --git a/ui-java/src/main/java/de/unixwork/ui/UiSourceList.java b/ui-java/src/main/java/de/unixwork/ui/UiSourceList.java index a5cf117..e5b714d 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiSourceList.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiSourceList.java @@ -35,6 +35,7 @@ public class UiSourceList { ListFuncs ui = ListFuncs.getInstance(); try { ui.srclist_add.invoke(valuePtr, sublist.createToolkitSublist()); + ui.srclist_generate_sublist_num_data.invoke(valuePtr); } catch (Throwable e) { throw new RuntimeException(e); } @@ -45,6 +46,7 @@ public class UiSourceList { ListFuncs ui = ListFuncs.getInstance(); try { ui.srclist_insert.invoke(valuePtr, index, sublist.createToolkitSublist()); + ui.srclist_generate_sublist_num_data.invoke(valuePtr); } catch (Throwable e) { throw new RuntimeException(e); } @@ -64,6 +66,7 @@ public class UiSourceList { try { list.remove(index); ui.srclist_remove.invoke(valuePtr, index); + ui.srclist_generate_sublist_num_data.invoke(valuePtr); } catch (Throwable e) { throw new RuntimeException(e); } 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 9c7b959..f58d369 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 @@ -34,7 +34,7 @@ public class Main implements Application{ //MyDocument doc = new MyDocument(); - ListView.sourcelist(window).dynamicSublists(src).fill(true).getvalue((elm) -> { + ListView.sourcelist(window).dynamicSublists(src).fill(true).getvalue((elm, i, sublist) -> { return new SubListItem(elm); }).onActivate((event -> { SubListEventData data = event.getSubListEventData(); diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt index ca8e552..130ad5b 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt @@ -1734,6 +1734,7 @@ class Toplevel(obj: UiObject) { name: String? = null, styleClass: String? = null, contextmenu: Menu? = null, + headerIsItem: Boolean = false, onActivate: EventHandler? = null, onButtonClick: EventHandler? = null, getvalue: SubListValueConverter? = null @@ -1793,6 +1794,9 @@ class Toplevel(obj: UiObject) { contextmenu?.let { list.contextmenu(it) } + if(headerIsItem) { + list.headerIsItem(true) + } onActivate?.let { list.onActivate(it) }