From b86525d65d88850e8ddbbaa3cc4fbb240077f0c5 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Mon, 5 Jan 2026 01:05:56 +0100 Subject: [PATCH] tooltip raw text, inline translation fallback support --- dash-frontend/src/tab/apps.rs | 25 +++++++++++++++---------- wgui/doc/widgets.md | 4 ++++ wgui/src/i18n.rs | 11 ++++++++++- wgui/src/parser/component_button.rs | 10 ++++++---- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/dash-frontend/src/tab/apps.rs b/dash-frontend/src/tab/apps.rs index 0080b4fe..4c58f77b 100644 --- a/dash-frontend/src/tab/apps.rs +++ b/dash-frontend/src/tab/apps.rs @@ -198,17 +198,22 @@ impl AppList { tasks: &Tasks, parser_state: &mut ParserState, ) -> anyhow::Result<()> { - if let Some(entry) = self.entries_to_mount.pop_front() { - let globals = frontend.layout.state.globals.clone(); - let button = self.mount_entry(frontend, parser_state, &doc_params(globals.clone()), &entry)?; + // load 4 entries for a single frame at most + for _ in 0..4 { + if let Some(entry) = self.entries_to_mount.pop_front() { + let globals = frontend.layout.state.globals.clone(); + let button = self.mount_entry(frontend, parser_state, &doc_params(globals.clone()), &entry)?; - button.on_click(on_app_click( - frontend.tasks.clone(), - globals.clone(), - entry.clone(), - state.clone(), - tasks.clone(), - )); + button.on_click(on_app_click( + frontend.tasks.clone(), + globals.clone(), + entry.clone(), + state.clone(), + tasks.clone(), + )); + } else { + break; + } } Ok(()) diff --git a/wgui/doc/widgets.md b/wgui/doc/widgets.md index 1492b169..fae5ac23 100644 --- a/wgui/doc/widgets.md +++ b/wgui/doc/widgets.md @@ -264,6 +264,10 @@ _Translated by key_ _Tooltip text on hover, translated by key_ +`tooltip_str`: **string** + +_Tooltip text on hover, raw text (not translated)_ + `tooltip_side`: "top" | "bottom" | "left" | "right" (default: top) `sticky`: "1" | "0" (default: "0") diff --git a/wgui/src/i18n.rs b/wgui/src/i18n.rs index 52123eea..f15c3ec0 100644 --- a/wgui/src/i18n.rs +++ b/wgui/src/i18n.rs @@ -109,7 +109,11 @@ impl I18n { }) } - pub fn translate(&mut self, translation_key: &str) -> Rc { + pub fn translate(&mut self, translation_key_full: &str) -> Rc { + let translation_key = translation_key_full + .split_once(';') + .map_or(translation_key_full, |(a, _)| a); + if let Some(translated) = find_translation(translation_key, &self.json_root_translated) { return Rc::from(translated); } @@ -119,6 +123,11 @@ impl I18n { return Rc::from(translated_fallback); } + // not even found in fallback, check if the translation contains ";" (to be used as "MY_TRANSLATION_KEY;A fallback text") + if let Some((idx, _)) = translation_key_full.match_indices(';').next() { + return Rc::from(&translation_key_full[idx + 1..]); + } + log::error!("missing translation for key \"{translation_key}\""); Rc::from(translation_key) // show translation key as a fallback } diff --git a/wgui/src/parser/component_button.rs b/wgui/src/parser/component_button.rs index 685dd1dc..660f518a 100644 --- a/wgui/src/parser/component_button.rs +++ b/wgui/src/parser/component_button.rs @@ -12,6 +12,7 @@ use crate::{ widget::util::WLength, }; +#[allow(clippy::too_many_lines)] pub fn parse_component_button<'a>( file: &'a ParserFile, ctx: &mut ParserContext, @@ -25,7 +26,7 @@ pub fn parse_component_button<'a>( let mut hover_color: Option = None; let mut hover_border_color: Option = None; let mut round = WLength::Units(4.0); - let mut tooltip: Option = None; + let mut tooltip: Option = None; let mut tooltip_side: Option = None; let mut sticky: bool = false; let mut long_press_time = 0.0; @@ -76,7 +77,8 @@ pub fn parse_component_button<'a>( sprite_src = Some(asset_path); } } - "tooltip" => tooltip = Some(String::from(value)), + "tooltip" => tooltip = Some(Translation::from_translation_key(value)), + "tooltip_str" => tooltip = Some(Translation::from_raw_text(value)), "tooltip_side" => { tooltip_side = match value { "left" => Some(tooltip::TooltipSide::Left), @@ -112,9 +114,9 @@ pub fn parse_component_button<'a>( style, text_style, round, - tooltip: tooltip.map(|t| tooltip::TooltipInfo { + tooltip: tooltip.map(|text| tooltip::TooltipInfo { side: tooltip_side.map_or(tooltip::TooltipSide::Top, |f| f), - text: Translation::from_translation_key(&t), + text, }), sticky, long_press_time,