/* -------------< 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( `
` ); 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(''); 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; } });