]> uap-core.de Git - rssreader.git/commitdiff
make sourcelist headers selectable
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 18 Oct 2025 10:43:57 +0000 (12:43 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 18 Oct 2025 10:43:57 +0000 (12:43 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt
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/SubListValueConverter.java
ui-java/src/main/java/de/unixwork/ui/Toolkit.java
ui-java/src/main/java/de/unixwork/ui/UiSourceList.java
ui-java/src/test/java/de/unixwork/ui/demo/Main.java
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt

index 43cd8c134de1d1ce6142cfa0e207074e3dc70b9e..7fd27916038b2c2627f7a0bd933b963ca75670c5 100644 (file)
@@ -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
                     }
index ca9cb08ac97e2d1a28efaae26568f36043292fbf..f0ae1df504d669c1a341a0d4015076cb9bac8caa 100644 (file)
@@ -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);
index 54d2e366ec1252667ee230c12945482c41b8f80c..e83d88538c987e184c2bb37c3251eefae9813bf4 100644 (file)
@@ -22,6 +22,7 @@ public class SourceListBuilder<T> extends AbstractWidgetBuilder {
     private String name;
     private String styleClass;
     private Menu contextMenu;
+    private boolean headerIsItem;
     private int[] states;
 
     private List<SubList> sublists;
@@ -155,6 +156,11 @@ public class SourceListBuilder<T> extends AbstractWidgetBuilder {
         return this;
     }
 
+    public SourceListBuilder<T> 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<T> 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;
     }
index 615ada06cd783e4810e87fc6d356bb848f6046c4..890e9326028ae2f95122d8368884e3e827f312f9 100644 (file)
@@ -2,5 +2,5 @@ package de.unixwork.ui;
 
 @FunctionalInterface
 public interface SubListValueConverter<T> {
-    public SubListItem getValue(T elm);
+    public SubListItem getValue(T elm, int index, int sublistIndex);
 }
index 23742e4a6cfc97e47e75b2369e82989639e267db..7591882f724643a65cee8a4ffe9c4b29c538ce31 100644 (file)
@@ -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();
         }
     }
 
index a5cf117fcd7703146d5e7640e6008e578e632fd7..e5b714d7a1bd7bf87776ca150548fa7373f56e32 100644 (file)
@@ -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);
         }
index 9c7b9599ab01afe8b15aa934497b01b390295086..f58d3690112e7287f81250aed503fcf670808001 100644 (file)
@@ -34,7 +34,7 @@ public class Main implements Application{
 
         //MyDocument doc = new MyDocument();
 
-        ListView.<String>sourcelist(window).dynamicSublists(src).fill(true).getvalue((elm) -> {
+        ListView.<String>sourcelist(window).dynamicSublists(src).fill(true).getvalue((elm, i, sublist) -> {
             return new SubListItem(elm);
         }).onActivate((event -> {
             SubListEventData data = event.getSubListEventData();
index ca8e5525a8c8fd0fca16142235637d22d73942b4..130ad5b2d48ba99996333ae6bc35391022087350 100644 (file)
@@ -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<T>? = null
@@ -1793,6 +1794,9 @@ class Toplevel(obj: UiObject) {
         contextmenu?.let {
             list.contextmenu(it)
         }
+        if(headerIsItem) {
+            list.headerIsItem(true)
+        }
         onActivate?.let {
             list.onActivate(it)
         }