« get me outta code hell

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:
Diffstat (limited to 'ui.js')
-rw-r--r--ui.js64
1 files changed, 60 insertions, 4 deletions
diff --git a/ui.js b/ui.js
index 2777326..6562139 100644
--- a/ui.js
+++ b/ui.js
@@ -1500,19 +1500,28 @@ class AppElement extends FocusElement {
       this.SQP.playNext(playingTrack)
     }
 
+    const oldName = item.name
     if (isGroup(item)) {
       if (order === 'shuffle') {
-        item = {items: shuffleArray(flattenGrouplike(item).items)}
+        item = {
+          name: `${oldName} (shuffled)`,
+          items: shuffleArray(flattenGrouplike(item).items)
+        }
       } else if (order === 'shuffle-groups') {
         item = shuffleOrderOfGroups(item)
+        item.name = `${oldName} (group order shuffled)`
       } else if (order === 'reverse') {
-        item = {items: flattenGrouplike(item).items.reverse()}
+        item = {
+          name: `${oldName} (reversed)`,
+          items: flattenGrouplike(item).items.reverse()
+        }
       } else if (order === 'reverse-groups') {
         item = reverseOrderOfGroups(item)
+        item.name = `${oldName} (group order reversed)`
       }
     } else {
       // Make it into a grouplike that just contains itself.
-      item = {items: [item]}
+      item = {name: oldName, items: [item]}
     }
 
     if (where === 'next' || where === 'next-selected' || where === 'end') {
@@ -4396,6 +4405,10 @@ class Log extends ListScrollForm {
   }
 
   newLogMessage(text) {
+    if (this.inputs.length === 10) {
+      this.removeInput(this.inputs[0])
+    }
+
     const logMessage = new LogMessage(text)
     this.addInput(logMessage)
     this.fixLayout()
@@ -4404,6 +4417,49 @@ class Log extends ListScrollForm {
   }
 }
 
-class LogMessage extends Button {}
+class LogMessage extends FocusElement {
+  constructor(text) {
+    super()
+
+    this.label = new LogMessageLabel(text)
+    this.addChild(this.label)
+  }
+
+  fixLayout() {
+    this.w = this.parent.contentW
+    this.label.w = this.contentW
+    this.h = this.label.h
+  }
+
+  clicked(button) {
+    if (button === 'left') {
+      this.root.select(this)
+      return false
+    }
+  }
+}
+
+class LogMessageLabel extends WrapLabel {
+  writeTextTo(writable) {
+    const w = this.w
+    const lines = this.getWrappedLines()
+    for (let i = 0; i < lines.length; i++) {
+      const text = this.processFormatting(lines[i])
+      writable.write(ansi.moveCursor(this.absTop + i, this.absLeft))
+      writable.write(text)
+      const width = ansi.measureColumns(text)
+      if (width < w && this.textAttributes.length) {
+        writable.write(ansi.setAttributes([ansi.A_RESET, ...this.textAttributes]))
+        writable.write(' '.repeat(w - width))
+      }
+    }
+  }
+
+  set textAttributes(val) {}
+
+  get textAttributes() {
+    return this.parent.isSelected ? [40] : []
+  }
+}
 
 module.exports = AppElement