diff --git a/docs/dev-workflow.md b/docs/dev-workflow.md index 04de30f..cfd467e 100644 --- a/docs/dev-workflow.md +++ b/docs/dev-workflow.md @@ -91,9 +91,19 @@ HTML-макеты → PNG: **headless Edge** (`--headless --screenshot`), он Примечание: мок-пути (firefox.exe, chrome.exe, zen.exe) вне PATH — запуск вернёт ошибку в stderr до этапа E (автодетект/конфиг). Клик-выбор проверяется визуально. +### Этап D2 — UX-полировка списка + +- [x] Отступ списка слева/справа 12px (карточки не прилипают к краям) +- [x] Индикатор выбора без синего круга — синяя SVG-галочка 16px; + у невыбранных — шеврон «›» +- [x] Клик по карточке = немедленный запуск (`launch-browser(BrowserConfig)`); + «Открыть» в футере остаётся (запуск выбранного) + ## Этап E — конфиг и настройки - [ ] `config.toml` рядом с exe / `%APPDATA%\bropicker` (крейс `toml`), serde-структура BrowserConfig +- [ ] Логика запуска с учётом галочек: remember-choice → записать выбор для домена; + always-ask → показывать пикер несмотря на запомненное - [ ] Страница настроек: TabWidget + LineEdit/SpinBox/ComboBox/CheckBox std-widgets; вход по кнопке cog из футера (колбэк settings-clicked уже есть) - [ ] Автодетект установленных браузеров (реестр Windows) как fallback при отсутствии конфига diff --git a/src/main.rs b/src/main.rs index 20f3c90..eb4cdfd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,7 +65,7 @@ fn init() -> State { main_window.set_remember_choice(true); main_window.set_always_ask(true); - main_window.on_browser_selected({ + main_window.on_launch_browser({ let main_window = main_window.clone_strong(); let browser_model = browser_model.clone(); move |browser: BrowserConfig| { @@ -77,10 +77,24 @@ fn init() -> State { }) .unwrap_or(0); main_window.set_selected_index(index as i32); + + let url = main_window.get_current_url().to_string(); println!( - "Selected [{}]: {:?} {:?}", - index, browser.path, browser.flags + "Launching [{}]: {:?} {:?} {}", + index, browser.path, browser.flags, url ); + + let mut cmd = std::process::Command::new(browser.path.to_string()); + if !browser.flags.is_empty() { + cmd.args(browser.flags.split_whitespace()); + } + + match cmd.arg(url).spawn() { + Ok(_) => { + let _ = main_window.window().hide(); + } + Err(e) => eprintln!("launch failed: {e}"), + } } }); diff --git a/ui/browser_item.slint b/ui/browser_item.slint index 2fa357e..2f9ffc9 100644 --- a/ui/browser_item.slint +++ b/ui/browser_item.slint @@ -81,29 +81,22 @@ export component BrowserItem inherits Rectangle { } } - Rectangle { - width: 24px; - border-radius: 12px; - background: root.selected ? #3b82f6 : Theme.surface-elevated; + VerticalLayout { + width: 20px; + alignment: center; Image { - x: (parent.width - self.width) / 2; - y: (parent.height - self.height) / 2; - width: 12px; - height: 12px; + width: 16px; + height: 16px; source: @image-url("../icons/check.svg"); - colorize: #ffffff; + colorize: #3b82f6; visible: root.selected; } Text { - width: 100%; - height: 100%; - horizontal-alignment: center; - vertical-alignment: center; text: "›"; color: Theme.text-muted; - font-size: 14px; + font-size: 16px; visible: !root.selected; } } diff --git a/ui/main.slint b/ui/main.slint index ed7f5cf..0e96f6a 100644 --- a/ui/main.slint +++ b/ui/main.slint @@ -62,7 +62,7 @@ export component MainWindow inherits Window { in-out property always-ask: true; in property selected-index: 0; - callback browser-selected(BrowserConfig); + callback launch-browser(BrowserConfig); callback toggle-remember(bool); callback toggle-always-ask(bool); callback settings-clicked(); @@ -112,16 +112,21 @@ export component MainWindow inherits Window { request-drag => root.request-drag(); } - ListView { - vertical-stretch: 1; + HorizontalLayout { + padding-left: 12px; + padding-right: 12px; - for browser[i] in root.browser-model: BrowserItem { - browser-icon: browser.icon; - browser-name: browser.name; - is-default: browser.is-default; - selected: i == root.selected-index; - clicked => { - root.browser-selected(browser); + ListView { + vertical-stretch: 1; + + for browser[i] in root.browser-model: BrowserItem { + browser-icon: browser.icon; + browser-name: browser.name; + is-default: browser.is-default; + selected: i == root.selected-index; + clicked => { + root.launch-browser(browser); + } } } }