From 31fa75d37cba3f699102291fb52260ea6065ce49 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 29 Aug 2025 19:59:26 +0200 Subject: [PATCH] hide item viewer controls when no item is selected --- .../kotlin/de/unixwork/rssreader/FeedList.kt | 3 ++ .../de/unixwork/rssreader/MainWindow.kt | 39 ++++++++++++------- .../main/java/de/unixwork/ui/Container.java | 17 ++++++++ .../java/de/unixwork/ui/ContainerFuncs.java | 4 ++ .../kotlin/de/unixwork/ui/kotlin/Toplevel.kt | 8 ++++ 5 files changed, 57 insertions(+), 14 deletions(-) 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 211ab59..31cc8d7 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt @@ -10,6 +10,7 @@ class FeedList : Document() { val linkstr = string("link") val link = UiLinkData(linkstr) val webview = webview("webview") + val tabview = integer("tabview") var currentFeed: FeedCollection? = null @@ -52,5 +53,7 @@ class FeedList : Document() { } webview.loadContent(null, content, mimeType, "utf-8") + + tabview.setIntValue(1) } } \ 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 ec30864..4cc0abc 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -2,6 +2,7 @@ package de.unixwork.rssreader import de.unixwork.ui.ColumnType import de.unixwork.ui.SubListItem +import de.unixwork.ui.TabViewType import de.unixwork.ui.TableModel import de.unixwork.ui.UiList import de.unixwork.ui.UiString @@ -83,22 +84,32 @@ class MainWindow { } } - grid(fill = true, columnspacing = 8, rowspacing = 8, margin = 8, defvfill = true) { - row { - rlabel("Feed:", hfill = true) - llabel(varname = "feedname", hexpand = true) - } - row { - rlabel("Author:", hfill = true) - llabel(varname = "author") - } - row { - rlabel("Link:", hfill = true) - linkbutton(varname = "link", styleClass = "ui-nopadding"); + tabview(fill = true, varname = "tabview", type = TabViewType.INVISIBLE) { + tab { + // Completely empty tab, we don't want any visible UI elements + // when no feed item is selected. + // As an alternative to using a tabview, we could use a + // visibility state for the grid container } + tab { + grid(fill = true, columnspacing = 8, rowspacing = 8, margin = 8, defvfill = true) { + row { + rlabel("Feed:", hfill = true) + llabel(varname = "feedname", hexpand = true) + } + row { + rlabel("Author:", hfill = true) + llabel(varname = "author") + } + row { + rlabel("Link:", hfill = true) + linkbutton(varname = "link", styleClass = "ui-nopadding"); + } - row { - webview(varname = "webview", hfill = true, vfill = true, hexpand = true, vexpand = true, colspan = 2) + row { + webview(varname = "webview", hfill = true, vfill = true, hexpand = true, vexpand = true, colspan = 2) + } + } } } } diff --git a/ui-java/src/main/java/de/unixwork/ui/Container.java b/ui-java/src/main/java/de/unixwork/ui/Container.java index 5468445..247ffef 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Container.java +++ b/ui-java/src/main/java/de/unixwork/ui/Container.java @@ -1,5 +1,8 @@ package de.unixwork.ui; +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; + public class Container implements AutoCloseable { private UiObject object; private UiWidget widget; @@ -57,6 +60,20 @@ public class Container implements AutoCloseable { } } + public static Container tab(UiObject obj, String label) { + ContainerFuncs ui = ContainerFuncs.getInstance(); + try (Arena arena = Arena.ofConfined()) { + MemorySegment cstr = MemorySegment.NULL; + if(label != null) { + cstr = arena.allocateFrom(label); + } + ui.tab_create.invoke(obj.ptr, cstr); + } catch (Throwable e) { + throw new RuntimeException(e); + } + return new Container(obj, null); + } + public static FrameBuilder frame(UiObject obj) { ContainerFuncs ui = ContainerFuncs.getInstance(); return new FrameBuilder(obj, ui.frame_create); diff --git a/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java index d16cc6f..d2b9e4f 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ContainerFuncs.java @@ -23,12 +23,14 @@ public class ContainerFuncs { public MethodHandle container_finish; public MethodHandle newline; + public MethodHandle tab_create; private ContainerFuncs(Linker linker, SymbolLookup lib) { FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS); FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS); + FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS); MemorySegment ui_vbox_create_addr = lib.find("ui_vbox_create").orElseThrow(); MemorySegment ui_hbox_create_addr = lib.find("ui_hbox_create").orElseThrow(); @@ -47,6 +49,7 @@ public class ContainerFuncs { MemorySegment ui_container_finish = lib.find("ui_container_finish").orElseThrow(); MemorySegment ui_newline_addr = lib.find("ui_newline").orElseThrow(); + MemorySegment ui_tab_create_addr = lib.find("ui_tab_create").orElseThrow(); vbox_create = linker.downcallHandle(ui_vbox_create_addr, sigm_mm); hbox_create = linker.downcallHandle(ui_hbox_create_addr, sigm_mm); @@ -65,6 +68,7 @@ public class ContainerFuncs { container_finish = linker.downcallHandle(ui_container_finish, sigi_m); newline = linker.downcallHandle(ui_newline_addr, sigv_m); + tab_create = linker.downcallHandle(ui_tab_create_addr, sigv_mm); } static ContainerFuncs getInstance() { 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 ad155da..c17fe8c 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 @@ -240,6 +240,14 @@ class Toplevel(obj: UiObject) { Container.newline(this@Toplevel.ui) } + fun tab( + label: String? = null, + ui: ContainerUI? = null + ) { + val tab = Container.tab(this@Toplevel.ui, label) + ui?.callback() + tab.close() + } private fun createFrame( container: FrameBuilder, -- 2.47.3