fix: browser item style

This commit is contained in:
2026-08-25 19:49:44 +05:00
parent 8d3a6dcc79
commit 08a1739f44
4 changed files with 49 additions and 27 deletions
+10
View File
@@ -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 при отсутствии конфига
+17 -3
View File
@@ -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}"),
}
}
});
+7 -14
View File
@@ -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;
}
}
+7 -2
View File
@@ -62,7 +62,7 @@ export component MainWindow inherits Window {
in-out property <bool> always-ask: true;
in property <int> selected-index: 0;
callback browser-selected(BrowserConfig);
callback launch-browser(BrowserConfig);
callback toggle-remember(bool);
callback toggle-always-ask(bool);
callback settings-clicked();
@@ -112,6 +112,10 @@ export component MainWindow inherits Window {
request-drag => root.request-drag();
}
HorizontalLayout {
padding-left: 12px;
padding-right: 12px;
ListView {
vertical-stretch: 1;
@@ -121,7 +125,8 @@ export component MainWindow inherits Window {
is-default: browser.is-default;
selected: i == root.selected-index;
clicked => {
root.browser-selected(browser);
root.launch-browser(browser);
}
}
}
}