fix: browser item style
This commit is contained in:
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+15
-10
@@ -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,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user