63 lines
2.2 KiB
JavaScript
63 lines
2.2 KiB
JavaScript
import { SettingUtils } from './sn0w.js';
|
|
import { app } from '../../../scripts/app.js';
|
|
|
|
const favouriteCharactersId = 'sn0w.FavouriteCharacters';
|
|
let existingList = [];
|
|
|
|
app.registerExtension({
|
|
name: 'sn0w.CharacterContextMenu',
|
|
async setup() {
|
|
existingList = await SettingUtils.getSetting('sn0w.FavouriteCharacters');
|
|
if (!Array.isArray(existingList)) {
|
|
existingList = [];
|
|
}
|
|
|
|
const original_getNodeMenuOptions = app.canvas.getNodeMenuOptions;
|
|
app.canvas.getNodeMenuOptions = function (node) {
|
|
const options = original_getNodeMenuOptions.apply(this, arguments);
|
|
if (node.type === 'Character Selector') {
|
|
const settingUtils = new SettingUtils();
|
|
const nullIndex = options.indexOf(null);
|
|
|
|
// Check if the filename is in the existingList
|
|
const selectedCharacter = node.widgets[0].value;
|
|
const isFavourite = existingList.includes(selectedCharacter);
|
|
|
|
// Create the new menu item
|
|
const newMenuItem = {
|
|
content: isFavourite ? 'Unfavourite Character ☆' : 'Favourite Character ★',
|
|
disabled: false,
|
|
callback: () => {
|
|
SettingUtils.toggleFavourite(
|
|
existingList,
|
|
selectedCharacter,
|
|
favouriteCharactersId
|
|
);
|
|
settingUtils.refreshComboInSingleNode(app, 'Character Selector');
|
|
},
|
|
};
|
|
|
|
if (nullIndex !== -1) {
|
|
options.splice(nullIndex, 0, newMenuItem);
|
|
} else {
|
|
options.push(newMenuItem);
|
|
}
|
|
}
|
|
return options;
|
|
};
|
|
|
|
var observer = new MutationObserver(function (mutations) {
|
|
if (document.contains(document.getElementsByClassName('litecontextmenu')[0])) {
|
|
SettingUtils.addStarsToFavourited(existingList);
|
|
}
|
|
});
|
|
|
|
observer.observe(document, {
|
|
attributes: false,
|
|
childList: true,
|
|
characterData: false,
|
|
subtree: true,
|
|
});
|
|
},
|
|
});
|