|
@@ -180,6 +180,27 @@ const MapView = (() => {
|
|
|
function hasTrack(trackId) { return !!trackLayers[trackId]; }
|
|
function hasTrack(trackId) { return !!trackLayers[trackId]; }
|
|
|
function getTrackPoints(trackId) { return trackLayers[trackId]?.points || null; }
|
|
function getTrackPoints(trackId) { return trackLayers[trackId]?.points || null; }
|
|
|
|
|
|
|
|
|
|
+ // ===== Track highlight (sidebar hover) =====
|
|
|
|
|
+
|
|
|
|
|
+ let highlightedTrackId = null;
|
|
|
|
|
+
|
|
|
|
|
+ function highlightTrack(trackId) {
|
|
|
|
|
+ if (String(highlightedTrackId) === String(trackId)) return;
|
|
|
|
|
+ unhighlightTrack();
|
|
|
|
|
+ const tl = trackLayers[trackId];
|
|
|
|
|
+ if (!tl) return;
|
|
|
|
|
+ tl.layer.setStyle({ weight: 6, opacity: 1 });
|
|
|
|
|
+ tl.layer.bringToFront();
|
|
|
|
|
+ highlightedTrackId = trackId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function unhighlightTrack() {
|
|
|
|
|
+ if (highlightedTrackId === null) return;
|
|
|
|
|
+ const tl = trackLayers[highlightedTrackId];
|
|
|
|
|
+ if (tl) tl.layer.setStyle({ weight: 3, opacity: 0.8 });
|
|
|
|
|
+ highlightedTrackId = null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// ===== Hover =====
|
|
// ===== Hover =====
|
|
|
|
|
|
|
|
function onMapMouseMove(e) {
|
|
function onMapMouseMove(e) {
|
|
@@ -309,6 +330,7 @@ const MapView = (() => {
|
|
|
init, addTrack, removeTrack, clearTracks,
|
|
init, addTrack, removeTrack, clearTracks,
|
|
|
fitTrack, fitAll, hasTrack, getTrackPoints,
|
|
fitTrack, fitAll, hasTrack, getTrackPoints,
|
|
|
showHoverMarker, hideHoverMarker,
|
|
showHoverMarker, hideHoverMarker,
|
|
|
|
|
+ highlightTrack, unhighlightTrack,
|
|
|
saveToHash, restoreFromHash, getHashParams,
|
|
saveToHash, restoreFromHash, getHashParams,
|
|
|
setCurrentTrack, getMap
|
|
setCurrentTrack, getMap
|
|
|
};
|
|
};
|