From 52e2d625df4631d5c67e7610f824bc83da485e7e Mon Sep 17 00:00:00 2001 From: Florrie Date: Sat, 6 Jul 2019 14:31:34 -0300 Subject: Support disabling controlling the queue --- telnet-server.js | 3 ++- ui.js | 58 ++++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/telnet-server.js b/telnet-server.js index 1e06c78..93b4a5b 100644 --- a/telnet-server.js +++ b/telnet-server.js @@ -28,8 +28,9 @@ class TelnetServer { interfacer, appConfig: { canControlPlayback: false, + canControlQueue: false, canSuspend: false, - showLeftPane: false, + showLeftPane: true, stopPlayingUponQuit: false, menubarColor: 2 } diff --git a/ui.js b/ui.js index b577568..766b4eb 100644 --- a/ui.js +++ b/ui.js @@ -144,6 +144,7 @@ class AppElement extends FocusElement { this.config = Object.assign({ canControlPlayback: true, + canControlQueue: true, canSuspend: true, menubarColor: 4, // blue showLeftPane: true, @@ -258,7 +259,7 @@ class AppElement extends FocusElement { playingTrack && {element: this.playingControl}, {element: this.loopingControl}, {element: this.volumeSlider}, - (next || previous) && {divider: true}, + {divider: true}, previous && {label: `Previous (${previous.name})`, action: () => this.backend.playPrevious(playingTrack)}, next && {label: `Next (${next.name})`, action: () => this.backend.playNext(playingTrack)}, next && {label: '- Play later', action: () => this.playLater(next)} @@ -270,7 +271,7 @@ class AppElement extends FocusElement { return [ {label: `(Queue - ${curIndex >= 0 ? `${curIndex + 1}/` : ''}${items.length} items.)`}, - items.length && {divider: true}, + {divider: true}, items.length && {label: 'Shuffle', action: () => this.shuffleQueue()}, items.length && {label: 'Clear', action: () => this.clearQueue()} ] @@ -474,10 +475,18 @@ class AppElement extends FocusElement { } play(item) { + if (!this.config.canControlQueue) { + return + } + this.backend.play(item) } unqueue(item) { + if (!this.config.canControlQueue) { + return + } + let focusItem = this.queueListingElement.currentItem focusItem = this.backend.unqueue(item, focusItem) @@ -490,6 +499,10 @@ class AppElement extends FocusElement { } playSooner(item) { + if (!this.config.canControlQueue) { + return + } + this.backend.playSooner(item) // It may not have queued as soon as the user wants; in that case, they'll // want to queue it sooner again. Automatically reselect the track so that @@ -498,6 +511,10 @@ class AppElement extends FocusElement { } playLater(item) { + if (!this.config.canControlQueue) { + return + } + this.backend.playLater(item) // Just for consistency with playSooner (you can press ^-L to quickly get // back to the current track). @@ -515,16 +532,17 @@ class AppElement extends FocusElement { const { item, isGroup, isMarked } = el const { editMode } = this + const { canControlQueue } = this.config const anyMarked = editMode && this.markGrouplike.items.length > 0 let items; if (listing.grouplike.isTheQueue) { items = [ - {label: 'Reveal', action: () => this.reveal(item)}, + this.paneLeft.visible && {label: 'Reveal', action: () => this.reveal(item)}, {divider: true}, - {label: 'Play later', action: () => this.playLater(item)}, - {label: 'Play sooner', action: () => this.playSooner(item)}, - {label: 'Remove from queue', action: () => this.unqueue(item)} + canControlQueue && {label: 'Play later', action: () => this.playLater(item)}, + canControlQueue && {label: 'Play sooner', action: () => this.playSooner(item)}, + canControlQueue && {label: 'Remove from queue', action: () => this.unqueue(item)} ] } else { items = [ @@ -551,17 +569,17 @@ class AppElement extends FocusElement { anyMarked && {label: 'Paste (above)', action: () => el.emit('paste', {where: 'above'})}, anyMarked && {label: 'Paste (below)', action: () => el.emit('paste', {where: 'below'})}, // anyMarked && !this.isReal && {label: 'Paste', action: () => this.emit('paste')}, // No "above" or "elow" in the label because the "fake" item/row will be replaced (it'll disappear, since there'll be an item in the group) - editMode && {divider: true}, + {divider: true}, - {element: this.whereControl}, - isGroup && {element: this.orderControl}, - {label: 'Play!', action: emitControls(true)}, - {label: 'Queue!', action: emitControls(false)}, + canControlQueue && {element: this.whereControl}, + canControlQueue && isGroup && {element: this.orderControl}, + canControlQueue && {label: 'Play!', action: emitControls(true)}, + canControlQueue && {label: 'Queue!', action: emitControls(false)}, {divider: true}, {label: 'Process metadata (new entries)', action: () => this.processMetadata(item, false)}, {label: 'Process metadata (reprocess)', action: () => this.processMetadata(item, true)}, - {label: 'Remove from queue', action: () => this.unqueue(item)} + canControlQueue && {label: 'Remove from queue', action: () => this.unqueue(item)} ] } @@ -2454,13 +2472,25 @@ class ContextMenu extends FocusElement { this.y = y this.visible = true + // This code is so that we don't show two dividers beside each other, or + // end a menu with a divider! + let wantDivider = false + const addDividerIfWanted = () => { + if (wantDivider) { + const element = new HorizontalRule() + this.form.addInput(element) + wantDivider = false + } + } + for (const item of items.filter(Boolean)) { if (item.element) { + addDividerIfWanted() this.form.addInput(item.element) } else if (item.divider) { - const element = new HorizontalRule() - this.form.addInput(element) + wantDivider = true } else { + addDividerIfWanted() const button = new Button(item.label) button.keyboardIdentifier = item.keyboardIdentifier || item.label if (item.action) { -- cgit 1.3.0-6-gf8a5