From fc73cb1fdd9b0c559cc6ee6861e0abc4e09f586d Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sat, 23 Aug 2025 19:13:05 +0200 Subject: [PATCH] add UiLinkData wrapper --- .../kotlin/de/unixwork/rssreader/FeedList.kt | 6 ++- .../de/unixwork/rssreader/MainWindow.kt | 2 +- .../main/java/de/unixwork/ui/ButtonFuncs.java | 17 +++++++ .../de/unixwork/ui/LinkButtonBuilder.java | 2 +- .../main/java/de/unixwork/ui/UiLinkData.java | 47 +++++++++++++++++++ 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 ui-java/src/main/java/de/unixwork/ui/UiLinkData.java diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt index 1010254..2e5e498 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt @@ -1,12 +1,14 @@ package de.unixwork.rssreader import de.unixwork.ui.Document +import de.unixwork.ui.UiLinkData class FeedList : Document() { val items = list("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 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 dac0607..66a7a75 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -77,7 +77,7 @@ class MainWindow { } row { rlabel("Link:", hfill = true) - llabel(varname = "link") + linkbutton(varname = "link") } row { diff --git a/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java index 04a3301..989ccf0 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java @@ -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() { diff --git a/ui-java/src/main/java/de/unixwork/ui/LinkButtonBuilder.java b/ui-java/src/main/java/de/unixwork/ui/LinkButtonBuilder.java index f20174d..17e0af6 100644 --- a/ui-java/src/main/java/de/unixwork/ui/LinkButtonBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/LinkButtonBuilder.java @@ -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 index 0000000..05db843 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/UiLinkData.java @@ -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); + } + } +} -- 2.47.3