Compare commits

..

17 Commits

Author SHA1 Message Date
jwetzell 071b7d0871 Merge pull request #224 from stagehacks/dependabot/npm_and_yarn/electron/notarize-2.3.2
Bump @electron/notarize from 2.3.0 to 2.3.2
2024-05-25 18:36:47 -05:00
dependabot[bot] f33229c5b0 Bump @electron/notarize from 2.3.0 to 2.3.2
Bumps [@electron/notarize](https://github.com/electron/notarize) from 2.3.0 to 2.3.2.
- [Release notes](https://github.com/electron/notarize/releases)
- [Changelog](https://github.com/electron/notarize/blob/main/.releaserc.json)
- [Commits](https://github.com/electron/notarize/compare/v2.3.0...v2.3.2)

---
updated-dependencies:
- dependency-name: "@electron/notarize"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-25 23:36:17 +00:00
jwetzell eef0f5859d Merge pull request #225 from stagehacks/dependabot/npm_and_yarn/electron-30.0.6
Bump electron from 29.1.0 to 30.0.6
2024-05-25 18:35:24 -05:00
jwetzell b3f268d2a5 notarize script is not needed anymore 2024-05-25 18:35:04 -05:00
jwetzell 8e9f2c7c56 add another release notes category 2024-05-25 18:30:54 -05:00
jwetzell 826b8d4fb0 Merge pull request #187 from stagehacks/feat/toggle-sidebar
Add ability to toggle sidebar
2024-05-25 18:24:55 -05:00
dependabot[bot] 42abbdef33 Bump electron from 29.1.0 to 30.0.6
Bumps [electron](https://github.com/electron/electron) from 29.1.0 to 30.0.6.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v29.1.0...v30.0.6)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-20 09:05:51 +00:00
jwetzell c93b56d263 add release yaml 2024-04-07 14:17:04 -05:00
jwetzell 0ff27fe5ec Merge pull request #213 from stagehacks/dependabot/github_actions/actions/checkout-4
Bump actions/checkout from 3 to 4
2024-04-07 14:10:53 -05:00
dependabot[bot] d29e7702df Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-07 19:10:48 +00:00
jwetzell b65823baad Merge pull request #214 from stagehacks/dependabot/github_actions/actions/setup-node-4
Bump actions/setup-node from 3 to 4
2024-04-07 14:10:16 -05:00
dependabot[bot] 60513b93b8 Bump actions/setup-node from 3 to 4
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-07 19:09:46 +00:00
jwetzell c199328e92 add dependabot config for github actions 2024-04-07 14:09:18 -05:00
jwetzell fcaa955868 update to node 20 2024-04-07 14:03:17 -05:00
jwetzell 8eb8c44a81 add team id to fix mac builds 2024-04-07 14:02:25 -05:00
jwetzell cdf1cf2b01 fix bad property name 2024-04-05 21:26:18 -05:00
jwetzell e85dd8f248 add option in menu to toggle sidebar 2024-01-15 16:13:01 -06:00
18 changed files with 72 additions and 376 deletions
+7 -3
View File
@@ -1,6 +1,10 @@
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
- package-ecosystem: 'npm'
directory: '/'
schedule:
interval: "weekly"
interval: 'weekly'
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'
+14
View File
@@ -0,0 +1,14 @@
changelog:
exclude:
authors:
- dependabot
categories:
- title: Plugins 🖥️
labels:
- plugin
- title: Interface
labels:
- interface
- title: Other Changes
labels:
- '*'
+9 -9
View File
@@ -9,20 +9,20 @@ jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run release
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run release
@@ -34,10 +34,10 @@ jobs:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run release
+1 -1
View File
@@ -1 +1 @@
v18.13.0
v20.12.1
+8 -1
View File
@@ -38,6 +38,13 @@ const menuTemplate = [
label: 'View',
submenu: [
{ role: 'togglefullscreen' },
{
label: 'Toggle Sidebar',
id: 'toggleSidebar',
click(menuItem, window, event) {
mainWindow.webContents.send('toggleSidebar');
},
},
{ type: 'separator' },
{
label: 'Arrangement 1',
@@ -144,7 +151,7 @@ const menuTemplate = [
const windowMac = {
width: 1500,
height: 900,
titleBarStyle: 'hiddenInset',
titleBarStyle: 'customButtonsOnHover',
transparent: false,
frame: false,
show: false,
-44
View File
@@ -1,44 +0,0 @@
const notarize = require('@electron/notarize');
const fs = require('fs');
const path = require('path');
module.exports = async function (params) {
if (process.platform !== 'darwin') {
console.log('Only need to notarize MacOS, skipping');
return;
}
const appId = 'com.stagehacks.cueview';
const appPath = path.join(
params.appOutDir,
`${params.packager.appInfo.productFilename}.app`
);
if (!fs.existsSync(appPath)) {
console.error('App file not found skipping notarization.');
return;
}
if (
process.env.APPLE_ID === undefined ||
process.env.APPLE_ID_PASSWORD === undefined
) {
console.log('Apple ID and Password must be set in order to notarize.');
return;
}
try {
console.log(`Notarizing ${appId} found at ${appPath}`);
await notarize.notarize({
appBundleId: appId,
appPath,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_ID_PASSWORD,
});
console.log(`Done notarizing ${appId}`);
} catch (error) {
console.log('There was an error notarizing.');
console.error(error);
}
};
+14 -14
View File
@@ -20,8 +20,8 @@
"uuid": "^9.0.1"
},
"devDependencies": {
"@electron/notarize": "^2.3.0",
"electron": "^29.1.0",
"@electron/notarize": "^2.3.2",
"electron": "^30.0.6",
"electron-builder": "^24.13.3",
"eslint": "^8.57.0",
"eslint-config-airbnb-base": "^15.0.0",
@@ -127,9 +127,9 @@
}
},
"node_modules/@electron/notarize": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.0.tgz",
"integrity": "sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz",
"integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==",
"dev": true,
"dependencies": {
"debug": "^4.1.1",
@@ -2175,9 +2175,9 @@
}
},
"node_modules/electron": {
"version": "29.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-29.1.0.tgz",
"integrity": "sha512-giJVIm0sWVp+8V1GXrKqKTb+h7no0P3ooYqEd34AD9wMJzGnAeL+usj+R0155/0pdvvP1mgydnA7lcaFA2M9lw==",
"version": "30.0.6",
"resolved": "https://registry.npmjs.org/electron/-/electron-30.0.6.tgz",
"integrity": "sha512-PkhEPFdpYcTzjAO3gMHZ+map7g2+xCrMDedo/L1i0ir2BRXvAB93IkTJX497U6Srb/09r2cFt+k20VPNVCdw3Q==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
@@ -6116,9 +6116,9 @@
}
},
"@electron/notarize": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.0.tgz",
"integrity": "sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz",
"integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==",
"dev": true,
"requires": {
"debug": "^4.1.1",
@@ -7647,9 +7647,9 @@
}
},
"electron": {
"version": "29.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-29.1.0.tgz",
"integrity": "sha512-giJVIm0sWVp+8V1GXrKqKTb+h7no0P3ooYqEd34AD9wMJzGnAeL+usj+R0155/0pdvvP1mgydnA7lcaFA2M9lw==",
"version": "30.0.6",
"resolved": "https://registry.npmjs.org/electron/-/electron-30.0.6.tgz",
"integrity": "sha512-PkhEPFdpYcTzjAO3gMHZ+map7g2+xCrMDedo/L1i0ir2BRXvAB93IkTJX497U6Srb/09r2cFt+k20VPNVCdw3Q==",
"dev": true,
"requires": {
"@electron/get": "^2.0.0",
+5 -2
View File
@@ -20,8 +20,8 @@
"homepage": "https://github.com/stagehacks/Cue-View",
"repository": "https://github.com/stagehacks/Cue-View",
"devDependencies": {
"@electron/notarize": "^2.3.0",
"electron": "^29.1.0",
"@electron/notarize": "^2.3.2",
"electron": "^30.0.6",
"electron-builder": "^24.13.3",
"eslint": "^8.57.0",
"eslint-config-airbnb-base": "^15.0.0",
@@ -48,6 +48,9 @@
"category": "Utilities",
"icon": "src/assets/img/icon.icns",
"hardenedRuntime": true,
"notarize": {
"teamId": "JHA7H7P56J"
},
"electronLanguages": [
"en"
],
+1 -1
View File
@@ -6,7 +6,7 @@ exports.config = {
defaultName: 'ATEM',
connectionType: 'atem',
defaultPort: 9910,
mayChangePort: false,
mayChangePorts: false,
searchOptions: {
type: 'UDPScan',
searchBuffer: Buffer.from([
+1 -1
View File
@@ -7,7 +7,7 @@ exports.config = {
defaultName: 'ETC Eos',
connectionType: 'osc',
defaultPort: 3037,
mayChangePort: true,
mayChangePorts: true,
heartbeatInterval: 5000,
heartbeatTimeout: 6000,
searchOptions: {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 B

-6
View File
@@ -1,6 +0,0 @@
<h3>Connection Requirements</h3>
<ul>
<li>Remote App must be set to OSC App under Remote App Interface settings</li>
<li>Network Protocol must be set to TCP under Remote App Interface settings</li>
<li>OSC Version must be set to 1.1 under Remote App Interface settings</li>
</ul>
-242
View File
@@ -1,242 +0,0 @@
exports.config = {
defaultName: 'Show Cue Systems',
connectionType: 'osc',
defaultPort: 58100,
mayChangePorts: true,
heartbeatInterval: 5000,
searchOptions: {
type: 'TCPport',
searchBuffer: Buffer.from('/status', 'ascii'),
testPort: 58100,
validateResponse(msg, info) {
return msg.toString().includes('/status');
},
},
fields: [],
};
const typeMap = {
A: 'Video/Image',
E: 'Memo',
F: 'Audio File',
G: 'GoTo Cue',
H: 'Multi-File Cue',
I: 'Live Input',
J: 'Enable/Disable',
K: 'Lighting',
L: 'Level Change',
M: 'Control Send',
N: 'Note',
P: 'Playlist',
Q: 'Call Cue',
R: 'Run Program',
S: 'SFR',
T: 'Set Position',
U: 'MIDI Time Code',
};
const versionMap = {
10: 'LITE',
20: 'STD',
30: 'PRO',
40: 'PLUS',
45: 'DEMO',
50: 'PLAT',
};
const activationMap = {
man: 'Manual',
'm+c': 'Manual w/ Confirmation',
auto: 'Auto-start',
'a+c': 'Auto-start w/ Confirmation',
callq: 'Call Cue',
hot: 'Hotkey (Trigger)',
hktg: 'Hotkey (Toggle)',
hknt: 'Hotkey (Note)',
time: 'Time-Based',
ext: 'External (Trigger)',
extg: 'External (Toggle)',
exnt: 'External (Note)',
mtc: 'MIDI Time Code',
ocm: 'On Cue Marker',
};
const stateMap = {
0: 'Ready',
1: 'Playing',
2: 'Paused',
3: 'Completed',
};
exports.ready = function ready(_device) {
const device = _device;
device.data.cues = [];
device.data.initialized = false;
device.send('/prod/gettitle');
};
exports.data = function data(_device, oscData) {
const device = _device;
this.deviceInfoUpdate(device, 'status', 'ok');
const messagePath = oscData.address;
if (messagePath === '/prod/gettitle') {
const title = oscData.args[0].replaceAll('"', '').trim();
this.deviceInfoUpdate(device, 'defaultName', title);
device.send('/info/scsversion');
} else if (messagePath === '/info/scsversion') {
const versionInfo = oscData.args;
const versionNumber = versionInfo[0].toString();
const versionMajor = versionNumber.substring(0, 2).replace('0', '');
const versionMinor = versionNumber.substring(2, 4).replace('0', '');
const versionPatch = versionNumber.substring(4, 6).replace('0', '');
const versionString = `${versionMajor}.${versionMinor}.${versionPatch}`;
const versionType = versionMap[versionInfo[1]];
device.data.version = {
number: versionString,
type: versionType,
};
device.send('/info/finalcue');
} else if (messagePath === '/info/finalcue') {
const cueCount = oscData.args[0];
if (cueCount !== device.data.cues.length) {
device.data.initialized = false;
device.data.cues = new Array(cueCount).fill(0).map(() => ({
label: '',
page: '',
description: '',
type: { code: '', display: '' },
state: '',
activation: { code: '', display: '' },
file_info: '',
length: '',
colors: ['', ''],
}));
device.send('/cue/getitemsn', [
{ type: 'i', value: 1 },
{ type: 's', value: 'QNTCLSPARZ' },
]);
}
} else if (messagePath === '/info/getcue') {
const cueLabelInfo = oscData.args;
const cueNumber = cueLabelInfo[0];
const cueLabel = cueLabelInfo[1].replaceAll('"', '');
device.data.cues[cueNumber - 1].label = cueLabel;
device.draw();
} else if (messagePath === '/cue/getpage') {
const pageInfo = oscData.args;
const cueLabel = pageInfo[0].replaceAll('"', '');
const cueIndex = device.data.cues.map((cue) => cue.label).indexOf(cueLabel);
device.data.cues[cueIndex].page = pageInfo[1].replaceAll('"', '');
if (cueIndex < device.data.cues.length - 1) {
device.send('/cue/getpage', [{ type: 's', value: device.data.cues[cueIndex + 1].label }]);
} else {
device.draw();
device.data.initialized = true;
device.send('/status');
}
} else if (messagePath === '/cue/getname') {
const nameInfo = oscData.args;
const cueLabel = nameInfo[0].replaceAll('"', '');
const cueIndex = device.data.cues.map((cue) => cue.label).indexOf(cueLabel);
device.data.cues[cueIndex].description = nameInfo[1].replaceAll('"', '');
device.draw();
} else if (messagePath === '/cue/gettype') {
const typeInfo = oscData.args;
const cueLabel = typeInfo[0].replaceAll('"', '');
const cueIndex = device.data.cues.map((cue) => cue.label).indexOf(cueLabel);
device.data.cues[cueIndex].type = {
code: typeInfo[1].replaceAll('"', ''),
display: typeMap[typeInfo[1].replaceAll('"', '')],
};
device.draw();
} else if (messagePath === '/cue/getitemsn') {
const itemParts = oscData.args;
if (itemParts.length === 12) {
const cueIndex = itemParts[0] - 1;
device.data.cues[cueIndex].label = itemParts[2];
device.data.cues[cueIndex].description = itemParts[3];
device.data.cues[cueIndex].type = {
code: itemParts[4],
display: typeMap[itemParts[4]],
};
device.data.cues[cueIndex].colors = itemParts[5].split(', ');
device.data.cues[cueIndex].length = millisToString(itemParts[6]);
device.data.cues[cueIndex].state = stateMap[itemParts[7]];
device.data.cues[cueIndex].position = itemParts[8];
device.data.cues[cueIndex].activation = {
code: itemParts[9],
display: activationMap[itemParts[9]],
};
device.data.cues[cueIndex].repeat = itemParts[10];
device.data.cues[cueIndex].loop = itemParts[11];
device.draw();
if (!device.data.initialized) {
if (cueIndex < device.data.cues.length - 1) {
device.send('/cue/getitemsn', [
{ type: 'i', value: cueIndex + 2 },
{ type: 's', value: 'QNTCLSPARZ' },
]);
} else {
device.send('/cue/getpage', [{ type: 's', value: device.data.cues[0].label }]);
}
}
} else {
console.error('bad response from getitems');
}
} else if (messagePath === '/cue/statechange') {
const cueLabel = oscData.args[0];
const cueIndex = device.data.cues.map((cue) => cue.label).indexOf(cueLabel);
if (cueIndex !== undefined) {
device.data.cues[cueIndex].state = stateMap[oscData.args[1]];
device.draw();
device.send('/cue/getitemsn', [
{ type: 'i', value: cueIndex + 1 },
{ type: 's', value: 'QNTCLSPARZ' },
]);
}
} else if (messagePath === '/status') {
// const status = oscData.args[0];
device.send('/info/currcue');
} else if (messagePath === '/connected') {
device.send('/prod/gettitle');
} else if (messagePath === '/info/currcue') {
device.data.currentCue = oscData.args[0];
device.draw();
} else if (messagePath === '/info/nextcue') {
device.data.nextCue = oscData.args[0];
device.draw();
device.data.initialized = false;
device.send('/cue/getitemsn', [
{ type: 'i', value: 1 },
{ type: 's', value: 'QNTCLSPARZ' },
]);
} else {
console.error(`unhandled message path: ${messagePath}`);
}
};
function millisToString(duration) {
const milliseconds = parseInt(duration % 1000, 10);
let seconds = parseInt((duration / 1000) % 60, 10);
const minutes = parseInt((duration / (1000 * 60)) % 60, 10);
if (minutes === 0) {
return `${seconds}.${milliseconds}`;
}
if (seconds === 0) {
return `0.${milliseconds}`;
}
if (seconds < 10) {
seconds = `0${seconds}`;
}
return `${minutes}:${seconds}.${milliseconds}`;
}
exports.heartbeat = function heartbeat(device) {
device.send('/info/finalcue');
};
-17
View File
@@ -1,17 +0,0 @@
table {
background: white;
}
th {
text-align: left;
font-weight: normal;
}
.header-row {
background: white;
}
td {
padding-left: 5px;
padding-right: 5px;
}
-34
View File
@@ -1,34 +0,0 @@
<header>
<h1><%= listName %></h1>
</header>
<table>
<tr class="header-row">
<th>Label</th>
<th>Page</th>
<th>Description</th>
<th>Cue Type</th>
<th>State</th>
<th>Activation</th>
<th>Length</th>
</tr>
<% data.cues.forEach((cue, index )=>{ %>
<% if (data.currentCue === index + 1){ %>
<tr style="background-color: black; color: white;">
<%} else if (index + 1 < data.currentCue){ %>
<tr style="background-color: #808080; color: #E5E5E5;">
<%} else{ %>
<tr style="background-color: <%=cue.colors[0]%>; color: <%=cue.colors[1]%>;">
<% } %>
<td><%=cue.label%></td>
<td><%=cue.page%></td>
<td><%=cue.description%></td>
<td><%=cue.type.display%></td>
<td><%=cue.state%></td>
<td><%=cue.activation.display%></td>
<td><%=cue.length%></td>
</tr>
<% }) %>
</table>
+4
View File
@@ -155,6 +155,10 @@ ipcRenderer.on('clearSavedData', (event, message) => {
SAVESLOTS.clearSavedData();
});
ipcRenderer.on('toggleSidebar', (event, message) => {
document.getElementById('main').classList.toggle('sidebar-hidden');
});
ipcRenderer.on('loadSlot', (event, slot) => {
if (slot) {
SAVESLOTS.loadSlot(slot);
+8
View File
@@ -31,6 +31,14 @@ a {
float: right;
}
#main.sidebar-hidden {
grid-template-columns: auto;
}
#main.sidebar-hidden > #device-list-col {
display: none;
}
#main {
box-sizing: border-box;
display: grid;
-1
View File
@@ -122,7 +122,6 @@ function initDeviceConnection(id) {
device.connection = new osc.TCPSocketPort({
address: device.addresses[0],
port: device.remotePort,
useSLIP: plugins[type].config.useSLIP !== undefined ? plugins[type].config.useSLIP : true
});
}
device.connection.open();