]> uap-core.de Git - rssreader.git/commitdiff
add UiLinkData wrapper
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 23 Aug 2025 17:13:05 +0000 (19:13 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 23 Aug 2025 17:13:05 +0000 (19:13 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt
ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java
ui-java/src/main/java/de/unixwork/ui/LinkButtonBuilder.java
ui-java/src/main/java/de/unixwork/ui/UiLinkData.java [new file with mode: 0644]

index 1010254123ac7b3a42a43d124b0c88262d507811..2e5e498f79271e5ec2598f16c72038bd420545d0 100644 (file)
@@ -1,12 +1,14 @@
 package de.unixwork.rssreader
 
 import de.unixwork.ui.Document
+import de.unixwork.ui.UiLinkData
 
 class FeedList : Document() {
     val items = list<Item>("items")
     val feedName = string("feedname")
     val author = string("author")
-    val link = string("link")
+    val linkstr = string("link")
+    val link = UiLinkData(linkstr)
     val webview = webview("webview")
 
     fun loadFeed(feed: FeedCollection) {
@@ -24,7 +26,7 @@ class FeedList : Document() {
     fun selectItem(item: Item) {
         feedName.setString(item.feedName)
         author.setString(item.author)
-        link.setString(item.link)
+        link.set(item.link, item.link)
         webview.loadContent(null, item.content ?: "", "text/html", "utf-8")
     }
 }
\ No newline at end of file
index dac0607f73c8bf0b74c178f895a0e5123d38811b..66a7a75ae698bc4826c6729875de489b3406e726 100644 (file)
@@ -77,7 +77,7 @@ class MainWindow {
                     }
                     row {
                         rlabel("Link:", hfill = true)
-                        llabel(varname = "link")
+                        linkbutton(varname = "link")
                     }
 
                     row {
index 04a3301ee134ddecac9e4b6f35fbfac972965ed6..989ccf0cdc7527ba62ff1af744278defe571e840 100644 (file)
@@ -14,9 +14,16 @@ public class ButtonFuncs {
     public MethodHandle radiobutton_create;
     public MethodHandle linkbutton_create;
 
+    public MethodHandle linkbutton_value_set;
+    public MethodHandle linkbutton_value_set_label;
+    public MethodHandle linkbutton_value_set_uri;
+    public MethodHandle linkbutton_value_set_visited;
+
     private ButtonFuncs(Linker linker, SymbolLookup lib) {
         // void* func(void*, void*)
         FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+        FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+        FunctionDescriptor sigv_mb = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_BOOLEAN);
 
         MemorySegment ui_button_create_addr = lib.find("ui_button_create").orElseThrow();
         MemorySegment ui_togglebutton_create_addr = lib.find("ui_togglebutton_create").orElseThrow();
@@ -25,12 +32,22 @@ public class ButtonFuncs {
         MemorySegment ui_radiobutton_create_addr = lib.find("ui_radiobutton_create").orElseThrow();
         MemorySegment ui_linkbutton_create_addr = lib.find("ui_linkbutton_create").orElseThrow();
 
+        MemorySegment ui_linkbutton_value_set_addr = lib.find("ui_linkbutton_value_set").orElseThrow();
+        MemorySegment ui_linkbutton_value_set_label_addr = lib.find("ui_linkbutton_value_set_label").orElseThrow();
+        MemorySegment ui_linkbutton_value_set_uri_addr = lib.find("ui_linkbutton_value_set_uri").orElseThrow();
+        MemorySegment ui_linkbutton_value_set_visited_addr = lib.find("ui_linkbutton_value_set_visited").orElseThrow();
+
         button_create = linker.downcallHandle(ui_button_create_addr, sigm_mm);
         togglebutton_create = linker.downcallHandle(ui_togglebutton_create_addr, sigm_mm);
         checkbox_create = linker.downcallHandle(ui_checkbox_create_addr, sigm_mm);
         switch_create = linker.downcallHandle(ui_switch_create_addr, sigm_mm);
         radiobutton_create = linker.downcallHandle(ui_radiobutton_create_addr, sigm_mm);
         linkbutton_create = linker.downcallHandle(ui_linkbutton_create_addr, sigm_mm);
+
+        linkbutton_value_set = linker.downcallHandle(ui_linkbutton_value_set_addr, sigv_mm);
+        linkbutton_value_set_label = linker.downcallHandle(ui_linkbutton_value_set_label_addr, sigv_mm);
+        linkbutton_value_set_uri = linker.downcallHandle(ui_linkbutton_value_set_uri_addr, sigv_mm);
+        linkbutton_value_set_visited = linker.downcallHandle(ui_linkbutton_value_set_visited_addr, sigv_mb);
     }
 
     static ButtonFuncs getInstance() {
index f20174dec6acf95050ecb60a7a7d6674ca6b3a49..17e0af656e9b8c6b6a161772855ad595b6c04b3e 100644 (file)
@@ -25,7 +25,7 @@ public class LinkButtonBuilder extends AbstractWidgetBuilder {
     private String varname;
     private UiString value;
     private boolean nofollow;
-    private c type;
+    private LinkButtonType type;
     private int[] states;
 
     public LinkButtonBuilder(UiObject obj, MethodHandle widgetConstructor) {
diff --git a/ui-java/src/main/java/de/unixwork/ui/UiLinkData.java b/ui-java/src/main/java/de/unixwork/ui/UiLinkData.java
new file mode 100644 (file)
index 0000000..05db843
--- /dev/null
@@ -0,0 +1,47 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+
+public class UiLinkData {
+    private UiString value;
+
+    public UiLinkData(UiString value) {
+        this.value = value;
+    }
+
+    public UiString getValue() {
+        return value;
+    }
+
+    public void set(String label, String uri) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        try (Arena arena = Arena.ofConfined()) {
+            MemorySegment labelCstr = arena.allocateFrom(label);
+            MemorySegment uriCstr = arena.allocateFrom(uri);
+            ui.linkbutton_value_set.invoke(value.valuePtr, labelCstr, uriCstr);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void setLabel(String label) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        try (Arena arena = Arena.ofConfined()) {
+            MemorySegment cstr = arena.allocateFrom(label);
+            ui.linkbutton_value_set_label.invoke(value.valuePtr, cstr);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void setUri(String uri) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        try (Arena arena = Arena.ofConfined()) {
+            MemorySegment cstr = arena.allocateFrom(uri);
+            ui.linkbutton_value_set_uri.invoke(value.valuePtr, cstr);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+}