From 67435d5fc9bd4469a5c96ba7743e45761db0e7c3 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Wed, 10 Dec 2025 18:22:04 +0100 Subject: [PATCH] src_ext --- wgui/doc/widgets.md | 6 +++++- wgui/src/assets.rs | 8 ++++++++ wgui/src/globals.rs | 1 + wgui/src/parser/component_button.rs | 9 +++++---- wgui/src/parser/mod.rs | 6 ++++-- wgui/src/parser/widget_sprite.rs | 5 +++-- 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/wgui/doc/widgets.md b/wgui/doc/widgets.md index 1cde488..0587c25 100644 --- a/wgui/doc/widgets.md +++ b/wgui/doc/widgets.md @@ -160,6 +160,10 @@ _2nd gradient color_ _External (filesystem) image path. Falls back to Internal (assets) if not found._ +`src_ext`: **string** + +_External (filesystem) image path_ + `src_builtin`: **string** _Internal (assets) image path_ @@ -210,7 +214,7 @@ _Tooltip text on hover, translated by key_ _make button act as a toggle (visual only)_ -`sprite_src` | `sprite_src_builtin` | `sprite_src_internal` +`sprite_src` | `sprite_src_ext` | `sprite_src_builtin` | `sprite_src_internal` _Image path (see [sprite](#sprite-widget)) for src descriptions_ diff --git a/wgui/src/assets.rs b/wgui/src/assets.rs index 17beec8..c7cda15 100644 --- a/wgui/src/assets.rs +++ b/wgui/src/assets.rs @@ -8,13 +8,16 @@ pub enum AssetPath<'a> { WguiInternal(&'a str), // tied to internal wgui AssetProvider. Used internally BuiltIn(&'a str), // tied to user AssetProvider FileOrBuiltIn(&'a str), // attempts to load from a path relative to asset_folder, falls back to BuiltIn + File(&'a str), // load from filesystem } +// see AssetPath above for documentation #[derive(Clone)] pub enum AssetPathOwned { WguiInternal(PathBuf), BuiltIn(PathBuf), FileOrBuiltIn(PathBuf), + File(PathBuf), } impl AssetPath<'_> { @@ -23,6 +26,7 @@ impl AssetPath<'_> { AssetPath::WguiInternal(path) => path, AssetPath::BuiltIn(path) => path, AssetPath::FileOrBuiltIn(path) => path, + AssetPath::File(path) => path, } } @@ -31,6 +35,7 @@ impl AssetPath<'_> { AssetPath::WguiInternal(path) => AssetPathOwned::WguiInternal(PathBuf::from(path)), AssetPath::BuiltIn(path) => AssetPathOwned::BuiltIn(PathBuf::from(path)), AssetPath::FileOrBuiltIn(path) => AssetPathOwned::FileOrBuiltIn(PathBuf::from(path)), + AssetPath::File(path) => AssetPathOwned::File(PathBuf::from(path)), } } } @@ -41,6 +46,7 @@ impl AssetPathOwned { AssetPathOwned::WguiInternal(buf) => AssetPath::WguiInternal(buf.to_str().unwrap()), AssetPathOwned::BuiltIn(buf) => AssetPath::BuiltIn(buf.to_str().unwrap()), AssetPathOwned::FileOrBuiltIn(buf) => AssetPath::FileOrBuiltIn(buf.to_str().unwrap()), + AssetPathOwned::File(buf) => AssetPath::File(buf.to_str().unwrap()), } } @@ -49,6 +55,7 @@ impl AssetPathOwned { AssetPathOwned::WguiInternal(buf) => buf, AssetPathOwned::BuiltIn(buf) => buf, AssetPathOwned::FileOrBuiltIn(buf) => buf, + AssetPathOwned::File(buf) => buf, } } } @@ -65,6 +72,7 @@ impl AssetPathOwned { AssetPathOwned::WguiInternal(_) => AssetPathOwned::WguiInternal(new_path), AssetPathOwned::BuiltIn(_) => AssetPathOwned::BuiltIn(new_path), AssetPathOwned::FileOrBuiltIn(_) => AssetPathOwned::FileOrBuiltIn(new_path), + AssetPathOwned::File(_) => AssetPathOwned::File(new_path), } } } diff --git a/wgui/src/globals.rs b/wgui/src/globals.rs index 37d0a75..5245e41 100644 --- a/wgui/src/globals.rs +++ b/wgui/src/globals.rs @@ -71,6 +71,7 @@ impl WguiGlobals { match asset_path { AssetPath::WguiInternal(path) => self.assets_internal().load_from_path(path), AssetPath::BuiltIn(path) => self.assets_builtin().load_from_path(path), + AssetPath::File(path) => self.load_asset_from_fs(path), AssetPath::FileOrBuiltIn(path) => self .load_asset_from_fs(path) .inspect_err(|e| log::debug!("{e:?}")) diff --git a/wgui/src/parser/component_button.rs b/wgui/src/parser/component_button.rs index db9cf1b..1aeab62 100644 --- a/wgui/src/parser/component_button.rs +++ b/wgui/src/parser/component_button.rs @@ -1,13 +1,13 @@ use crate::{ assets::AssetPath, - components::{button, tooltip, Component}, + components::{Component, button, tooltip}, drawing::Color, i18n::Translation, layout::WidgetID, parser::{ - parse_check_f32, parse_check_i32, parse_children, print_invalid_attrib, process_component, + AttribPair, ParserContext, ParserFile, parse_check_f32, parse_check_i32, parse_children, print_invalid_attrib, + process_component, style::{parse_color_opt, parse_round, parse_style, parse_text_style}, - AttribPair, ParserContext, ParserFile, }, widget::util::WLength, }; @@ -62,9 +62,10 @@ pub fn parse_component_button<'a>( "hover_border_color" => { parse_color_opt(value, &mut hover_border_color); } - "sprite_src" | "sprite_src_builtin" | "sprite_src_internal" => { + "sprite_src" | "sprite_src_ext" | "sprite_src_builtin" | "sprite_src_internal" => { let asset_path = match key { "sprite_src" => AssetPath::FileOrBuiltIn(value), + "sprite_src_ext" => AssetPath::File(value), "sprite_src_builtin" => AssetPath::BuiltIn(value), "sprite_src_internal" => AssetPath::WguiInternal(value), _ => unreachable!(), diff --git a/wgui/src/parser/mod.rs b/wgui/src/parser/mod.rs index f9bebe8..1d642ef 100644 --- a/wgui/src/parser/mod.rs +++ b/wgui/src/parser/mod.rs @@ -8,7 +8,7 @@ mod widget_rectangle; mod widget_sprite; use crate::{ - assets::{normalize_path, AssetPath, AssetPathOwned}, + assets::{AssetPath, AssetPathOwned, normalize_path}, components::{Component, ComponentWeak}, drawing::{self}, globals::WguiGlobals, @@ -551,7 +551,7 @@ fn parse_tag_include( for pair in attribs { #[allow(clippy::single_match)] match pair.attrib.as_ref() { - "src" | "src_builtin" | "src_internal" => { + "src" | "src_ext" | "src_builtin" | "src_internal" => { path = Some({ let this = &file.path.clone(); let include: &str = &pair.value; @@ -565,7 +565,9 @@ fn parse_tag_include( AssetPathOwned::WguiInternal(_) => AssetPathOwned::WguiInternal(new_path), AssetPathOwned::BuiltIn(_) => AssetPathOwned::BuiltIn(new_path), AssetPathOwned::FileOrBuiltIn(_) => AssetPathOwned::FileOrBuiltIn(new_path), + AssetPathOwned::File(_) => AssetPathOwned::File(new_path), }, + "src_ext" => AssetPathOwned::File(new_path), "src_builtin" => AssetPathOwned::BuiltIn(new_path), "src_internal" => AssetPathOwned::WguiInternal(new_path), _ => unreachable!(), diff --git a/wgui/src/parser/widget_sprite.rs b/wgui/src/parser/widget_sprite.rs index b919a61..fc86f16 100644 --- a/wgui/src/parser/widget_sprite.rs +++ b/wgui/src/parser/widget_sprite.rs @@ -1,7 +1,7 @@ use crate::{ assets::AssetPath, layout::WidgetID, - parser::{parse_children, parse_widget_universal, style::parse_style, AttribPair, ParserContext, ParserFile}, + parser::{AttribPair, ParserContext, ParserFile, parse_children, parse_widget_universal, style::parse_style}, renderer_vk::text::custom_glyph::{CustomGlyphContent, CustomGlyphData}, widget::sprite::{WidgetSprite, WidgetSpriteParams}, }; @@ -22,9 +22,10 @@ pub fn parse_widget_sprite<'a>( for pair in attribs { let (key, value) = (pair.attrib.as_ref(), pair.value.as_ref()); match key { - "src" | "src_builtin" | "src_internal" => { + "src" | "src_ext" | "src_builtin" | "src_internal" => { let asset_path = match key { "src" => AssetPath::FileOrBuiltIn(value), + "src_ext" => AssetPath::File(value), "src_builtin" => AssetPath::BuiltIn(value), "src_internal" => AssetPath::WguiInternal(value), _ => unreachable!(),