mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 18:34:02 +00:00
Main gained three imagery providers (Google Street View, KartaView,
Panoramax), shared line-coverage, cone and photo-viewer modules, one source
lit at a time and the translated interface. Their shared modules still
carried what this branch removes, so the merge ports them onto it:
- lineCoverage.js is this branch's coverage.js made provider-neutral
(draped lines near the ground only, the selection drawn over them, key
and rate-limit blocking); sequenceCones.js is sequences.js the same way.
Mapillary, KartaView and Panoramax all build on them; Mapillary moves
back to providers/mapillary/ beside the others.
- No ground casting, mesh sampling, surface modes, FOLLOW, legend, prewarm,
orbit overview points (Panoramax's density dots included), stale-tile
swaps or water-filled point budget come back.
- Kept from main because the new providers need them: requiresMapStack and
attachMapStackController (Street View on Google 3D only), ground clicks,
openNearest with an optional provider nearestImage, openImage {frame},
reportError, the view-cone marker (now an SVG glyph), filters /
coverageLabel / sinceBasis, OPEN STREET VIEW, keyAlternatives and i18n.
- photoViewer.js treats the viewer as expanded when its wrap is full screen
or the iPhone popover, as EXPAND now is.
- The fixture browser gate keeps its 8 steps and adds one each for
KartaView and Panoramax; catalogs, docs, boundaries and format scope
follow.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
85 lines
3.0 KiB
JavaScript
85 lines
3.0 KiB
JavaScript
/** Own panel collapsed-state preferences and the one-time layout-reset notice. */
|
|
import { t } from '../i18n/index.js';
|
|
/** Versioned localStorage namespace prefix to invalidate stale panel layouts. */
|
|
const PANEL_LAYOUT_STORAGE_VERSION = 'v6';
|
|
/**
|
|
* Position keys are versioned separately from collapsed-state keys. The rails
|
|
* now lay panels out themselves and store no position; the version still names
|
|
* the layout-reset notice and the documented key.
|
|
*/
|
|
const PANEL_POSITION_STORAGE_VERSION = 'v8';
|
|
export class PanelPositionControls {
|
|
constructor({ syncPanelCollapseButton, showToast }) {
|
|
this._syncPanelCollapseButton = syncPanelCollapseButton;
|
|
this._showToast = showToast;
|
|
}
|
|
|
|
_maybeNotifyLayoutReset() {
|
|
try {
|
|
const marker = `godsEyeView.${PANEL_POSITION_STORAGE_VERSION}.layoutResetNotified`;
|
|
if (localStorage.getItem(marker)) return;
|
|
localStorage.setItem(marker, '1');
|
|
const hadOldPositions = Object.keys(localStorage).some((key) =>
|
|
key.startsWith('godsEyeView.v6.panelPos.'),
|
|
);
|
|
if (hadOldPositions) {
|
|
this._showToast(
|
|
t('Panel layout updated — positions reset to new defaults'),
|
|
);
|
|
}
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
|
|
_panelCollapseStorageKey(panelId) {
|
|
return `godsEyeView.${PANEL_LAYOUT_STORAGE_VERSION}.panelCollapsed.${panelId}`;
|
|
}
|
|
|
|
_restorePanelCollapsedState(panelId, { allowStored = true } = {}) {
|
|
const panelEl = document.getElementById(panelId);
|
|
if (!panelEl) return;
|
|
let collapsed = panelEl.classList.contains('collapsed');
|
|
let stored = null;
|
|
if (allowStored) {
|
|
try {
|
|
stored = localStorage.getItem(this._panelCollapseStorageKey(panelId));
|
|
if (stored === '1') collapsed = true;
|
|
if (stored === '0') collapsed = false;
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
// DISPLAY starts COLLAPSED for a first-time visitor, then respects the
|
|
// user's persisted choice like every other panel.
|
|
//
|
|
// It used to start expanded, to advertise the HUD / DETECT / 3D toggles.
|
|
// That reason expired when those became ON by default: the rail now opens
|
|
// to offer controls for things already happening, while competing with the
|
|
// first-run mission card for the one first impression there is. A stored
|
|
// choice still wins in both directions, so anyone who opens it keeps it.
|
|
if (panelId === 'pp-toggles' && stored === null) collapsed = true;
|
|
panelEl.classList.toggle('collapsed', collapsed);
|
|
// Bodies that expand themselves on first appearance must not override a
|
|
// choice the user (or a share link) already made.
|
|
if (panelEl.dataset)
|
|
panelEl.dataset.collapsedPreference = !allowStored
|
|
? 'share'
|
|
: stored === null
|
|
? 'default'
|
|
: 'stored';
|
|
this._syncPanelCollapseButton(panelEl);
|
|
}
|
|
|
|
_savePanelCollapsedState(panelId, collapsed) {
|
|
try {
|
|
localStorage.setItem(
|
|
this._panelCollapseStorageKey(panelId),
|
|
collapsed ? '1' : '0',
|
|
);
|
|
} catch {
|
|
// storage unavailable
|
|
}
|
|
}
|
|
}
|