From: Olaf Wintermann Date: Sun, 12 Oct 2025 06:27:49 +0000 (+0200) Subject: add tooltips to toolbar items X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=427ccab568060dd9e37300ddaf7c7c0b4e695ade;p=rssreader.git add tooltips to toolbar items --- diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt index 784ab80..351944c 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt @@ -65,14 +65,14 @@ object App : Application { } fun initToolbar() { - toolbarItem(name = "reloadFeed", icon = "view-refresh") { event -> + toolbarItem(name = "reloadFeed", icon = "view-refresh", tooltip = "Refresh current feed") { event -> syncCurrent() } - toolbarItem(name = "markCurrentFeed", icon = "checkbox-checked") { event -> + toolbarItem(name = "markCurrentFeed", icon = "checkbox-checked", tooltip = "Mark items in this feed as read") { event -> markCurrentFeedAsRead() } - toolbarToggleItem(name = "starred", icon = "starred", varname = "starred") { event -> + toolbarToggleItem(name = "starred", icon = "starred", varname = "starred", tooltip = "star the current item") { event -> setBookmark(event.intValue == 1) } diff --git a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java index 1f28c87..f7f3b10 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -65,6 +65,7 @@ class ArgFuncs { MethodHandle toolbar_item_args_new; MethodHandle toolbar_item_args_set_label; MethodHandle toolbar_item_args_set_icon; + MethodHandle toolbar_item_args_set_tooltip; MethodHandle toolbar_item_args_set_onclick; MethodHandle toolbar_item_args_set_onclickdata; MethodHandle toolbar_item_args_set_groups; @@ -73,6 +74,7 @@ class ArgFuncs { MethodHandle toolbar_toggleitem_args_new; MethodHandle toolbar_toggleitem_args_set_label; MethodHandle toolbar_toggleitem_args_set_icon; + MethodHandle toolbar_toggleitem_args_set_tooltip; MethodHandle toolbar_toggleitem_args_set_varname; MethodHandle toolbar_toggleitem_args_set_onchange; MethodHandle toolbar_toggleitem_args_set_onchangedata; @@ -82,6 +84,7 @@ class ArgFuncs { MethodHandle toolbar_menu_args_new; MethodHandle toolbar_menu_args_set_label; MethodHandle toolbar_menu_args_set_icon; + MethodHandle toolbar_menu_args_set_tooltip; MethodHandle toolbar_menu_args_free; MethodHandle container_args_new; @@ -282,6 +285,7 @@ class ArgFuncs { MethodHandle button_args_set_style_class; MethodHandle button_args_set_label; MethodHandle button_args_set_icon; + MethodHandle button_args_set_tooltip; MethodHandle button_args_set_labeltype; MethodHandle button_args_set_onclick; MethodHandle button_args_set_onclickdata; @@ -306,6 +310,7 @@ class ArgFuncs { MethodHandle toggle_args_set_style_class; MethodHandle toggle_args_set_label; MethodHandle toggle_args_set_icon; + MethodHandle toggle_args_set_tooltip; MethodHandle toggle_args_set_labeltype; MethodHandle toggle_args_set_varname; MethodHandle toggle_args_set_value; @@ -579,6 +584,7 @@ class ArgFuncs { MemorySegment ui_toolbar_item_args_new_addr = lib.find("ui_toolbar_item_args_new").orElseThrow(); MemorySegment ui_toolbar_item_args_set_label_addr = lib.find("ui_toolbar_item_args_set_label").orElseThrow(); MemorySegment ui_toolbar_item_args_set_icon_addr = lib.find("ui_toolbar_item_args_set_icon").orElseThrow(); + MemorySegment ui_toolbar_item_args_set_tooltip_addr = lib.find("ui_toolbar_item_args_set_tooltip").orElseThrow(); MemorySegment ui_toolbar_item_args_set_onclick_addr = lib.find("ui_toolbar_item_args_set_onclick").orElseThrow(); MemorySegment ui_toolbar_item_args_set_onclickdata_addr = lib.find("ui_toolbar_item_args_set_onclickdata").orElseThrow(); MemorySegment ui_toolbar_item_args_set_groups_addr = lib.find("ui_toolbar_item_args_set_groups").orElseThrow(); @@ -587,6 +593,7 @@ class ArgFuncs { MemorySegment ui_toolbar_toggleitem_args_new_addr = lib.find("ui_toolbar_toggleitem_args_new").orElseThrow(); MemorySegment ui_toolbar_toggleitem_args_set_label_addr = lib.find("ui_toolbar_toggleitem_args_set_label").orElseThrow(); MemorySegment ui_toolbar_toggleitem_args_set_icon_addr = lib.find("ui_toolbar_toggleitem_args_set_icon").orElseThrow(); + MemorySegment ui_toolbar_toggleitem_args_set_tooltip_addr = lib.find("ui_toolbar_toggleitem_args_set_tooltip").orElseThrow(); MemorySegment ui_toolbar_toggleitem_args_set_varname_addr = lib.find("ui_toolbar_toggleitem_args_set_varname").orElseThrow(); MemorySegment ui_toolbar_toggleitem_args_set_onchange_addr = lib.find("ui_toolbar_toggleitem_args_set_onchange").orElseThrow(); MemorySegment ui_toolbar_toggleitem_args_set_onchangedata_addr = lib.find("ui_toolbar_toggleitem_args_set_onchangedata").orElseThrow(); @@ -596,6 +603,7 @@ class ArgFuncs { MemorySegment ui_toolbar_menu_args_new_addr = lib.find("ui_toolbar_menu_args_new").orElseThrow(); MemorySegment ui_toolbar_menu_args_set_label_addr = lib.find("ui_toolbar_menu_args_set_label").orElseThrow(); MemorySegment ui_toolbar_menu_args_set_icon_addr = lib.find("ui_toolbar_menu_args_set_icon").orElseThrow(); + MemorySegment ui_toolbar_menu_args_set_tooltip_addr = lib.find("ui_toolbar_menu_args_set_tooltip").orElseThrow(); MemorySegment ui_toolbar_menu_args_free_addr = lib.find("ui_toolbar_menu_args_free").orElseThrow(); MemorySegment ui_container_args_new_addr = lib.find("ui_container_args_new").orElseThrow(); @@ -797,6 +805,7 @@ class ArgFuncs { MemorySegment ui_button_args_set_style_class_addr = lib.find("ui_button_args_set_style_class").orElseThrow(); MemorySegment ui_button_args_set_label_addr = lib.find("ui_button_args_set_label").orElseThrow(); MemorySegment ui_button_args_set_icon_addr = lib.find("ui_button_args_set_icon").orElseThrow(); + MemorySegment ui_button_args_set_tooltip_addr = lib.find("ui_button_args_set_tooltip").orElseThrow(); MemorySegment ui_button_args_set_labeltype_addr = lib.find("ui_button_args_set_labeltype").orElseThrow(); MemorySegment ui_button_args_set_onclick_addr = lib.find("ui_button_args_set_onclick").orElseThrow(); MemorySegment ui_button_args_set_onclickdata_addr = lib.find("ui_button_args_set_onclickdata").orElseThrow(); @@ -821,6 +830,7 @@ class ArgFuncs { MemorySegment ui_toggle_args_set_style_class_addr = lib.find("ui_toggle_args_set_style_class").orElseThrow(); MemorySegment ui_toggle_args_set_label_addr = lib.find("ui_toggle_args_set_label").orElseThrow(); MemorySegment ui_toggle_args_set_icon_addr = lib.find("ui_toggle_args_set_icon").orElseThrow(); + MemorySegment ui_toggle_args_set_tooltip_addr = lib.find("ui_toggle_args_set_tooltip").orElseThrow(); MemorySegment ui_toggle_args_set_labeltype_addr = lib.find("ui_toggle_args_set_labeltype").orElseThrow(); MemorySegment ui_toggle_args_set_varname_addr = lib.find("ui_toggle_args_set_varname").orElseThrow(); MemorySegment ui_toggle_args_set_value_addr = lib.find("ui_toggle_args_set_value").orElseThrow(); @@ -1083,6 +1093,7 @@ class ArgFuncs { toolbar_item_args_new = linker.downcallHandle(ui_toolbar_item_args_new_addr, sigm); toolbar_item_args_set_icon = linker.downcallHandle(ui_toolbar_item_args_set_icon_addr, sigv_mm); + toolbar_item_args_set_tooltip = linker.downcallHandle(ui_toolbar_item_args_set_tooltip_addr, sigv_mm); toolbar_item_args_set_label = linker.downcallHandle(ui_toolbar_item_args_set_label_addr, sigv_mm); toolbar_item_args_set_onclick = linker.downcallHandle(ui_toolbar_item_args_set_onclick_addr, sigv_mm); toolbar_item_args_set_onclickdata = linker.downcallHandle(ui_toolbar_item_args_set_onclickdata_addr, sigv_mm); @@ -1091,6 +1102,7 @@ class ArgFuncs { toolbar_toggleitem_args_new = linker.downcallHandle(ui_toolbar_toggleitem_args_new_addr, sigm); toolbar_toggleitem_args_set_icon = linker.downcallHandle(ui_toolbar_toggleitem_args_set_icon_addr, sigv_mm); + toolbar_toggleitem_args_set_tooltip = linker.downcallHandle(ui_toolbar_toggleitem_args_set_tooltip_addr, sigv_mm); toolbar_toggleitem_args_set_label = linker.downcallHandle(ui_toolbar_toggleitem_args_set_label_addr, sigv_mm); toolbar_toggleitem_args_set_varname = linker.downcallHandle(ui_toolbar_toggleitem_args_set_varname_addr, sigv_mm); toolbar_toggleitem_args_set_onchange = linker.downcallHandle(ui_toolbar_toggleitem_args_set_onchange_addr, sigv_mm); @@ -1101,6 +1113,7 @@ class ArgFuncs { toolbar_menu_args_new = linker.downcallHandle(ui_toolbar_menu_args_new_addr, sigm); toolbar_menu_args_set_icon = linker.downcallHandle(ui_toolbar_menu_args_set_icon_addr, sigv_mm); toolbar_menu_args_set_label = linker.downcallHandle(ui_toolbar_menu_args_set_label_addr, sigv_mm); + toolbar_menu_args_set_tooltip = linker.downcallHandle(ui_toolbar_menu_args_set_tooltip_addr, sigv_mm); toolbar_menu_args_free = linker.downcallHandle(ui_toolbar_menu_args_free_addr, sigv_m); container_args_new = linker.downcallHandle(ui_container_args_new_addr, sigm); @@ -1301,6 +1314,7 @@ class ArgFuncs { button_args_set_style_class = linker.downcallHandle(ui_button_args_set_style_class_addr, sigv_mm); button_args_set_label = linker.downcallHandle(ui_button_args_set_label_addr, sigv_mm); button_args_set_icon = linker.downcallHandle(ui_button_args_set_icon_addr, sigv_mm); + button_args_set_tooltip = linker.downcallHandle(ui_button_args_set_tooltip_addr, sigv_mm); button_args_set_labeltype = linker.downcallHandle(ui_button_args_set_labeltype_addr, sigv_mi); button_args_set_onclick = linker.downcallHandle(ui_button_args_set_onclick_addr, sigv_mm); button_args_set_onclickdata = linker.downcallHandle(ui_button_args_set_onclickdata_addr, sigv_mm); @@ -1325,6 +1339,7 @@ class ArgFuncs { toggle_args_set_style_class = linker.downcallHandle(ui_toggle_args_set_style_class_addr, sigv_mm); toggle_args_set_label = linker.downcallHandle(ui_toggle_args_set_label_addr, sigv_mm); toggle_args_set_icon = linker.downcallHandle(ui_toggle_args_set_icon_addr, sigv_mm); + toggle_args_set_tooltip = linker.downcallHandle(ui_toggle_args_set_tooltip_addr, sigv_mm); toggle_args_set_labeltype = linker.downcallHandle(ui_toggle_args_set_labeltype_addr, sigv_mi); toggle_args_set_varname = linker.downcallHandle(ui_toggle_args_set_varname_addr, sigv_mm); toggle_args_set_value = linker.downcallHandle(ui_toggle_args_set_value_addr, sigv_mm); diff --git a/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java index c53191e..5a2bfb5 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java @@ -26,6 +26,7 @@ public class ButtonBuilder extends AbstractWidgetBuilder { private String styleClass; private String label; private String icon; + private String tooltip; private int labelType; private EventHandler onClick; private int[] states; @@ -120,6 +121,11 @@ public class ButtonBuilder extends AbstractWidgetBuilder { return this; } + public ButtonBuilder tooltip(String tooltip) { + this.tooltip = tooltip; + return this; + } + public ButtonBuilder labelType(int labelType) { this.labelType = labelType; return this; @@ -194,6 +200,10 @@ public class ButtonBuilder extends AbstractWidgetBuilder { MemorySegment cstr = arena.allocateFrom(icon); ui.button_args_set_icon.invoke(args, cstr); } + if(tooltip != null) { + MemorySegment cstr = arena.allocateFrom(tooltip); + ui.button_args_set_tooltip.invoke(args, cstr); + } if(states != null) { MemorySegment st = arena.allocate(ValueLayout.JAVA_INT, states.length); MemorySegment.copy(states, 0, st, ValueLayout.JAVA_INT, 0, states.length); diff --git a/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java index 6a5b920..8d0bb1c 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java @@ -23,6 +23,7 @@ public class ToggleBuilder extends AbstractWidgetBuilder { private String styleClass; private String label; private String icon; + private String tooltip; private int labelType; private String varname; private UiInteger value; @@ -120,6 +121,11 @@ public class ToggleBuilder extends AbstractWidgetBuilder { return this; } + public ToggleBuilder tooltip(String tooltip) { + this.tooltip = tooltip; + return this; + } + public ToggleBuilder labelType(int labelType) { this.labelType = labelType; return this; @@ -204,6 +210,10 @@ public class ToggleBuilder extends AbstractWidgetBuilder { MemorySegment cstr = arena.allocateFrom(icon); ui.toggle_args_set_icon.invoke(args, cstr); } + if(tooltip != null) { + MemorySegment cstr = arena.allocateFrom(tooltip); + ui.toggle_args_set_tooltip.invoke(args, cstr); + } ui.toggle_args_set_labeltype.invoke(args, labelType); if(varname != null) { diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolbar.java b/ui-java/src/main/java/de/unixwork/ui/Toolbar.java index d8cd930..628d6da 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolbar.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolbar.java @@ -13,6 +13,9 @@ public class Toolbar { } public static void item(String name, String label, String icon, EventHandler onClick) { + item(name, label, icon, null, onClick); + } + public static void item(String name, String label, String icon, String tooltip, EventHandler onClick) { MenuFuncs ui = MenuFuncs.getInstance(); ArgFuncs a = ArgFuncs.getInstance(); Toolkit toolkit = Toolkit.getInstance(); @@ -27,6 +30,10 @@ public class Toolbar { MemorySegment cstr = arena.allocateFrom(icon); a.toolbar_item_args_set_icon.invoke(args, cstr); } + if(tooltip != null) { + MemorySegment cstr = arena.allocateFrom(tooltip); + a.toolbar_item_args_set_tooltip.invoke(args, cstr); + } if(onClick != null) { EventWrapper event = new EventWrapper(onClick); @@ -43,6 +50,10 @@ public class Toolbar { } public static void toggleItem(String name, String label, String icon, String varname, EventHandler onChange) { + toggleItem(name, label, icon, null, varname, onChange); + } + + public static void toggleItem(String name, String label, String icon, String tooltip, String varname, EventHandler onChange) { MenuFuncs ui = MenuFuncs.getInstance(); ArgFuncs a = ArgFuncs.getInstance(); Toolkit toolkit = Toolkit.getInstance(); @@ -57,6 +68,10 @@ public class Toolbar { MemorySegment cstr = arena.allocateFrom(icon); a.toolbar_toggleitem_args_set_icon.invoke(args, cstr); } + if(tooltip != null) { + MemorySegment cstr = arena.allocateFrom(tooltip); + a.toolbar_toggleitem_args_set_tooltip.invoke(args, cstr); + } if(varname != null) { MemorySegment cstr = arena.allocateFrom(varname); a.toolbar_toggleitem_args_set_varname.invoke(args, cstr); @@ -77,6 +92,10 @@ public class Toolbar { } public static void menu(String name, String label, String icon, Menu menu) { + menu(name, label, icon, null, menu); + } + + public static void menu(String name, String label, String icon, String tooltip, Menu menu) { MenuFuncs ui = MenuFuncs.getInstance(); ArgFuncs a = ArgFuncs.getInstance(); try (Arena arena = Arena.ofConfined()) { @@ -94,6 +113,10 @@ public class Toolbar { MemorySegment cstr = arena.allocateFrom(icon); a.toolbar_menu_args_set_icon.invoke(args, cstr); } + if(tooltip != null) { + MemorySegment cstr = arena.allocateFrom(tooltip); + a.toolbar_menu_args_set_tooltip.invoke(args, cstr); + } ui.toolbar_menu_create.invoke(nameCstr, args); menu.create(); diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Menu.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Menu.kt index 62a58ce..54ae127 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Menu.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Menu.kt @@ -41,22 +41,16 @@ fun menuBuilder(block: MenuBuilder.() -> Unit) : Menu { return menu } -fun toolbarItem(name: String, label: String? = null, icon: String? = null, stockId: String? = null, onClick: EventHandler? = null) { - if(stockId != null) { - // TODO - } else { - Toolbar.item(name, label, icon, onClick) - } +fun toolbarItem(name: String, label: String? = null, icon: String? = null, tooltip: String? = null, onClick: EventHandler? = null) { + Toolbar.item(name, label, icon, tooltip, onClick) } -fun toolbarToggleItem(name: String, label: String? = null, icon: String? = null, stockId: String? = null, varname: String? = null, onChange: EventHandler? = null) { - // TODO: stockId - Toolbar.toggleItem(name, label, icon, varname, onChange) +fun toolbarToggleItem(name: String, label: String? = null, icon: String? = null, tooltip: String? = null, varname: String? = null, onChange: EventHandler? = null) { + Toolbar.toggleItem(name, label, icon, tooltip, varname, onChange) } -fun toolbarMenu(name: String?, label: String? = null, icon: String? = null, stockId: String? = null, block: MenuBuilder.() -> Unit) { - // TODO: stockId - Toolbar.menu(name, label, icon, menuBuilder(block)) +fun toolbarMenu(name: String?, label: String? = null, icon: String? = null, tooltip: String? = null, block: MenuBuilder.() -> Unit) { + Toolbar.menu(name, label, icon, tooltip, menuBuilder(block)) } fun toolbarAppMenu(block: MenuBuilder.() -> Unit) { 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 e5dc33f..4f56acc 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 @@ -901,6 +901,7 @@ class Toplevel(obj: UiObject) { fun button( label: String? = null, icon: String? = null, + tooltip: String? = null, fill: Boolean = false, hexpand: Boolean = false, vexpand: Boolean = false, @@ -926,6 +927,9 @@ class Toplevel(obj: UiObject) { icon?.let { button.icon(it) } + tooltip?.let { + button.tooltip(it) + } if(fill) { button.fill(fill); } @@ -984,6 +988,7 @@ class Toplevel(obj: UiObject) { button: ToggleBuilder, label: String? = null, icon: String? = null, + tooltip: String? = null, varname: String? = null, value: UiInteger? = null, fill: Boolean = false, @@ -1007,6 +1012,9 @@ class Toplevel(obj: UiObject) { label?.let { button.label(it) } + tooltip?.let { + button.tooltip(it) + } varname?.let { button.varname(it) } @@ -1070,6 +1078,7 @@ class Toplevel(obj: UiObject) { fun togglebutton( label: String? = null, icon: String? = null, + tooltip: String? = null, varname: String? = null, value: UiInteger? = null, fill: Boolean = false, @@ -1094,6 +1103,7 @@ class Toplevel(obj: UiObject) { button = Button.toggleButton(ui), label = label, icon = icon, + tooltip = tooltip, varname = varname, value = value, fill = fill, @@ -1119,6 +1129,7 @@ class Toplevel(obj: UiObject) { fun checkbox( label: String? = null, icon: String? = null, + tooltip: String? = null, varname: String? = null, value: UiInteger? = null, fill: Boolean = false, @@ -1143,6 +1154,7 @@ class Toplevel(obj: UiObject) { button = Button.checkbox(ui), label = label, icon = icon, + tooltip = tooltip, varname = varname, value = value, fill = fill, @@ -1168,6 +1180,7 @@ class Toplevel(obj: UiObject) { fun switch( label: String? = null, icon: String? = null, + tooltip: String? = null, varname: String? = null, value: UiInteger? = null, fill: Boolean = false, @@ -1192,6 +1205,7 @@ class Toplevel(obj: UiObject) { button = Button.switchButton(ui), label = label, icon = icon, + tooltip = tooltip, varname = varname, value = value, fill = fill, @@ -1217,6 +1231,7 @@ class Toplevel(obj: UiObject) { fun radiobutton( label: String? = null, icon: String? = null, + tooltip: String? = null, varname: String? = null, value: UiInteger? = null, fill: Boolean = false, @@ -1241,6 +1256,7 @@ class Toplevel(obj: UiObject) { button = Button.radioButton(ui), label = label, icon = icon, + tooltip = tooltip, varname = varname, value = value, fill = fill,