7.6 KiB
План: удобная разработка bropicker с ИИ-агентом (Slint)
Статус: принят к исполнению. Дата: 2026-08-25.
Предыстория: эксперимент dioxus-native/Blitz закрыт (прозрачность окна на Windows нереализуема без форка blitz-shell/winit на этапе создания HWND). Ветка-архив:
dioxus-archive. Работаем на Slint, основная веткаmain.
Принцип «агент видит картинку»
Цикл работы агента над дизайном:
правка ui/*.slint → сборка+запуск в фоне → скриншот окна → сравнение с ref-PNG → правка
Агент читает PNG напрямую (инструмент чтения файлов поддерживает картинки), поэтому визуальная сверка с макетами происходит без участия человека.
Инструменты визуализации:
- PS-скрипт скриншота окна (основной): ноль зависимостей, любая версия slint, снимает реальный композитинг — важно для прозрачности поверх стола. Минус: окно должно быть видимым
slint-snapshot(опционально, позже): headless, детерминированный, пиксель-диф из коробки. Минусы: требует ровноslint =1.17.1(апгрейд с 1.16.1) и возню со шрифтами/embed ресурсов
HTML-макеты → PNG: headless Edge (--headless --screenshot), он предустановлен на Windows.
Этап A — порядок в репозитории
- Удалена
example/— копия примера Slint с копирайтом SixtyFPS и битыми path-deps - Zip
browser-logosудалён (не был в git; перезаливаемо с github alrrr/browser-logos); LICENSE логотипов сохранён вlogos/LICENSE-browser-logos.txt; вlogos/уже лежат отобранные PNG (chrome, firefox, opera, yandex, brave) .gitignore:tools/out/,*.log,coldstart.txt
Коммит: chore: repo hygiene
Этап B — утилиты в tools/
Все скрипты — PowerShell, без сторонних зависимостей.
tools/render-refs.ps1— рендеритrefs/dark.htmlиrefs/light.htmlчерез headless Edge вtools/out/ref-dark.png/ref-light.png(окно 488×800,--hide-scrollbars). Находит msedge.exe в стандартных путяхtools/shot.ps1 [-Title bropicker] [-Out tools/out/app.png]— скриншот окна приложения: FindWindowW + GetWindowRect (Win32 через Add-Type) + System.Drawing CopyFromScreentools/run-and-shot.ps1— полный цикл агента:cargo build→Start-Process target\debug\bropicker.exe→ пауза ~1.5 c → shot.ps1 →Stop-Process. Решает проблему «GUI-процесс блокирует терминал агента»- Опционально:
slint-lsp/ VS Code extension — ей для редактора, агент не зависит
Коммит: feat(tools): visual dev loop for ai agents
Проверка цикла: render-refs → run-and-shot → оба PNG существуют, агент их прочитал.
Этап C — возвращение к no-frame окну (цель дизайна)
Текущее: окно с заголовком (специально, чтобы двигать мышью). Целевое: frameless + прозрачность + драг за хедер, как в макете.
no-frame: true+background: transparentв MainWindow- Прозрачность проверить первой же парой скриншотов (углы карточки vs ref-dark.png)
- Драг: TouchArea в хедере → callback
request-drag→ в Rust черезi-slint-backend-winit:window.with_winit_window(|w| w.drag_window())(код частично был в старом src/main.rs, восстановить из истории при необходимости) - Центрирование окна при старте — вернуть
src/winit.rs(он в истории main до коммита 464f4f0) - Esc — закрыть:
FocusScope { key-event }илиwindow.close() - README привести в соответствие: стек Slint, скриншоты из
tools/out/
Коммит: feat(ui): frameless transparent window with drag
Этап D — список браузеров (MVP-ядро)
- Раскомментировать/восстановить ListView + BrowserItem в main.slint (было закомментировано)
- Логотипы: PNG из
logos/вместо emoji (поле icon → путь к png) - Мок-данные 4 браузеров в VecModel (уже были в старом src/main.rs)
- Выбор кликом + подсветка selected; hover-стили
- Кнопка «Открыть» → callback → Rust:
std::process::Command(path).args(flags).arg(url) - URL из argv:
std::env::args().nth(1) - Закрытие окна после запуска
Коммит: feat: browser list mvp
Этап E — конфиг и настройки
config.tomlрядом с exe /%APPDATA%\bropicker(крейсtoml), serde-структура BrowserConfig- Страница настроек: TabWidget + LineEdit/SpinBox/ComboBox/CheckBox std-widgets; вход по кнопке cog из футера (колбэк settings-clicked уже есть)
- Автодетект установленных браузеров (реестр Windows) как fallback при отсутствии конфига
- Чтение флагов из .lnk ярлыков (крейс
lnk) — по желанию
Коммит: feat: config + settings page
Этап F — релиз
[profile.release]: lto, codegen-units=1, strip- Замер cold start: Instant в начале main → печать в первом колбэке; цель <100 ms;
результат записать сюда:
___ ms - Иконка exe (.ico через build.rs winres)
- Выбрать лицензию проекта: GPLv3 (опенсорс) или Royalty-free Slint (закрытый десктоп, атрибуция AboutSlint) — зафиксировать в README и LICENSE
- Скриншоты в README из tools/out
Заметки для агента
- GUI-приложение запускать только через
tools/run-and-shot.ps1, никогда не блокирующе - После каждого изменения UI: скриншот + сравнение с
tools/out/ref-{dark,light}.png - Тёмная/светлая тема переключается кнопкой sun/moon (Theme.toggle уже работает);
для скриншота светлой темы кликать нельзя — добавить env-флаг
BP_THEME=light, который в main() выставитTheme.is-dark = falseперед показом - Cargo.toml правится только через cargo CLI; манифесты руками — только человеком