]> uap-core.de Git - rssreader.git/commitdiff
add tooltips to toolbar items
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 12 Oct 2025 06:27:49 +0000 (08:27 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 12 Oct 2025 06:27:49 +0000 (08:27 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java
ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java
ui-java/src/main/java/de/unixwork/ui/Toolbar.java
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Menu.kt
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt

index 784ab8053acf88f8a27ebedb78395b3cdc44fa33..351944ce059138a3adeedd8f33b2d424ed402011 100644 (file)
@@ -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)
         }
 
index 1f28c879cc6f871b4c58166c21d2f0f5707d15aa..f7f3b101af00ee6a04c0f0af08cbfc08e0143040 100644 (file)
@@ -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);
index c53191e5fb88395b54e8040ecd1031bedd9f0acd..5a2bfb51ac974b190e3c7301bd3a176576335d19 100644 (file)
@@ -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);
index 6a5b920ed739d5c189b8ae868df05d4c50ff02a1..8d0bb1c6ef3ebda9df199873e0c84b61da0de029 100644 (file)
@@ -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) {
index d8cd930211947ccc3012c179e086ca0c34831fec..628d6da79f7935e8a70fe794652f42b098b3a2cd 100644 (file)
@@ -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();
index 62a58ceb6a36e25cfcac9304ea6bd615e25e0c71..54ae1273bd6d343e786f8bf18b0b32de2ee06037 100644 (file)
@@ -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) {
index e5dc33fb444bb3b52ccc63411bdd72f7ea37a6e0..4f56acc4485026974d022bbd8eece23c45cb10a5 100644 (file)
@@ -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,