« get me outta code hell

Improve cursor display - tui-lib - Pure Node.js library for making visual command-line programs (ala vim, ncdu)
about summary refs log tree commit diff
diff options
context:
space:
mode:
authorliam4 <towerofnix@gmail.com>2017-07-03 21:13:50 -0300
committerliam4 <towerofnix@gmail.com>2017-07-03 21:13:50 -0300
commitb087c428ba492715626a7875185f9ba18fb30b3e (patch)
treec7ca597804b9cb3b13e43782d95b0a24fb83a73e
parent930d61b9f067346f467d4d84015088f57c54da56 (diff)
Improve cursor display
- Whether the cursor is displayed or not is now based on the
  cursorVisible property rather than whether cursorX and cursorY
  are set or not.
- The actual shell cursor is now invisible... this is objectively
  an act of Evil, though! This doesn't look like too hard to
  fix, thankfully.
- A new cleanCursor function has been added to ansi.js.
-rw-r--r--examples/list-scroll-form.js2
-rw-r--r--ui/Root.js6
-rw-r--r--ui/form/FocusElement.js1
-rw-r--r--ui/form/TextInput.js1
-rw-r--r--util/ansi.js6
5 files changed, 12 insertions, 4 deletions
diff --git a/examples/list-scroll-form.js b/examples/list-scroll-form.js
index a68cb78..cb7fa27 100644
--- a/examples/list-scroll-form.js
+++ b/examples/list-scroll-form.js
@@ -13,6 +13,7 @@ interfacer.getScreenSize().then(size => {
 
   const list = new ListScrollForm()
   root.addChild(list)
+
   list.x = 2
   list.y = 2
   list.w = root.contentW - 4
@@ -23,6 +24,7 @@ interfacer.getScreenSize().then(size => {
     list.addInput(button)
 
     button.on('pressed', () => {
+      process.stdout.write(ansi.cleanCursor())
       process.stdout.write(ansi.clearScreen())
       console.log(item)
       process.exit(0)
diff --git a/ui/Root.js b/ui/Root.js
index b170f99..fc494a7 100644
--- a/ui/Root.js
+++ b/ui/Root.js
@@ -50,9 +50,7 @@ module.exports = class Root extends DisplayElement {
     // Render the cursor, based on the cursorX and cursorY of the currently
     // selected element.
     if (
-      this.selected &&
-      typeof this.selected.cursorX === 'number' &&
-      typeof this.selected.cursorY === 'number' &&
+      this.selected && this.selected.cursorVisible &&
       (Date.now() - this.cursorBlinkOffset) % 1000 < 500
     ) {
       writable.write(ansi.moveCursor(
@@ -61,7 +59,7 @@ module.exports = class Root extends DisplayElement {
       writable.write('I')
       writable.write(ansi.resetAttributes())
     }
-    writable.write(ansi.moveCursor(0, 0))
+    writable.write(ansi.hideCursor())
   }
 
   cursorMoved() {
diff --git a/ui/form/FocusElement.js b/ui/form/FocusElement.js
index 5967e26..18f13bf 100644
--- a/ui/form/FocusElement.js
+++ b/ui/form/FocusElement.js
@@ -6,6 +6,7 @@ module.exports = class FocusElement extends DisplayElement {
   constructor() {
     super()
 
+    this.cursorVisible = false
     this.cursorX = 0
     this.cursorY = 0
 
diff --git a/ui/form/TextInput.js b/ui/form/TextInput.js
index fc59cbb..a10a26f 100644
--- a/ui/form/TextInput.js
+++ b/ui/form/TextInput.js
@@ -11,6 +11,7 @@ module.exports = class TextInput extends FocusElement {
     super()
 
     this.value = ''
+    this.cursorVisible = true
     this.cursorIndex = 0
     this.scrollChars = 0
   }
diff --git a/util/ansi.js b/util/ansi.js
index 0e6e3fe..0ee1bc1 100644
--- a/util/ansi.js
+++ b/util/ansi.js
@@ -43,6 +43,12 @@ const ansi = {
     return `${ESC}[${line + 1};${col + 1}H`
   },
 
+  cleanCursor() {
+    // A combination of codes that generally cleans up the cursor.
+
+    return ansi.resetAttributes() + ansi.showCursor()
+  },
+
   hideCursor() {
     // Makes the cursor invisible.