142 lines
4.5 KiB
JavaScript
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();
|
|
}
|
|
}
|