All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

160 lines
6.0 KiB

/* -------------< Ace >------------ */
Hooks.once("init", () => {
["ace/mode/javascript", "ace/ext/language_tools", "ace/ext/error_marker", "ace/theme/twilight", "ace/snippets/javascript"].forEach((s) => ace.config.loadModule(s));
});
/* -------------< End Ace >------------ */
Hooks.on("init", () => {
Macros.registerSheet?.("macroeditor", AceMacroConfig, {
makeDefault: true,
label: "Ace Macro Editor",
// types: ["script", "chat"],
});
});
class AceMacroConfig extends MacroConfig {
async _render(...args) {
await super._render(...args);
const configElement = this.element;
configElement
.find("div.form-group.stacked.command")
.append(
`<button type="button" class="macro-editor-expand" title="Expand Editor"><i class="fas fa-expand-alt"></i></button><div class="macro-editor" id="macroEditor-${this.object.id}"></div>`
);
if (game.settings.get("macroeditor", "defaultShow")) {
configElement.find('.command textarea[name="command"]').css("display", "none");
const furnace = this.element.find("div.furnace-macro-command");
if (furnace.length !== 0) {
furnace.css("display", "none");
}
} else {
configElement.find(".macro-editor").css("display", "none");
configElement.find(".macro-editor-expand").css("display", "none");
}
configElement
.find(".sheet-footer")
.append('<button type="button" class="macro-editor-button" title="Toggle Code Editor" name="editorButton"><i class="fas fa-terminal"></i></button>');
let editor = (this.editor = ace.edit(`macroEditor-${this.object.id}`));
this.editor.session.on("changeMode", function (e, session) {
if ("ace/mode/javascript" === session.getMode().$id) {
if (!!session.$worker) {
session.$worker.send("setOptions", [
{
esversion: 9,
esnext: false,
},
]);
}
}
});
// Merge ace-lib user-settings with module settings
this.editor.setOptions(
mergeObject(ace.userSettings, {
mode: "ace/mode/javascript",
})
);
configElement.find(".macro-editor-button").on("click", (event) => {
event.preventDefault();
if (configElement.find(".macro-editor").css("display") == "none") {
configElement.find('.command textarea[name="command"]').css("display", "none");
configElement.find(".macro-editor").css("display", "");
configElement.find(".macro-editor-expand").css("display", "");
this.editor.setValue(configElement.find('.command textarea[name="command"]').val(), -1);
// furnace compat / advanced macros
const furnace = configElement.find("div.furnace-macro-command");
if (furnace.length !== 0) {
furnace.css("display", "none");
}
} else {
configElement.find('.command textarea[name="command"]').css("display", "");
configElement.find(".macro-editor").css("display", "none");
configElement.find(".macro-editor-expand").css("display", "none");
// furnace compat / advanced macros
const furnace = configElement.find("div.furnace-macro-command");
if (furnace.length !== 0) {
furnace.css("display", "");
furnace.trigger("change");
}
}
});
configElement.find(".macro-editor-expand").on("click", (event) => {
event.preventDefault();
if (configElement.find(".macro-editor").hasClass("fullscreen")) {
configElement.find(".macro-editor").removeClass("fullscreen");
configElement.find(".macro-editor-expand").removeClass("fullscreen");
configElement.find(".macro-editor-expand").prop("title", "Expand Editor");
configElement.find(".macro-editor-expand i.fas.fa-compress-alt").attr("class", "fas fa-expand-alt");
configElement.find(".window-resizable-handle").css("display", "");
} else {
configElement.find(".macro-editor").addClass("fullscreen");
configElement.find(".macro-editor-expand").addClass("fullscreen");
configElement.find(".macro-editor-expand").prop("title", "Shrink Editor");
configElement.find(".macro-editor-expand i.fas.fa-expand-alt").attr("class", "fas fa-compress-alt");
configElement.find(".window-resizable-handle").css("display", "none");
}
});
this.editor.setValue(configElement.find('textarea[name="command"]').val(), -1);
this.editor.getSession().on("change", () => {
configElement.find('textarea[name="command"]').val(editor.getSession().getValue());
});
this.editor.commands.addCommand({
name: "Save",
bindKey: { win: "Ctrl-S", mac: "Command-S" },
exec: () => configElement.find("form.editable").trigger("submit"),
});
this.editor.commands.addCommand({
name: "Execute",
bindKey: { win: "Ctrl-E", mac: "Command-E" },
exec: () => configElement.find("button.execute").trigger("click"),
});
// watch for resizing of editor
new ResizeObserver(() => {
editor.resize();
editor.renderer.updateFull();
}).observe(this.editor.container);
}
close(...args) {
this.editor.destroy();
super.close(...args);
}
}
Hooks.once("init", function () {
game.settings.register("macroeditor", "defaultShow", {
name: "Show Macro editor by default",
hint: "Shows the code editor by default instead of the default editor",
default: true,
type: Boolean,
scope: "client",
config: true,
});
});
// Item Macro Compat
Hooks.once("init", async function () {
// only trigger if item macro is active and the compatible version isn't V9 yet
if (!game.modules.get("itemacro")?.active || game.modules.get("itemacro")?.data?.compatibleCoreVersion?.match(/\./g)?.length !== 2) return;
let classLoc = game.modules.get("itemacro")?.esmodules?.[0]?.replace("hooks", "ItemMacroConfig");
if (classLoc) {
let theClass = (await import(window.location.origin + "/" + classLoc)).ItemMacroConfig;
theClass.prototype._render = AceMacroConfig.prototype._render;
theClass.prototype.close = AceMacroConfig.prototype.close;
}
});