mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2026-02-05 18:11:23 +01:00
Implement Standalone Android App via Flutter WebView
- Configured `vite.config.ts` for relative base path support. - Initialized `mobile_app` Flutter project with `webview_flutter`. - Added `assets/www` to Flutter assets configuration. - Implemented `mobile_app/lib/main.dart` with WebView and Bridge API integration (Water Level Slider). - Updated `.gitignore` for Flutter artifacts. - Successfully built APK artifacts. Co-authored-by: kliffdafunkfacekilla-arch <239708976+kliffdafunkfacekilla-arch@users.noreply.github.com>
This commit is contained in:
parent
e938bc7802
commit
e62f20b0d1
808 changed files with 111592 additions and 10 deletions
119
mobile_app/assets/www/modules/ui/ice-editor.js
Normal file
119
mobile_app/assets/www/modules/ui/ice-editor.js
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
"use strict";
|
||||
function editIce(element) {
|
||||
if (customization) return;
|
||||
if (elSelected && element === elSelected.node()) return;
|
||||
|
||||
closeDialogs(".stable");
|
||||
if (!layerIsOn("toggleIce")) toggleIce();
|
||||
|
||||
elSelected = d3.select(d3.event.target);
|
||||
const id = +elSelected.attr("data-id");
|
||||
const iceElement = pack.ice.find(el => el.i === id);
|
||||
const isGlacier = elSelected.attr("type") === "glacier";
|
||||
const type = isGlacier ? "Glacier" : "Iceberg";
|
||||
|
||||
document.getElementById("iceRandomize").style.display = isGlacier ? "none" : "inline-block";
|
||||
document.getElementById("iceSize").style.display = isGlacier ? "none" : "inline-block";
|
||||
if (!isGlacier) document.getElementById("iceSize").value = iceElement?.size || "";
|
||||
|
||||
ice.selectAll("*").classed("draggable", true).call(d3.drag().on("drag", dragElement));
|
||||
|
||||
$("#iceEditor").dialog({
|
||||
title: "Edit " + type,
|
||||
resizable: false,
|
||||
position: { my: "center top+60", at: "top", of: d3.event, collision: "fit" },
|
||||
close: closeEditor
|
||||
});
|
||||
|
||||
if (modules.editIce) return;
|
||||
modules.editIce = true;
|
||||
// add listeners
|
||||
document.getElementById("iceEditStyle").addEventListener("click", () => editStyle("ice"));
|
||||
document.getElementById("iceRandomize").addEventListener("click", randomizeShape);
|
||||
document.getElementById("iceSize").addEventListener("input", changeSize);
|
||||
document.getElementById("iceNew").addEventListener("click", toggleAdd);
|
||||
document.getElementById("iceRemove").addEventListener("click", removeIce);
|
||||
|
||||
|
||||
function randomizeShape() {
|
||||
const selectedId = +elSelected.attr("data-id");
|
||||
Ice.randomizeIcebergShape(selectedId);
|
||||
redrawIceberg(selectedId);
|
||||
}
|
||||
|
||||
function changeSize() {
|
||||
const newSize = +this.value;
|
||||
const selectedId = +elSelected.attr("data-id");
|
||||
Ice.changeIcebergSize(selectedId, newSize);
|
||||
redrawIceberg(selectedId);
|
||||
}
|
||||
|
||||
function toggleAdd() {
|
||||
document.getElementById("iceNew").classList.toggle("pressed");
|
||||
if (document.getElementById("iceNew").classList.contains("pressed")) {
|
||||
viewbox.style("cursor", "crosshair").on("click", addIcebergOnClick);
|
||||
tip("Click on map to create an iceberg. Hold Shift to add multiple", true);
|
||||
} else {
|
||||
clearMainTip();
|
||||
viewbox.on("click", clicked).style("cursor", "default");
|
||||
}
|
||||
}
|
||||
|
||||
function addIcebergOnClick() {
|
||||
const [x, y] = d3.mouse(this);
|
||||
const i = findGridCell(x, y, grid);
|
||||
const size = +document.getElementById("iceSize")?.value || 1;
|
||||
|
||||
Ice.addIceberg(i, size);
|
||||
|
||||
if (d3.event.shiftKey === false) toggleAdd();
|
||||
}
|
||||
|
||||
function removeIce() {
|
||||
const type = elSelected.attr("type") === "glacier" ? "Glacier" : "Iceberg";
|
||||
alertMessage.innerHTML = /* html */ `Are you sure you want to remove the ${type}?`;
|
||||
$("#alert").dialog({
|
||||
resizable: false,
|
||||
title: "Remove " + type,
|
||||
buttons: {
|
||||
Remove: function () {
|
||||
$(this).dialog("close");
|
||||
Ice.removeIce(+elSelected.attr("data-id"));
|
||||
$("#iceEditor").dialog("close");
|
||||
},
|
||||
Cancel: function () {
|
||||
$(this).dialog("close");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function dragElement() {
|
||||
const selectedId = +elSelected.attr("data-id");
|
||||
const initialTransform = parseTransform(this.getAttribute("transform"));
|
||||
const dx = initialTransform[0] - d3.event.x;
|
||||
const dy = initialTransform[1] - d3.event.y;
|
||||
|
||||
d3.event.on("drag", function () {
|
||||
const x = d3.event.x;
|
||||
const y = d3.event.y;
|
||||
const transform = `translate(${dx + x},${dy + y})`;
|
||||
this.setAttribute("transform", transform);
|
||||
|
||||
// Update data model with new position
|
||||
const offset = [dx + x, dy + y];
|
||||
const iceData = pack.ice.find(element => element.i === selectedId);
|
||||
if (iceData) {
|
||||
// Store offset for visual positioning, actual geometry stays in points
|
||||
iceData.offset = offset;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function closeEditor() {
|
||||
ice.selectAll("*").classed("draggable", false).call(d3.drag().on("drag", null));
|
||||
clearMainTip();
|
||||
iceNew.classList.remove("pressed");
|
||||
unselect();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue