WS: Add strip mute buttons to mixer demo

This commit is contained in:
Luciano Iam 2020-08-16 15:03:17 +02:00 committed by Robin Gareus
parent 75338ad4c5
commit 864bcf09b7
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
7 changed files with 169 additions and 45 deletions

View file

@ -20,13 +20,13 @@
margin: 4px; margin: 4px;
padding: 8px 16px; padding: 8px 16px;
color: #002f42; color: #002f42;
text-shadow: 0px 1px 0px rgba(255,255,255,0.6); /*text-shadow: 0px 1px 0px rgba(255,255,255,0.6);*/
background-color: rgb(245,245,245); /*background-color: rgb(245,245,245);
background-image: url(../images/gradients/grey_out.png); background-image: url(../images/gradients/grey_out.png);
background-repeat: repeat-x; background-repeat: repeat-x;
background-size: 100% 200%; background-size: 100% 200%;
background-position: 50% 0; background-position: 50% 0;
background-clip: padding-box; background-clip: padding-box;*/
border: 1px solid #aaa; border: 1px solid #aaa;
-webkit-border-radius: 6px; -webkit-border-radius: 6px;
-moz-border-radius: 6px; -moz-border-radius: 6px;
@ -35,15 +35,15 @@
box-sizing: border-box; box-sizing: border-box;
transition: border 0.25s ease-in-out, box-shadow 0.25s ease-in-out; transition: border 0.25s ease-in-out, box-shadow 0.25s ease-in-out;
} }
.toolkit-button:hover { /*.toolkit-button:hover {
border: 1px solid #002f42; border: 1px solid #002f42;
background-size: 100% 120%; background-size: 100% 120%;
background-position: 50% 0; background-position: 50% 0;
-webkit-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
} }*/
.toolkit-button:active { /*.toolkit-button:active {
background-image: url(../images/gradients/grey_in.png); background-image: url(../images/gradients/grey_in.png);
background-size: 100% 250%; background-size: 100% 250%;
background-position: 50% 75%; background-position: 50% 75%;
@ -51,14 +51,14 @@
-moz-box-shadow: 0px 3px 0px rgba(255,255,255,0.5), 0px -3px 0px rgba(0,0,0,0.05), 2px 0px 0px rgba(255,255,255,0.3), 0px -2px 0px rgba(0,0,0,0.025); -moz-box-shadow: 0px 3px 0px rgba(255,255,255,0.5), 0px -3px 0px rgba(0,0,0,0.05), 2px 0px 0px rgba(255,255,255,0.3), 0px -2px 0px rgba(0,0,0,0.025);
box-shadow: 0px 3px 0px rgba(255,255,255,0.5), 0px -3px 0px rgba(0,0,0,0.05), 2px 0px 0px rgba(255,255,255,0.3), 0px -2px 0px rgba(0,0,0,0.025); box-shadow: 0px 3px 0px rgba(255,255,255,0.5), 0px -3px 0px rgba(0,0,0,0.05), 2px 0px 0px rgba(255,255,255,0.3), 0px -2px 0px rgba(0,0,0,0.025);
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/gradients/grey_in.png',sizingMethod='scale'); filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/gradients/grey_in.png',sizingMethod='scale');
} }*/
.toolkit-button > .toolkit-label { .toolkit-button > .toolkit-label {
line-height: 1.1em; line-height: 1.1em;
text-align: center; text-align: center;
margin: auto; margin: auto;
padding: 0 3px; padding: 0 3px;
transition: background 0.33s ease-in-out, color 0.33s ease-in-out; /*transition: background 0.33s ease-in-out, color 0.33s ease-in-out;*/
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
@ -78,13 +78,13 @@
margin-right: 5px; margin-right: 5px;
} }
.toolkit-button.toolkit-active { /*.toolkit-button.toolkit-active {
border: 1px solid #002f42; border: 1px solid #002f42;
} }*/
.toolkit-button.toolkit-active > .toolkit-label { .toolkit-button.toolkit-active > .toolkit-label {
background-color: #002f42; background-color: #002f42;
color: white; color: white;
text-shadow: 0px -1px 0px black; /*text-shadow: 0px -1px 0px black;*/
} }
.toolkit-button.toolkit-active > .toolkit-icon { .toolkit-button.toolkit-active > .toolkit-icon {

View file

@ -17,8 +17,8 @@
*/ */
import ArdourClient from '/shared/ardour.js'; import ArdourClient from '/shared/ardour.js';
import { createRootContainer, Container, Label, DiscreteKnob, LinearKnob, import { createRootContainer, Container, Dialog, Label, Button, DiscreteKnob,
PanKnob, StripGainFader, StripMeter, Toggle } from './tkwidget.js'; LinearKnob, PanKnob, StripGainFader, StripMeter, Toggle } from './tkwidget.js';
(() => { (() => {
@ -56,15 +56,28 @@ import { createRootContainer, Container, Label, DiscreteKnob, LinearKnob,
} }
function createStrip (strip, container) { function createStrip (strip, container) {
const inserts = new Button();
inserts.text = 'ƒ';
inserts.appendTo(container);
inserts.classList.add('strip-inserts');
if (strip.isVca || (strip.plugins.length == 0)) {
inserts.classList.add('disabled');
} else {
inserts.callback = () => openInserts (strip.plugins);
}
const pan = new PanKnob(); const pan = new PanKnob();
pan.appendTo(container); pan.appendTo(container);
if (strip.isVca) { if (!strip.isVca) {
// hide pan keeping layout
pan.element.style.visibility = 'hidden';
} else {
pan.bindTo(strip, 'pan'); pan.bindTo(strip, 'pan');
} }
const mute = new Toggle();
mute.text = 'Mute';
mute.appendTo(container);
mute.bindTo(strip, 'mute');
mute.classList.add('strip-mute');
const meterFader = new Container(); const meterFader = new Container();
meterFader.appendTo(container); meterFader.appendTo(container);
meterFader.classList.add('strip-meter-fader'); meterFader.classList.add('strip-meter-fader');
@ -82,10 +95,11 @@ import { createRootContainer, Container, Label, DiscreteKnob, LinearKnob,
label.classList.add('strip-label'); label.classList.add('strip-label');
label.appendTo(container); label.appendTo(container);
// TO DO if (strip.isVca) {
/*for (const plugin of strip.plugins) { // hide inserts and pan keeping layout
createStripPlugin(plugin, container); pan.element.style.visibility = 'hidden';
}*/ inserts.element.style.visibility = 'hidden';
}
} }
function createStripPlugin (plugin, container) { function createStripPlugin (plugin, container) {
@ -119,8 +133,7 @@ import { createRootContainer, Container, Label, DiscreteKnob, LinearKnob,
function setupFullscreenButton () { function setupFullscreenButton () {
const doc = document.documentElement, const doc = document.documentElement,
button = document.getElementById('fullscreen'), button = document.getElementById('fullscreen');
touchOrClick = ('ontouchstart' in doc) ? 'touchstart' : 'click';
let requestFullscreen = null, fullscreenChange = null; let requestFullscreen = null, fullscreenChange = null;
@ -133,7 +146,7 @@ import { createRootContainer, Container, Label, DiscreteKnob, LinearKnob,
} }
if (requestFullscreen && fullscreenChange) { if (requestFullscreen && fullscreenChange) {
button.addEventListener(touchOrClick, requestFullscreen); button.addEventListener('click', requestFullscreen);
document.addEventListener(fullscreenChange, (e) => { document.addEventListener(fullscreenChange, (e) => {
const fullscreen = document.fullscreen || document.webkitIsFullScreen; const fullscreen = document.fullscreen || document.webkitIsFullScreen;
@ -144,6 +157,21 @@ import { createRootContainer, Container, Label, DiscreteKnob, LinearKnob,
} }
} }
function openInserts (plugins) {
const dialog = new Dialog();
dialog.classList.add('inserts-view');
dialog.show();
const label = new Label();
label.text = `WIP: This strip has ${plugins.length} plugins...`;
label.appendTo(dialog);
// TO DO
/*for (const plugin of plugins) {
createStripPlugin(plugin, container);
}*/
}
main(); main();
})(); })();

View file

@ -27,6 +27,7 @@ const SCRIPTS = [
'toolkit', 'toolkit',
'implements/audiomath', 'implements/audiomath',
'implements/base', 'implements/base',
'implements/anchor',
'implements/globalcursor', 'implements/globalcursor',
'implements/ranged', 'implements/ranged',
'implements/gradient', 'implements/gradient',
@ -42,6 +43,7 @@ const SCRIPTS = [
'widgets/label', 'widgets/label',
'widgets/button', 'widgets/button',
'widgets/container', 'widgets/container',
'widgets/dialog',
'widgets/meterbase', 'widgets/meterbase',
'widgets/state', 'widgets/state',
'widgets/toggle', 'widgets/toggle',

View file

@ -17,7 +17,18 @@
*/ */
import loadToolkit from './tkloader.js'; import loadToolkit from './tkloader.js';
import { BaseWidget, BaseContainer, BaseControl } from './widget.js'; import { BaseWidget, BaseContainer, BaseDialog, BaseControl } from './widget.js';
let _tkRoot = null;
export async function createRootContainer () {
await loadToolkit();
_tkRoot = new TK.Root({id: 'root'});
const root = new Container();
root.tk = _tkRoot;
document.body.appendChild(root.element);
return root;
}
class Widget extends BaseWidget { class Widget extends BaseWidget {
@ -91,14 +102,6 @@ class Knob extends RangeControl {
} }
export async function createRootContainer () {
await loadToolkit();
const root = new Container();
root.tk = new TK.Root({id: 'root'});
document.body.appendChild(root.element);
return root;
}
export class Container extends BaseContainer { export class Container extends BaseContainer {
constructor () { constructor () {
@ -117,12 +120,63 @@ export class Container extends BaseContainer {
} }
export class Dialog extends BaseDialog {
constructor () {
super();
this.tk = new TK.Dialog({
anchor: 'center', // center v&h
auto_close: true,
auto_remove: true,
showing_duration: 10,
hiding_duration: 10,
container: document.getElementById('root')
});
}
get element () {
return this.tk.element;
}
appendChild (child) {
super.appendChild(child);
this.tk.append_child(child.tk);
}
show () {
// opening a TK.Dialog with auto_close=true from a TK.Button callback
// fails otherwise ev.stopPropagation() is called in the button event
// handler or setTimeout() is used here
setTimeout(() => {
this.tk.set('display_state', 'show');
}, 0);
}
}
export class Button extends Control {
constructor () {
super(new TK.Button());
this.tk.add_event('click', (ev) => this.callback(ev));
}
set text (text) {
this.tk.set('label', text);
}
}
export class Toggle extends Control { export class Toggle extends Control {
constructor () { constructor () {
super(new TK.Toggle()); super(new TK.Toggle());
this.tk.add_event('toggled', (state) => this.callback(state)); this.tk.add_event('toggled', (state) => this.callback(state));
} }
set text (text) {
this.tk.set('label', text);
}
get value () { get value () {
return this.tk.get('state'); return this.tk.get('state');

View file

@ -55,6 +55,19 @@ export class BaseContainer extends BaseWidget {
} }
export class BaseDialog extends BaseContainer {
constructor () {
super();
this.children = [];
}
show () {
// empty
}
}
export class BaseControl extends BaseWidget { export class BaseControl extends BaseWidget {
get value () { get value () {

View file

@ -69,14 +69,44 @@ div {
padding: 1em 0; padding: 1em 0;
} }
.toolkit-fader { .strip-mute {
/* empty */ background: rgb(62,61,61);
border: 1px solid rgb(36,36,36);
width: 50%;
} }
.toolkit-level-meter { .strip-mute.toolkit-active {
/* empty */ background: rgb(172,155,5);
} }
.toolkit-knob { .strip-mute > .toolkit-label {
/* empty */ color: rgb(248,248,242);
background-color: inherit;
}
.strip-mute.toolkit-active > .toolkit-label {
color: rgb(36,36,36);
background-color: inherit;
}
.strip-inserts {
color: rgb(248,248,242);
border: 1px solid rgb(36,36,36);
width: 50%;
}
.strip-inserts.disabled {
color: rgb(36,36,36);
}
.inserts-view {
width: 100%;
max-width: 666px;
height: 100%;
max-height: 500px;
background: rgb(62,61,61);
border: none;
/* absolute positioning cannot be disabled for tk dialogs */
left: inherit !important;
top: inherit !important;
} }

View file

@ -44,22 +44,19 @@ import ArdourClient from '/shared/ardour.js';
} }
function addDomEventListeners () { function addDomEventListeners () {
// transport buttons
const touchOrClick = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'click';
const roll = () => { const roll = () => {
setRolling(!_rolling); setRolling(!_rolling);
ardour.transport.roll = _rolling; ardour.transport.roll = _rolling;
}; };
dom.roll.addEventListener(touchOrClick, roll); dom.roll.addEventListener('click', roll);
const record = () => { const record = () => {
setRecord(!_record); setRecord(!_record);
ardour.transport.record = _record; ardour.transport.record = _record;
}; };
dom.record.addEventListener(touchOrClick, record); dom.record.addEventListener('click', record);
// fullscreen button // fullscreen button
let requestFullscreen = null, fullscreenChange = null; let requestFullscreen = null, fullscreenChange = null;
@ -73,7 +70,7 @@ import ArdourClient from '/shared/ardour.js';
} }
if (requestFullscreen && fullscreenChange) { if (requestFullscreen && fullscreenChange) {
dom.fullscreen.addEventListener(touchOrClick, requestFullscreen); dom.fullscreen.addEventListener('click', requestFullscreen);
document.addEventListener(fullscreenChange, (e) => { document.addEventListener(fullscreenChange, (e) => {
const fullscreen = document.fullscreen || document.webkitIsFullScreen; const fullscreen = document.fullscreen || document.webkitIsFullScreen;