« get me outta code hell

tui-lib - Pure Node.js library for making visual command-line programs (ala vim, ncdu)
about summary refs log tree commit diff
path: root/ui/presentation/WrapLabel.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/presentation/WrapLabel.js')
-rw-r--r--ui/presentation/WrapLabel.js45
1 files changed, 45 insertions, 0 deletions
diff --git a/ui/presentation/WrapLabel.js b/ui/presentation/WrapLabel.js
new file mode 100644
index 0000000..0ecc777
--- /dev/null
+++ b/ui/presentation/WrapLabel.js
@@ -0,0 +1,45 @@
+import wrap from 'word-wrap'
+
+import * as ansi from 'tui-lib/util/ansi'
+
+import Label from './Label.js'
+
+export default class WrapLabel extends Label {
+  // A word-wrapping text display. Given a width, wraps text to fit.
+
+  constructor(...args) {
+    super(...args)
+  }
+
+  fixLayout() {
+    // Override Label.fixLayout to do nothing. We don't want to make the
+    // width of this label be set to the content of the text! (That would
+    // defeat the entire point of word wrapping.)
+  }
+
+  writeTextTo(writable) {
+    const lines = this.getWrappedLines()
+    for (let i = 0; i < lines.length; i++) {
+      writable.write(ansi.moveCursor(this.absTop + i, this.absLeft))
+      writable.write(lines[i])
+    }
+  }
+
+  getWrappedLines() {
+    if (this.text.trim().length === 0) {
+      return []
+    }
+
+    const options = {width: this.w, indent: ''}
+    return wrap(this.text, options).split('\n')
+      .map(l => l.trim())
+  }
+
+  get h() {
+    return this.getWrappedLines().length
+  }
+
+  set h(newHeight) {
+    // Do nothing. Height is computed on the fly.
+  }
+}