Refactoring: add 'anchor'-field instead of using the iconSize to determine the anchor

This commit is contained in:
Pieter Vander Vennet 2023-06-20 02:47:20 +02:00
parent f4b7e7eb88
commit 36cdcf0648
3 changed files with 13 additions and 3 deletions

View file

@ -198,7 +198,8 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
},
],
},
iconSize: "40,40,center",
iconSize: "40,40",
anchor: "center",
},
],
}

View file

@ -62,7 +62,7 @@ export default interface PointRenderingConfigJson {
* For example, a feature attached to the ground can use 'bottom' as zooming in will give the appearance of being anchored to a fixed location.
*
*/
anchor?: "center" | "top" | "bottom" | "left" | "right" | string
anchor?: "center" | "top" | "bottom" | "left" | "right" | string | TagRenderingConfigJson
/**
* The rotation of an icon, useful for e.g. directions.

View file

@ -92,6 +92,16 @@ export default class PointRenderingConfig extends WithContextLoader {
throw context + ": builtin SVG asset not found: " + iconPath
}
}
if (typeof json.iconSize === "string") {
const s = json.iconSize
if (["bottom", "top", "center"].some((e) => s.endsWith(e))) {
throw (
"At " +
context +
" in : iconSize uses legacy ,bottom, center or top postfix. Use the field `anchor` instead."
)
}
}
this.iconSize = this.tr("iconSize", "40,40")
this.anchor = this.tr("anchor", "center")
this.label = this.tr("label", undefined)
@ -239,7 +249,6 @@ export default class PointRenderingConfig extends WithContextLoader {
const anchor = render(this.anchor, "center")
const mode = anchor?.trim()?.toLowerCase() ?? "center"
// in MapLibre, the offset is relative to the _center_ of the object, with left = [-x, 0] and up = [0,-y]
let anchorW = 0
let anchorH = 0