diff --git a/index.html b/index.html index d74da411..c86e75cf 100644 --- a/index.html +++ b/index.html @@ -1425,9 +1425,9 @@ Canvas size - + x - + px @@ -7688,34 +7688,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/modules/ui/biomes-editor.js b/src/dialogs/dialogs/biomes-editor.js similarity index 99% rename from src/modules/ui/biomes-editor.js rename to src/dialogs/dialogs/biomes-editor.js index 92735700..97406487 100644 --- a/src/modules/ui/biomes-editor.js +++ b/src/dialogs/dialogs/biomes-editor.js @@ -7,9 +7,9 @@ import {getRandomColor} from "utils/colorUtils"; import {openURL} from "utils/linkUtils"; import {rn} from "utils/numberUtils"; import {si} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; -export function editBiomes() { - if (customization) return; +export function open() { closeDialogs("#biomesEditor, .stable"); if (!layerIsOn("toggleBiomes")) toggleBiomes(); if (layerIsOn("toggleStates")) toggleStates(); diff --git a/src/modules/ui/burg-editor.js b/src/dialogs/dialogs/burg-editor.js similarity index 98% rename from src/modules/ui/burg-editor.js rename to src/dialogs/dialogs/burg-editor.js index 3adc6bd7..8a85269a 100644 --- a/src/modules/ui/burg-editor.js +++ b/src/dialogs/dialogs/burg-editor.js @@ -1,14 +1,19 @@ import * as d3 from "d3"; -import {findCell} from "utils/graphUtils"; -import {tip, clearMainTip} from "scripts/tooltips"; -import {rn} from "utils/numberUtils"; +import {closeDialogs} from "dialogs/utils"; +import {layerIsOn} from "layers"; import {prompt} from "scripts/prompt"; +import {clearMainTip, tip} from "scripts/tooltips"; +import {findCell} from "utils/graphUtils"; +import {rn} from "utils/numberUtils"; import {rand} from "utils/probabilityUtils"; import {parseTransform} from "utils/stringUtils"; -import {getHeight} from "utils/unitUtils"; +import {convertTemperature, getHeight} from "utils/unitUtils"; +import {getMFCGlink, getBurgSeed} from "modules/ui/editors"; -export function editBurg(id) { +let isLoaded = false; + +export function open({id} = {}) { if (customization) return; closeDialogs(".stable"); if (!layerIsOn("toggleIcons")) toggleIcons(); @@ -26,8 +31,8 @@ export function editBurg(id) { position: {my: "left top", at: "left+10 top+10", of: "svg", collision: "fit"} }); - if (fmg.modules.editBurg) return; - fmg.modules.editBurg = true; + if (isLoaded) return; + isLoaded = true; // add listeners document.getElementById("burgGroupShow").addEventListener("click", showGroupSection); diff --git a/src/modules/dynamic/overview/charts-overview.js b/src/dialogs/dialogs/charts-overview.js similarity index 99% rename from src/modules/dynamic/overview/charts-overview.js rename to src/dialogs/dialogs/charts-overview.js index fa9b1f2d..60564f1b 100644 --- a/src/modules/dynamic/overview/charts-overview.js +++ b/src/dialogs/dialogs/charts-overview.js @@ -7,6 +7,7 @@ import {rn} from "utils/numberUtils"; import {capitalize} from "utils/stringUtils"; import {si, convertTemperature, getFriendlyPrecipitation} from "utils/unitUtils"; import {rollups} from "utils/functionUtils"; +import {closeDialogs} from "dialogs/utils"; const entitiesMap = { states: { diff --git a/src/modules/dynamic/editors/cultures-editor.js b/src/dialogs/dialogs/cultures-editor.js similarity index 99% rename from src/modules/dynamic/editors/cultures-editor.js rename to src/dialogs/dialogs/cultures-editor.js index 5bd613cb..833c5d6c 100644 --- a/src/modules/dynamic/editors/cultures-editor.js +++ b/src/dialogs/dialogs/cultures-editor.js @@ -9,6 +9,8 @@ import {capitalize} from "utils/stringUtils"; import {si} from "utils/unitUtils"; import {abbreviate} from "utils/languageUtils"; import {debounce} from "utils/functionUtils"; +import {closeDialogs} from "dialogs/utils"; +import {openDialog} from "dialogs"; const $body = insertEditorHtml(); addListeners(); @@ -639,9 +641,6 @@ function togglePercentageMode() { } async function showHierarchy() { - if (customization) return; - const HeirarchyTree = await import("../hierarchy-tree.js"); - const getDescription = culture => { const {name, type, rural, urban} = culture; @@ -660,7 +659,7 @@ async function showHierarchy() { if (type === "Hunting") return "pentagon"; }; - HeirarchyTree.open({ + openDialog("hierarchyTree", null, { type: "cultures", data: pack.cultures, onNodeEnter: cultureHighlightOn, diff --git a/src/modules/dynamic/heightmap-selection.js b/src/dialogs/dialogs/heightmap-selection.js similarity index 99% rename from src/modules/dynamic/heightmap-selection.js rename to src/dialogs/dialogs/heightmap-selection.js index d5073bf9..0f8c72c6 100644 --- a/src/modules/dynamic/heightmap-selection.js +++ b/src/dialogs/dialogs/heightmap-selection.js @@ -7,6 +7,7 @@ import {byId} from "utils/shorthands"; import {generateSeed} from "utils/probabilityUtils"; import {getColorScheme} from "utils/colorUtils"; import {aleaPRNG} from "scripts/aleaPRNG"; +import {closeDialogs} from "dialogs/utils"; const initialSeed = generateSeed(); let graph = getGraph(grid); diff --git a/src/modules/dynamic/hierarchy-tree.js b/src/dialogs/dialogs/hierarchy-tree.js similarity index 99% rename from src/modules/dynamic/hierarchy-tree.js rename to src/dialogs/dialogs/hierarchy-tree.js index fb77c921..74ec40b0 100644 --- a/src/modules/dynamic/hierarchy-tree.js +++ b/src/dialogs/dialogs/hierarchy-tree.js @@ -3,6 +3,7 @@ import * as d3 from "d3"; import {byId} from "utils/shorthands"; import {tip} from "scripts/tooltips"; import {capitalize} from "utils/stringUtils"; +import {closeDialogs} from "dialogs/utils"; appendStyleSheet(); insertHtml(); diff --git a/src/modules/dynamic/editors/religions-editor.js b/src/dialogs/dialogs/religions-editor.js similarity index 99% rename from src/modules/dynamic/editors/religions-editor.js rename to src/dialogs/dialogs/religions-editor.js index 70def4c4..e02ceab3 100644 --- a/src/modules/dynamic/editors/religions-editor.js +++ b/src/dialogs/dialogs/religions-editor.js @@ -8,6 +8,8 @@ import {rn} from "utils/numberUtils"; import {si} from "utils/unitUtils"; import {abbreviate} from "utils/languageUtils"; import {debounce} from "utils/functionUtils"; +import {closeDialogs} from "dialogs/utils"; +import {openDialog} from "dialogs"; const $body = insertEditorHtml(); addListeners(); @@ -543,9 +545,6 @@ function togglePercentageMode() { } async function showHierarchy() { - if (customization) return; - const HeirarchyTree = await import("../hierarchy-tree.js"); - const getDescription = religion => { const {name, type, form, rural, urban} = religion; @@ -570,7 +569,7 @@ async function showHierarchy() { if (type === "Heresy") return "diamond"; }; - HeirarchyTree.open({ + openDialog("hierarchyTree", null, { type: "religions", data: pack.religions, onNodeEnter: religionHighlightOn, diff --git a/src/modules/dynamic/editors/states-editor.js b/src/dialogs/dialogs/states-editor.js similarity index 99% rename from src/modules/dynamic/editors/states-editor.js rename to src/dialogs/dialogs/states-editor.js index 65d3f4c0..0636e091 100644 --- a/src/modules/dynamic/editors/states-editor.js +++ b/src/dialogs/dialogs/states-editor.js @@ -9,6 +9,7 @@ import {rn} from "utils/numberUtils"; import {rand, P} from "utils/probabilityUtils"; import {si} from "utils/unitUtils"; import {getAdjective} from "utils/languageUtils"; +import {closeDialogs} from "dialogs/utils"; const $body = insertEditorHtml(); addListeners(); diff --git a/src/modules/ui/units-editor.js b/src/dialogs/dialogs/units-editor.js similarity index 99% rename from src/modules/ui/units-editor.js rename to src/dialogs/dialogs/units-editor.js index db5d1cc8..ea15bc91 100644 --- a/src/modules/ui/units-editor.js +++ b/src/dialogs/dialogs/units-editor.js @@ -4,6 +4,8 @@ import {restoreDefaultEvents} from "scripts/events"; import {findCell} from "utils/graphUtils"; import {tip} from "scripts/tooltips"; import {prompt} from "scripts/prompt"; +import {closeDialogs} from "dialogs/utils"; +import {fitScaleBar} from "modules/measurers"; export function open() { closeDialogs("#unitsEditor, .stable"); diff --git a/src/dialogs/index.ts b/src/dialogs/index.ts new file mode 100644 index 00000000..cc993839 --- /dev/null +++ b/src/dialogs/index.ts @@ -0,0 +1,27 @@ +const dialogsMap = { + biomesEditor: "biomes-editor", + burgEditor: "burg-editor", + chartsOverview: "charts-overview", + culturesEditor: "cultures-editor", + heightmapSelection: "heightmap-selection", + hierarchyTree: "hierarchy-tree", + religionsEditor: "religions-editor", + statesEditor: "states-editor", + unitsEditor: "units-editor" +}; + +type TDialog = keyof typeof dialogsMap; + +const defaultOptions = { + allowDuringCustomization: false +}; + +// dynamically load UI dialog +// dialog is a es module with the only exported function 'open' +export async function openDialog(dialog: TDialog, options: null | typeof defaultOptions, props?: UnknownObject) { + const {allowDuringCustomization} = options || defaultOptions; + if (customization && !allowDuringCustomization) return; + + const Dialog = await import(`./dialogs/${dialogsMap[dialog]}.js`); + Dialog.open(props); +} diff --git a/src/dialogs/utils.ts b/src/dialogs/utils.ts new file mode 100644 index 00000000..fa1c4199 --- /dev/null +++ b/src/dialogs/utils.ts @@ -0,0 +1,10 @@ +// close all dialogs except stated +export function closeDialogs(except = "#except") { + try { + $(".dialog:visible") + .not(except) + .each(function () { + $(this).dialog("close"); + }); + } catch (error) {} +} diff --git a/src/layers/toggles.ts b/src/layers/toggles.ts index 96458f98..2d0c0f0c 100644 --- a/src/layers/toggles.ts +++ b/src/layers/toggles.ts @@ -3,13 +3,12 @@ import * as d3 from "d3"; import {tip} from "scripts/tooltips"; import {getBase64} from "utils/functionUtils"; import {isCtrlPressed} from "utils/keyboardUtils"; +import {openDialog} from "dialogs"; // @ts-expect-error js module -import {editStyle, calculateFriendlyGridSize, shiftCompass} from "modules/ui/style"; -import {turnLayerButtonOn, turnLayerButtonOff, layerIsOn} from "./utils"; -import {renderLayer} from "./renderers"; +import {calculateFriendlyGridSize, editStyle, shiftCompass} from "modules/ui/style"; import {getInputNumber, getInputValue} from "utils/nodeUtils"; -// @ts-expect-error js module -import {editUnits} from "modules/ui/editors"; +import {renderLayer} from "./renderers"; +import {layerIsOn, turnLayerButtonOff, turnLayerButtonOn} from "./utils"; const layerTogglesMap = { toggleBiomes, @@ -467,9 +466,9 @@ function toggleScaleBar(event?: MouseEvent) { if (!layerIsOn("toggleScaleBar")) { turnLayerButtonOn("toggleScaleBar"); $("#scaleBar").fadeIn(); - if (isCtrlPressed(event)) editUnits(); + if (isCtrlPressed(event)) openDialog("unitsEditor"); } else { - if (isCtrlPressed(event)) editUnits(); + if (isCtrlPressed(event)) openDialog("unitsEditor"); else { $("#scaleBar").fadeOut(); turnLayerButtonOff("toggleScaleBar"); diff --git a/src/main.ts b/src/main.ts index 1d639b5c..93312bdb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,14 +11,8 @@ import {Rulers} from "./modules/measurers"; // @ts-expect-error js-module import {applyStoredOptions} from "./modules/ui/options"; import {addGlobalListeners} from "./scripts/listeners"; -import {tip} from "./scripts/tooltips"; import {checkForUpdates} from "./scripts/updater"; import {getInputNumber} from "utils/nodeUtils"; -// @ts-expect-error js module -import {editUnits} from "modules/ui/editors"; - -checkForUpdates(); -addGlobalListeners(); window.fmg = { modules: {} @@ -32,14 +26,15 @@ options = { stateLabelsMode: "auto" }; +checkForUpdates(); +applyStoredOptions(); + populationRate = getInputNumber("populationRateInput"); distanceScale = getInputNumber("distanceScaleInput"); urbanization = getInputNumber("urbanizationInput"); urbanDensity = getInputNumber("urbanDensityInput"); statesNeutral = 1; // statesEditor growth parameter -applyStoredOptions(); - rulers = new Rulers(); biomesData = window.Biomes.getDefault(); nameBases = window.Names.getNameBases(); // cultures-related data @@ -53,8 +48,4 @@ svgWidth = graphWidth; svgHeight = graphHeight; defineSvg(graphWidth, graphHeight); - -scaleBar.on("mousemove", () => tip("Click to open Units Editor")).on("click", editUnits); -legend - .on("mousemove", () => tip("Drag to change the position. Click to hide the legend")) - .on("click", () => clearLegend()); +addGlobalListeners(); diff --git a/src/modules/dynamic/export-json.js b/src/modules/dynamic/export-json.js index b3a822a6..7c949077 100644 --- a/src/modules/dynamic/export-json.js +++ b/src/modules/dynamic/export-json.js @@ -1,4 +1,5 @@ import {tip} from "scripts/tooltips"; +import {closeDialogs} from "dialogs/utils"; export function exportToJson(type) { if (customization) diff --git a/src/modules/io/load.js b/src/modules/io/load.js index b7a43994..78db8434 100644 --- a/src/modules/io/load.js +++ b/src/modules/io/load.js @@ -11,7 +11,7 @@ import {link} from "utils/linkUtils"; import {minmax, rn} from "utils/numberUtils"; import {regenerateMap} from "scripts/generation"; import {reMarkFeatures} from "modules/markup"; -import {editUnits} from "modules/ui/editors"; +import {closeDialogs} from "dialogs/utils"; // add drag to upload logic, pull request from @evyatron export function addDragToUpload() { @@ -480,13 +480,6 @@ async function parseLoadedData(data) { updatePresetInput(); })(); - void (function restoreEvents() { - scaleBar.on("mousemove", () => tip("Click to open Units Editor")).on("click", editUnits); - legend - .on("mousemove", () => tip("Drag to change the position. Click to hide the legend")) - .on("click", () => clearLegend()); - })(); - { // dynamically import and run auto-udpdate script const versionNumber = parseFloat(params[0]); diff --git a/src/modules/io/save.js b/src/modules/io/save.js index dd77e11f..83a12736 100644 --- a/src/modules/io/save.js +++ b/src/modules/io/save.js @@ -2,6 +2,7 @@ import {tip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; import {ldb} from "scripts/indexedDB"; import {ra} from "utils/probabilityUtils"; +import {closeDialogs} from "dialogs/utils"; // functions to save project as .map file diff --git a/src/modules/ui/battle-screen.js b/src/modules/ui/battle-screen.js index 8b2b8e84..f11982ae 100644 --- a/src/modules/ui/battle-screen.js +++ b/src/modules/ui/battle-screen.js @@ -7,6 +7,7 @@ import {rn, minmax} from "utils/numberUtils"; import {rand, P, Pint} from "utils/probabilityUtils"; import {capitalize} from "utils/stringUtils"; import {getAdjective, list} from "utils/languageUtils"; +import {closeDialogs} from "dialogs/utils"; export class Battle { constructor(attacker, defender) { @@ -172,35 +173,38 @@ export class Battle { const state = pack.states[regiment.state]; const distance = (Math.hypot(this.y - regiment.by, this.x - regiment.bx) * distanceScaleInput.value) | 0; // distance between regiment and its base const color = state.color[0] === "#" ? state.color : "#999"; - const icon = ` + const icon = /* html */ ` ${regiment.icon}`; const body = ``; - let initial = `
${icon}${regiment.name.slice(0, 24)}`; - let casualties = `
${state.fullName.slice( - 0, - 26 - )}`; - let survivors = `
Distance to base: ${distance} ${distanceUnitInput.value}`; + let initial = /* html */ `
+ ${icon} + ${regiment.name.slice(0, 24)} + `; + + let casualties = /* html */ `
+ + ${state.fullName.slice(0, 26)} + `; + + let survivors = /* html */ `
+ + Distance to base: ${distance} ${distanceUnitInput.value} + `; for (const u of options.military) { - initial += `${ - regiment.u[u.name] || 0 - }`; + initial += ` + ${regiment.u[u.name] || 0}`; casualties += `0`; - survivors += `${ - regiment.u[u.name] || 0 - }`; + survivors += ` + ${regiment.u[u.name] || 0}`; } initial += `${regiment.a || 0}
`; casualties += `0
`; - survivors += `${ - regiment.a || 0 - }
`; + survivors += ` + ${regiment.a || 0}
`; const div = side === "attackers" ? battleAttackers : battleDefenders; div.innerHTML += body + initial + casualties + survivors + "
"; diff --git a/src/modules/ui/burgs-overview.js b/src/modules/ui/burgs-overview.js index efcf1c44..324f4b0e 100644 --- a/src/modules/ui/burgs-overview.js +++ b/src/modules/ui/burgs-overview.js @@ -7,6 +7,8 @@ import {getCoordinates} from "utils/coordinateUtils"; import {rn} from "utils/numberUtils"; import {si, siToInteger} from "utils/unitUtils"; import {getHeight} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; +import {openDialog} from "dialogs"; export function overviewBurgs() { if (customization) return; @@ -241,8 +243,7 @@ export function overviewBurgs() { } function openBurgEditor() { - const burg = +this.parentNode.dataset.id; - editBurg(burg); + openDialog("burgEditor", null, {id: +this.parentNode.dataset.id}); } function triggerBurgRemove() { diff --git a/src/modules/ui/coastline-editor.js b/src/modules/ui/coastline-editor.js index 6dc4215b..ea19b53c 100644 --- a/src/modules/ui/coastline-editor.js +++ b/src/modules/ui/coastline-editor.js @@ -6,6 +6,7 @@ import {clipPoly} from "utils/lineUtils"; import {rn} from "utils/numberUtils"; import {round} from "utils/stringUtils"; import {si} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; export function editCoastline(node = d3.event.target) { if (customization) return; diff --git a/src/modules/ui/diplomacy-editor.js b/src/modules/ui/diplomacy-editor.js index 64142cb0..7edc7d68 100644 --- a/src/modules/ui/diplomacy-editor.js +++ b/src/modules/ui/diplomacy-editor.js @@ -3,6 +3,7 @@ import * as d3 from "d3"; import {restoreDefaultEvents} from "scripts/events"; import {findCell} from "utils/graphUtils"; import {tip, clearMainTip} from "scripts/tooltips"; +import {closeDialogs} from "dialogs/utils"; export function editDiplomacy() { if (customization) return; diff --git a/src/modules/ui/editors.js b/src/modules/ui/editors.js index 87e05b9e..a3845a4b 100644 --- a/src/modules/ui/editors.js +++ b/src/modules/ui/editors.js @@ -6,6 +6,7 @@ import {byId} from "utils/shorthands"; import {tip} from "scripts/tooltips"; import {rn, minmax, normalize} from "utils/numberUtils"; import {parseTransform} from "utils/stringUtils"; +import {each} from "utils/probabilityUtils"; // clear elSelected variable export function unselect() { @@ -17,17 +18,6 @@ export function unselect() { elSelected = null; } -// close all dialogs except stated -export function closeDialogs(except = "#except") { - try { - $(".dialog:visible") - .not(except) - .each(function () { - $(this).dialog("close"); - }); - } catch (error) {} -} - // move brush radius circle export function moveCircle(x, y, r = 20) { let circle = byId("brushCircle"); @@ -256,11 +246,11 @@ function togglePort(burg) { .attr("height", size); } -function getBurgSeed(burg) { +export function getBurgSeed(burg) { return burg.MFCG || Number(`${seed}${String(burg.i).padStart(4, 0)}`); } -function getMFCGlink(burg) { +export function getMFCGlink(burg) { if (burg.link) return burg.link; const {cells} = pack; @@ -1025,27 +1015,3 @@ function refreshAllEditors() { if (byId("zonesEditorRefresh")?.offsetParent) zonesEditorRefresh.click(); TIME && console.timeEnd("refreshAllEditors"); } - -// dynamically loaded editors -export async function editStates() { - if (customization) return; - const Editor = await import("../dynamic/editors/states-editor.js"); - Editor.open(); -} - -export async function editCultures() { - if (customization) return; - const Editor = await import("../dynamic/editors/cultures-editor.js"); - Editor.open(); -} - -export async function editReligions() { - if (customization) return; - const Editor = await import("../dynamic/editors/religions-editor.js"); - Editor.open(); -} - -export async function editUnits() { - const {open} = await import("./units-editor.js"); - open(); -} diff --git a/src/modules/ui/heightmap-editor.js b/src/modules/ui/heightmap-editor.js index 8a793d67..c4fd6abb 100644 --- a/src/modules/ui/heightmap-editor.js +++ b/src/modules/ui/heightmap-editor.js @@ -16,6 +16,7 @@ import {prompt} from "scripts/prompt"; import {clearMainTip, showMainTip, tip} from "scripts/tooltips"; import {aleaPRNG} from "scripts/aleaPRNG"; import {undraw} from "scripts/generation"; +import {closeDialogs} from "dialogs/utils"; export function editHeightmap(options) { const {mode, tool} = options || {}; diff --git a/src/modules/ui/hotkeys.js b/src/modules/ui/hotkeys.js index 29784c47..3fdd34fd 100644 --- a/src/modules/ui/hotkeys.js +++ b/src/modules/ui/hotkeys.js @@ -1,6 +1,8 @@ -import {byId} from "utils/shorthands"; +import {openDialog} from "dialogs"; import {toggleLayer} from "layers"; import {showAboutDialog} from "scripts/options/about"; +import {byId} from "utils/shorthands"; +import {closeDialogs} from "dialogs/utils"; // Hotkeys, see github.com/Azgaar/Fantasy-Map-Generator/wiki/Hotkeys document.on("keydown", handleKeydown); @@ -40,17 +42,17 @@ function handleKeyup(event) { else if (ctrl && code === "KeyY" && redo?.offsetParent) redo.click(); else if (shift && code === "KeyH") editHeightmap(); else if (shift && code === "KeyB") editBiomes(); - else if (shift && code === "KeyS") editStates(); + else if (shift && code === "KeyS") openDialog("statesEditor"); else if (shift && code === "KeyP") editProvinces(); else if (shift && code === "KeyD") editDiplomacy(); - else if (shift && code === "KeyC") editCultures(); + else if (shift && code === "KeyC") openDialog("culturesEditor"); else if (shift && code === "KeyN") editNamesbase(); else if (shift && code === "KeyZ") editZones(); - else if (shift && code === "KeyR") editReligions(); + else if (shift && code === "KeyR") openDialog("religionsEditor"); else if (shift && code === "KeyY") openEmblemEditor(); - else if (shift && code === "KeyQ") editUnits(); + else if (shift && code === "KeyQ") openDialog("unitsEditor"); else if (shift && code === "KeyO") editNotes(); - else if (shift && code === "KeyA") overviewCharts(); + else if (shift && code === "KeyA") openDialog("chartsOverview"); else if (shift && code === "KeyT") overviewBurgs(); else if (shift && code === "KeyV") overviewRivers(); else if (shift && code === "KeyM") overviewMilitary(); diff --git a/src/modules/ui/ice-editor.js b/src/modules/ui/ice-editor.js index 09a0285c..9a686474 100644 --- a/src/modules/ui/ice-editor.js +++ b/src/modules/ui/ice-editor.js @@ -5,6 +5,7 @@ import {tip, clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; import {ra} from "utils/probabilityUtils"; import {parseTransform} from "utils/stringUtils"; +import {closeDialogs} from "dialogs/utils"; export function editIce() { if (customization) return; diff --git a/src/modules/ui/labels-editor.js b/src/modules/ui/labels-editor.js index 5e766b02..9212235d 100644 --- a/src/modules/ui/labels-editor.js +++ b/src/modules/ui/labels-editor.js @@ -1,6 +1,7 @@ import {findCell} from "utils/graphUtils"; import {tip, showMainTip} from "scripts/tooltips"; import {round, parseTransform} from "utils/stringUtils"; +import {closeDialogs} from "dialogs/utils"; export function editLabel() { if (customization) return; diff --git a/src/modules/ui/lakes-editor.js b/src/modules/ui/lakes-editor.js index 76cef05b..058a4b3d 100644 --- a/src/modules/ui/lakes-editor.js +++ b/src/modules/ui/lakes-editor.js @@ -6,6 +6,7 @@ import {rn} from "utils/numberUtils"; import {rand} from "utils/probabilityUtils"; import {round} from "utils/stringUtils"; import {si, getHeight} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; export function editLake() { if (customization) return; diff --git a/src/modules/ui/markers-editor.js b/src/modules/ui/markers-editor.js index 2ee365a6..39f3b6e8 100644 --- a/src/modules/ui/markers-editor.js +++ b/src/modules/ui/markers-editor.js @@ -4,6 +4,7 @@ import {restoreDefaultEvents} from "scripts/events"; import {findCell} from "utils/graphUtils"; import {clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; +import {closeDialogs} from "dialogs/utils"; export function editMarker(markerI) { if (customization) return; diff --git a/src/modules/ui/markers-overview.js b/src/modules/ui/markers-overview.js index bb7d9a00..fa52cb5c 100644 --- a/src/modules/ui/markers-overview.js +++ b/src/modules/ui/markers-overview.js @@ -1,5 +1,6 @@ import {restoreDefaultEvents} from "scripts/events"; import {clearMainTip} from "scripts/tooltips"; +import {closeDialogs} from "dialogs/utils"; export function overviewMarkers() { if (customization) return; diff --git a/src/modules/ui/military-overview.js b/src/modules/ui/military-overview.js index a99e66a7..a382effc 100644 --- a/src/modules/ui/military-overview.js +++ b/src/modules/ui/military-overview.js @@ -5,6 +5,7 @@ import {wiki} from "utils/linkUtils"; import {rn} from "utils/numberUtils"; import {capitalize} from "utils/stringUtils"; import {si} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; export function overviewMilitary() { if (customization) return; diff --git a/src/modules/ui/namesbase-editor.js b/src/modules/ui/namesbase-editor.js index 78af82ca..b81f3041 100644 --- a/src/modules/ui/namesbase-editor.js +++ b/src/modules/ui/namesbase-editor.js @@ -4,6 +4,7 @@ import {unique} from "utils/arrayUtils"; import {tip} from "scripts/tooltips"; import {openURL} from "utils/linkUtils"; import {rn} from "utils/numberUtils"; +import {closeDialogs} from "dialogs/utils"; export function editNamesbase() { if (customization) return; diff --git a/src/modules/ui/options.js b/src/modules/ui/options.js index 2520f9aa..7fc5a2ce 100644 --- a/src/modules/ui/options.js +++ b/src/modules/ui/options.js @@ -11,6 +11,8 @@ import {gauss, P, rand, rw} from "utils/probabilityUtils"; import {byId, stored} from "utils/shorthands"; import {regenerateMap} from "scripts/generation"; import {fitScaleBar} from "modules/measurers"; +import {openDialog} from "dialogs"; +import {closeDialogs} from "dialogs/utils"; $("#optionsContainer").draggable({handle: ".drag-trigger", snap: "svg", snapMode: "both"}); $("#exitCustomization").draggable({handle: "div"}); @@ -160,7 +162,7 @@ optionsContent.addEventListener("click", function (event) { else if (id === "optionsMapHistory") showSeedHistoryDialog(); else if (id === "optionsCopySeed") copyMapURL(); else if (id === "optionsEraRegenerate") regenerateEra(); - else if (id === "templateInputContainer") openTemplateSelectionDialog(); + else if (id === "templateInputContainer") openDialog("heightmapSelection"); else if (id === "zoomExtentDefault") restoreDefaultZoomExtent(); else if (id === "translateExtent") toggleTranslateExtent(event.target); else if (id === "speakerTest") testSpeaker(); @@ -650,11 +652,6 @@ function changeEra() { options.era = eraInput.value; } -async function openTemplateSelectionDialog() { - const HeightmapSelectionDialog = await import("../dynamic/heightmap-selection.js"); - HeightmapSelectionDialog.open(); -} - // remove all saved data from LocalStorage and reload the page function restoreDefaultOptions() { localStorage.clear(); diff --git a/src/modules/ui/provinces-editor.js b/src/modules/ui/provinces-editor.js index 063f8762..b4d24f81 100644 --- a/src/modules/ui/provinces-editor.js +++ b/src/modules/ui/provinces-editor.js @@ -11,6 +11,7 @@ import {parseTransform} from "utils/stringUtils"; import {si} from "utils/unitUtils"; import {turnLayerButtonOff} from "layers"; import {byId} from "utils/shorthands"; +import {closeDialogs} from "dialogs/utils"; export function editProvinces() { if (customization) return; @@ -387,7 +388,7 @@ export function editProvinces() { unfog(); closeDialogs(); - editStates(); + openDialog("statesEditor"); } function changePopulation(province) { diff --git a/src/modules/ui/regiment-editor.js b/src/modules/ui/regiment-editor.js index 2db9749c..34689458 100644 --- a/src/modules/ui/regiment-editor.js +++ b/src/modules/ui/regiment-editor.js @@ -6,6 +6,7 @@ import {last} from "utils/arrayUtils"; import {tip, clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; import {capitalize} from "utils/stringUtils"; +import {closeDialogs} from "dialogs/utils"; export function editRegiment(selector) { if (customization) return; diff --git a/src/modules/ui/regiments-overview.js b/src/modules/ui/regiments-overview.js index f5085554..514b3d04 100644 --- a/src/modules/ui/regiments-overview.js +++ b/src/modules/ui/regiments-overview.js @@ -6,6 +6,7 @@ import {tip, clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; import {capitalize} from "utils/stringUtils"; import {si} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; export function overviewRegiments(state) { if (customization) return; diff --git a/src/modules/ui/relief-editor.js b/src/modules/ui/relief-editor.js index 45dc047c..6b4ae948 100644 --- a/src/modules/ui/relief-editor.js +++ b/src/modules/ui/relief-editor.js @@ -4,6 +4,7 @@ import {restoreDefaultEvents} from "scripts/events"; import {findCell} from "utils/graphUtils"; import {tip, showMainTip, clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; +import {closeDialogs} from "dialogs/utils"; export function editReliefIcon() { if (customization) return; diff --git a/src/modules/ui/rivers-creator.js b/src/modules/ui/rivers-creator.js index 5ffe76e6..67f678d3 100644 --- a/src/modules/ui/rivers-creator.js +++ b/src/modules/ui/rivers-creator.js @@ -5,6 +5,7 @@ import {getPackPolygon, findCell} from "utils/graphUtils"; import {last} from "utils/arrayUtils"; import {tip, clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; +import {closeDialogs} from "dialogs/utils"; export function createRiver() { if (customization) return; diff --git a/src/modules/ui/rivers-editor.js b/src/modules/ui/rivers-editor.js index f080cefc..c43b5c8e 100644 --- a/src/modules/ui/rivers-editor.js +++ b/src/modules/ui/rivers-editor.js @@ -5,6 +5,7 @@ import {tip, clearMainTip} from "scripts/tooltips"; import {getSegmentId} from "utils/lineUtils"; import {rn} from "utils/numberUtils"; import {rand} from "utils/probabilityUtils"; +import {closeDialogs} from "dialogs/utils"; export function editRiver(id) { if (customization) return; diff --git a/src/modules/ui/rivers-overview.js b/src/modules/ui/rivers-overview.js index 0139ff75..8c463c5c 100644 --- a/src/modules/ui/rivers-overview.js +++ b/src/modules/ui/rivers-overview.js @@ -1,6 +1,7 @@ import * as d3 from "d3"; import {rn} from "utils/numberUtils"; +import {closeDialogs} from "dialogs/utils"; export function overviewRivers() { if (customization) return; diff --git a/src/modules/ui/routes-editor.js b/src/modules/ui/routes-editor.js index 75046f71..6369eec2 100644 --- a/src/modules/ui/routes-editor.js +++ b/src/modules/ui/routes-editor.js @@ -5,6 +5,7 @@ import {getSegmentId} from "utils/lineUtils"; import {rn} from "utils/numberUtils"; import {getNextId} from "utils/nodeUtils"; import {round} from "utils/stringUtils"; +import {closeDialogs} from "dialogs/utils"; export function editRoute(onClick) { if (customization) return; diff --git a/src/modules/ui/submap.js b/src/modules/ui/submap.js index 3fa6a9e3..79f0d0a4 100644 --- a/src/modules/ui/submap.js +++ b/src/modules/ui/submap.js @@ -5,6 +5,7 @@ import {rn, minmax} from "utils/numberUtils"; import {debounce} from "utils/functionUtils"; import {restoreLayers} from "layers"; import {undraw} from "scripts/generation"; +import {closeDialogs} from "dialogs/utils"; window.UISubmap = (function () { byId("submapPointsInput").addEventListener("input", function () { diff --git a/src/modules/ui/tools.js b/src/modules/ui/tools.js index c44b9bdc..cbc77041 100644 --- a/src/modules/ui/tools.js +++ b/src/modules/ui/tools.js @@ -1,7 +1,8 @@ import * as d3 from "d3"; +import {openDialog} from "dialogs"; +import {closeDialogs} from "dialogs/utils"; import {turnLayerButtonOn} from "layers"; -import {editUnits} from "modules/ui/editors"; import {aleaPRNG} from "scripts/aleaPRNG"; import {restoreDefaultEvents} from "scripts/events"; import {prompt} from "scripts/prompt"; @@ -21,17 +22,17 @@ toolsContent.addEventListener("click", function (event) { // click on open Editor buttons if (button === "editHeightmapButton") editHeightmap(); else if (button === "editBiomesButton") editBiomes(); - else if (button === "editStatesButton") editStates(); + else if (button === "editStatesButton") openDialog("statesEditor"); else if (button === "editProvincesButton") editProvinces(); else if (button === "editDiplomacyButton") editDiplomacy(); - else if (button === "editCulturesButton") editCultures(); - else if (button === "editReligions") editReligions(); + else if (button === "editCulturesButton") openDialog("culturesEditor"); + else if (button === "editReligions") openDialog("religionsEditor"); else if (button === "editEmblemButton") openEmblemEditor(); else if (button === "editNamesBaseButton") editNamesbase(); - else if (button === "editUnitsButton") editUnits(); + else if (button === "editUnitsButton") openDialog("unitsEditor"); else if (button === "editNotesButton") editNotes(); else if (button === "editZonesButton") editZones(); - else if (button === "overviewChartsButton") overviewCharts(); + else if (button === "overviewChartsButton") openDialog("chartsOverview"); else if (button === "overviewBurgsButton") overviewBurgs(); else if (button === "overviewRiversButton") overviewRivers(); else if (button === "overviewMilitaryButton") overviewMilitary(); @@ -867,8 +868,3 @@ function viewCellDetails() { position: {my: "right top", at: "right-10 top+10", of: "svg", collision: "fit"} }); } - -async function overviewCharts() { - const Overview = await import("../dynamic/overview/charts-overview.js"); - Overview.open(); -} diff --git a/src/modules/ui/zones-editor.js b/src/modules/ui/zones-editor.js index a9e21a4e..a5b21a0c 100644 --- a/src/modules/ui/zones-editor.js +++ b/src/modules/ui/zones-editor.js @@ -7,6 +7,7 @@ import {tip, showMainTip, clearMainTip} from "scripts/tooltips"; import {rn} from "utils/numberUtils"; import {getNextId} from "utils/nodeUtils"; import {si} from "utils/unitUtils"; +import {closeDialogs} from "dialogs/utils"; export function editZones() { closeDialogs(); diff --git a/src/scripts/events.js b/src/scripts/events.js index d582795f..2581cee3 100644 --- a/src/scripts/events.js +++ b/src/scripts/events.js @@ -1,18 +1,23 @@ import * as d3 from "d3"; -import {dragLegendBox} from "modules/legend"; +import {openDialog} from "dialogs"; +import {layerIsOn} from "layers"; +import {clearLegend, dragLegendBox} from "modules/legend"; +import {updateCellInfo} from "modules/ui/cell-info"; import {debounce} from "utils/functionUtils"; import {findCell, findGridCell} from "utils/graphUtils"; import {byId} from "utils/shorthands"; -import {convertTemperature, si, getFriendlyHeight, getCellIdPrecipitation, getPopulationTip} from "utils/unitUtils"; +import {convertTemperature, getCellIdPrecipitation, getFriendlyHeight, getPopulationTip, si} from "utils/unitUtils"; import {showMainTip, tip} from "./tooltips"; -import {updateCellInfo} from "modules/ui/cell-info"; -import {layerIsOn} from "layers"; export function restoreDefaultEvents() { Zoom.setZoomBehavior(); viewbox.style("cursor", "default").on(".drag", null).on("click", clicked).on("touchmove mousemove", onMouseMove); - legend.call(d3.drag().on("start", dragLegendBox)); + scaleBar.on("mousemove", () => tip("Click to open Units Editor")).on("click", () => openDialog("unitsEditor")); + legend + .on("mousemove", () => tip("Drag to change the position. Click to hide the legend")) + .on("click", clearLegend) + .call(d3.drag().on("start", dragLegendBox)); } // on viewbox click event - run function based on target @@ -29,9 +34,10 @@ function clicked() { else if (parent.id === "rivers") editRiver(el.id); else if (grand.id === "routes") editRoute(); else if (el.tagName === "tspan" && grand.parentNode.parentNode.id === "labels") editLabel(); - else if (grand.id === "burgLabels") editBurg(); - else if (grand.id === "burgIcons") editBurg(); - else if (parent.id === "ice") editIce(); + else if (grand.id === "burgLabels" || grand.id === "burgIcons") { + const burgId = grand.id === "burgLabels" ? +el.dataset.id : +el.parentNode.dataset.id; + openDialog("burgEditor", null, {id: burgId}); + } else if (parent.id === "ice") editIce(); else if (parent.id === "terrain") editReliefIcon(); else if (grand.id === "markers" || great.id === "markers") editMarker(); else if (grand.id === "coastline") editCoastline(); diff --git a/src/scripts/generation.js b/src/scripts/generation.js index e2015750..47f9fc8d 100644 --- a/src/scripts/generation.js +++ b/src/scripts/generation.js @@ -23,6 +23,7 @@ import {byId} from "utils/shorthands"; import {showStatistics} from "./statistics"; import {reGraph} from "./reGraph"; import {rankCells} from "./rankCells"; +import {closeDialogs} from "dialogs/utils"; export async function generate(options) { try { diff --git a/vite.config.js b/vite.config.js index 59005e79..9d7cf29c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -76,6 +76,7 @@ export default defineConfig(({mode}) => { {find: "components", replacement: path.resolve(pathName, "./src/components")}, {find: "config", replacement: path.resolve(pathName, "./src/config")}, {find: "constants", replacement: path.resolve(pathName, "./src/constants")}, + {find: "dialogs", replacement: path.resolve(pathName, "./src/dialogs")}, {find: "layers", replacement: path.resolve(pathName, "./src/layers")}, {find: "libs", replacement: path.resolve(pathName, "./src/libs")}, {find: "modules", replacement: path.resolve(pathName, "./src/modules")},