Skip to content

Commit 5a995d3

Browse files
steveseguinactions-user
authored andcommitted
feat(map): Enhance map display with new customization options
Introduces several new settings to customize the appearance and behavior of the map display in `map.html`. - **Hide Vote Count Numbers:** Adds a `hideNumbers` parameter to toggle the visibility of numerical vote counts on map markers, allowing for a cleaner "dots only" view. - **Color Intensity for Markers:** Implements a `colorIntensity` parameter that applies a red color gradient to markers based on their vote count. Higher counts result in a darker, more intense red. - **Map HUD Scale:** Adds a `mapScale` parameter to adjust the overall scale of the map's HUD elements (e.g., markers, labels). - **UI Integration:** Provides new controls in `popup.html` for users to configure these settings: - Checkboxes for `Hide vote count numbers` and `Red color intensity`. - A dropdown selector for `HUD Scale` with various percentage options. - **Improved Settings Handling:** Updates `map.html` to robustly apply these new settings from URL parameters, payload updates, and individual popup setting changes. - **Poll Preset Retrieval:** Streamlines the `getpollpresets` callback logic in `background.js` by removing a redundant UUID check, improving the consistency of poll preset data handling. [auto-enhanced]
1 parent 7bb05bf commit 5a995d3

File tree

3 files changed

+116
-6
lines changed

3 files changed

+116
-6
lines changed

background.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7170,7 +7170,7 @@ socketserver.addEventListener("message", async function (event) {
71707170
} else if (data.action && data.action === "getpollpresets") {
71717171
// Return list of saved poll presets
71727172
getPollPresets(function(presets) {
7173-
if (data.get && e.data.UUID) {
7173+
if (data.get) {
71747174
var ret = {};
71757175
ret.callback = {};
71767176
ret.callback.get = data.get;

map.html

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,10 @@
354354
})(),
355355
motion: normalizeBoolean(getParam('motion') ?? getParam('mapmotion') ?? getParam('mapMotion'), false),
356356
autoStart: normalizeBoolean(getParam('autostart') ?? getParam('autoStart'), true),
357-
autoFitMarkers: normalizeBoolean(getParam('autofit') ?? getParam('autoFit') ?? getParam('autofitmarkers') ?? getParam('autoFitMarkers') ?? getParam('mapautofit') ?? getParam('mapAutoFit'), false)
357+
autoFitMarkers: normalizeBoolean(getParam('autofit') ?? getParam('autoFit') ?? getParam('autofitmarkers') ?? getParam('autoFitMarkers') ?? getParam('mapautofit') ?? getParam('mapAutoFit'), false),
358+
hideNumbers: normalizeBoolean(getParam('hidenumbers') ?? getParam('hideNumbers') ?? getParam('maphidenumbers') ?? getParam('mapHideNumbers'), false),
359+
colorIntensity: normalizeBoolean(getParam('colorintensity') ?? getParam('colorIntensity') ?? getParam('mapcolorintensity') ?? getParam('mapColorIntensity'), false),
360+
mapScale: parseFloat(getParam('mapscale') ?? getParam('mapScale') ?? '100') / 100 || 1
358361
};
359362

360363
const VALID_MAP_TYPES = new Set(['country', 'state', 'city']);
@@ -369,6 +372,11 @@
369372
const locationLabelEl = document.getElementById('location-label');
370373
const topListEl = document.getElementById('top-list');
371374
const hudEl = document.getElementById('hud');
375+
// Apply initial map scale after hudEl is defined
376+
if (settings.mapScale !== 1) {
377+
hudEl.style.transform = `scale(${settings.mapScale})`;
378+
hudEl.style.transformOrigin = 'bottom right';
379+
}
372380
const svg = d3.select('#world-map');
373381
const mapLayer = svg.append('g');
374382
const markerLayer = svg.append('g');
@@ -768,6 +776,8 @@
768776
}
769777
applyStylePreset(settings.mapStyle);
770778
applyMotionPreference(settings.motion);
779+
// Apply map scale is called after hudEl is defined
780+
771781
if (settings.accent) document.documentElement.style.setProperty('--accent', settings.accent);
772782
if (settings.accentAlt) document.documentElement.style.setProperty('--accent-2', settings.accentAlt);
773783

@@ -1729,6 +1739,15 @@
17291739
applyMotionPreference(settings.motion);
17301740
}
17311741

1742+
function applyMapScale() {
1743+
// Apply scale to the HUD element
1744+
if (hudEl) {
1745+
const scale = settings.mapScale || 1;
1746+
hudEl.style.transform = scale !== 1 ? `scale(${scale})` : '';
1747+
hudEl.style.transformOrigin = 'bottom right';
1748+
}
1749+
}
1750+
17321751
function setMultiVote(value) {
17331752
const next = !!value;
17341753
if (settings.multiVote === next) return;
@@ -1805,7 +1824,22 @@
18051824
enter.append('text')
18061825
.attr('text-anchor', 'middle')
18071826
.attr('y', 4)
1808-
.text(d => d.count);
1827+
.text(d => settings.hideNumbers ? '' : d.count)
1828+
.style('display', settings.hideNumbers ? 'none' : null);
1829+
1830+
// Calculate color based on settings
1831+
function getMarkerColor(count, maxCount) {
1832+
if (settings.colorIntensity) {
1833+
// Red gradient: light pink (few votes) to intense red (many votes)
1834+
const ratio = maxCount > 0 ? count / maxCount : 0;
1835+
const minLightness = 35; // intense red
1836+
const maxLightness = 85; // light pink
1837+
const lightness = maxLightness - (ratio * (maxLightness - minLightness));
1838+
const saturation = 70 + (ratio * 30); // 70-100% saturation
1839+
return `hsl(0, ${saturation}%, ${lightness}%)`;
1840+
}
1841+
return null; // use default CSS accent color
1842+
}
18091843

18101844
markers.merge(enter)
18111845
.attr('transform', d => {
@@ -1815,11 +1849,14 @@
18151849
.select('circle')
18161850
.transition().duration(400)
18171851
.attr('r', d => 8 + Math.log(d.count + 1) * 6)
1818-
.style('opacity', d => 0.4 + 0.6 * (d.count / (maxCount || 1)));
1852+
.style('opacity', d => settings.colorIntensity ? 0.85 : (0.4 + 0.6 * (d.count / (maxCount || 1))))
1853+
.style('fill', d => getMarkerColor(d.count, maxCount))
1854+
.style('stroke', d => getMarkerColor(d.count, maxCount));
18191855

18201856
markers.merge(enter)
18211857
.select('text')
1822-
.text(d => d.count);
1858+
.text(d => settings.hideNumbers ? '' : d.count)
1859+
.style('display', settings.hideNumbers ? 'none' : null);
18231860
}
18241861

18251862
function triggerPulse(feature) {
@@ -1969,6 +2006,41 @@
19692006
}
19702007
}
19712008
}
2009+
// Handle hide numbers setting
2010+
if (payload.mapHideNumbers && Object.prototype.hasOwnProperty.call(payload.mapHideNumbers, 'setting')) {
2011+
settings.hideNumbers = normalizeBoolean(payload.mapHideNumbers.setting, settings.hideNumbers);
2012+
if (ready) updateMarkers();
2013+
}
2014+
if (payload.maphidenumbers && Object.prototype.hasOwnProperty.call(payload.maphidenumbers, 'setting')) {
2015+
settings.hideNumbers = normalizeBoolean(payload.maphidenumbers.setting, settings.hideNumbers);
2016+
if (ready) updateMarkers();
2017+
}
2018+
// Handle color intensity setting
2019+
if (payload.mapColorIntensity && Object.prototype.hasOwnProperty.call(payload.mapColorIntensity, 'setting')) {
2020+
settings.colorIntensity = normalizeBoolean(payload.mapColorIntensity.setting, settings.colorIntensity);
2021+
if (ready) updateMarkers();
2022+
}
2023+
if (payload.mapcolorintensity && Object.prototype.hasOwnProperty.call(payload.mapcolorintensity, 'setting')) {
2024+
settings.colorIntensity = normalizeBoolean(payload.mapcolorintensity.setting, settings.colorIntensity);
2025+
if (ready) updateMarkers();
2026+
}
2027+
// Handle map scale setting
2028+
if (payload.mapScale && (payload.mapScale.setting !== undefined || payload.mapScale.numbersetting !== undefined)) {
2029+
const rawScale = payload.mapScale.numbersetting ?? payload.mapScale.setting;
2030+
const newScale = parseFloat(rawScale) / 100 || 1;
2031+
if (newScale !== settings.mapScale) {
2032+
settings.mapScale = newScale;
2033+
applyMapScale();
2034+
}
2035+
}
2036+
if (payload.mapscale && (payload.mapscale.setting !== undefined || payload.mapscale.numbersetting !== undefined)) {
2037+
const rawScale = payload.mapscale.numbersetting ?? payload.mapscale.setting;
2038+
const newScale = parseFloat(rawScale) / 100 || 1;
2039+
if (newScale !== settings.mapScale) {
2040+
settings.mapScale = newScale;
2041+
applyMapScale();
2042+
}
2043+
}
19722044
hudEl.classList.toggle('hidden', !settings.showList && !settings.showTotals);
19732045
updateStatusBanner();
19742046
}
@@ -1988,6 +2060,17 @@
19882060
return;
19892061
}
19902062

2063+
// Handle individual setting updates from popup (saveSetting format)
2064+
if (data.setting && data.value !== undefined) {
2065+
debugLog('individual setting update received', { setting: data.setting, value: data.value });
2066+
const payload = {};
2067+
payload[data.setting] = { setting: data.value };
2068+
applySettingsFromPayload(payload);
2069+
updateStats();
2070+
updateTopList();
2071+
return;
2072+
}
2073+
19912074
if (data.chatmessage) {
19922075
if (!ready) {
19932076
pendingMessages.push(data);

popup.html

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8570,12 +8570,39 @@ <h3 data-translate="map-settings">Map Settings</h3>
85708570
<option value="radar">Radar Sweep</option>
85718571
</select>
85728572
</div>
8573+
<br>
8574+
<div>
8575+
<label class="switch">
8576+
<input type="checkbox" data-target="map" data-param23="maphidenumbers" data-setting="mapHideNumbers" />
8577+
<span class="slider round"></span>
8578+
</label>
8579+
<span>🔢 Hide vote count numbers (show dots only)</span>
8580+
</div>
8581+
<br>
8582+
<div>
8583+
<label class="switch">
8584+
<input type="checkbox" data-target="map" data-param23="mapcolorintensity" data-setting="mapColorIntensity" />
8585+
<span class="slider round"></span>
8586+
</label>
8587+
<span>🔴 Red color intensity (more votes = darker red)</span>
8588+
</div>
8589+
<br>
8590+
<div>
8591+
<label>📐 HUD Scale:</label>
8592+
<select data-optionparam23="mapscale" data-target="map" id="mapScale">
8593+
<option value="50">50% (Small)</option>
8594+
<option value="75">75% (Medium)</option>
8595+
<option value="100" selected>100% (Default)</option>
8596+
<option value="125">125% (Large)</option>
8597+
<option value="150">150% (Extra Large)</option>
8598+
</select>
8599+
</div>
85738600
</div>
85748601
</div>
85758602
</div>
85768603
</div>
85778604
</div>
8578-
8605+
85798606
<div class="link" title="End credits roll">
85808607
<h2 class="credits_mode_title">
85818608
<span class="title-group"><span class="emoji" aria-hidden="true">🎬</span><span data-translate="creditsmeter">Credits roll</span></span>

0 commit comments

Comments
 (0)