v0.8.5
This commit is contained in:
@@ -11,10 +11,10 @@ export var streamDeck;
|
|||||||
export var tokenControl;
|
export var tokenControl;
|
||||||
var move;
|
var move;
|
||||||
export var macroControl;
|
export var macroControl;
|
||||||
var combatTracker;
|
export var combatTracker;
|
||||||
var playlistControl;
|
export var playlistControl;
|
||||||
var soundboard;
|
export var soundboard;
|
||||||
var otherControls;
|
export var otherControls;
|
||||||
|
|
||||||
export const moduleName = "MaterialDeck";
|
export const moduleName = "MaterialDeck";
|
||||||
export var selectedTokenId;
|
export var selectedTokenId;
|
||||||
@@ -45,7 +45,7 @@ async function analyzeWSmessage(msg,passthrough = false){
|
|||||||
if (enableModule == false) return;
|
if (enableModule == false) return;
|
||||||
const data = JSON.parse(msg);
|
const data = JSON.parse(msg);
|
||||||
if (data == undefined || data.payload == undefined) return;
|
if (data == undefined || data.payload == undefined) return;
|
||||||
//console.log(data);
|
//console.log("Received",data);
|
||||||
const action = data.action;
|
const action = data.action;
|
||||||
const event = data.event;
|
const event = data.event;
|
||||||
const context = data.context;
|
const context = data.context;
|
||||||
@@ -62,8 +62,8 @@ async function analyzeWSmessage(msg,passthrough = false){
|
|||||||
streamDeck.setContext(action,context,coordinates,settings);
|
streamDeck.setContext(action,context,coordinates,settings);
|
||||||
|
|
||||||
if (action == 'token'){
|
if (action == 'token'){
|
||||||
if (selectedTokenId != undefined)
|
tokenControl.active = true;
|
||||||
tokenControl.update(selectedTokenId);
|
tokenControl.update(selectedTokenId);
|
||||||
}
|
}
|
||||||
else if (action == 'macro')
|
else if (action == 'macro')
|
||||||
macroControl.update(settings,context);
|
macroControl.update(settings,context);
|
||||||
@@ -126,7 +126,7 @@ function startWebsocket() {
|
|||||||
|
|
||||||
ws.onopen = function() {
|
ws.onopen = function() {
|
||||||
WSconnected = true;
|
WSconnected = true;
|
||||||
ui.notifications.info("Material Deck Connected: "+ip+':'+port);
|
ui.notifications.info("Material Deck "+game.i18n.localize("MaterialDeck.Notifications.Connected") +": "+ip+':'+port);
|
||||||
wsOpen = true;
|
wsOpen = true;
|
||||||
let msg = {
|
let msg = {
|
||||||
type: "Foundry"
|
type: "Foundry"
|
||||||
@@ -276,6 +276,7 @@ Hooks.on('renderHotbar', (hotbar)=>{
|
|||||||
Hooks.on('renderCombatTracker',()=>{
|
Hooks.on('renderCombatTracker',()=>{
|
||||||
if (enableModule == false || ready == false) return;
|
if (enableModule == false || ready == false) return;
|
||||||
combatTracker.updateAll();
|
combatTracker.updateAll();
|
||||||
|
tokenControl.update(selectedTokenId);
|
||||||
});
|
});
|
||||||
|
|
||||||
Hooks.on('renderPlaylistDirectory', (playlistDirectory)=>{
|
Hooks.on('renderPlaylistDirectory', (playlistDirectory)=>{
|
||||||
@@ -309,6 +310,11 @@ Hooks.on('renderSceneControls',()=>{
|
|||||||
otherControls.updateAll();
|
otherControls.updateAll();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Hooks.on('targetToken',(user,token,targeted)=>{
|
||||||
|
if (enableModule == false || ready == false) return;
|
||||||
|
if (token.id == selectedTokenId) tokenControl.update(selectedTokenId);
|
||||||
|
});
|
||||||
|
|
||||||
Hooks.once('init', ()=>{
|
Hooks.once('init', ()=>{
|
||||||
//CONFIG.debug.hooks = true;
|
//CONFIG.debug.hooks = true;
|
||||||
registerSettings(); //in ./src/settings.js
|
registerSettings(); //in ./src/settings.js
|
||||||
|
|||||||
20
changelog.md
20
changelog.md
@@ -1,4 +1,22 @@
|
|||||||
# Changelog Material Deck Module
|
# Changelog Material Deck Module
|
||||||
|
### v0.8.5 - 17-11-2020
|
||||||
|
<ul>
|
||||||
|
<li>Added 'Display Icon' to Macro action</li>
|
||||||
|
<li>Removed background option from 'Macro' => 'Macro Board' => 'Trigger Macro', this is handled in the macro configuration screen</li>
|
||||||
|
<li>Added 'Background' option in 'Macro' => 'Macro Board' => 'Offset'</li>
|
||||||
|
<li>Fixed control buttons from not performing action when clicked</li>
|
||||||
|
<li>Added check for each function to prevent unnecessary searching through the button buffer</li>
|
||||||
|
<li>Added 'Target', 'Visibility', 'Toggle Combat State' and 'Set Condition' options to the 'Token' action (under 'on click')</li>
|
||||||
|
<li>Added 'Zoom In' and 'Zoom Out' functions to 'Move' action</li>
|
||||||
|
<li>Added ability to load icons from web sources</li>
|
||||||
|
<li>Added support for localization (module only)</li>
|
||||||
|
<li>Fixed issue where SD buttons would not load properly if Foundry was initialized before the SD, or if Foundry was refreshed</li>
|
||||||
|
<li>Long words now split up onto multiple lines</li>
|
||||||
|
</ul>
|
||||||
|
<b>Compatible server app and SD plugin:</b><br>
|
||||||
|
Server v0.2.4 (no change)<br>
|
||||||
|
SD plugin v0.7.2<br>
|
||||||
|
|
||||||
### v0.8.4 - 11-11-2020
|
### v0.8.4 - 11-11-2020
|
||||||
<ul>
|
<ul>
|
||||||
<li>In 'Other' action, 'Control Button' mode, add 'Displayed Controls' option</li>
|
<li>In 'Other' action, 'Control Button' mode, add 'Displayed Controls' option</li>
|
||||||
@@ -9,7 +27,7 @@
|
|||||||
<li>Newly created actions now show the correct options at the start</li>
|
<li>Newly created actions now show the correct options at the start</li>
|
||||||
</ul>
|
</ul>
|
||||||
<b>Compatible server app and SD plugin:</b><br>
|
<b>Compatible server app and SD plugin:</b><br>
|
||||||
Server v0.2.4<br>
|
Server v0.2.4 (no change)<br>
|
||||||
SD plugin v0.7.1<br>
|
SD plugin v0.7.1<br>
|
||||||
|
|
||||||
### v0.8.3 - 10-11-2020
|
### v0.8.3 - 10-11-2020
|
||||||
|
|||||||
61
lang/en.json
61
lang/en.json
@@ -1,39 +1,40 @@
|
|||||||
{
|
{
|
||||||
"MaterialDeck.Notifications.Disconnected": "Disconnected from mdServer, attempting to reconnect",
|
"MaterialDeck.Notifications.Disconnected": "Disconnected from mdServer, attempting to reconnect",
|
||||||
"MaterialDeck.Notifications.ConnectFail": "Can't connect to mdServer, retrying",
|
"MaterialDeck.Notifications.ConnectFail": "Can't connect to mdServer, retrying",
|
||||||
|
"MaterialDeck.Notifications.Connected": "Connected",
|
||||||
|
|
||||||
"MaterialDeck.Sett.PlaylistConfig": "Playlist Configuration",
|
|
||||||
"MaterialDeck.Sett.SoundboardConfig": "Soundboard Configuration",
|
|
||||||
"MaterialDeck.Sett.MacroConfig": "Macro Configuration",
|
|
||||||
"MaterialDeck.Sett.Brightness": "Brightness",
|
|
||||||
"MaterialDeck.Sett.Brightness_Hint": "LED brightness level",
|
|
||||||
"MaterialDeck.Sett.Enable": "Enable module",
|
"MaterialDeck.Sett.Enable": "Enable module",
|
||||||
|
"MaterialDeck.Sett.Model": "Stream Deck Model",
|
||||||
|
"MaterialDeck.Sett.Model_Hint": "Reduces the amount of macros and sounds in the macro and soundboard configuration screens. Gives a better overview, but if desired it can be set to XL to get the maximum number. This doesn't influence the operation of the module.",
|
||||||
|
"MaterialDeck.Sett.Model_Mini": "Mini",
|
||||||
|
"MaterialDeck.Sett.Model_Normal": "Normal or Mobile",
|
||||||
|
"MaterialDeck.Sett.Model_XL": "XL",
|
||||||
|
"MaterialDeck.Sett.PlaylistConfig": "Playlist Configuration",
|
||||||
|
"MaterialDeck.Sett.MacroConfig": "Macro Configuration",
|
||||||
|
"MaterialDeck.Sett.SoundboardConfig": "Soundboard Configuration",
|
||||||
|
|
||||||
"MaterialDeck.Playlist.Clear": "Clear data",
|
"MaterialDeck.PL.Unrestricted": "Unrestricted",
|
||||||
"MaterialDeck.Playlist.Playmethod.Header": "Play Method",
|
"MaterialDeck.PL.OneTrackPlaylist": "One track per playlist",
|
||||||
"MaterialDeck.Playlist.Playmethod.Label": "Method",
|
"MaterialDeck.PL.OneTrackTotal": "One track in total",
|
||||||
"MaterialDeck.Playlist.Playmethod.Unrestricted": "Unrestricted",
|
"MaterialDeck.PL.Header": "Play Method",
|
||||||
"MaterialDeck.Playlist.Playmethod.OneTrackPlaylist": "One track per playlist",
|
"MaterialDeck.PL.Label": "Method",
|
||||||
"MaterialDeck.Playlist.Playmethod.OneTrackTotal": "One track in total",
|
|
||||||
"MaterialDeck.Playlist.Playlists": "Playlists",
|
|
||||||
"MaterialDeck.Playlist.Playlist": "Playlist",
|
|
||||||
"MaterialDeck.Playlist.None": "None",
|
|
||||||
"MaterialDeck.Playlist.Save": "Save",
|
|
||||||
"MaterialDeck.Soundboard.Volume": "Volume",
|
|
||||||
|
|
||||||
"MaterialDeck.Soundboard.Sound": "Sound",
|
"MaterialDeck.Playlists": "Playlists",
|
||||||
"MaterialDeck.Soundboard.Icon": "Icon",
|
"MaterialDeck.Playlist": "Playlist",
|
||||||
"MaterialDeck.Soundboard.Playback": "Playback",
|
"MaterialDeck.FurnaceArgs": "Furnace arguments",
|
||||||
"MaterialDeck.Soundboard.Once": "Once",
|
"MaterialDeck.Background": "Background",
|
||||||
"MaterialDeck.Soundboard.Repeat": "Repeat",
|
"MaterialDeck.Macro": "Macro",
|
||||||
"MaterialDeck.Soundboard.Hold": "Hold",
|
"MaterialDeck.Sound": "Sound",
|
||||||
"MaterialDeck.Soundboard.On": "On",
|
"MaterialDeck.Icon": "Icon",
|
||||||
"MaterialDeck.Soundboard.Off": "Off",
|
"MaterialDeck.Once": "Once",
|
||||||
|
"MaterialDeck.Repeat": "Repeat",
|
||||||
"MaterialDeck.Macro.Macro": "Macro",
|
"MaterialDeck.Hold": "Hold",
|
||||||
"MaterialDeck.Macro.Background": "Background",
|
"MaterialDeck.Playback": "Playback",
|
||||||
"MaterialDeck.Macro.FurnaceArgs": "Furnace arguments",
|
"MaterialDeck.Volume": "Volume",
|
||||||
|
"MaterialDeck.On": "On",
|
||||||
"MaterialDeck.Name": "Name"
|
"MaterialDeck.Off": "Off",
|
||||||
|
"MaterialDeck.Name": "Name",
|
||||||
|
"MaterialDeck.None": "None",
|
||||||
|
"MaterialDeck.Save": "Save"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "MaterialDeck",
|
"name": "MaterialDeck",
|
||||||
"title": "Material Deck",
|
"title": "Material Deck",
|
||||||
"description": "",
|
"description": "",
|
||||||
"version": "0.8.4",
|
"version": "0.8.5",
|
||||||
"author": "CDeenen",
|
"author": "CDeenen",
|
||||||
"esmodules": [
|
"esmodules": [
|
||||||
"./MaterialDeck.js"
|
"./MaterialDeck.js"
|
||||||
|
|||||||
@@ -3,11 +3,12 @@ import {streamDeck, tokenControl} from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class CombatTracker{
|
export class CombatTracker{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
this.combatantLength = 0;
|
this.combatantLength = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAll(){
|
async updateAll(){
|
||||||
|
if (this.active == false) return;
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
let data = streamDeck.buttonContext[i];
|
let data = streamDeck.buttonContext[i];
|
||||||
if (data == undefined || data.action != 'combattracker') continue;
|
if (data == undefined || data.action != 'combattracker') continue;
|
||||||
@@ -16,6 +17,7 @@ export class CombatTracker{
|
|||||||
}
|
}
|
||||||
|
|
||||||
update(settings,context){
|
update(settings,context){
|
||||||
|
this.active = true;
|
||||||
let ctFunction = settings.combatTrackerFunction;
|
let ctFunction = settings.combatTrackerFunction;
|
||||||
if (ctFunction == undefined) ctFunction == 0;
|
if (ctFunction == undefined) ctFunction == 0;
|
||||||
|
|
||||||
|
|||||||
18
src/macro.js
18
src/macro.js
@@ -3,10 +3,12 @@ import {streamDeck} from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class MacroControl{
|
export class MacroControl{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
this.offset = 0;
|
this.offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAll(){
|
async updateAll(){
|
||||||
|
if (this.active == false) return;
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
let data = streamDeck.buttonContext[i];
|
let data = streamDeck.buttonContext[i];
|
||||||
if (data == undefined || data.action != 'macro') continue;
|
if (data == undefined || data.action != 'macro') continue;
|
||||||
@@ -15,10 +17,13 @@ export class MacroControl{
|
|||||||
}
|
}
|
||||||
|
|
||||||
update(settings,context){
|
update(settings,context){
|
||||||
|
this.active = true;
|
||||||
let mode = settings.macroMode;
|
let mode = settings.macroMode;
|
||||||
let displayName = settings.displayName;
|
let displayName = settings.displayName;
|
||||||
let macroNumber = settings.macroNumber;
|
let macroNumber = settings.macroNumber;
|
||||||
let background = settings.background;
|
let background = settings.background;
|
||||||
|
let icon = false;
|
||||||
|
if (settings.displayIcon) icon = true;
|
||||||
let ringColor = "#000000";
|
let ringColor = "#000000";
|
||||||
let ring = 0;
|
let ring = 0;
|
||||||
if(macroNumber == undefined || isNaN(parseInt(macroNumber))){
|
if(macroNumber == undefined || isNaN(parseInt(macroNumber))){
|
||||||
@@ -53,15 +58,15 @@ export class MacroControl{
|
|||||||
src += macro.img;
|
src += macro.img;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (icon) streamDeck.setIcon(1,context,src,background);
|
||||||
streamDeck.setIcon(1,context,src,background);
|
else streamDeck.setIcon(0, context, "", background);
|
||||||
if (displayName == 0) name = "";
|
if (displayName == 0) name = "";
|
||||||
streamDeck.setTitle(name,context);
|
streamDeck.setTitle(name,context);
|
||||||
}
|
}
|
||||||
else {
|
else { //Macro board
|
||||||
let name = "";
|
let name = "";
|
||||||
let src = '';
|
let src = '';
|
||||||
if (settings.macroBoardMode == 0) {
|
if (settings.macroBoardMode == 0) { //Execute macro
|
||||||
macroNumber += this.offset - 1;
|
macroNumber += this.offset - 1;
|
||||||
if (macroNumber < 0) macroNumber = 0;
|
if (macroNumber < 0) macroNumber = 0;
|
||||||
var macroId = game.settings.get(MODULE.moduleName,'macroSettings').macros[macroNumber];
|
var macroId = game.settings.get(MODULE.moduleName,'macroSettings').macros[macroNumber];
|
||||||
@@ -77,7 +82,7 @@ export class MacroControl{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else { //Offset
|
||||||
let ringOffColor = settings.offRing;
|
let ringOffColor = settings.offRing;
|
||||||
if (ringOffColor == undefined) ringOffColor = '#000000';
|
if (ringOffColor == undefined) ringOffColor = '#000000';
|
||||||
|
|
||||||
@@ -92,7 +97,8 @@ export class MacroControl{
|
|||||||
|
|
||||||
ring = 2;
|
ring = 2;
|
||||||
}
|
}
|
||||||
streamDeck.setIcon(1, context,src,background,ring,ringColor);
|
if (icon) streamDeck.setIcon(1, context,src,background,ring,ringColor);
|
||||||
|
else streamDeck.setIcon(0, context, "", background,ring,ringColor);
|
||||||
if (displayName == 0) name = "";
|
if (displayName == 0) name = "";
|
||||||
streamDeck.setTitle(name,context);
|
streamDeck.setTitle(name,context);
|
||||||
}
|
}
|
||||||
|
|||||||
25
src/move.js
25
src/move.js
@@ -2,22 +2,37 @@ import * as MODULE from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class Move{
|
export class Move{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
keyPress(settings){
|
keyPress(settings){
|
||||||
|
console.log('move',settings)
|
||||||
let dir = settings.dir;
|
let dir = settings.dir;
|
||||||
let mode = settings.mode;
|
let mode = settings.mode;
|
||||||
if (mode == undefined) mode = 0;
|
if (mode == undefined) mode = 0;
|
||||||
if (dir == undefined) dir = 0;
|
if (dir == undefined) dir = 0;
|
||||||
if (settings.mode == '1')
|
if (dir < 9){
|
||||||
this.moveToken(MODULE.selectedTokenId,dir);
|
if (settings.mode == '1')
|
||||||
else
|
this.moveToken(MODULE.selectedTokenId,dir);
|
||||||
this.moveCanvas(dir);
|
else
|
||||||
|
this.moveCanvas(dir);
|
||||||
|
}
|
||||||
|
else if (dir == 9) {//zoom in
|
||||||
|
let viewPosition = canvas.scene._viewPosition;
|
||||||
|
viewPosition.scale = viewPosition.scale*1.05;
|
||||||
|
viewPosition.duration = 100;
|
||||||
|
canvas.animatePan(viewPosition);
|
||||||
|
}
|
||||||
|
else if (dir == 10) {//zoom out
|
||||||
|
let viewPosition = canvas.scene._viewPosition;
|
||||||
|
viewPosition.scale = viewPosition.scale*0.95;
|
||||||
|
viewPosition.duration = 100;
|
||||||
|
canvas.animatePan(viewPosition);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async moveToken(tokenId,dir){
|
async moveToken(tokenId,dir){
|
||||||
if (tokenId == undefined) return;
|
if (tokenId == undefined) return;
|
||||||
|
|
||||||
const token = canvas.tokens.children[0].children.find(p => p.id == tokenId);
|
const token = canvas.tokens.children[0].children.find(p => p.id == tokenId);
|
||||||
const gridSize = canvas.scene.data.grid;
|
const gridSize = canvas.scene.data.grid;
|
||||||
let x = token.x;
|
let x = token.x;
|
||||||
|
|||||||
@@ -3,10 +3,12 @@ import {streamDeck} from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class OtherControls{
|
export class OtherControls{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
this.offset = 0;
|
this.offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAll(){
|
async updateAll(){
|
||||||
|
if (this.active == false) return;
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
let data = streamDeck.buttonContext[i];
|
let data = streamDeck.buttonContext[i];
|
||||||
if (data == undefined || data.action != 'other') continue;
|
if (data == undefined || data.action != 'other') continue;
|
||||||
@@ -15,6 +17,7 @@ export class OtherControls{
|
|||||||
}
|
}
|
||||||
|
|
||||||
update(settings,context){
|
update(settings,context){
|
||||||
|
this.active = true;
|
||||||
let mode = settings.otherMode;
|
let mode = settings.otherMode;
|
||||||
if (mode == undefined) mode = 0;
|
if (mode == undefined) mode = 0;
|
||||||
|
|
||||||
@@ -312,8 +315,10 @@ export class OtherControls{
|
|||||||
if (selectedControl != undefined){
|
if (selectedControl != undefined){
|
||||||
const selectedTool = selectedControl.tools[controlNr];
|
const selectedTool = selectedControl.tools[controlNr];
|
||||||
if (selectedTool != undefined){
|
if (selectedTool != undefined){
|
||||||
if (selectedTool.toggle)
|
if (selectedTool.toggle) {
|
||||||
selectedTool.active = !selectedTool.active;
|
selectedTool.active = !selectedTool.active;
|
||||||
|
selectedTool.onClick(selectedTool.active);
|
||||||
|
}
|
||||||
else if (selectedTool.button){
|
else if (selectedTool.button){
|
||||||
selectedTool.onClick();
|
selectedTool.onClick();
|
||||||
}
|
}
|
||||||
@@ -335,8 +340,10 @@ export class OtherControls{
|
|||||||
if (selectedTool != undefined){
|
if (selectedTool != undefined){
|
||||||
ui.controls.activeControl = controlName;
|
ui.controls.activeControl = controlName;
|
||||||
canvas.getLayer(selectedControl.layer).activate();
|
canvas.getLayer(selectedControl.layer).activate();
|
||||||
if (selectedTool.toggle)
|
if (selectedTool.toggle) {
|
||||||
selectedTool.active = !selectedTool.active;
|
selectedTool.active = !selectedTool.active;
|
||||||
|
selectedTool.onClick(selectedTool.active);
|
||||||
|
}
|
||||||
else if (selectedTool.button){
|
else if (selectedTool.button){
|
||||||
selectedTool.onClick();
|
selectedTool.onClick();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ import {streamDeck} from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class PlaylistControl{
|
export class PlaylistControl{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
this.playlistOffset = 0;
|
this.playlistOffset = 0;
|
||||||
this.trackOffset = 0;
|
this.trackOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAll(){
|
async updateAll(){
|
||||||
|
if (this.active == false) return;
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
let data = streamDeck.buttonContext[i];
|
let data = streamDeck.buttonContext[i];
|
||||||
if (data == undefined || data.action != 'playlist') continue;
|
if (data == undefined || data.action != 'playlist') continue;
|
||||||
@@ -16,6 +18,7 @@ export class PlaylistControl{
|
|||||||
}
|
}
|
||||||
|
|
||||||
update(settings,context){
|
update(settings,context){
|
||||||
|
this.active = true;
|
||||||
if (settings.playlistMode == undefined) settings.playlistMode = 0;
|
if (settings.playlistMode == undefined) settings.playlistMode = 0;
|
||||||
if (settings.playlistMode == 0){
|
if (settings.playlistMode == 0){
|
||||||
this.updatePlaylist(settings,context);
|
this.updatePlaylist(settings,context);
|
||||||
|
|||||||
@@ -17,13 +17,13 @@ export const registerSettings = function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
game.settings.register(MODULE.moduleName,'streamDeckModel', {
|
game.settings.register(MODULE.moduleName,'streamDeckModel', {
|
||||||
name: "Stream Deck Model",
|
name: "MaterialDeck.Sett.Model",
|
||||||
hint: "Reduces the amount of macros and sounds in the macro and soundboard configuration screens. Gives a better overview, but if desired it can be set to XL to get the maximum number. This doesn't influence the operation of the module.",
|
hint: "MaterialDeck.Sett.Model_Hint",
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: true,
|
config: true,
|
||||||
type:Number,
|
type:Number,
|
||||||
default:1,
|
default:1,
|
||||||
choices:["Mini","Normal or Mobile","XL"],
|
choices:["MaterialDeck.Sett.Model_Mini","MaterialDeck.Sett.Model_Normal","MaterialDeck.Sett.Model_XL"],
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,12 +35,12 @@ export const registerSettings = function() {
|
|||||||
config: false,
|
config: false,
|
||||||
type:Number,
|
type:Number,
|
||||||
default:0,
|
default:0,
|
||||||
choices:["Default","One track per playlist","One track in total"],
|
choices:["MaterialDeck.Playlist.Playmethod.Unrestricted","MaterialDeck.Playlist.Playmethod.OneTrackPlaylist","MaterialDeck.Playlist.Playmethod.OneTrackTotal"],
|
||||||
});
|
});
|
||||||
|
|
||||||
game.settings.registerMenu(MODULE.moduleName, 'playlistConfigMenu',{
|
game.settings.registerMenu(MODULE.moduleName, 'playlistConfigMenu',{
|
||||||
name: "Playlist Configuration",
|
name: "MaterialDeck.Sett.PlaylistConfig",
|
||||||
label: "Playlist Configuration",
|
label: "MaterialDeck.Sett.PlaylistConfig",
|
||||||
type: playlistConfigForm,
|
type: playlistConfigForm,
|
||||||
restricted: true
|
restricted: true
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import {streamDeck} from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class SoundboardControl{
|
export class SoundboardControl{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
this.offset = 0;
|
this.offset = 0;
|
||||||
this.activeSounds = [];
|
this.activeSounds = [];
|
||||||
for (let i=0; i<64; i++)
|
for (let i=0; i<64; i++)
|
||||||
@@ -10,6 +11,7 @@ export class SoundboardControl{
|
|||||||
}
|
}
|
||||||
|
|
||||||
async updateAll(){
|
async updateAll(){
|
||||||
|
if (this.active == false) return;
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
let data = streamDeck.buttonContext[i];
|
let data = streamDeck.buttonContext[i];
|
||||||
if (data == undefined || data.action != 'soundboard') continue;
|
if (data == undefined || data.action != 'soundboard') continue;
|
||||||
@@ -18,6 +20,7 @@ export class SoundboardControl{
|
|||||||
}
|
}
|
||||||
|
|
||||||
update(settings,context){
|
update(settings,context){
|
||||||
|
this.active = true;
|
||||||
let mode = settings.soundboardMode;
|
let mode = settings.soundboardMode;
|
||||||
if (mode == undefined) mode = 0;
|
if (mode == undefined) mode = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ export class StreamDeck{
|
|||||||
let canvasBox = document.createElement('div');
|
let canvasBox = document.createElement('div');
|
||||||
canvasBox.id = 'sdCanvasBox';
|
canvasBox.id = 'sdCanvasBox';
|
||||||
document.body.appendChild(canvasBox); // adds the canvas to the body element
|
document.body.appendChild(canvasBox); // adds the canvas to the body element
|
||||||
|
|
||||||
|
this.syllableRegex = /[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi;
|
||||||
}
|
}
|
||||||
|
|
||||||
setScreen(action){
|
setScreen(action){
|
||||||
@@ -42,20 +44,90 @@ export class StreamDeck{
|
|||||||
clearContext(action,coordinates = {column:0,row:0}){
|
clearContext(action,coordinates = {column:0,row:0}){
|
||||||
let num = coordinates.column + coordinates.row*8;
|
let num = coordinates.column + coordinates.row*8;
|
||||||
this.buttonContext[num] = undefined;
|
this.buttonContext[num] = undefined;
|
||||||
|
if (this.getActive(action) == false){
|
||||||
|
if (action == 'token') MODULE.tokenControl.active = false;
|
||||||
|
else if (action == 'macro') MODULE.macroControl.active = false;
|
||||||
|
else if (action == 'combattracker') MODULE.combatTracker.active = false;
|
||||||
|
else if (action == 'playlist') MODULE.playlistControl.active = false;
|
||||||
|
else if (action == 'soundboard') MODULE.soundboard.active = false;
|
||||||
|
else if (action == 'other') MODULE.otherControls.active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getActive(action){
|
||||||
|
for (let i=0; i<this.buttonContext.length; i++){
|
||||||
|
if (this.buttonContext[i] != undefined && this.buttonContext[i].action == action)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get syllables of a word. Taken from: https://stackoverflow.com/a/49407494
|
||||||
|
*/
|
||||||
|
syllabify(words) {
|
||||||
|
return words.match(this.syllableRegex);
|
||||||
}
|
}
|
||||||
|
|
||||||
formatTitle(txt){
|
formatTitle(txt){
|
||||||
let txtArray = txt.split(" ");
|
let txtArrayOriginal = txt.split("\n");
|
||||||
let txtNew = "";
|
let txtArray = [];
|
||||||
for (let i=0; i<txtArray.length; i++){
|
let counter = 0;
|
||||||
let txtNewPart = txtArray[i];
|
for (let i=0; i<txtArrayOriginal.length; i++){
|
||||||
if (i<txtArray.length-1 && txtArray[i].length + txtArray[i+1].length < 8) {
|
|
||||||
txtNewPart = txtArray[i] + " " + txtArray[i+1];
|
let txtArrayTemp = txtArrayOriginal[i].split(" ");
|
||||||
i++;
|
for (let j=0; j<txtArrayTemp.length; j++){
|
||||||
|
txtArray[counter] = txtArrayTemp[j];
|
||||||
|
counter++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
let txtNew = "";
|
||||||
|
let newTxtArray = ['','','','','','','','','','','','','','','','','','','',''];
|
||||||
|
counter = 0;
|
||||||
|
for (let i=0; i<txtArray.length; i++){
|
||||||
|
|
||||||
|
let txtNewPart = txtArray[i];
|
||||||
|
|
||||||
|
if (txtNewPart != undefined && txtNewPart.length > 10){
|
||||||
|
let syllables = this.syllabify(txtNewPart);
|
||||||
|
|
||||||
|
for (let j=0; j<syllables.length; j++){
|
||||||
|
if (syllables.length == 0){
|
||||||
|
newTxtArray[counter] = txtNewPart;
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
else if (syllables[j+1] == undefined){
|
||||||
|
newTxtArray[counter] = syllables[j];
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
else if ((syllables[j].length+syllables[j+1].length) < 10){
|
||||||
|
newTxtArray[counter] = syllables[j]+syllables[j+1];
|
||||||
|
if (syllables.length-2 > j) newTxtArray[counter] += '-';
|
||||||
|
counter++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newTxtArray[counter] = syllables[j];
|
||||||
|
if (syllables.length > j) newTxtArray[counter] += '-';
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
newTxtArray[counter] = txtNewPart;
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i=0; i<counter; i++){
|
||||||
if (txtNew.length > 0)
|
if (txtNew.length > 0)
|
||||||
txtNew += "\n";
|
txtNew += "\n";
|
||||||
txtNew += txtNewPart;
|
if (i<counter-1 && newTxtArray[i].length + newTxtArray[i+1].length < 10) {
|
||||||
|
txtNew += newTxtArray[i] + " " + newTxtArray[i+1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
txtNew += newTxtArray[i];
|
||||||
}
|
}
|
||||||
return txtNew;
|
return txtNew;
|
||||||
}
|
}
|
||||||
@@ -107,7 +179,7 @@ export class StreamDeck{
|
|||||||
MODULE.sendWS(JSON.stringify(json));
|
MODULE.sendWS(JSON.stringify(json));
|
||||||
}
|
}
|
||||||
|
|
||||||
setIcon(iconLocation, context,src,background = '#000000',ring=0,ringColor = "#000000"){
|
setIcon(iconLocation, context,src,background = '#000000',ring=0,ringColor = "#000000",overlay=false){
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
if (this.buttonContext[i] == undefined) continue;
|
if (this.buttonContext[i] == undefined) continue;
|
||||||
if (this.buttonContext[i].context == context) {
|
if (this.buttonContext[i].context == context) {
|
||||||
@@ -121,10 +193,10 @@ export class StreamDeck{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let split = src.split('?');
|
let split = src.split('.');
|
||||||
split = split[0].split('.');
|
//filter out stuff from Tokenizer
|
||||||
let format = split[split.length-1];
|
let format = split[split.length-1].split('?')[0];
|
||||||
split = src.split(' ');
|
split = split[0].split(' ');
|
||||||
if (split[0] == 'fas' || split[0] == 'far' || split[0] == 'fal' || split[0] == 'fad') format = 'icon';
|
if (split[0] == 'fas' || split[0] == 'far' || split[0] == 'fal' || split[0] == 'fad') format = 'icon';
|
||||||
let msg = {
|
let msg = {
|
||||||
event: 'setIcon',
|
event: 'setIcon',
|
||||||
@@ -133,7 +205,8 @@ export class StreamDeck{
|
|||||||
format: format,
|
format: format,
|
||||||
background: background,
|
background: background,
|
||||||
ring: ring,
|
ring: ring,
|
||||||
ringColor: ringColor
|
ringColor: ringColor,
|
||||||
|
overlay: overlay
|
||||||
};
|
};
|
||||||
if (iconLocation == 0){
|
if (iconLocation == 0){
|
||||||
MODULE.sendWS(JSON.stringify(msg));
|
MODULE.sendWS(JSON.stringify(msg));
|
||||||
@@ -257,8 +330,10 @@ export class StreamDeck{
|
|||||||
let resImageURL = url;
|
let resImageURL = url;
|
||||||
|
|
||||||
let img = new Image();
|
let img = new Image();
|
||||||
|
img.setAttribute('crossorigin', 'anonymous');
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
if (format == 'color') ctx.filter = "opacity(0)";
|
if (format == 'color') ctx.filter = "opacity(0)";
|
||||||
|
if (data.overlay) ctx.filter = "brightness(60%)";
|
||||||
//ctx.filter = "brightness(0) saturate(100%) invert(38%) sepia(62%) saturate(2063%) hue-rotate(209deg) brightness(90%) contrast(95%)";
|
//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 imageAspectRatio = img.width / img.height;
|
||||||
var canvasAspectRatio = canvas.width / canvas.height;
|
var canvasAspectRatio = canvas.width / canvas.height;
|
||||||
|
|||||||
161
src/token.js
161
src/token.js
@@ -3,9 +3,11 @@ import {streamDeck} from "../MaterialDeck.js";
|
|||||||
|
|
||||||
export class TokenControl{
|
export class TokenControl{
|
||||||
constructor(){
|
constructor(){
|
||||||
|
this.active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
async update(tokenId){
|
async update(tokenId){
|
||||||
|
if (this.active == false) return;
|
||||||
for (let i=0; i<32; i++){
|
for (let i=0; i<32; i++){
|
||||||
let data = streamDeck.buttonContext[i];
|
let data = streamDeck.buttonContext[i];
|
||||||
if (data == undefined || data.action != 'token') continue;
|
if (data == undefined || data.action != 'token') continue;
|
||||||
@@ -73,10 +75,99 @@ export class TokenControl{
|
|||||||
}
|
}
|
||||||
initiative = attributes.init.total;
|
initiative = attributes.init.total;
|
||||||
}
|
}
|
||||||
else return;
|
else {
|
||||||
|
//Other systems
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (settings.onClick == 4) { //toggle visibility
|
||||||
|
ring = 1;
|
||||||
|
if (token.data.hidden){
|
||||||
|
ring = 2;
|
||||||
|
ringColor = "#FF7B00";
|
||||||
|
}
|
||||||
|
if (icon == false) {
|
||||||
|
iconSrc = window.CONFIG.controlIcons.visibility;
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor,true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.onClick == 5) { //toggle combat state
|
||||||
|
ring = 1;
|
||||||
|
if (token.inCombat){
|
||||||
|
ring = 2;
|
||||||
|
ringColor = "#FF7B00";
|
||||||
|
}
|
||||||
|
if (icon == false) {
|
||||||
|
iconSrc = window.CONFIG.controlIcons.combat;
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor,true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.onClick == 6) { //target token
|
||||||
|
ring = 1;
|
||||||
|
if (token.isTargeted){
|
||||||
|
ring = 2;
|
||||||
|
ringColor = "#FF7B00";
|
||||||
|
}
|
||||||
|
if (icon == false) {
|
||||||
|
iconSrc = "fas fa-bullseye";
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.onClick == 7) { //toggle condition
|
||||||
|
ring = 1;
|
||||||
|
let condition = settings.condition;
|
||||||
|
if (condition == undefined) condition = 0;
|
||||||
|
|
||||||
|
if (condition == 0 && icon == false){
|
||||||
|
iconSrc = window.CONFIG.controlIcons.effects;
|
||||||
|
}
|
||||||
|
else if (icon == false) {
|
||||||
|
let effect = CONFIG.statusEffects.find(e => e.id === this.getStatusId(condition));
|
||||||
|
iconSrc = effect.icon;
|
||||||
|
let effects = token.actor.effects.entries;
|
||||||
|
let active = effects.find(e => e.isTemporary === this.getStatusId(condition));
|
||||||
|
if (active != undefined){
|
||||||
|
ring = 2;
|
||||||
|
ringColor = "#FF7B00";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor,true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
iconSrc += "";
|
iconSrc += "";
|
||||||
|
if (settings.onClick == 4) { //toggle visibility
|
||||||
|
if (icon == false) {
|
||||||
|
iconSrc = window.CONFIG.controlIcons.visibility;
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,1,'#000000',true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.onClick == 5) { //toggle combat state
|
||||||
|
if (icon == false) {
|
||||||
|
iconSrc = window.CONFIG.controlIcons.combat;
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,1,'#000000',true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.onClick == 6) { //target token
|
||||||
|
if (icon == false) {
|
||||||
|
iconSrc = "fas fa-bullseye";
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,1,'#000000');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.onClick == 7) { //toggle condition
|
||||||
|
let condition = settings.condition;
|
||||||
|
if (condition == undefined) condition = 0;
|
||||||
|
|
||||||
|
if (condition == 0 && icon == false){
|
||||||
|
iconSrc = window.CONFIG.controlIcons.effects;
|
||||||
|
}
|
||||||
|
else if (icon == false) {
|
||||||
|
iconSrc = CONFIG.statusEffects.find(e => e.id === this.getStatusId(condition)).icon;
|
||||||
|
}
|
||||||
|
streamDeck.setIcon(1,context,iconSrc,background,1,'#000000',true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (icon) streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor);
|
if (icon) streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor);
|
||||||
|
|
||||||
@@ -89,7 +180,7 @@ export class TokenControl{
|
|||||||
streamDeck.setTitle(txt,context);
|
streamDeck.setTitle(txt,context);
|
||||||
}
|
}
|
||||||
|
|
||||||
keyPress(settings){
|
async keyPress(settings){
|
||||||
if (MODULE.selectedTokenId == undefined) return;
|
if (MODULE.selectedTokenId == undefined) return;
|
||||||
const tokenId = MODULE.selectedTokenId;
|
const tokenId = MODULE.selectedTokenId;
|
||||||
|
|
||||||
@@ -108,8 +199,72 @@ export class TokenControl{
|
|||||||
else if (onClick == 2){ //Open character sheet
|
else if (onClick == 2){ //Open character sheet
|
||||||
token.actor.sheet.render(true);
|
token.actor.sheet.render(true);
|
||||||
}
|
}
|
||||||
else { //Open token config
|
else if (onClick == 3) { //Open token config
|
||||||
token.sheet._render(true);
|
token.sheet._render(true);
|
||||||
}
|
}
|
||||||
|
else if (onClick == 4) { //Toggle visibility
|
||||||
|
token.toggleVisibility();
|
||||||
|
}
|
||||||
|
else if (onClick == 5) { //Toggle combat state
|
||||||
|
token.toggleCombat();
|
||||||
|
}
|
||||||
|
else if (onClick == 6) { //Target token
|
||||||
|
token.setTarget(!token.isTargeted,{releaseOthers:false});
|
||||||
|
}
|
||||||
|
else if (onClick == 7) { //Toggle condition
|
||||||
|
let condition = settings.condition;
|
||||||
|
if (condition == undefined) condition = 0;
|
||||||
|
|
||||||
|
if (condition == 0){
|
||||||
|
const effects = token.actor.effects.entries;
|
||||||
|
for (let i=0; i<effects.length; i++){
|
||||||
|
const effect = CONFIG.statusEffects.find(e => e.icon === effects[i].data.icon);
|
||||||
|
await token.toggleEffect(effect)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const effect = CONFIG.statusEffects.find(e => e.id === this.getStatusId(condition));
|
||||||
|
token.toggleEffect(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getStatusId(nr){
|
||||||
|
let id;
|
||||||
|
if (nr == 1) id = 'dead';
|
||||||
|
else if (nr == 2) id = 'unconscious';
|
||||||
|
else if (nr == 3) id = 'sleep';
|
||||||
|
else if (nr == 4) id = 'stun';
|
||||||
|
else if (nr == 5) id = 'prone';
|
||||||
|
else if (nr == 6) id = 'restrain';
|
||||||
|
else if (nr == 7) id = 'paralysis';
|
||||||
|
else if (nr == 8) id = 'fly';
|
||||||
|
else if (nr == 9) id = 'bind';
|
||||||
|
else if (nr == 10) id = 'deaf';
|
||||||
|
else if (nr == 11) id = 'silence';
|
||||||
|
else if (nr == 12) id = 'fear';
|
||||||
|
else if (nr == 13) id = 'burning';
|
||||||
|
else if (nr == 14) id = 'frozen';
|
||||||
|
else if (nr == 15) id = 'shock';
|
||||||
|
else if (nr == 16) id = 'corrode';
|
||||||
|
else if (nr == 17) id = 'bleeding';
|
||||||
|
else if (nr == 18) id = 'disease';
|
||||||
|
else if (nr == 19) id = 'poison';
|
||||||
|
else if (nr == 20) id = 'radiation';
|
||||||
|
else if (nr == 21) id = 'regen';
|
||||||
|
else if (nr == 22) id = 'degen';
|
||||||
|
else if (nr == 23) id = 'upgrade';
|
||||||
|
else if (nr == 24) id = 'downgrade';
|
||||||
|
else if (nr == 25) id = 'target';
|
||||||
|
else if (nr == 26) id = 'eye';
|
||||||
|
else if (nr == 27) id = 'curse';
|
||||||
|
else if (nr == 28) id = 'bless';
|
||||||
|
else if (nr == 29) id = 'fireShield';
|
||||||
|
else if (nr == 30) id = 'coldShield';
|
||||||
|
else if (nr == 31) id = 'magicShield';
|
||||||
|
else if (nr == 32) id = 'holyShield';
|
||||||
|
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,12 +13,12 @@
|
|||||||
{{#each this.dataThis}}
|
{{#each this.dataThis}}
|
||||||
<div class="boxed" style="padding: 5px; margin:2px">
|
<div class="boxed" style="padding: 5px; margin:2px">
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
{{localize "MaterialDeck.Macro.Macro"}} {{this.iteration}}
|
{{localize "MaterialDeck.Macro"}} {{this.iteration}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<select name="macros" class="macros-select" default="" style="max-width:140px;">
|
<select name="macros" class="macros-select" default="" style="max-width:140px;">
|
||||||
{{#select this.macro}}
|
{{#select this.macro}}
|
||||||
<option value="">{{localize "MaterialDeck.Playlist.None"}}</option>
|
<option value="">{{localize "MaterialDeck.None"}}</option>
|
||||||
{{#each macros}}
|
{{#each macros}}
|
||||||
<option value="{{this._id}}">{{this.name}}</option>
|
<option value="{{this._id}}">{{this.name}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -26,12 +26,12 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
{{#if this.furnace}}
|
{{#if this.furnace}}
|
||||||
<label>{{localize "MaterialDeck.Macro.FurnaceArgs"}}</label>
|
<label>{{localize "MaterialDeck.FurnaceArgs"}}</label>
|
||||||
<input type="text" name="args" value="{{this.args}}">
|
<input type="text" name="args" value="{{this.args}}">
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<div class="flex-container" style="display:flex;flex-direction:row;padding-top:10px">
|
<div class="flex-container" style="display:flex;flex-direction:row;padding-top:10px">
|
||||||
<label style="flex:1">{{localize "MaterialDeck.Macro.Background"}}</label>
|
<label style="flex:1">{{localize "MaterialDeck.Background"}}</label>
|
||||||
<input style="flex:1" type="color" name="colorPicker" data-dtype="String" value="{{this.color}}">
|
<input style="flex:1" type="color" name="colorPicker" data-dtype="String" value="{{this.color}}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<button type="submit" name="submit">
|
<button type="submit" name="submit">
|
||||||
<i class="far fa-save"></i> {{localize "MaterialDeck.Playlist.Save"}}
|
<i class="far fa-save"></i> {{localize "MaterialDeck.Save"}}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
@@ -1,26 +1,26 @@
|
|||||||
<form autocomplete="off" onsubmit="event.preventDefault()">
|
<form autocomplete="off" onsubmit="event.preventDefault()">
|
||||||
<div >
|
<div >
|
||||||
<h2>{{localize "MaterialDeck.Playlist.Playmethod.Header"}}</h2>
|
<h2>{{localize "MaterialDeck.PL.Header"}}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>{{localize "MaterialDeck.Playlist.Playmethod.Label"}}</label>
|
<label>{{localize "MaterialDeck.PL.Label"}}</label>
|
||||||
<select name="playMethod" class="playMethod" default="">
|
<select name="playMethod" class="playMethod" default="">
|
||||||
{{#select playMethod}}
|
{{#select playMethod}}
|
||||||
<option value="0">{{localize "MaterialDeck.Playlist.Playmethod.Unrestricted"}}</option>
|
<option value="0">{{localize "MaterialDeck.PL.Unrestricted"}}</option>
|
||||||
<option value="1">{{localize "MaterialDeck.Playlist.Playmethod.OneTrackPlaylist"}}</option>
|
<option value="1">{{localize "MaterialDeck.PL.OneTrackPlaylist"}}</option>
|
||||||
<option value="2">{{localize "MaterialDeck.Playlist.Playmethod.OneTrackTotal"}}</option>
|
<option value="2">{{localize "MaterialDeck.PL.OneTrackTotal"}}</option>
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2>{{localize "MaterialDeck.Playlist.Playlists"}}</h2>
|
<h2>{{localize "MaterialDeck.Playlists"}}</h2>
|
||||||
</div>
|
</div>
|
||||||
{{#each playlistData}}
|
{{#each playlistData}}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>{{localize "MaterialDeck.Playlist.Playlist"}} {{this.iteration}}</label>
|
<label>{{localize "MaterialDeck.Playlist"}} {{this.iteration}}</label>
|
||||||
<select name="selectedPlaylist" class="playlist-select" default="">
|
<select name="selectedPlaylist" class="playlist-select" default="">
|
||||||
{{#select this.playlist}}
|
{{#select this.playlist}}
|
||||||
<option value="">{{localize "MaterialDeck.Playlist.None"}}</option>
|
<option value="">{{localize "MaterialDeck.None"}}</option>
|
||||||
{{#each this.playlists}}
|
{{#each this.playlists}}
|
||||||
<option value="{{this._id}}">{{this.name}}</option>
|
<option value="{{this._id}}">{{this.name}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
||||||
<button type="submit" name="submit">
|
<button type="submit" name="submit">
|
||||||
<i class="far fa-save"></i> {{localize "MaterialDeck.Playlist.Save"}}
|
<i class="far fa-save"></i> {{localize "MaterialDeck.Save"}}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
@@ -8,10 +8,10 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>{{localize "MaterialDeck.Playlist.Playlist"}} </label>
|
<label>{{localize "MaterialDeck.Playlist"}} </label>
|
||||||
<select name="playlist" class="playlist-select" default="" style="max-width:200px;">
|
<select name="playlist" class="playlist-select" default="" style="max-width:200px;">
|
||||||
{{#select playlist}}
|
{{#select playlist}}
|
||||||
<option value="">{{localize "MaterialDeck.Playlist.None"}}</option>
|
<option value="">{{localize "MaterialDeck.None"}}</option>
|
||||||
{{#each playlists}}
|
{{#each playlists}}
|
||||||
<option value="{{this._id}}">{{this.name}}</option>
|
<option value="{{this._id}}">{{this.name}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -23,19 +23,19 @@
|
|||||||
{{#each this.dataThis}}
|
{{#each this.dataThis}}
|
||||||
<div class="boxed" style="padding: 5px; margin:2px">
|
<div class="boxed" style="padding: 5px; margin:2px">
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
{{localize "MaterialDeck.Soundboard.Sound"}} {{this.iteration}}
|
{{localize "MaterialDeck.Sound"}} {{this.iteration}}
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
{{localize "MaterialDeck.Name"}}
|
{{localize "MaterialDeck.Name"}}
|
||||||
</div>
|
</div>
|
||||||
<input type="text" name="name" value="{{this.name}}">
|
<input type="text" name="name" value="{{this.name}}">
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
{{localize "MaterialDeck.Soundboard.Sound"}}
|
{{localize "MaterialDeck.Sound"}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<select name="sounds" class="sounds-select" default="" style="width:132px;" id="soundSelect{{this.iteration}}">
|
<select name="sounds" class="sounds-select" default="" style="width:132px;" id="soundSelect{{this.iteration}}">
|
||||||
{{#select this.sound}}
|
{{#select this.sound}}
|
||||||
<option value="">{{localize "MaterialDeck.Playlist.None"}}</option>
|
<option value="">{{localize "MaterialDeck.None"}}</option>
|
||||||
{{#each sounds}}
|
{{#each sounds}}
|
||||||
<option value="{{this._id}}">{{this.name}}</option>
|
<option value="{{this._id}}">{{this.name}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
{{localize "MaterialDeck.Soundboard.Icon"}}
|
{{localize "MaterialDeck.Icon"}}
|
||||||
</div>
|
</div>
|
||||||
<div class="form-fields">
|
<div class="form-fields">
|
||||||
<button type="button" class="file-picker" data-type="image" data-target="img{{this.iteration}}" title="Browse Files" tabindex="-1">
|
<button type="button" class="file-picker" data-type="image" data-target="img{{this.iteration}}" title="Browse Files" tabindex="-1">
|
||||||
@@ -52,24 +52,24 @@
|
|||||||
<input class="image" type="text" name="img{{this.iteration}}" id="imgPath{{this.iteration}}" placeholder="path/image.png" value={{this.imgPath}}>
|
<input class="image" type="text" name="img{{this.iteration}}" id="imgPath{{this.iteration}}" placeholder="path/image.png" value={{this.imgPath}}>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-container" style="display:flex;flex-direction:row;padding-top:5px">
|
<div class="flex-container" style="display:flex;flex-direction:row;padding-top:5px">
|
||||||
<label style="flex:1">{{localize "MaterialDeck.Soundboard.On"}} </label>
|
<label style="flex:1">{{localize "MaterialDeck.On"}} </label>
|
||||||
<input style="flex:1" type="color" id="colorOn{{this.iteration}}" name="colorOn" style="flex:4" data-dtype="String" value="{{this.colorOn}}">
|
<input style="flex:1" type="color" id="colorOn{{this.iteration}}" name="colorOn" style="flex:4" data-dtype="String" value="{{this.colorOn}}">
|
||||||
<label style="flex:1"> {{localize "MaterialDeck.Soundboard.Off"}} </label>
|
<label style="flex:1"> {{localize "MaterialDeck.Off"}} </label>
|
||||||
<input style="flex:1" type="color" id="colorOff{{this.iteration}}" name="colorOff" style="flex:4" data-dtype="String" value="{{this.colorOff}}">
|
<input style="flex:1" type="color" id="colorOff{{this.iteration}}" name="colorOff" style="flex:4" data-dtype="String" value="{{this.colorOff}}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group options">
|
<div class="form-group options">
|
||||||
<label>{{localize "MaterialDeck.Soundboard.Playback"}}</label>
|
<label>{{localize "MaterialDeck.Playback"}}</label>
|
||||||
<select name="mode" style="flex:1">
|
<select name="mode" style="flex:1">
|
||||||
{{#select this.mode}}
|
{{#select this.mode}}
|
||||||
<option value="0">{{localize "MaterialDeck.Soundboard.Once"}}</option>
|
<option value="0">{{localize "MaterialDeck.Once"}}</option>
|
||||||
<option value="1">{{localize "MaterialDeck.Soundboard.Repeat"}}</option>
|
<option value="1">{{localize "MaterialDeck.Repeat"}}</option>
|
||||||
<option value="2">{{localize "MaterialDeck.Soundboard.Hold"}}</option>
|
<option value="2">{{localize "MaterialDeck.Hold"}}</option>
|
||||||
{{/select}}
|
{{/select}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group options">
|
<div class="form-group options">
|
||||||
<label>{{localize "MaterialDeck.Soundboard.Volume"}}</label>
|
<label>{{localize "MaterialDeck.Volume"}}</label>
|
||||||
<input type="range" min="0" max="100" value={{this.volume}} class="slider" name="volume" id="volume{{this.iteration}}">
|
<input type="range" min="0" max="100" value={{this.volume}} class="slider" name="volume" id="volume{{this.iteration}}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<button type="submit" name="submit">
|
<button type="submit" name="submit">
|
||||||
<i class="far fa-save"></i> {{localize "MaterialDeck.Playlist.Save"}}
|
<i class="far fa-save"></i> {{localize "MaterialDeck.Save"}}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
Reference in New Issue
Block a user