From b7f88b519d8b1b13b019c4ad6fc8692ca0b470c6 Mon Sep 17 00:00:00 2001 From: Azgaar Date: Mon, 19 Dec 2022 01:45:14 +0300 Subject: [PATCH] refactor(#902): lock state - keep label --- modules/burgs-and-states.js | 42 ++++------------------ modules/ui/tools.js | 71 ++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 65 deletions(-) diff --git a/modules/burgs-and-states.js b/modules/burgs-and-states.js index a198a216..e56d9b6a 100644 --- a/modules/burgs-and-states.js +++ b/modules/burgs-and-states.js @@ -602,40 +602,15 @@ window.BurgsAndStates = (function () { const displayed = layerIsOn("toggleLabels"); if (!displayed) toggleLabels(); - if (!list) { - // remove all labels and textpaths - g.selectAll("text") - .filter((_, i) => { - const id = g.select(`:nth-child(${i + 1})`).node()?.id; - if (!id) return true; + // remove state labels to be redrawn + for (const state of pack.states) { + if (!state.i || state.removed || state.lock) continue; + if (list && !list.includes(state.i)) continue; - return !pack.states.some(s => s.lock && `${s.old_i}` === id.substring(10)); - }) - .remove(); - t.selectAll("path[id*='stateLabel']") - .filter((_, i) => { - const id = t.select(`:nth-child(${i + 1})`).node()?.id; - if (!id) return true; - - return !pack.states.some(s => s.lock && `${s.old_i}` === id.substring(19)); - }) - .remove(); + byId(`stateLabel${state.i}`)?.remove(); + byId(`textPath_stateLabel6${state.i}`)?.remove(); } - pack.states.forEach(s => { - if (!s.lock) return; - - // For locked states, get the name and update its index to keep it in place - const g = labels.select("#states"); - const t = defs.select("#textPaths"); - - const labelNode = g.select(`#stateLabel${s.old_i}`); - const textNode = t.select(`#textPath_stateLabel${s.old_i}`); - - labelNode.attr("id", `stateLabel${s.i}`).select("textPath").attr("xlink:href", `#textPath_stateLabel${s.i}`); - textNode.attr("id", `textPath_stateLabel${s.i}`); - }); - const example = g.append("text").attr("x", 0).attr("x", 0).text("Average"); const letterLength = example.node().getComputedTextLength() / 7; // average length of 1 letter @@ -644,11 +619,6 @@ window.BurgsAndStates = (function () { const state = states[p[0]]; const {name, fullName} = state; - if (list) { - t.select("#textPath_stateLabel" + id).remove(); - g.select("#stateLabel" + id).remove(); - } - const path = p[1].length > 1 ? round(lineGen(p[1])) : `M${p[1][0][0] - 50},${p[1][0][1]}h${100}`; const textPath = t .append("path") diff --git a/modules/ui/tools.js b/modules/ui/tools.js index 29807226..3ec4c8b9 100644 --- a/modules/ui/tools.js +++ b/modules/ui/tools.js @@ -152,6 +152,7 @@ function regenerateStates() { else drawStates(); if (!layerIsOn("toggleBorders")) toggleBorders(); else drawBorders(); + BurgsAndStates.drawStateLabels(); Military.generate(); if (layerIsOn("toggleEmblems")) drawEmblems(); // redrawEmblems @@ -167,6 +168,7 @@ function recreateStates() { const statesCount = +regionsOutput.value; const validBurgs = pack.burgs.filter(b => b.i && !b.removed); + if (!validBurgs.length) return tip("There are no any burgs to generate states. Please create burgs first", false, "error"); if (validBurgs.length < statesCount) @@ -189,30 +191,27 @@ function recreateStates() { burg.capital = 0; } - // remove emblems - document.querySelectorAll("[id^=stateCOA]").forEach(el => el.remove()); - document.querySelectorAll("[id^=provinceCOA]").forEach(el => el.remove()); - emblems.selectAll("use").remove(); + // remove labels and emblems for non-locked states + for (const state of pack.states) { + if (!state.i || state.removed || state.lock) continue; + + // remove state labels + byId(`stateLabel${state.i}`)?.remove(); + byId(`textPath_stateLabel${state.i}`)?.remove(); + + // remove state emblems + byId(`stateCOA${state.i}`)?.remove(); + document.querySelector(`#stateEmblems > use[data-i="${state.i}"]`)?.remove(); + + // remove province emblems + for (const provinceId of state.provinces) { + byId(`provinceCOA${provinceId}`)?.remove(); + document.querySelector(`#provinceEmblems > use[data-i="${provinceId}"]`)?.remove(); + } + } unfog(); - if (!statesCount) { - tip(`Cannot generate zero states. Please check the States Number option`, false, "warn"); - pack.states = pack.states.slice(0, 1); // remove all except of neutrals - pack.states[0].diplomacy = []; // clear diplomacy - pack.provinces = [0]; // remove all provinces - pack.cells.state = new Uint16Array(pack.cells.i.length); // reset cells data - - borders.selectAll("path").remove(); // remove borders - regions.selectAll("path").remove(); // remove states fill - labels.select("#states").selectAll("text"); // remove state labels - defs.select("#textPaths").selectAll("path[id*='stateLabel']").remove(); // remove state labels paths - - if (document.getElementById("burgsOverviewRefresh").offsetParent) burgsOverviewRefresh.click(); - if (document.getElementById("statesEditorRefresh").offsetParent) statesEditorRefresh.click(); - return; - } - // burg local ids sorted by a bit randomized population. Also ignore burgs of a locked state const sortedBurgs = validBurgs .filter(b => !lockedStatesIds.includes(b.state)) @@ -229,26 +228,38 @@ function recreateStates() { const newStates = [{i: 0, name: pack.states[0].name}]; // restore locked states - lockedStates.forEach(s => { + lockedStates.forEach(state => { const newId = newStates.length; + const {x, y} = validBurgs[state.capital]; + capitalsTree.add([x, y]); - s.provinces.forEach(id => { + // update label id reference + labels + .select("#states") + .select(`#stateLabel${state.i}`) + .attr("id", `stateLabel${newId}`) + .select("textPath") + .attr("xlink:href", `#textPath_stateLabel${newId}`); + defs.select("#textPaths").select(`#textPath_stateLabel${state.i}`).attr("id", `textPath_stateLabel${newId}`); + + // update emblem id reference + byId(`stateCOA${state.i}`)?.setAttribute("id", `stateCOA${newId}`); + document.querySelector(`#stateEmblems > use[data-i="${state.i}"]`)?.setAttribute("data-i", newId); + + state.provinces.forEach(id => { if (!pack.provinces[id] || !pack.provinces[id].removed) return; pack.provinces[id].state = newId; // pack.provinces[id].should_restore = true; }); - const {x, y} = validBurgs[s.capital]; - capitalsTree.add([x, y]); - - s.i = newId; - newStates.push(s); + state.i = newId; + newStates.push(state); }); for (const i of pack.cells.i) { const stateId = pack.cells.state[i]; const lockedStateIndex = lockedStatesIds.indexOf(stateId) + 1; - // lockedStateIndex is an index of locked state of 0 if state is not locked + // lockedStateIndex is an index of locked state or 0 if state is not locked pack.cells.state[i] = lockedStateIndex; } @@ -291,6 +302,8 @@ function recreateStates() { newStates.push({i, name, type, capital: capital.i, center: capital.cell, culture, expansionism, coa}); } + if (!statesCount) tip(`States Number option is set to zero. No counties are generated`, false, "warn"); + pack.states = newStates; }