diff options
Diffstat (limited to 'ui/presentation/WrapLabel.js')
-rw-r--r-- | ui/presentation/WrapLabel.js | 45 |
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. + } +} |