This commit is contained in:
CDeenen
2021-04-21 18:23:02 +02:00
parent 8fa32838d8
commit c3ee0a76aa
76 changed files with 549 additions and 319 deletions

View File

@@ -10,14 +10,16 @@ export class CombatTracker{
async updateAll(){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'combattracker') continue;
await this.update(data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'combattracker') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
update(settings,context){
update(settings,context,device){
this.active = true;
const ctFunction = settings.combatTrackerFunction ? settings.combatTrackerFunction : 'startStop';
const mode = settings.combatTrackerMode ? settings.combatTrackerMode : 'combatants';
@@ -29,7 +31,7 @@ export class CombatTracker{
if (mode == 'combatants'){
if (MODULE.getPermission('COMBAT','DISPLAY_COMBATANTS') == false) {
streamDeck.noPermission(context,false,"combat tracker");
streamDeck.noPermission(context,device,device,false,"combat tracker");
return;
}
if (combat != null && combat != undefined && combat.turns.length != 0){
@@ -41,45 +43,45 @@ export class CombatTracker{
if (combatant != undefined){
const tokenId = compatibleCore("0.8.1") ? combatant.data.tokenId : combatant.tokenId;
tokenControl.pushData(tokenId,settings,context,combatantState,'#cccc00');
tokenControl.pushData(tokenId,settings,context,device,combatantState,'#cccc00');
return;
}
else {
streamDeck.setIcon(context,src,{background:background});
streamDeck.setIcon(context,device,src,{background:background});
streamDeck.setTitle(txt,context);
}
}
else {
streamDeck.setIcon(context,src,{background:background});
streamDeck.setIcon(context,device,src,{background:background});
streamDeck.setTitle(txt,context);
}
}
else if (mode == 'currentCombatant'){
if (MODULE.getPermission('COMBAT','DISPLAY_COMBATANTS') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device,device);
return;
}
if (combat != null && combat != undefined && combat.started){
const tokenId = compatibleCore("0.8.1") ? combat.combatant.data.tokenId : combat.combatant.tokenId;
tokenControl.pushData(tokenId,settings,context);
tokenControl.pushData(tokenId,settings,context,device);
}
else {
streamDeck.setIcon(context,src,{background:background});
streamDeck.setIcon(context,device,src,{background:background});
streamDeck.setTitle(txt,context);
}
}
else if (mode == 'function'){
if (ctFunction == 'turnDisplay' && MODULE.getPermission('COMBAT','TURN_DISPLAY') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
else if (ctFunction == 'endTurn' && MODULE.getPermission('COMBAT','END_TURN') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
else if (ctFunction != 'turnDisplay' && ctFunction != 'endTurn' && MODULE.getPermission('COMBAT','OTHER_FUNCTIONS') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
@@ -126,12 +128,12 @@ export class CombatTracker{
if (txt != "") txt += "\n";
if (settings.displayTurn) txt += "Turn\n"+turn;
}
streamDeck.setIcon(context,src,{background:background});
streamDeck.setIcon(context,device,src,{background:background});
streamDeck.setTitle(txt,context);
}
}
keyPress(settings,context){
keyPress(settings,context,device){
const mode = settings.combatTrackerMode ? settings.combatTrackerMode : 'combatants';
const combat = game.combat;
@@ -140,15 +142,15 @@ export class CombatTracker{
const ctFunction = settings.combatTrackerFunction ? settings.combatTrackerFunction : 'startStop';
if (ctFunction == 'turnDisplay' && MODULE.getPermission('COMBAT','TURN_DISPLAY') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
else if (ctFunction == 'endTurn' && MODULE.getPermission('COMBAT','END_TURN') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
else if (ctFunction != 'turnDisplay' && ctFunction != 'endTurn' && MODULE.getPermission('COMBAT','OTHER_FUNCTIONS') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
@@ -157,15 +159,10 @@ export class CombatTracker{
let background;
if (game.combat.started){
game.combat.endCombat();
src = "modules/MaterialDeck/img/combattracker/startcombat.png";
background = "#000000";
}
else {
game.combat.startCombat();
src = "modules/MaterialDeck/img/combattracker/stopcombat.png";
background = "#FF0000";
}
streamDeck.setIcon(context,src,{background:background});
return;
}
if (game.combat.started == false) return;

View File

@@ -12,39 +12,41 @@ export class ExternalModules{
this.gmScreenOpen = data.gmScreen.isOpen;
}
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'external') continue;
await this.update(data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'external') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
update(settings,context){
update(settings,context,device){
this.active = true;
const module = settings.module ? settings.module : 'fxmaster';
if (module == 'fxmaster') this.updateFxMaster(settings,context);
else if (module == 'gmscreen') this.updateGMScreen(settings,context);
else if (module == 'triggerHappy') this.updateTriggerHappy(settings,context);
else if (module == 'sharedVision') this.updateSharedVision(settings,context);
else if (module == 'mookAI') this.updateMookAI(settings,context);
else if (module == 'notYourTurn') this.updateNotYourTurn(settings,context);
else if (module == 'lockView') this.updateLockView(settings,context);
else if (module == 'aboutTime') this.updateAboutTime(settings,context);
if (module == 'fxmaster') this.updateFxMaster(settings,context,device);
else if (module == 'gmscreen') this.updateGMScreen(settings,context,device);
else if (module == 'triggerHappy') this.updateTriggerHappy(settings,context,device);
else if (module == 'sharedVision') this.updateSharedVision(settings,context,device);
else if (module == 'mookAI') this.updateMookAI(settings,context,device);
else if (module == 'notYourTurn') this.updateNotYourTurn(settings,context,device);
else if (module == 'lockView') this.updateLockView(settings,context,device);
else if (module == 'aboutTime') this.updateAboutTime(settings,context,device);
}
keyPress(settings,context){
keyPress(settings,context,device){
if (this.active == false) return;
const module = settings.module ? settings.module : 'fxmaster';
if (module == 'fxmaster') this.keyPressFxMaster(settings,context);
else if (module == 'gmscreen') this.keyPressGMScreen(settings,context);
else if (module == 'triggerHappy') this.keyPressTriggerHappy(settings,context);
else if (module == 'sharedVision') this.keyPressSharedVision(settings,context);
else if (module == 'mookAI') this.keyPressMookAI(settings,context);
else if (module == 'notYourTurn') this.keyPressNotYourTurn(settings,context);
else if (module == 'lockView') this.keyPressLockView(settings,context);
else if (module == 'aboutTime') this.keyPressAboutTime(settings,context);
if (module == 'fxmaster') this.keyPressFxMaster(settings,context,device);
else if (module == 'gmscreen') this.keyPressGMScreen(settings,context,device);
else if (module == 'triggerHappy') this.keyPressTriggerHappy(settings,context,device);
else if (module == 'sharedVision') this.keyPressSharedVision(settings,context,device);
else if (module == 'mookAI') this.keyPressMookAI(settings,context,device);
else if (module == 'notYourTurn') this.keyPressNotYourTurn(settings,context,device);
else if (module == 'lockView') this.keyPressLockView(settings,context,device);
else if (module == 'aboutTime') this.keyPressAboutTime(settings,context,device);
}
getModuleEnable(moduleId){
@@ -56,7 +58,7 @@ export class ExternalModules{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//FxMaster
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateFxMaster(settings,context){
updateFxMaster(settings,context,device){
if (game.user.isGM == false) return;
const fxmaster = game.modules.get("fxmaster");
if (fxmaster == undefined || fxmaster.active == false) return;
@@ -125,8 +127,8 @@ export class ExternalModules{
name = game.i18n.localize("MaterialDeck.FxMaster.Clear");
}
if (displayIcon) streamDeck.setIcon(context,icon,{background:background,ring:ring,ringColor:ringColor});
else streamDeck.setIcon(context, "", {background:background,ring:ring,ringColor:ringColor});
if (displayIcon) streamDeck.setIcon(context,device,icon,{background:background,ring:ring,ringColor:ringColor});
else streamDeck.setIcon(context,device, "", {background:background,ring:ring,ringColor:ringColor});
if (displayName == 0) name = "";
streamDeck.setTitle(name,context);
}
@@ -140,7 +142,7 @@ export class ExternalModules{
} : null;
}
keyPressFxMaster(settings,context){
keyPressFxMaster(settings,context,device){
if (game.user.isGM == false) return;
const fxmaster = game.modules.get("fxmaster");
if (fxmaster == undefined || fxmaster.active == false) return;
@@ -257,7 +259,7 @@ export class ExternalModules{
//GM Screen
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateGMScreen(settings,context){
updateGMScreen(settings,context,device){
if (this.getModuleEnable("gm-screen") == false) return;
if (game.user.isGM == false) return;
@@ -270,12 +272,12 @@ export class ExternalModules{
if (this.gmScreenOpen) ring = 2;
if (settings.displayGmScreenIcon) src = "fas fa-book-reader";
streamDeck.setIcon(context,src,{background:background,ring:ring,ringColor:ringColor});
streamDeck.setIcon(context,device,src,{background:background,ring:ring,ringColor:ringColor});
if (settings.displayGmScreenName) txt = game.i18n.localize(`GMSCR.gmScreen.Open`);
streamDeck.setTitle(txt,context);
}
keyPressGMScreen(settings,context){
keyPressGMScreen(settings,context,device){
if (this.getModuleEnable("gm-screen") == false) return;
if (game.user.isGM == false) return;
window['gm-screen'].toggleGmScreenVisibility();
@@ -285,7 +287,7 @@ export class ExternalModules{
//Trigger Happy
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateTriggerHappy(settings,context) {
updateTriggerHappy(settings,context,device) {
if (this.getModuleEnable("trigger-happy") == false) return;
if (game.user.isGM == false) return;
@@ -296,14 +298,14 @@ export class ExternalModules{
const ringColor = game.settings.get("trigger-happy", "enableTriggers") ? "#A600FF" : "#340057";
let txt = '';
if (displayIcon) streamDeck.setIcon(context,"fas fa-grin-squint-tears",{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,'',{background:'#000000'});
if (displayIcon) streamDeck.setIcon(context,device,"fas fa-grin-squint-tears",{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,device,'',{background:'#000000'});
if (displayName) txt = 'Trigger Happy';
streamDeck.setTitle(txt,context);
}
keyPressTriggerHappy(settings,context){
keyPressTriggerHappy(settings,context,device){
if (this.getModuleEnable("trigger-happy") == false) return;
if (game.user.isGM == false) return;
const mode = settings.triggerHappyMode ? settings.triggerHappyMode : 'toggle';
@@ -326,7 +328,7 @@ export class ExternalModules{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Shared Vision
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateSharedVision(settings,context) {
updateSharedVision(settings,context,device) {
if (this.getModuleEnable("SharedVision") == false) return;
if (game.user.isGM == false) return;
@@ -337,13 +339,13 @@ export class ExternalModules{
const ringColor = game.settings.get("SharedVision", "enable") ? "#A600FF" : "#340057";
let txt = '';
if (displayIcon) streamDeck.setIcon(context,"fas fa-eye",{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,'',{background:'#000000'});
if (displayIcon) streamDeck.setIcon(context,device,"fas fa-eye",{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,device,'',{background:'#000000'});
if (displayName) txt = 'Shared Vision';
streamDeck.setTitle(txt,context);
}
keyPressSharedVision(settings,context) {
keyPressSharedVision(settings,context,device) {
if (this.getModuleEnable("SharedVision") == false) return;
if (game.user.isGM == false) return;
@@ -357,7 +359,7 @@ export class ExternalModules{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Mook AI
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateMookAI(settings,context) {
updateMookAI(settings,context,device) {
if (this.getModuleEnable("mookAI") == false) return;
if (game.user.isGM == false) return;
@@ -367,13 +369,13 @@ export class ExternalModules{
const background = "#000000";
let txt = '';
if (displayIcon) streamDeck.setIcon(context,"fas fa-brain",{background:'#000000'});
else streamDeck.setIcon(context,'',{background:'#000000'});
if (displayIcon) streamDeck.setIcon(context,device,"fas fa-brain",{background:'#000000'});
else streamDeck.setIcon(context,device,'',{background:'#000000'});
if (displayName) txt = 'Mook AI';
streamDeck.setTitle(txt,context);
}
async keyPressMookAI(settings,context) {
async keyPressMookAI(settings,context,device) {
if (this.getModuleEnable("mookAI") == false) return;
if (game.user.isGM == false) return;
@@ -385,7 +387,7 @@ export class ExternalModules{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Not Your Turn!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateNotYourTurn(settings,context) {
updateNotYourTurn(settings,context,device) {
if (this.getModuleEnable("NotYourTurn") == false) return;
if (game.user.isGM == false) return;
@@ -409,13 +411,13 @@ export class ExternalModules{
txt = "Block Non-Combat Movement";
ringColor = game.settings.get('NotYourTurn','nonCombat') ? "#A600FF": "#340057" ;
}
if (displayIcon) streamDeck.setIcon(context,icon,{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,'',{background:'#000000'});
if (displayIcon) streamDeck.setIcon(context,device,icon,{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,device,'',{background:'#000000'});
if (displayName == false) txt = '';
streamDeck.setTitle(txt,context);
}
async keyPressNotYourTurn(settings,context) {
async keyPressNotYourTurn(settings,context,device) {
if (this.getModuleEnable("NotYourTurn") == false) return;
if (game.user.isGM == false) return;
@@ -433,7 +435,7 @@ export class ExternalModules{
//Lock View
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateLockView(settings,context) {
updateLockView(settings,context,device) {
if (this.getModuleEnable("LockView") == false) return;
if (game.user.isGM == false) return;
@@ -463,13 +465,13 @@ export class ExternalModules{
ringColor = canvas.scene.getFlag('LockView', 'boundingBox') ? "#A600FF": "#340057" ;
}
if (displayIcon) streamDeck.setIcon(context,icon,{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,'',{background:'#000000'});
if (displayIcon) streamDeck.setIcon(context,device,icon,{background:background,ring:2,ringColor:ringColor});
else streamDeck.setIcon(context,device,'',{background:'#000000'});
if (displayName == false) txt = '';
streamDeck.setTitle(txt,context);
}
async keyPressLockView(settings,context) {
async keyPressLockView(settings,context,device) {
if (this.getModuleEnable("LockView") == false) return;
if (game.user.isGM == false) return;
@@ -489,7 +491,7 @@ export class ExternalModules{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//About Time
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
updateAboutTime(settings,context) {
updateAboutTime(settings,context,device) {
if (this.getModuleEnable("about-time") == false) return;
if (game.user.isGM == false) return;
@@ -566,10 +568,10 @@ export class ExternalModules{
}
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,'',{background:background,ring:ring,ringColor:ringColor, clock:clock});
streamDeck.setIcon(context,device,'',{background:background,ring:ring,ringColor:ringColor, clock:clock});
}
keyPressAboutTime(settings,context) {
keyPressAboutTime(settings,context,device) {
if (this.getModuleEnable("about-time") == false) return;
if (game.user.isGM == false) return;

View File

@@ -10,14 +10,16 @@ export class MacroControl{
async updateAll(){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'macro') continue;
await this.update(data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'macro') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
async update(settings,context){
async update(settings,context,device){
this.active = true;
const mode = settings.macroMode ? settings.macroMode : 'hotbar';
const displayName = settings.displayName ? settings.displayName : false;
@@ -37,7 +39,7 @@ export class MacroControl{
if (mode == 'macroBoard') { //Macro board
if ((MODULE.getPermission('MACRO','MACROBOARD') == false )) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (settings.macroBoardMode == 'offset') { //Offset
@@ -66,7 +68,7 @@ export class MacroControl{
}
else { //Macro Hotbar
if ((MODULE.getPermission('MACRO','HOTBAR') == false )) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (mode == 'hotbar') macroId = game.user.data.hotbar[macroNumber];
@@ -95,7 +97,7 @@ export class MacroControl{
if (displayIcon) src = "modules/MaterialDeck/img/black.png";
}
streamDeck.setIcon(context,src,{background:background,ring:ring,ringColor:ringColor,uses:uses});
streamDeck.setIcon(context,device,src,{background:background,ring:ring,ringColor:ringColor,uses:uses});
streamDeck.setTitle(name,context);
}
@@ -121,7 +123,7 @@ export class MacroControl{
if(macroNumber == undefined || isNaN(parseInt(macroNumber))) macroNumber = 1;
if ((MODULE.getPermission('MACRO','HOTBAR') == false )) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
@@ -146,7 +148,7 @@ export class MacroControl{
if (displayIcon) src += macro.img;
if (MODULE.hotbarUses && displayUses) uses = await this.getUses(macro);
}
streamDeck.setIcon(context,src,{background:background,uses:uses});
streamDeck.setIcon(context,device,src,{background:background,uses:uses});
streamDeck.setTitle(name,context);
}
}
@@ -156,14 +158,6 @@ export class MacroControl{
let macroNumber = settings.macroNumber;
if(macroNumber == undefined || isNaN(parseInt(macroNumber))) macroNumber = 0;
let target = settings.target ? settings.target : undefined;
//const targetActor = target.actor ? undefined : target;
//if (targetActor != undefined) target = undefined;
//let macroTarget = {
// token: target,
// actor: targetActor
//}
//console.log('target',macroTarget,mode);
if (mode == 'hotbar' || mode == 'visibleHotbar' || mode == 'customHotbar'){
if ((MODULE.getPermission('MACRO','HOTBAR') == false )) return;

View File

@@ -7,13 +7,13 @@ export class Move{
this.active = false;
}
update(settings,context){
update(settings,context,device){
const background = settings.background ? settings.background : '#000000';
const mode = settings.mode ? settings.mode : 'canvas';
const type = settings.type ? settings.type : 'move';
if ((MODULE.getPermission('MOVE','TOKEN') == false && mode == 'selectedToken') || (MODULE.getPermission('MOVE','CANVAS') == false && mode == 'canvas')) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
@@ -50,14 +50,14 @@ export class Move{
else
url = "modules/MaterialDeck/img/move/rotateccw.png";
}
streamDeck.setIcon(context,url,{background:background});
streamDeck.setIcon(context,device,url,{background:background,overlay:true});
streamDeck.setTitle('',context);
}
keyPress(settings){
if (canvas.scene == null) return;
if ((MODULE.getPermission('MOVE','TOKEN') == false && mode == 'selectedToken') || (MODULE.getPermission('MOVE','CANVAS') == false && mode == 'canvas')) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}

View File

@@ -6,44 +6,54 @@ export class OtherControls{
constructor(){
this.active = false;
this.rollData = {};
this.rollOption = 'dialog';
}
setRollOption(option) {
this.rollOption = option;
this.updateAll();
}
async updateAll(options={}){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'other') continue;
await this.update(data.settings,data.context,options);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'other') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
update(settings,context,options={}){
update(settings,context,device,options={}){
this.active = true;
const mode = settings.otherMode ? settings.otherMode : 'pause';
if (mode == 'pause') //pause
this.updatePause(settings,context,options);
this.updatePause(settings,context,device,options);
else if (mode == 'controlButtons') //control buttons
this.updateControl(settings,context,options);
this.updateControl(settings,context,device,options);
else if (mode == 'darkness') //darkness
this.updateDarkness(settings,context,options);
this.updateDarkness(settings,context,device,options);
else if (mode == 'rollDice') //roll dice
this.updateRollDice(settings,context,options);
this.updateRollDice(settings,context,device,options);
else if (mode == 'rollTables') //roll tables
this.updateRollTable(settings,context,options);
this.updateRollTable(settings,context,device,options);
else if (mode == 'sidebarTab') //open sidebar tab
this.updateSidebar(settings,context,options);
this.updateSidebar(settings,context,device,options);
else if (mode == 'compendiumBrowser') //open compendium browser
this.updateCompendiumBrowser(settings,context,options);
this.updateCompendiumBrowser(settings,context,device,options);
else if (mode == 'compendium') //open compendium
this.updateCompendium(settings,context,options);
this.updateCompendium(settings,context,device,options);
else if (mode == 'journal') //open journal
this.updateJournal(settings,context,options);
this.updateJournal(settings,context,device,options);
else if (mode == 'chatMessage')
this.updateChatMessage(settings,context,options);
this.updateChatMessage(settings,context,device,options);
else if (mode == 'rollOptions')
this.updateRollOptions(settings,context,device,options);
}
keyPress(settings,context){
keyPress(settings,context,device){
const mode = settings.otherMode ? settings.otherMode : 'pause';
if (mode == 'pause') //pause
@@ -53,7 +63,7 @@ export class OtherControls{
else if (mode == 'darkness') //darkness controll
this.keyPressDarkness(settings);
else if (mode == 'rollDice') //roll dice
this.keyPressRollDice(settings,context);
this.keyPressRollDice(settings,context,device);
else if (mode == 'rollTables') //roll tables
this.keyPressRollTable(settings);
else if (mode == 'sidebarTab') //sidebar
@@ -66,13 +76,15 @@ export class OtherControls{
this.keyPressJournal(settings);
else if (mode == 'chatMessage')
this.keyPressChatMessage(settings);
else if (mode == 'rollOptions')
this.keyPressRollOptions(settings);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
updatePause(settings,context,options={}){
updatePause(settings,context,device,options={}){
if (MODULE.getPermission('OTHER','PAUSE') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
@@ -91,7 +103,7 @@ export class OtherControls{
}
else if (pauseFunction == 'toggle') //toggle
src = 'modules/MaterialDeck/img/other/pause/playpause.png';
streamDeck.setIcon(context,src,{background:background,ring:2,ringColor:ringColor,overlay:true});
streamDeck.setIcon(context,device,src,{background:background,ring:2,ringColor:ringColor,overlay:true});
streamDeck.setTitle('',context);
}
@@ -115,9 +127,9 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateControl(settings,context,options={}){
updateControl(settings,context,device,options={}){
if (MODULE.getPermission('OTHER','CONTROL') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const control = settings.control ? settings.control : 'dispControls';
@@ -128,18 +140,19 @@ export class OtherControls{
let src = "";
const activeControl = ui.controls.activeControl;
const activeTool = ui.controls.activeTool;
if (control == 'dispControls') { //displayed controls
let controlNr = parseInt(settings.controlNr);
if (isNaN(controlNr)) controlNr = 1;
controlNr--;
const selectedControl = ui.controls.controls[controlNr];
if (selectedControl.visible == false) {
streamDeck.noPermission(context,false);
return;
}
if (selectedControl != undefined){
if (selectedControl.visible == false) {
streamDeck.noPermission(context,device,false);
return;
}
if (tool == 'open'){ //open category
txt = game.i18n.localize(selectedControl.title);
src = selectedControl.icon;
@@ -158,7 +171,7 @@ export class OtherControls{
const selectedTool = selectedControl.tools[controlNr];
if (selectedTool != undefined){
if (selectedControl.visible == false || selectedTool.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
txt = game.i18n.localize(selectedTool.title);
@@ -176,7 +189,7 @@ export class OtherControls{
const selectedControl = ui.controls.controls.find(c => c.name == control);
if (selectedControl != undefined){
if (selectedControl.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
if (tool == 'open'){ //open category
@@ -189,7 +202,7 @@ export class OtherControls{
const selectedTool = selectedControl.tools.find(t => t.name == tool);
if (selectedTool != undefined){
if (selectedTool.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
txt = game.i18n.localize(selectedTool.title);
@@ -204,7 +217,7 @@ export class OtherControls{
}
}
}
streamDeck.setIcon(context,src,{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,src,{background:background,ring:2,ringColor:ringColor});
streamDeck.setTitle(txt,context);
}
@@ -213,18 +226,19 @@ export class OtherControls{
if (canvas.scene == null) return;
const control = settings.control ? settings.control : 'dispControls';
const tool = settings.tool ? settings.tool : 'open';
if (control == 'dispControls'){ //displayed controls
let controlNr = parseInt(settings.controlNr);
if (isNaN(controlNr)) controlNr = 1;
controlNr--;
const selectedControl = ui.controls.controls[controlNr];
if (selectedControl != undefined){
if (selectedControl.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
ui.controls.activeControl = 'token';
ui.controls.activeControl = selectedControl.name;
selectedControl.activeTool = selectedControl.activeTool;
canvas.getLayer(selectedControl.layer).activate();
}
@@ -236,13 +250,13 @@ export class OtherControls{
const selectedControl = ui.controls.controls.find(c => c.name == ui.controls.activeControl);
if (selectedControl != undefined){
if (selectedControl.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
const selectedTool = selectedControl.tools[controlNr];
if (selectedTool != undefined){
if (selectedTool.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
if (selectedTool.toggle) {
@@ -261,11 +275,11 @@ export class OtherControls{
const selectedControl = ui.controls.controls.find(c => c.name == control);
if (selectedControl != undefined){
if (selectedControl.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
if (tool == 'open'){ //open category
ui.controls.activeControl = 'token';
ui.controls.activeControl = control;
selectedControl.activeTool = selectedControl.activeTool;
canvas.getLayer(selectedControl.layer).activate();
}
@@ -273,7 +287,7 @@ export class OtherControls{
const selectedTool = selectedControl.tools.find(t => t.name == tool);
if (selectedTool != undefined){
if (selectedTool.visible == false) {
streamDeck.noPermission(context,false);
streamDeck.noPermission(context,device,false);
return;
}
ui.controls.activeControl = control;
@@ -296,9 +310,9 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateDarkness(settings,context,options={}){
updateDarkness(settings,context,device,options={}){
if (MODULE.getPermission('OTHER','DARKNESS') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const func = settings.darknessFunction ? settings.darknessFunction : 'value';
@@ -321,7 +335,7 @@ export class OtherControls{
txt += darkness;
}
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,src,{background:background});
streamDeck.setIcon(context,device,src,{background:background,overlay:true});
}
keyPressDarkness(settings) {
@@ -342,9 +356,9 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateRollDice(settings,context,options={}){
updateRollDice(settings,context,device,options={}){
if (MODULE.getPermission('OTHER','DICE') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const background = settings.background ? settings.background : '#000000';
@@ -353,10 +367,10 @@ export class OtherControls{
if (settings.displayDiceName) txt = 'Roll: ' + settings.rollDiceFormula;
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,'',{background:background});
streamDeck.setIcon(context,device,'',{background:background});
}
keyPressRollDice(settings,context){
keyPressRollDice(settings,context,device){
if (MODULE.getPermission('OTHER','DICE') == false ) return;
if (settings.rollDiceFormula == undefined || settings.rollDiceFormula == '') return;
const rollFunction = settings.rollDiceFunction ? settings.rollDiceFunction : 'public';
@@ -394,11 +408,11 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateRollTable(settings,context,options={}){
updateRollTable(settings,context,device,options={}){
const name = settings.rollTableName;
if (name == undefined) return;
if (MODULE.getPermission('OTHER','TABLES') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
@@ -414,13 +428,13 @@ export class OtherControls{
}
else {
if (table.permission < 2 && MODULE.getPermission('OTHER','TABLES_ALL') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
}
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,src,{background:background});
streamDeck.setIcon(context,device,src,{background:background});
}
keyPressRollTable(settings){
@@ -479,9 +493,9 @@ export class OtherControls{
return icon;
}
updateSidebar(settings,context,options={}){
updateSidebar(settings,context,device,options={}){
if (MODULE.getPermission('OTHER','SIDEBAR') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const popOut = settings.sidebarPopOut ? settings.sidebarPopOut : false;
@@ -500,7 +514,7 @@ export class OtherControls{
const icon = settings.displaySidebarIcon ? this.getSidebarIcon(sidebarTab) : '';
streamDeck.setTitle(name,context);
streamDeck.setIcon(context,icon,{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,icon,{background:background,ring:2,ringColor:ringColor});
}
keyPressSidebar(settings){
@@ -523,7 +537,7 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateCompendiumBrowser(settings,context,options={}){
updateCompendiumBrowser(settings,context,device,options={}){
let rendered = options.renderCompendiumBrowser;
if (rendered == undefined && game.system.id == "pf2e") rendered = (document.getElementById("app-1") != null);
else if (rendered == undefined) rendered = (document.getElementById("compendium-popout") != null);
@@ -534,7 +548,7 @@ export class OtherControls{
const txt = settings.displayCompendiumName ? name : '';
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,"",{background:background,ring:2,ringColor:ringColor});
}
keyPressCompendiumBrowser(settings){
@@ -553,11 +567,11 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateCompendium(settings,context,options={}){
updateCompendium(settings,context,device,options={}){
const name = settings.compendiumName;
if (name == undefined) return;
if (MODULE.getPermission('OTHER','COMPENDIUM') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
let compendium;
@@ -565,7 +579,7 @@ export class OtherControls{
else compendium = game.packs.entries.find(p=>p.metadata.label == name);
if (compendium == undefined) return;
if (compendium.private && MODULE.getPermission('OTHER','COMPENDIUM_ALL') == false) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const background = settings.background ? settings.background : '#000000';
@@ -575,7 +589,7 @@ export class OtherControls{
const txt = settings.displayCompendiumName ? name : '';
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,"",{background:background,ring:2,ringColor:ringColor});
}
keyPressCompendium(settings){
@@ -594,7 +608,7 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateJournal(settings,context,options={}){
updateJournal(settings,context,device,options={}){
const name = settings.compendiumName;
if (name == undefined) return;
@@ -602,11 +616,11 @@ export class OtherControls{
if (journal == undefined) return;
if (MODULE.getPermission('OTHER','JOURNAL') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (journal.permission < 2 && MODULE.getPermission('OTHER','JOURNAL_ALL') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
let rendered = false;
@@ -625,7 +639,7 @@ export class OtherControls{
const txt = settings.displayCompendiumName ? name : '';
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,"",{background:background,ring:2,ringColor:ringColor});
}
keyPressJournal(settings){
@@ -644,14 +658,14 @@ export class OtherControls{
//////////////////////////////////////////////////////////////////////////////////////////
updateChatMessage(settings,context,options={}){
updateChatMessage(settings,context,device,options={}){
if (MODULE.getPermission('OTHER','CHAT') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const background = settings.background ? settings.background : '#000000';
streamDeck.setTitle("",context);
streamDeck.setIcon(context,"",{background:background});
streamDeck.setIcon(context,device,"",{background:background});
}
keyPressChatMessage(settings){
@@ -665,4 +679,25 @@ export class OtherControls{
};
ChatMessage.create(chatData, {});
}
//////////////////////////////////////////////////////////////////////////////////////////
updateRollOptions(settings,context,device,options={}){
const background = settings.background ? settings.background : '#000000';
const ringOffColor = settings.offRing ? settings.offRing : '#000000';
const ringOnColor = settings.onRing ? settings.onRing : '#00FF00';
const iconSrc = "modules/MaterialDeck/img/other/d20.png";
const rollOption = settings.rollOptionFunction ? settings.rollOptionFunction : 'normal';
const ringColor = (rollOption == this.rollOption) ? ringOnColor : ringOffColor;
streamDeck.setTitle("",context);
streamDeck.setIcon(context,device,iconSrc,{background:background,ring:2,ringColor:ringColor,overlay:true});
}
keyPressRollOptions(settings){
const rollOption = settings.rollOptionFunction ? settings.rollOptionFunction : 'normal';
if (this.rollOption != rollOption) {
this.rollOption = rollOption;
this.updateAll();
}
}
}

View File

@@ -11,26 +11,28 @@ export class PlaylistControl{
async updateAll(){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'playlist') continue;
await this.update(data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'playlist') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
update(settings,context){
update(settings,context,device){
if (MODULE.getPermission('PLAYLIST','PLAY') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
this.active = true;
const mode = settings.playlistMode ? settings.playlistMode : 'playlist';
if (mode == 'playlist'){
this.updatePlaylist(settings,context);
this.updatePlaylist(settings,context,device);
}
else if (mode == 'track'){
this.updateTrack(settings,context);
this.updateTrack(settings,context,device);
}
else {
const src = 'modules/MaterialDeck/img/playlist/stop.png';
@@ -38,12 +40,12 @@ export class PlaylistControl{
const ringColor = (game.playlists.playing.length > 0) ? '#00FF00' : '#000000';
const ring = (game.playlists.playing.length > 0) ? 2 : 1;
const txt = settings.displayPlaylistName ? this.getPlaylist(this.playlistOffset).name : '';
streamDeck.setIcon(context,src,{background:background,ring:ring,ringColor:ringColor,overlay:true});
streamDeck.setIcon(context,device,src,{background:background,ring:ring,ringColor:ringColor,overlay:true});
streamDeck.setTitle(txt,context);
}
}
updatePlaylist(settings,context){
updatePlaylist(settings,context,device){
let name = "";
let ringColor = "#000000"
const background = settings.background ? settings.background : '#000000';
@@ -85,11 +87,11 @@ export class PlaylistControl{
const targetPlaylist = this.getPlaylist(number);
if (targetPlaylist != undefined) name = targetPlaylist.name;
}
streamDeck.setIcon(context,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setTitle(name,context);
}
updateTrack(settings,context){
updateTrack(settings,context,device){
let name = "";
let ringColor = "#000000"
const background = settings.background ? settings.background : '#000000';
@@ -133,7 +135,7 @@ export class PlaylistControl{
//Relative Offset
else if (playlistType == 'relativeOffset') {
}
streamDeck.setIcon(context,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setTitle(name,context);
}
@@ -171,7 +173,7 @@ export class PlaylistControl{
else return undefined;
}
keyPress(settings,context){
keyPress(settings,context,device){
if (MODULE.getPermission('PLAYLIST','PLAY') == false ) return;
let playlistNr = settings.playlistNr;
if (playlistNr == undefined || playlistNr < 1) playlistNr = 1;

View File

@@ -11,14 +11,16 @@ export class SceneControl{
async updateAll(){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'scene') continue;
await this.update(data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'scene') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
update(settings,context){
update(settings,context,device){
if (canvas.scene == null) return;
this.active = true;
const func = settings.sceneFunction ? settings.sceneFunction : 'visible';
@@ -32,7 +34,7 @@ export class SceneControl{
let name = "";
if (func == 'visible') { //visible scenes
if (MODULE.getPermission('SCENE','VISIBLE') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
let nr = parseInt(settings.sceneNr);
@@ -50,7 +52,7 @@ export class SceneControl{
}
else if (func == 'dir') { //from directory
if (MODULE.getPermission('SCENE','DIRECTORY') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
let nr = parseInt(settings.sceneNr);
@@ -85,7 +87,7 @@ export class SceneControl{
}
else if (func == 'any') { //by name
if (MODULE.getPermission('SCENE','NAME') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (settings.sceneName == undefined || settings.sceneName == '') return;
@@ -100,7 +102,7 @@ export class SceneControl{
}
else if (func == 'active'){
if (MODULE.getPermission('SCENE','ACTIVE') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const scene = game.scenes.active;
@@ -116,7 +118,7 @@ export class SceneControl{
else ringColor = ringOffColor;
}
streamDeck.setTitle(name,context);
streamDeck.setIcon(context,src,{background:background,ring:ring,ringColor:ringColor});
streamDeck.setIcon(context,device,src,{background:background,ring:ring,ringColor:ringColor});
}
keyPress(settings){

View File

@@ -117,6 +117,17 @@ export const registerSettings = async function() {
});
game.settings.register(MODULE.moduleName, 'imageBrightness', {
name: "MaterialDeck.Sett.ImageBrightness",
hint: "MaterialDeck.Sett.ImageBrightnessHint",
default: 50,
type: Number,
scope: 'client',
range: { min: 0, max: 100, step: 1 },
config: true
});
//Create the Help button
game.settings.registerMenu(MODULE.moduleName, 'helpMenu',{
name: "MaterialDeck.Sett.Help",

View File

@@ -13,16 +13,18 @@ export class SoundboardControl{
async updateAll(){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'soundboard') continue;
await this.update(data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'soundboard') continue;
await this.update(data.settings,data.context,device.device);
}
}
}
update(settings,context){
update(settings,context,device){
if (MODULE.getPermission('SOUNDBOARD','PLAY') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
this.active = true;
@@ -46,7 +48,7 @@ export class SoundboardControl{
if (settings.displayIcon && soundboardSettings.img != undefined) src = soundboardSettings.img[soundNr];
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,src,{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,src,{background:background,ring:2,ringColor:ringColor});
}
else if (mode == 'offset') { //Offset
const ringOffColor = settings.offRing ? settings.offRing : '#000000';
@@ -58,7 +60,7 @@ export class SoundboardControl{
else ringColor = ringOffColor;
streamDeck.setTitle(txt,context);
streamDeck.setIcon(context,"",{background:background,ring:2,ringColor:ringColor});
streamDeck.setIcon(context,device,"",{background:background,ring:2,ringColor:ringColor});
}
else if (mode == 'stopAll') { //Stop all sounds
let src = 'modules/MaterialDeck/img/playlist/stop.png';
@@ -68,9 +70,9 @@ export class SoundboardControl{
if (this.activeSounds[i])
soundPlaying = true;
if (soundPlaying)
streamDeck.setIcon(context,src,{background:background,ring:2,ringColor:'#00FF00',overlay:true});
streamDeck.setIcon(context,device,src,{background:background,ring:2,ringColor:'#00FF00',overlay:true});
else
streamDeck.setIcon(context,src,{background:background,ring:1,ringColor:'#000000',overlay:true});
streamDeck.setIcon(context,device,src,{background:background,ring:1,ringColor:'#000000',overlay:true});
}
}

View File

@@ -7,9 +7,7 @@ export class StreamDeck{
this.tokenNameContext;
this.tokenACContext;
this.buttonContext = [];
for (let i=0; i<31; i++){
this.buttonContext[i] = undefined;
}
this.playlistTrackBuffer = [];
this.playlistSelector = 0;
this.trackSelector = 0;
@@ -36,19 +34,39 @@ export class StreamDeck{
}
setContext(action,context,coordinates = {column:0,row:0},settings){
setContext(device,size,iteration,action,context,coordinates = {column:0,row:0},settings){
if (this.buttonContext[iteration] == undefined) {
const deckSize = size.columns*size.rows;
let buttons = [];
for (let i=0; i<deckSize; i++){
buttons[i] = undefined;
}
this.buttonContext[iteration] = {
device: device,
size: size,
buttons: buttons
}
}
const data = {
context: context,
action: action,
settings: settings
}
let num = coordinates.column + coordinates.row*8;
this.buttonContext[num] = data;
const num = coordinates.column + coordinates.row*size.columns;
this.buttonContext[iteration].buttons[num] = data;
}
clearContext(action,coordinates = {column:0,row:0}){
let num = coordinates.column + coordinates.row*8;
this.buttonContext[num] = undefined;
clearContext(device,action,coordinates = {column:0,row:0}){
for (let d of this.buttonContext) {
if (d.device == device) {
const num = coordinates.column + coordinates.row*d.size.columns;
d.buttons[num] = undefined;
return;
}
}
if (this.getActive(action) == false){
if (action == 'token') MODULE.tokenControl.active = false;
else if (action == 'macro') MODULE.macroControl.active = false;
@@ -127,7 +145,9 @@ export class StreamDeck{
newTxtArray[counter] = txtNewPart;
counter++;
}
if (counter == 1 && newTxtArray[0] == "") counter = 0;
}
for (let i=0; i<counter; i++){
if (txtNew.length > 0)
txtNew += "\n";
@@ -177,11 +197,12 @@ export class StreamDeck{
MODULE.sendWS(JSON.stringify(msg));
}
setImage(image,context,nr,id){
setImage(image,context,device,nr,id){
var json = {
target: "SD",
event: "setImage",
context: context,
device: device,
payload: {
nr: nr,
id: id,
@@ -192,11 +213,12 @@ export class StreamDeck{
MODULE.sendWS(JSON.stringify(json));
}
setBufferImage(context,nr,id){
setBufferImage(context,device,nr,id){
var json = {
target: "SD",
event: "setBufferImage",
context: context,
device: device,
payload: {
nr: nr,
id: id,
@@ -206,7 +228,7 @@ export class StreamDeck{
MODULE.sendWS(JSON.stringify(json));
}
setIcon(context,src='',options = {}){
setIcon(context,device,src='',options = {}){
if (src == null || src == undefined) src = '';
if (src == '') src = 'modules/MaterialDeck/img/black.png';
let background = options.background ? options.background : '#000000';
@@ -215,19 +237,27 @@ export class StreamDeck{
let overlay = options.overlay ? options.overlay : false;
let uses = options.uses ? options.uses : undefined;
let clock = options.clock ? options.clock : false;
for (let i=0; i<32; i++){
if (clock != false) break;
if (this.buttonContext[i] == undefined) continue;
if (this.buttonContext[i].context == context) {
if (this.buttonContext[i].icon == src && this.buttonContext[i].ring == ring && this.buttonContext[i].ringColor == ringColor && this.buttonContext[i].background == background && this.buttonContext[i].uses == uses)
return;
this.buttonContext[i].icon = src;
this.buttonContext[i].ring = ring;
this.buttonContext[i].ringColor = ringColor;
this.buttonContext[i].background = background;
this.buttonContext[i].uses = uses;
//if (src != 'modules/MaterialDeck/img/black.png')
for (let d of this.buttonContext) {
if (d.device == device) {
for (let i=0; i<d.buttons.length; i++){
if (clock != false) break;
if (d.buttons[i] == undefined) continue;
if (d.buttons[i].context == context) {
if (d.buttons[i].icon == src && d.buttons[i].ring == ring && d.buttons[i].ringColor == ringColor && d.buttons[i].background == background && d.buttons[i].uses == uses)
return;
d.buttons[i].icon = src;
d.buttons[i].ring = ring;
d.buttons[i].ringColor = ringColor;
d.buttons[i].background = background;
d.buttons[i].uses = uses;
}
}
break;
}
}
const data = {
url: src,
background:background,
@@ -235,11 +265,12 @@ export class StreamDeck{
ringColor:ringColor,
overlay:overlay,
uses:uses,
options:options
options:options,
devide:device
}
const imgBuffer = (clock == false) ? this.checkImageBuffer(data) : false;
if (imgBuffer != false) {
this.setBufferImage(context,imgBuffer,this.getImageBufferId(data))
this.setBufferImage(context,device,imgBuffer,this.getImageBufferId(data))
return;
}
@@ -252,6 +283,7 @@ export class StreamDeck{
target: "SD",
event: 'setIcon',
context: context,
device: device,
url: src,
format: format,
background: background,
@@ -312,6 +344,7 @@ export class StreamDeck{
if (data == undefined)
return;
const context = data.context;
const device = data.device;
var url = data.url;
const format = data.format;
var background = data.background;
@@ -355,14 +388,14 @@ export class StreamDeck{
else {
}
if (uses != undefined && uses.heart && (uses.available > 0 || uses.maximum != undefined)) {
if (uses != undefined && uses.heart != false && (uses.available > 0 || uses.maximum != undefined)) {
const percentage = 102*uses.available/uses.maximum;
ctx.fillStyle = "#FF0000";
ctx.fillStyle = uses.heart;
ctx.fillRect(0, 121,144,-percentage);
}
if (format == 'icon' && url != ""){
ctx.font = '600 90px "Font Awesome 5 Free"';
ctx.fillStyle = "gray";
ctx.fillStyle = "#545454";
var elm = document.createElement('i');
elm.className = url;
elm.style.display = 'none';
@@ -384,7 +417,8 @@ export class StreamDeck{
img.setAttribute('crossorigin', 'anonymous');
img.onload = () => {
if (format == 'color') ctx.filter = "opacity(0)";
if (data.overlay) ctx.filter = "brightness(60%)";
if (data.overlay == true) ctx.filter = "brightness(" + game.settings.get(MODULE.moduleName,'imageBrightness') + "%)";
//ctx.filter = "brightness(0) saturate(100%) invert(38%) sepia(62%) saturate(2063%) hue-rotate(209deg) brightness(90%) contrast(95%)";
var imageAspectRatio = img.width / img.height;
var canvasAspectRatio = canvas.width / canvas.height;
@@ -489,7 +523,7 @@ export class StreamDeck{
var dataURL = canvas.toDataURL();
canvas.remove();
const nr = this.addToImageBuffer(dataURL,data);
this.setImage(dataURL,data.context,nr,this.getImageBufferId(data));
this.setImage(dataURL,data.context,device,nr,this.getImageBufferId(data));
};
img.src = resImageURL;
}
@@ -531,12 +565,12 @@ export class StreamDeck{
this.imageBuffer = [];
}
noPermission(context,showTxt=true, origin = ""){
noPermission(context,device,showTxt=true, origin = ""){
console.warn("Material Deck: User lacks permission for function "+origin);
const url = 'modules/MaterialDeck/img/black.png';
const background = '#000000';
const txt = showTxt ? 'no\npermission' : '';
this.setIcon(context,url,{background:background});
this.setIcon(context,device,url,{background:background});
this.setTitle(txt,context);
}
}

View File

@@ -1,5 +1,5 @@
import * as MODULE from "../MaterialDeck.js";
import {streamDeck, macroControl} from "../MaterialDeck.js";
import {streamDeck, macroControl, otherControls} from "../MaterialDeck.js";
import {compatibleCore} from "./misc.js";
export class TokenControl{
@@ -10,24 +10,27 @@ export class TokenControl{
async update(tokenId=null){
if (this.active == false) return;
for (let i=0; i<32; i++){
const data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'token') continue;
await this.pushData(tokenId,data.settings,data.context);
for (let device of streamDeck.buttonContext) {
for (let i=0; i<device.buttons.length; i++){
const data = device.buttons[i];
if (data == undefined || data.action != 'token') continue;
await this.pushData(tokenId,data.settings,data.context,device.device);
}
}
}
async pushData(tokenId,settings,context,ring=0,ringColor='#000000'){
async pushData(tokenId,settings,context,device,ring=0,ringColor='#000000'){
const name = settings.displayName ? settings.displayName : false;
const icon = settings.displayIcon ? settings.displayIcon : false;
const background = settings.background ? settings.background : "#000000";
let stats = settings.stats ? settings.stats : 'none';
const selection = settings.selection ? settings.selection : 'selected';
const tokenIdentifier = settings.tokenName ? settings.tokenName : '';
const prependTitle = settings.prependTitle ? settings.prependTitle : '';
let validToken = false;
let token;
if (selection == 'selected') token = canvas.tokens.children[0].children.find(p => p.id == tokenId);
if (selection == 'selected') token = canvas.tokens.controlled[0];
else if (selection != 'selected' && tokenIdentifier == '') {}
else if (selection == 'tokenName') token = canvas.tokens.children[0].children.find(p => p.name == tokenIdentifier);
else if (selection == 'actorName') token = canvas.tokens.children[0].children.find(p => p.actor.name == tokenIdentifier);
@@ -35,7 +38,6 @@ export class TokenControl{
else if (selection == 'actorId') token = canvas.tokens.children[0].children.find(p => p.actor.id == tokenIdentifier);
if (token != undefined) validToken = true;
let tokenName = "";
let txt = "";
let iconSrc = "";
@@ -45,16 +47,17 @@ export class TokenControl{
let hp = undefined;
if (validToken) {
if (token.owner == false && token.observer == true && MODULE.getPermission('TOKEN','OBSERVER') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (token.owner == false && token.observer == false && MODULE.getPermission('TOKEN','NON_OWNED') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
tokenName = token.data.name;
if (name) txt += tokenName;
else txt += prependTitle;
const permission = token.actor?.permission;
if (settings.combat){
@@ -95,11 +98,14 @@ export class TokenControl{
else if (game.system.id == 'dnd5e'){
let attributes = token.actor.data.data.attributes;
if (stats == 'HP') {
uses = {
available: attributes.hp.value,
maximum: attributes.hp.max,
heart: true
};
if (!icon) {
uses = {
available: attributes.hp.value,
maximum: attributes.hp.max,
heart: "#FF0000"
};
}
txt += attributes.hp.value + "/" + attributes.hp.max;
}
else if (stats == 'HPbox') {
@@ -110,9 +116,17 @@ export class TokenControl{
}
}
else if (stats == 'TempHP') {
txt += attributes.hp.temp;
if (attributes.hp.tempmax != null)
txt += "/" + attributes.hp.tempmax;
const val = (attributes.hp.temp == null) ? 0 : attributes.hp.temp;
const max = (attributes.hp.tempmax == null) ? 0 : attributes.hp.tempmax
if (!icon) {
uses = {
available: (attributes.hp.temp == null) ? 0 : attributes.hp.temp,
maximum: (max == 0) ? 1 : attributes.hp.tempmax,
heart: "#00FF00"
};
}
txt += val;
if (max != 0) txt += "/" + max;
}
else if (stats == 'AC') txt += attributes.ac.value;
else if (stats == 'Speed'){
@@ -175,12 +189,25 @@ export class TokenControl{
if (value >= 0) txt += '+';
txt += value;
}
else if (stats == 'Prof') txt += token.actor.data.data.attributes.prof;
else if (stats == 'Prof') {
const value = token.actor.data.data.attributes.prof;
if (value >= 0) txt += '+';
txt += value;
}
}
else if (game.system.id == 'D35E' || game.system.id == 'pf1'){
let attributes = token.actor.data.data.attributes;
if (stats == 'HP') txt += attributes.hp.value + "/" + attributes.hp.max;
if (stats == 'HP') {
if (!icon) {
uses = {
available: attributes.hp.value,
maximum: attributes.hp.max,
heart: true
};
}
txt += attributes.hp.value + "/" + attributes.hp.max;
}
else if (stats == 'HPbox') {
uses = {
available: attributes.hp.value,
@@ -244,7 +271,17 @@ export class TokenControl{
}
else if (game.system.id == 'pf2e'){
let attributes = token.actor.data.data.attributes;
if (stats == 'HP') txt += attributes.hp.value + "/" + attributes.hp.max;
if (stats == 'HP') {
if (!icon) {
uses = {
available: attributes.hp.value,
maximum: attributes.hp.max,
heart: true
};
}
txt += attributes.hp.value + "/" + attributes.hp.max;
}
else if (stats == 'HPbox') {
uses = {
available: attributes.hp.value,
@@ -302,7 +339,17 @@ export class TokenControl{
}
else if (game.system.id == 'demonlord'){
let characteristics = token.actor.data.data.characteristics;
if (stats == 'HP') txt += characteristics.health.value + "/" + characteristics.health.max;
if (stats == 'HP') {
if (!icon) {
uses = {
available: attributes.hp.value,
maximum: attributes.hp.max,
heart: true
};
}
characteristics.health.value + "/" + characteristics.health.max;
}
else if (stats == 'HPbox') {
uses = {
available: characteristics.health.value,
@@ -335,7 +382,7 @@ export class TokenControl{
if (settings.onClick == 'visibility') { //toggle visibility
if (MODULE.getPermission('TOKEN','VISIBILITY') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
ring = 1;
@@ -350,7 +397,7 @@ export class TokenControl{
}
else if (settings.onClick == 'combatState') { //toggle combat state
if (MODULE.getPermission('TOKEN','COMBAT') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
ring = 1;
@@ -375,7 +422,7 @@ export class TokenControl{
}
else if (settings.onClick == 'condition') { //toggle condition
if (MODULE.getPermission('TOKEN','CONDITIONS') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
ring = 1;
@@ -430,7 +477,7 @@ export class TokenControl{
}
else if (settings.onClick == 'cubCondition') { //Combat Utility Belt conditions
if (MODULE.getPermission('TOKEN','CONDITIONS') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
ring = 1;
@@ -450,7 +497,7 @@ export class TokenControl{
}
else if (settings.onClick == 'wildcard') { //wildcard images
if (MODULE.getPermission('TOKEN','WILDCARD') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (icon == false) return;
@@ -490,7 +537,7 @@ export class TokenControl{
iconSrc += "";
if (settings.onClick == 'visibility') { //toggle visibility
if (MODULE.getPermission('TOKEN','VISIBILITY') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (icon == false) {
@@ -501,7 +548,7 @@ export class TokenControl{
}
else if (settings.onClick == 'combatState') { //toggle combat state
if (MODULE.getPermission('TOKEN','COMBAT') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (icon == false) {
@@ -519,7 +566,7 @@ export class TokenControl{
}
else if (settings.onClick == 'condition') { //toggle condition
if (MODULE.getPermission('TOKEN','CONDITIONS') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
if (game.system.id == 'dnd5e' || game.system.id == 'D35E' || game.system.id == 'pf1'){
@@ -548,7 +595,7 @@ export class TokenControl{
}
else if (settings.onClick == 'cubCondition') { //Combat Utility Belt conditions
if (MODULE.getPermission('TOKEN','CONDITIONS') == false ) {
streamDeck.noPermission(context);
streamDeck.noPermission(context,device);
return;
}
const condition = settings.cubConditionName;
@@ -560,22 +607,47 @@ export class TokenControl{
overlay = true;
}
}
if (icon == false){
if (MODULE.getPermission('TOKEN','STATS') == false) stats = statsOld;
if (stats == 'HP' || stats == 'TempHP') //HP
if (stats == 'HP') //HP
iconSrc = "modules/MaterialDeck/img/token/hp_empty.png";
if (stats == 'TempHP') //Temp HP
iconSrc = "modules/MaterialDeck/img/token/temp_hp_empty.png";
else if (stats == 'AC' || stats == 'ShieldHP') //AC
iconSrc = "modules/MaterialDeck/img/token/ac.webp";
else if (stats == 'Speed') //Speed
iconSrc = "modules/MaterialDeck/img/token/speed.webp";
else if (stats == 'Init') //Initiative
iconSrc = "modules/MaterialDeck/img/token/init.png";
else if (stats == 'PassivePerception')
iconSrc = "modules/MaterialDeck/img/black.png";
else if (stats == 'PassiveInvestigation')
iconSrc = "modules/MaterialDeck/img/black.png";
else if (stats == 'PassivePerception') {
iconSrc = "modules/MaterialDeck/img/token/skills/prc.png";
overlay = true;
ring = 1;
}
else if (stats == 'PassiveInvestigation') {
iconSrc = "modules/MaterialDeck/img/token/skills/inv.png";
overlay = true;
ring = 1;
}
else if (stats == 'Ability' || stats == 'AbilityMod' || stats == 'Save') {
overlay = true;
ring = 1;
let ability = (stats == 'Save') ? settings.save : settings.ability;
if (ability == undefined) ability = 'str';
if (ability == 'con') iconSrc = "modules/MaterialDeck/img/token/abilities/cons.png";
else iconSrc = "modules/MaterialDeck/img/token/abilities/" + ability + ".png";
}
else if (stats == 'Skill') {
overlay = true;
ring = 1;
let skill = settings.skill;
if (skill == undefined) skill = 'acr';
else iconSrc = "modules/MaterialDeck/img/token/skills/" + skill + ".png";
}
}
streamDeck.setIcon(context,iconSrc,{background:background,ring:ring,ringColor:ringColor,overlay:overlay,uses:uses,hp:hp});
streamDeck.setIcon(context,device,iconSrc,{background:background,ring:ring,ringColor:ringColor,overlay:overlay,uses:uses,hp:hp});
streamDeck.setTitle(txt,context);
}
@@ -774,37 +846,45 @@ export class TokenControl{
macroControl.keyPress(settingsNew);
}
else if (onClick == 'roll') { //roll skill/save/ability
const roll = settings.roll ? settings.roll : 'abilityCheck';
const roll = settings.roll ? settings.roll : 'ability';
const ability = settings.rollAbility ? settings.rollAbility : 'str';
const skill = settings.rollSkill ? settings.rollSkill : 'acr';
const save = settings.rollSave ? settings.rollSave : 'str';
const rollOptions = otherControls.rollOption ? otherControls.rollOption : 'dialog';
const options = {
fastForward: (otherControls.rollOption != 'dialog'),
advantage: (otherControls.rollOption == 'advantage'),
disadvantage: (otherControls.rollOption == 'disadvantage')
}
if (game.system.id == 'pf2e') {
if (roll == 'abilityCheck') token.actor.data.data.saves?.[ability].roll();
if (roll == 'ability') token.actor.data.data.saves?.[ability].roll(options);
else if (roll == 'save') {
let ability = save;
if (ability == 'fort') ability = 'fortitude';
else if (ability == 'ref') ability = 'reflex';
else if (ability == 'will') ability = 'will';
token.actor.data.data.saves?.[ability].roll();
token.actor.data.data.saves?.[ability].roll(options);
}
else if (roll == 'skill') token.actor.data.data.skills?.[skill].roll();
else if (roll == 'skill') token.actor.data.data.skills?.[skill].roll(options);
}
if (roll == 'abilityCheck') token.actor.rollAbilityTest(ability);
if (roll == 'ability') token.actor.rollAbilityTest(ability,options);
else if (roll == 'save') {
if (game.system.id == 'dnd5e') token.actor.rollAbilitySave(save);
else token.actor.rollSavingThrow(save);
if (game.system.id == 'dnd5e') token.actor.rollAbilitySave(save,options);
else token.actor.rollSavingThrow(save,options);
}
else if (roll == 'skill') token.actor.rollSkill(skill);
else if (roll == 'initiative') token.actor.rollInitiative();
else if (roll == 'deathSave') token.actor.rollDeathSave();
else if (roll == 'grapple') token.actor.rollGrapple();
else if (roll == 'bab') token.actor.rollBAB();
else if (roll == 'melee') token.actor.rollMelee();
else if (roll == 'ranged') token.actor.rollRanged();
else if (roll == 'cmb') token.actor.rollCMB();
else if (roll == 'attack') token.actor.rollAttack();
else if (roll == 'defenses') token.actor.rollDefenses();
else if (roll == 'skill') token.actor.rollSkill(skill,options);
else if (roll == 'initiative') token.actor.rollInitiative(options);
else if (roll == 'deathSave') token.actor.rollDeathSave(options);
else if (roll == 'grapple') token.actor.rollGrapple(options);
else if (roll == 'bab') token.actor.rollBAB(options);
else if (roll == 'melee') token.actor.rollMelee(options);
else if (roll == 'ranged') token.actor.rollRanged(options);
else if (roll == 'cmb') token.actor.rollCMB(options);
else if (roll == 'attack') token.actor.rollAttack(options);
else if (roll == 'defenses') token.actor.rollDefenses(options);
if (otherControls.rollOption != 'dialog') otherControls.setRollOption('normal');
}
else if (onClick == 'custom') {//custom onClick function
if (MODULE.getPermission('TOKEN','CUSTOM') == false ) return;