From 381fc5c04956fab013773f81eb4188ca62b5358b Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Wed, 26 Aug 2026 14:17:57 +0500 Subject: [PATCH] feat: update config flow, use emoji --- docs/config.example.toml | 5 +++++ docs/dev-workflow.md | 4 ++++ src/config.rs | 34 +++++++++++++++++++++++----------- src/main.rs | 6 ++++++ ui/browser_item.slint | 22 +++++++++++++++++++++- ui/main.slint | 2 ++ ui/types.slint | 2 ++ 7 files changed, 63 insertions(+), 12 deletions(-) diff --git a/docs/config.example.toml b/docs/config.example.toml index 9343ceb..06cca0e 100644 --- a/docs/config.example.toml +++ b/docs/config.example.toml @@ -6,6 +6,8 @@ # path — полный путь к exe (или имя из PATH) # flags — аргументы запуска; пробелы внутри значения — в кавычках # icon — необязательно: путь к png/svg, иначе подбирается по имени +# emoji — необязательно: эмодзи вместо иконки (удобно различать профили); +# имеет приоритет над icon [[browsers]] name = "Firefox" @@ -20,16 +22,19 @@ flags = "" name = "Chrome — Work" path = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' flags = '--profile-directory="Default"' +emoji = "💼" [[browsers]] name = "Chrome — Personal" path = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' flags = '--profile-directory="Profile 1"' +emoji = "🏠" [[browsers]] name = "Firefox — Work" path = 'C:\Program Files\Mozilla Firefox\firefox.exe' flags = '-P "Work"' +emoji = "🦊" # Запомненные домены: домен = имя записи из [[browsers]] [remembered] diff --git a/docs/dev-workflow.md b/docs/dev-workflow.md index 9ea488b..b87b57e 100644 --- a/docs/dev-workflow.md +++ b/docs/dev-workflow.md @@ -155,6 +155,10 @@ HTML-макеты → PNG: **headless Edge** (`--headless --screenshot`), он - [x] Парсер флагов понимает кавычки (`split_flags`) — профили браузеров: `flags = '--profile-directory="Profile 1"'` (Chrome), `-P "Work"` (Firefox); пример: docs/config.example.toml +- [x] Эмодзи-иконка для записи: поле `emoji` в конфиге (приоритет над icon) — + различение профилей одного браузера; фолбэк-глобус colorize по теме + (был чёрным на тёмной), цветные PNG логотипов не трогаются + (`icon-mask` только для генерик-глобуса) - [x] Cold start release: 131 ms (после добавления файлового лога) ## Этап F — релиз diff --git a/src/config.rs b/src/config.rs index 465778a..201580e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -30,6 +30,8 @@ pub struct BrowserEntry { pub flags: String, #[serde(default)] pub icon: String, + #[serde(default)] + pub emoji: String, } #[derive(Serialize, Deserialize, Clone, Debug)] @@ -165,6 +167,7 @@ pub fn detect_browsers() -> Vec { path, flags: String::new(), icon: String::new(), + emoji: String::new(), }); } } @@ -173,18 +176,27 @@ pub fn detect_browsers() -> Vec { } pub fn icon_for(name: &str) -> &'static str { - let n = name.to_lowercase(); - if n.contains("firefox") { - "logos/firefox_48x48.png" - } else if n.contains("chrome") { - "logos/chrome_48x48.png" - } else if n.contains("opera") { - "logos/opera_48x48.png" - } else if n.contains("brave") { - "logos/brave_48x48.png" - } else if n.contains("яндекс") || n.contains("yandex") { - "logos/yandex_48x48.png" + if is_known_browser(name) { + KNOWN_ICONS + .iter() + .find(|(kw, _)| name.to_lowercase().contains(kw)) + .map(|(_, path)| *path) + .unwrap_or("icons/globe.svg") } else { "icons/globe.svg" } } + +const KNOWN_ICONS: &[(&str, &str)] = &[ + ("firefox", "logos/firefox_48x48.png"), + ("chrome", "logos/chrome_48x48.png"), + ("opera", "logos/opera_48x48.png"), + ("brave", "logos/brave_48x48.png"), + ("яндекс", "logos/yandex_48x48.png"), + ("yandex", "logos/yandex_48x48.png"), +]; + +pub fn is_known_browser(name: &str) -> bool { + let n = name.to_lowercase(); + KNOWN_ICONS.iter().any(|(kw, _)| n.contains(kw)) +} diff --git a/src/main.rs b/src/main.rs index 39809df..57ca807 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,6 +54,10 @@ fn to_ui_config(entry: &BrowserEntry) -> BrowserConfig { }; BrowserConfig { icon: load_icon(icon_rel), + emoji: entry.emoji.clone().into(), + icon_mask: entry.icon.is_empty() + && entry.emoji.is_empty() + && !config::is_known_browser(&entry.name), name: entry.name.clone().into(), path: entry.path.clone().into(), flags: entry.flags.clone().into(), @@ -142,6 +146,7 @@ fn init(cfg: Config, url: Option) -> State { path: entry.path.to_string(), flags: entry.flags.to_string(), icon: String::new(), + emoji: String::new(), }; let url = main_window.get_current_url().to_string(); @@ -180,6 +185,7 @@ fn init(cfg: Config, url: Option) -> State { path: ui_entry.path.to_string(), flags: ui_entry.flags.to_string(), icon: String::new(), + emoji: String::new(), }; let url = main_window.get_current_url().to_string(); diff --git a/ui/browser_item.slint b/ui/browser_item.slint index 2f9ffc9..3341f0e 100644 --- a/ui/browser_item.slint +++ b/ui/browser_item.slint @@ -2,6 +2,8 @@ import { Theme } from "./theme.slint"; export component BrowserItem inherits Rectangle { in property browser-icon; + in property emoji; + in property icon-mask; in property browser-name; in property is-default; in property selected; @@ -37,7 +39,25 @@ export component BrowserItem inherits Rectangle { border-radius: 12px; background: Theme.surface-elevated; - Image { + if root.emoji != "": Text { + width: 100%; + height: 100%; + text: root.emoji; + font-size: 26px; + horizontal-alignment: center; + vertical-alignment: center; + } + + if root.emoji == "" && root.icon-mask: Image { + x: (parent.width - self.width) / 2; + y: (parent.height - self.height) / 2; + width: 30px; + height: 30px; + source: root.browser-icon; + colorize: Theme.text-muted; + } + + if root.emoji == "" && !root.icon-mask: Image { x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; width: 30px; diff --git a/ui/main.slint b/ui/main.slint index b58c1ce..39e28f5 100644 --- a/ui/main.slint +++ b/ui/main.slint @@ -129,6 +129,8 @@ export component MainWindow inherits Window { for browser[i] in root.browser-model: BrowserItem { browser-icon: browser.icon; + emoji: browser.emoji; + icon-mask: browser.icon-mask; browser-name: browser.name; is-default: browser.is-default; selected: i == root.selected-index; diff --git a/ui/types.slint b/ui/types.slint index 113615a..6b10d89 100644 --- a/ui/types.slint +++ b/ui/types.slint @@ -1,5 +1,7 @@ export struct BrowserConfig { icon: image, + emoji: string, + icon-mask: bool, name: string, path: string, flags: string,