Files
2025-01-04 00:34:03 +01:00

142 lines
4.5 KiB
JavaScript

/**
* @typedef {FormApplicationOptions} DrawingConfigOptions
* @property {boolean} [configureDefault=false] Configure the default drawing settings, instead of a specific Drawing
*/
/**
* The Application responsible for configuring a single Drawing document within a parent Scene.
* @extends {DocumentSheet}
*
* @param {Drawing} drawing The Drawing object being configured
* @param {DrawingConfigOptions} options Additional application rendering options
*/
class DrawingConfig extends DocumentSheet {
/**
* @override
* @returns {DrawingConfigOptions}
*/
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
id: "drawing-config",
template: "templates/scene/drawing-config.html",
width: 480,
height: "auto",
configureDefault: false,
tabs: [{navSelector: ".tabs", contentSelector: "form", initial: "position"}]
});
}
/* -------------------------------------------- */
/** @override */
get title() {
if ( this.options.configureDefault ) return game.i18n.localize("DRAWING.ConfigDefaultTitle");
return super.title;
}
/* -------------------------------------------- */
/** @override */
getData(options={}) {
// Submit text
let submit;
if ( this.options.configureDefault ) submit = "DRAWING.SubmitDefault";
else submit = this.document.id ? "DRAWING.SubmitUpdate" : "DRAWING.SubmitCreate";
// Rendering context
return {
author: this.document.author?.name || "",
isDefault: this.options.configureDefault,
fillTypes: Object.entries(CONST.DRAWING_FILL_TYPES).reduce((obj, v) => {
obj[v[1]] = `DRAWING.FillType${v[0].titleCase()}`;
return obj;
}, {}),
scaledBezierFactor: this.document.bezierFactor * 2,
fontFamilies: FontConfig.getAvailableFontChoices(),
drawingRoles: {
object: "DRAWING.Object",
information: "DRAWING.Information"
},
currentRole: this.document.interface ? "information" : "object",
object: this.document.toObject(),
options: this.options,
gridUnits: this.document.parent?.grid.units || canvas.scene.grid.units || game.i18n.localize("GridUnits"),
userColor: game.user.color,
submitText: submit
};
}
/* -------------------------------------------- */
/** @override */
async _updateObject(event, formData) {
if ( !this.object.isOwner ) throw new Error("You do not have the ability to configure this Drawing object.");
// Un-scale the bezier factor
formData.bezierFactor /= 2;
// Configure the default Drawing settings
if ( this.options.configureDefault ) {
formData = foundry.utils.expandObject(formData);
const defaults = DrawingDocument.cleanData(formData, {partial: true});
return game.settings.set("core", DrawingsLayer.DEFAULT_CONFIG_SETTING, defaults);
}
// Assign location
formData.interface = (formData.drawingRole === "information");
delete formData.drawingRole;
// Rescale dimensions if needed
const shape = this.object.shape;
const w = formData["shape.width"];
const h = formData["shape.height"];
if ( shape && ((w !== shape.width) || (h !== shape.height)) ) {
const dx = w - shape.width;
const dy = h - shape.height;
formData = foundry.utils.expandObject(formData);
formData.shape.width = shape.width;
formData.shape.height = shape.height;
foundry.utils.mergeObject(formData, Drawing.rescaleDimensions(formData, dx, dy));
}
// Create or update a Drawing
if ( this.object.id ) return this.object.update(formData);
return this.object.constructor.create(formData);
}
/* -------------------------------------------- */
/** @override */
async close(options) {
await super.close(options);
if ( this.preview ) {
this.preview.removeChildren();
this.preview = null;
}
}
/* -------------------------------------------- */
/* Event Listeners and Handlers */
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
super.activateListeners(html);
html.find('button[name="reset"]').click(this._onResetDefaults.bind(this));
}
/* -------------------------------------------- */
/**
* Reset the user Drawing configuration settings to their default values
* @param {PointerEvent} event The originating mouse-click event
* @protected
*/
_onResetDefaults(event) {
event.preventDefault();
this.object = DrawingDocument.fromSource({});
this.render();
}
}