Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/numbered presentations #38

Merged
merged 5 commits into from
Jan 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion companion/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "presentationtools-aps",
"shortname": "aps",
"description": "Module to control Auto Presentation Switcher",
"version": "2.5.0",
"version": "2.6.0",
"license": "MIT",
"repository": "git+https://github.com/bitfocus/companion-module-presentationtools-aps.git",
"bugs": "https://github.com/bitfocus/companion-module-presentationtools-aps/issues",
Expand Down
36 changes: 30 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class APSInstance extends InstanceBase {
}
this.watchedMediaFolderState = {
name: null,
filesList: [],
originalFilesList: [], // Will save the original here (in case numbered-only sorting used)
filesList: [], // This will be modified if numbered-only sorting used
filesState: {}
}
this.mediaPlayerState = {
Expand All @@ -71,6 +72,11 @@ class APSInstance extends InstanceBase {
}

async init(config) {

if(!config.sort){
config.sort = 'normal'
}

this.configUpdated(config)
}

Expand Down Expand Up @@ -221,16 +227,15 @@ class APSInstance extends InstanceBase {
states.updatePresentationFolderStates(self.presentationFolderStates, jsonData.data)
self.checkFeedbacks('presentation_folder_exist')
} else if (jsonData.action === 'watched_presentation_folder') {
states.updateWatchedPresentationFolderState(self.watchedPresentationFolderState, jsonData.data)
states.updateWatchedPresentationFolderState(self.watchedPresentationFolderState, jsonData.data, self.config.sort == 'numberedonly')
self.variables(true)
self.actions()
self.feedbacks()
self.presets()
self.setPresentationFolderFilesVariables()
states.updatePresentationFileExistanceStates(self.watchedPresentationFolderState)
self.checkFeedbacks('presentation_file_exist', 'presentation_folder_watched', 'presentation_file_selected')
} else if (jsonData.action === 'opened_folder_presentation') {
states.updatePresentationFileOpenStates(self.watchedPresentationFolderState, jsonData.data.current_opened_file_index)
states.updatePresentationFileOpenStates(self.watchedPresentationFolderState, jsonData.data.current_opened_file_index, self.config.sort == 'numberedonly')
self.checkFeedbacks('presentation_file_displayed')
}

Expand All @@ -240,7 +245,6 @@ class APSInstance extends InstanceBase {
states.updateMediaFolderStates(self.mediaFolderStates, jsonData.data)
self.checkFeedbacks('media_folder_exist')
} else if (jsonData.action === 'watched_media_folder') {
self.log('debug', JSON.stringify(jsonData.data))
states.updateWatchedMediaFolderState(self.watchedMediaFolderState, jsonData.data)
self.variables(true)
self.actions()
Expand Down Expand Up @@ -300,9 +304,29 @@ class APSInstance extends InstanceBase {
type: 'static-text',
id: 'info-defaultport',
width: 12,
label:
value:
'Check that the port in APS matches the target port shown here. To change the default port in APS, go to “Settings” in the app interface. Note that for earlier versions of APS, (2.2 and below) the default port is 4778. We recommend using port 31600 for connection. If this port is not available, try something else in the same range.',
},
{
type: 'dropdown',
id: 'sort',
label: 'Presentation watched folder: Sorting method',
default: 'normal',
width: 8,
choices: [
{id: "normal", label: "Normal"},
{id: "numberedonly", label: "Numbered only"},
]
},
{
type: 'static-text',
id: 'info-sort',
width: 12,
value:
'<b>Normal:</b> All presentation-files in the folder are shown in alphabetical order.<br/>' +
'<b>Numbered only:</b> Only presentation filenames starting with numbers are shown, and always put in the folder-position with the same number. Example: «4.john.pptx» will go to position 4, also when its the first presentation alphabetically in the folder.<br/><br/>' +
'Please note: You need to restart the Companion-module after making changes to these settings.',
},
]
}

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "presentationtools-aps",
"version": "2.5.0",
"version": "2.6.0",
"main": "index.js",
"prettier": "@companion-module/tools/.prettierrc.json",
"scripts": {
Expand Down
119 changes: 93 additions & 26 deletions states.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const {
minNumberOfMediaFolderFiles,
numberOfMediaFolders } = require('./constants')
var choices = require('./choices')
var utils = require('./utils')
exports.generateCaptureStates = function () {
var cchoices = choices.getChoicesForCapture()
var states = new Object()
Expand Down Expand Up @@ -144,24 +145,51 @@ exports.updatePresentationFolderStates = function (states, data) {
states[si].exists = data.exists[i - 1]
}
}
exports.updatePresentationFileExistanceStates = function (states) {
exports.updatePresentationFileOpenStates = function (states, openedFileIndex, useNumberedSystem = false) {
let filesState = states.filesState
let numberOfFiles = states.filesList.length
for (var i = Math.max(minNumberOfPresentationFolderFiles, numberOfFiles); i > 0; i--) {
const si = 'File' + i
filesState[si].exists = false
if(i <= numberOfFiles)
filesState[si].exists = true
if (!useNumberedSystem) {
for (var i = Math.max(minNumberOfPresentationFolderFiles, numberOfFiles); i > 0; i--) {
const si = 'File' + i
filesState[si].opened = false
if(i == openedFileIndex + 1)
filesState[si].opened = true
}
}
}
exports.updatePresentationFileOpenStates = function (states, openedFileIndex) {
let filesState = states.filesState
let numberOfFiles = states.filesList.length
for (var i = Math.max(minNumberOfPresentationFolderFiles, numberOfFiles); i > 0; i--) {
const si = 'File' + i
filesState[si].opened = false
if(i == openedFileIndex + 1)
filesState[si].opened = true
else{
const numberedFiles = new Map();

states.filesList.forEach(file => {
let fileName = utils.getNameFromPath(file)
const match = fileName.match(/^(\d+)/);
if (match) {
const slotNumber = parseInt(match[1], 10);
if (!numberedFiles.has(slotNumber)) {
numberedFiles.set(slotNumber, file);
}
}
});


for (var i = Math.max(minNumberOfPresentationFolderFiles, numberOfFiles); i > 0; i--) {
const si = 'File' + i;
if (filesState.hasOwnProperty(si)) {
filesState[si].opened = false;
}
}



if(openedFileIndex >= 0){
let openedFilePath = states.originalFilesList[openedFileIndex]
numberedFiles.forEach((filePath, slotNumber) => {
if(openedFilePath == filePath){
const si = 'File' + slotNumber;
states.filesState[si].opened = true
}
});
}

}
}
exports.updateMediaFolderStates = function (states, data) {
Expand Down Expand Up @@ -190,18 +218,57 @@ exports.updateFolderCaptureStates = function (states, index) {
}
}
}
exports.updateWatchedPresentationFolderState = function (states, data) {
states.name = data.name
states.number = data.number
states.filesList = data.files_list
exports.updateWatchedPresentationFolderState = function (states, data, useNumberedSystem = false) {
states.name = data.name
states.number = data.number
states.originalFilesList = data.files_list;
if (!useNumberedSystem) {
states.filesList = data.files_list

let numberOfFiles = states.filesList.length
for (var i = Math.max(minNumberOfPresentationFolderFiles, numberOfFiles); i > 0; i--) {
const si = 'File' + i
states.filesState[si] = new Object()
states.filesState[si].opened = false
states.filesState[si].exists = false
}
let numberOfFiles = states.filesList.length
for (var i = Math.max(minNumberOfPresentationFolderFiles, numberOfFiles); i > 0; i--) {
const si = 'File' + i
states.filesState[si] = new Object()
states.filesState[si].opened = false
states.filesState[si].exists = false

if(i <= numberOfFiles)
states.filesState[si].exists = true
}
} else {
let maxFileNumberPrefix = 0;
const numberedFiles = new Map();

data.files_list.forEach(file => {
let fileName = utils.getNameFromPath(file)
const match = fileName.match(/^(\d+)/);
if (match) {
const slotNumber = parseInt(match[1], 10);
maxFileNumberPrefix = Math.max(maxFileNumberPrefix, slotNumber);
if (!numberedFiles.has(slotNumber)) {
numberedFiles.set(slotNumber, file);
}
}
});

for (let i = 1; i <= Math.max(minNumberOfPresentationFolderFiles, maxFileNumberPrefix); i++) {
const si = 'File' + i;
states.filesState[si] = {
opened: false,
exists: false
};
}

states.filesList = new Array(Math.max(minNumberOfPresentationFolderFiles, maxFileNumberPrefix)).fill('');
numberedFiles.forEach((filename, slotNumber) => {
states.filesList[slotNumber - 1] = filename;
const si = 'File' + slotNumber;
states.filesState[si] = {
exists: true
};

});
}
}
exports.updateWatchedMediaFolderState = function (states, data) {
states.name = data.name
Expand Down
Loading