« get me outta code hell

(o) to open through system; show non-music files - mtui - Music Text User Interface - user-friendly command line music player
about summary refs log tree commit diff
path: root/ui.js
diff options
context:
space:
mode:
authorFlorrie <towerofnix@gmail.com>2019-10-15 17:55:58 -0300
committerFlorrie <towerofnix@gmail.com>2019-10-15 17:55:58 -0300
commitc0d6ea0363473cbb43e4f1f50c92803ed14742cb (patch)
tree883b8602584f66e9ddeb53cfe32b2d96dbfd909f /ui.js
parentb2b424c977099d5fc9d49a9bbba6d911e2bc7901 (diff)
(o) to open through system; show non-music files
Diffstat (limited to 'ui.js')
-rw-r--r--ui.js75
1 files changed, 61 insertions, 14 deletions
diff --git a/ui.js b/ui.js
index 674541d..f334a70 100644
--- a/ui.js
+++ b/ui.js
@@ -47,6 +47,11 @@ const {
   }
 } = require('./tui-lib')
 
+const open = require('open')
+
+const isPlayable = item => isGroup(item) || isTrack(item)
+const isOpenable = item => !!(item && item.url)
+
 const input = {}
 
 const keyBindings = [
@@ -79,6 +84,7 @@ const keyBindings = [
   ['isDownload', 'd'],
   ['isRemove', 'x'],
   ['isQueueAfterSelectedTrack', 'q'],
+  ['isOpenThroughSystem', 'o'],
   ['isShuffleQueue', 's'],
   ['isClearQueue', 'c'],
   ['isFocusMenubar', ';'],
@@ -217,6 +223,7 @@ class AppElement extends FocusElement {
     this.queueTimeLabel = new Label('')
     this.paneRight.addChild(this.queueTimeLabel)
 
+    this.queueListingElement.on('open', item => this.openThroughSystem(item))
     this.queueListingElement.on('queue', item => this.play(item))
     this.queueListingElement.on('remove', item => this.unqueue(item))
     this.queueListingElement.on('shuffle', () => this.shuffleQueue())
@@ -572,8 +579,9 @@ class AppElement extends FocusElement {
     this.tabber.addTab(grouplikeListing)
     this.tabber.selectTab(grouplikeListing)
 
-    grouplikeListing.on('download', item => this.SQP.download(item))
     grouplikeListing.on('browse', item => grouplikeListing.loadGrouplike(item))
+    grouplikeListing.on('download', item => this.SQP.download(item))
+    grouplikeListing.on('open', item => this.openThroughSystem(item))
     grouplikeListing.on('queue', (item, opts) => this.handleQueueOptions(item, opts))
 
     const updateListingsFor = item => {
@@ -789,6 +797,14 @@ class AppElement extends FocusElement {
     }
   }
 
+  openThroughSystem(item) {
+    if (!isOpenable(item)) {
+      return
+    }
+
+    open(item.url)
+  }
+
   set actOnAllPlayers(val) {
     if (val) {
       this.queuePlayersToActOn = this.backend.queuePlayers.slice()
@@ -888,15 +904,19 @@ class AppElement extends FocusElement {
         {divider: true},
         */
 
-        canControlQueue && {element: this.whereControl},
+        canControlQueue && isPlayable(item) && {element: this.whereControl},
         canControlQueue && isGroup(item) && {element: this.orderControl},
-        canControlQueue && {label: 'Play!', action: emitControls(true)},
-        canControlQueue && {label: 'Queue!', action: emitControls(false)},
+        canControlQueue && isPlayable(item) && {label: 'Play!', action: emitControls(true)},
+        canControlQueue && isPlayable(item) && {label: 'Queue!', action: emitControls(false)},
+        {divider: true},
+
+        canProcessMetadata && isGroup(item) && {label: 'Process metadata (new entries)', action: () => this.processMetadata(item, false)},
+        canProcessMetadata && isGroup(item) && {label: 'Process metadata (reprocess)', action: () => this.processMetadata(item, true)},
+        canProcessMetadata && isTrack(item) && {label: 'Process metadata', action: () => this.processMetadata(item, true)},
+        canControlQueue && isPlayable(item) && {label: 'Remove from queue', action: () => this.unqueue(item)},
         {divider: true},
 
-        canProcessMetadata && {label: 'Process metadata (new entries)', action: () => this.processMetadata(item, false)},
-        canProcessMetadata && {label: 'Process metadata (reprocess)', action: () => this.processMetadata(item, true)},
-        canControlQueue && {label: 'Remove from queue', action: () => this.unqueue(item)},
+        isOpenable(item) && {label: 'Open (System)', action: () => this.openThroughSystem(item)},
         {divider: true},
 
         item === this.markGrouplike && {label: 'Deselect', action: () => this.deselectAll()}
@@ -1610,7 +1630,17 @@ class GrouplikeListingElement extends Form {
   }
 
   addEventListeners(itemElement) {
-    for (const evtName of ['download', 'remove', 'mark', 'paste', 'browse', 'queue', 'unqueue', 'menu']) {
+    for (const evtName of [
+      'browse',
+      'download',
+      'paste',
+      'mark',
+      'menu',
+      'open',
+      'queue',
+      'remove',
+      'unqueue'
+    ]) {
       itemElement.on(evtName, (...data) => this.emit(evtName, itemElement.item, ...data))
     }
 
@@ -2512,11 +2542,15 @@ class InteractiveGrouplikeItemElement extends BasicGrouplikeItemElement {
       this.emit('download')
     } else if (input.isQueueAfterSelectedTrack(keyBuf)) {
       this.emit('queue', {where: 'next-selected'})
+    } else if (input.isOpenThroughSystem(keyBuf)) {
+      this.emit('open')
     } else if (telc.isEnter(keyBuf)) {
       if (isGroup(this.item)) {
         this.emit('browse')
-      } else {
+      } else if (isTrack(this.item)) {
         this.emit('queue', {where: 'next', play: true})
+      } else if (!this.isPlayable) {
+        this.emit('open')
       }
     } else if (input.isRemove(keyBuf)) {
       this.emit('remove')
@@ -2559,11 +2593,12 @@ class InteractiveGrouplikeItemElement extends BasicGrouplikeItemElement {
         }
         if (this.isGroup) {
           this.emit('browse')
-          return false
-        } else {
+        } else if (this.isTrack) {
           this.emit('queue', {where: 'next', play: true})
-          return false
+        } else if (!this.isPlayable) {
+          this.emit('open')
         }
+        return false
       } else {
         this.parent.selectInput(this)
       }
@@ -2584,10 +2619,16 @@ class InteractiveGrouplikeItemElement extends BasicGrouplikeItemElement {
       } else {
         writable.write(ansi.setAttributes([ansi.C_BLUE, ansi.A_BRIGHT]))
       }
-    } else {
+    } else if (this.isTrack) {
       if (this.isMarked) {
         writable.write(ansi.setAttributes([ansi.C_WHITE + 10, ansi.C_BLACK, ansi.A_BRIGHT]))
       }
+    } else if (!this.isPlayable) {
+      if (this.isMarked) {
+        writable.write(ansi.setAttributes([ansi.C_WHITE + 10, ansi.C_BLACK, ansi.A_BRIGHT]))
+      } else {
+        writable.write(ansi.setAttributes([ansi.A_DIM]))
+      }
     }
 
     this.drawX += 3
@@ -2605,6 +2646,8 @@ class InteractiveGrouplikeItemElement extends BasicGrouplikeItemElement {
 
     if (this.isGroup) {
       writable.write('G')
+    } else if (!this.isPlayable) {
+      writable.write('F')
     } else if (record.downloading) {
       writable.write(braille[Math.floor(Date.now() / 250) % 6])
     } else if (this.app.SQP.playingTrack === this.item) {
@@ -2627,6 +2670,10 @@ class InteractiveGrouplikeItemElement extends BasicGrouplikeItemElement {
   get isTrack() {
     return isTrack(this.item)
   }
+
+  get isPlayable() {
+    return isPlayable(this.item)
+  }
 }
 
 class ListingJumpElement extends Form {
@@ -2682,7 +2729,7 @@ class PathElement extends ListScrollForm {
       this.removeInput(this.inputs[0])
     }
 
-    if (!isTrack(item) && !isGroup(item)) {
+    if (!item) {
       return
     }