journal-to-canvas-slideshow/scripts/init.js

245 lines
9.0 KiB
JavaScript

"use strict";
import { ArtTileManager } from "./classes/ArtTileManager.js";
import { CanvasIndicators } from "./classes/CanvasIndicators.js";
import { HelperFunctions } from "./classes/HelperFunctions.js";
import { ImageDisplayManager } from "./classes/ImageDisplayManager.js";
import ImageVideoPopout from "./classes/MultiMediaPopout.js";
import { JTCSActions } from "./data/JTCS-Actions.js";
import { SheetImageApp } from "./SheetImageApp.js";
import { SheetImageDataController } from "./SheetImageDataController.js";
import { SlideshowConfig } from "./SlideshowConfig.js";
import { log, MODULE_ID } from "./debug-mode.js";
import {
generateTemplates,
createTemplatePathString,
mapTemplates,
} from "./data/templates.js";
import { registerHelpers } from "./handlebars/register-helpers.js";
import { registerSettings } from "./settings.js";
import { setupHookHandlers } from "./hooks.js";
import { universalInterfaceActions as UIA } from "./data/Universal-Actions.js";
export const JTCSModules = {
ArtTileManager,
CanvasIndicators,
HelperFunctions,
ImageDisplayManager,
ImageVideoPopout,
JTCSActions,
SheetImageApp,
SheetImageDataController,
SlideshowConfig,
};
Hooks.once("ready", () => {
try {
window.Ardittristan.ColorSetting.tester;
} catch {
ui.notifications.notify(
'Journal to Canvas Slideshow requires the "lib - ColorSettings" module. Please make sure you have it installed and enabled.',
"error"
);
}
});
Hooks.on("init", async () => {
console.log("Initializing Journal to Canvas Slideshow");
//register settings
registerSettings();
//register handlebars helpers
registerHelpers();
libWrapper.register(
"journal-to-canvas-slideshow",
"TextEditor._onDropEditorData",
function (wrapped, ...args) {
let event = args[0];
let editor = args[1];
var files = event.dataTransfer.files;
let containsImage = false;
for (let f of files) {
let type = f["type"].split("/")[0];
if (type === "image") {
containsImage = true;
insertImageIntoJournal(f, editor);
}
}
if (!containsImage) {
console.log("TextEditor._onDropEditorData called");
return wrapped(...args);
}
},
"MIXED"
);
//map of template names w/ short keys
let templates = generateTemplates();
let mappedTemplates = mapTemplates(templates);
// once settings are set up, create our API object
game.modules.get("journal-to-canvas-slideshow").api = {
templates: mappedTemplates,
imageUtils: {
manager: ImageDisplayManager,
displayImageInScene: ImageDisplayManager.displayImageInScene,
updateTileObjectTexture: ImageDisplayManager.updateTileObjectTexture,
scaleToScene: ImageDisplayManager.scaleArtTileToScene,
scaleToBoundingTile: ImageDisplayManager.scaleArtTileToFrameTile,
},
tileUtils: {
manager: ArtTileManager,
getLinkedFrameID: ArtTileManager.getLinkedFrameID,
createAndLinkSceneTile: ArtTileManager.createAndLinkSceneTile,
// createArtTileObject: ArtTileManager.createArtTileObject,
// createFrameTileObject: ArtTileManager.createFrameTileObject,
getSceneSlideshowTiles: ArtTileManager.getSceneSlideshowTiles,
getDefaultData: ArtTileManager.getDefaultData,
getFrameTiles: ArtTileManager.getFrameTiles,
getDisplayTiles: ArtTileManager.getDisplayTiles,
getTileObjectByID: ArtTileManager.getTileObjectByID,
selectTile: ArtTileManager.selectTile,
renderTileConfig: ArtTileManager.renderTileConfig,
updateTileDataID: ArtTileManager.updateTileDataID,
updateSceneTileFlags: ArtTileManager.updateSceneTileFlags,
getTileDataFromFlag: ArtTileManager.getTileDataFromFlag,
getUnlinkedTileIDs: ArtTileManager.getUnlinkedTileIDs,
getMissingTiles: ArtTileManager.getMissingTiles,
deleteSceneTileData: ArtTileManager.deleteSceneTileData,
getAllScenesWithSlideshowData: ArtTileManager.getAllScenesWithSlideshowData,
},
indicatorUtils: {
createTileIndicator: CanvasIndicators.createTileIndicator,
deleteTileIndicator: CanvasIndicators.deleteTileIndicator,
hideTileIndicator: CanvasIndicators.hideTileIndicator,
showTileIndicator: CanvasIndicators.showTileIndicator,
setUpIndicators: CanvasIndicators.setUpIndicators,
},
utils: {
manager: HelperFunctions,
createDialog: HelperFunctions.createDialog,
swapTools: HelperFunctions.swapTools,
setSettingValue: HelperFunctions.setSettingValue,
getSettingValue: HelperFunctions.getSettingValue,
createTemplatePathString: createTemplatePathString,
createEventActionObject: HelperFunctions.createEventActionObject,
},
sheetImageUtils: {
manager: SheetImageApp,
},
};
//load templates
loadTemplates(templates);
// now that we've created our API, inform other modules we are ready
// provide a reference to the module api as the hook arguments for good measure
Hooks.callAll(
"journalToCanvasSlideshowReady",
game.modules.get("journal-to-canvas-slideshow").api
);
});
Hooks.on("journalToCanvasSlideshowReady", async (api) => {
game.JTCS = api;
await (await setupHookHandlers()).registerHooks();
await HelperFunctions.setUIColors();
// await setupHookHandlers.registerHooks();
// setUpSheetRenderHooks();
// setUpIndicatorHooks();
});
Hooks.once("renderSlideshowConfig", (app) => {
game.JTCSlideshowConfig = app;
});
async function insertImageIntoJournal(file, editor) {
if (typeof ForgeVTT != "undefined" && ForgeVTT.usingTheForge) {
source = "forgevtt";
} else {
var source = "data";
}
let response;
if (file.isExternalUrl) {
response = {
path: file.url,
};
} else {
response = await FilePicker.upload(
source,
"/upload",
// game.settings.get("journal-to-canvas-slideshow", "imageSaveLocation"),
file,
{}
);
}
let contentToInsert = `<p><img src="${response.path}" width="512" height="512" /></p>`;
if (contentToInsert) editor.insertContent(contentToInsert);
}
Hooks.once("canvasReady", async () => {
const showWelcomeMessage = await HelperFunctions.getSettingValue(
"showWelcomeMessage"
);
if (showWelcomeMessage && game.user.isGM) {
await HelperFunctions.showWelcomeMessage();
}
});
Hooks.on("canvasReady", async (canvas) => {
//get tile data from scene flags
let artTileDataArray = (await ArtTileManager.getSceneSlideshowTiles("", true)).filter(
(item) => !item.missing
);
game.scenes.viewed.tiles.forEach(async (tileDoc) => {
let foundTileData = artTileDataArray.find(
(tileData) => tileData.id === tileDoc.id
);
await CanvasIndicators.setUpIndicators(foundTileData, tileDoc);
});
});
/**
* For rendering a button in the Tile Config that shows the linked Art Tile
*/
Hooks.on("renderTileConfig", async (app, element) => {
let currentScene = game.scenes.viewed;
//get tiles with flags
let flaggedTiles = await ArtTileManager.getSceneSlideshowTiles();
let defaultData = await ArtTileManager.getDefaultData();
//get data from tiles
if (flaggedTiles) {
let tileID = game.version >= 10 ? app.object._id : app.object.data._id;
defaultData = await ArtTileManager.getTileDataFromFlag(tileID, flaggedTiles);
defaultData = { ...defaultData };
defaultData.boundingTiles = await game.JTCS.tileUtils.getFrameTiles(flaggedTiles);
}
if (element[0] && !element[0]?.querySelector("#displayTileData")) {
//if we don't have this data
// let template = "modules/journal-to-canvas-slideshow/templates/display-tile-config.hbs";
const showConfigButton = document.createElement("button");
showConfigButton.textContent = "Open Gallery Config";
showConfigButton.setAttribute("id", defaultData.id);
showConfigButton.setAttribute("type", "button");
const target = $(element).find(`[name="tint"]`).parent().parent();
target.after(showConfigButton);
$(showConfigButton).on("click", async (event) => {
event.preventDefault();
await UIA.renderAnotherApp("JTCSlideshowConfig", SlideshowConfig);
// let btn = event.currentTarget;
// if (game.JTCSlideshowConfig) {
// game.JTCSlideshowConfig.render(true);
// } else {
// game.JTCSlideshowConfig = new SlideshowConfig().render(true);
// }
});
}
});