baldav/docs/session-logs/2026-09-29_progress-and-zoom.md
4aiman 3e2a6e47f7 Progress on recompute/refine/roads-rebuild + remember map zoom
- .btn-progress fills a button's bg by --pct (setBtnProgress). Elevation
  refine drives it from fetchElevations network batches (0-80%) then save
  (85-100%); recompute from recalculateSession phase milestones; roads
  rebuild from a new Rust roads_progress event (rebuild_roads emits
  [current,total] every ~2000 points - first Rust->JS event in the app,
  adds use tauri::Emitter) so it no longer just hangs silently.
- recalc/refine now reopen the detail via reopenDetail (awaits the
  popstate) instead of the manual pop+history.back+render race.
- Track detail remembers its map view per session (_sdMapView, moveend) and
  restores it on reopen/return instead of re-fitting the whole track; the
  recording map persists its zoom in localStorage across screen switches.
2026-09-29 23:19:37 +03:00

4.2 KiB
Raw Blame History

Сессия 2026-09-29 (3) - прогресс на кнопках, память масштаба карты

Продолжение дня (см. 2026-09-29_startup-slowness.md). По списку задач пользователя.

Что значат сообщения достройки (объяснение, без правок)

GPS.fillGaps (gps.js) чинит только реальные потери сигнала: разрыв > 60с И хорда > 150м. Для такого разрыва спрашивает у BRouter дорожный путь между концами:

  • "больше нужного" = skipped-long: дорога есть, но путь длиннее прямой более чем в 2 раза (крюк). Значит ехал не по дороге (тропа/поле/грунт, которого нет в графе) - оставляем прямую.
  • "нет данных" = skipped-noroute: BRouter не проложил вообще - нет дорожных данных на участке (не скачан .rd5-сегмент региона / пусто). Мостить нечем. Это не баг, а честный отказ достраивать заведомо кривым путём.

Прогресс на долгих действиях (заливка фона кнопки по %)

  • CSS .btn-progress (styles.css): фон кнопки заливается слева по --pct (ставится из JS через CSS-переменную, не инлайн-стиль). Хелпер setBtnProgress(el, pct) (main.js).
  • "Уточнить высоты" (#sd-refine): реальный % от сетевых батчей fetchElevations(pts, onProgress) (0-80%), затем сохранение+пересчёт (85-100%). Сеть - api.gpxz.io / open-elevation / open-meteo / opentopodata.
  • "Пересчитать" (#sd-recalc): GPS.recalculateSession(id, {onProgress}) шлёт честные вехи по фазам (5 старт / 40 фильтр / 70 стата / 100 запись).
  • "Перестроить" дороги (#roads-rebuild): Rust rebuild_roads эмитит roads_progress [current,total] каждые ~2000 точек (в проекте раньше событий из Rust не было вообще - добавлен use tauri::Emitter), JS слушает и заливает кнопку + пишет "Построение: cur / tot". Убирает "просто подвисает".

Гонка reopenDetail - распространил на recalc/refine

#sd-recalc и #sd-refine раньше делали тот же ручной winStack.pop + history.back + showSessionDetail (гонка с пустой картой/графиками). Переведены на reopenDetail (ждёт popstate) - фикс той же гонки.

Память масштаба карты

  • Деталь трека: _sdMapView[sessionId] хранит {центр, зум}, обновляется на moveend/zoomend; при рендере, если вид сохранён - setView вместо fitBounds. Так после пересчёта/уточнения (reopen) и при возврате к треку масштаб сохраняется, а не сбрасывается на весь трек. Первый показ - как раньше, fitBounds.
  • Карта записи (renderRecordingInline): зум хранится в localStorage baldav_rec_zoom (сохраняется на zoomend, восстанавливается при создании карты вместо жёсткого 15). Так возврат на экран трекинга держит масштаб.

Проверка

  • Синтаксис JS - ок. Сборка debug + телефон. Проверить: заливка кнопок идёт по %, дороги больше не "висят молча"; после "Пересчитать"/"Уточнить" карта на том же масштабе; вернулся на запись - масштаб прежний. (Задача 1 - фикс гонки reopenDetail - проверена через CDP отдельно.)