diff --git a/lib/widget.js b/lib/widget.js index 8b996fb..c808870 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -27,6 +27,7 @@ function Node(options) { || (function(){throw new Error('No active screen.')})(); this.parent = options.parent || null; // this.screen; this.children = []; + this.$ = this._ = this.data = {}; (options.children || []).forEach(this.append.bind(this)); @@ -194,7 +195,7 @@ Screen.prototype._listenMouse = function(el) { for (; i < self.clickable.length; i++) { el = self.clickable[i]; - if (el.hidden) continue; + if (!el.visible) continue; // Get the true coordinates. //ret = el.render(true); @@ -550,18 +551,23 @@ Screen.prototype._reduceColor = function(col) { }; Screen.prototype.focus = function(offset) { - if (!this.input.length || !offset) return; + var shown = this.input.filter(function(el) { + return el.visible; + }); + if (!shown || !offset) return; var i = this.input.indexOf(this.focused); if (!~i) return; - if (!this.input[i + offset]) { - if (offset > 0) { - while (offset--) if (++i > this.input.length - 1) i = 0; - } else { - offset = -offset; - while (offset--) if (--i < 0) i = this.input.length - 1; + if (offset > 0) { + while (offset--) { + if (++i > this.input.length - 1) i = 0; + if (!this.input[i].visible) offset++; } } else { - i += offset; + offset = -offset; + while (offset--) { + if (--i < 0) i = this.input.length - 1; + if (!this.input[i].visible) offset++; + } } return this.input[i].focus(); }; @@ -727,9 +733,12 @@ Element.prototype.emit = function(type) { Element.prototype.hide = function() { if (this.hidden) return; - var ret = this.render(true); this.hidden = true; - this.screen.clearRegion(ret.xi, ret.xl, ret.yi, ret.yl); + //var ret = this.render(true); + var ret = this._lastPos; + if (ret) { + this.screen.clearRegion(ret.xi, ret.xl, ret.yi, ret.yl); + } this.emit('hide'); }; @@ -756,6 +765,7 @@ Element.prototype.focus = function() { Element.prototype.setContent = function(content) { var ret = this.render(true); // TODO: Maybe simply set _pcontent with _parseTags result. + // text = text.replace(/\x1b(?!\[[\d;]*m)/g, ''); this.content = this._parseTags(content || ''); this.screen.clearRegion(ret.xi, ret.xl, ret.yi, ret.yl); }; @@ -779,6 +789,14 @@ Element.prototype._parseTags = function(text) { }); }; +Element.prototype.__defineGetter__('visible', function() { + var el = this; + do { + if (el.hidden) return false; + } while (el = el.parent); + return true; +}); + /** * Positioning */ @@ -1500,6 +1518,7 @@ function List(options) { self.childBase = 0; self.childOffset = self.selected; } else { + // Is this supposed to be: self.childBase = visible - self.selected + 1; ? self.childBase = self.selected - visible + 1; self.childOffset = visible - 1; } @@ -1666,7 +1685,12 @@ ScrollableText.prototype.scroll = function(offset) { } max = this._clines.length - 1 - (this.height - (this.border ? 2 : 0)); - if (cb > max) this.childBase = cb = max; + if (max < 0) max = 0; + + if (cb > max) { + this.childBase = cb = max; + diff = cb - base; + } if (diff > 0) { for (i = base; i < cb; i++) this.contentIndex += this._clines[i].length + 1; @@ -1690,6 +1714,10 @@ ScrollableText.prototype._recalculateIndex = function() { this._clines = wrapContent(this.content, this.width - (this.border ? 2 : 0)); this._pcontent = this._clines.join('\n'); + if (this.childBase > this._clines.length - 1) { + this.childBase = this._clines.length - 1; + } + for (var i = 0, t = 0; i < this.childBase; i++) { t += this._clines[i].length + 1; } @@ -1726,6 +1754,11 @@ Textbox.prototype.__proto__ = Input.prototype; Textbox.prototype.setInput = function(callback) { var self = this; + if (this._timeout != null) { + clearTimeout(this._timeout); + delete this._timeout; + } + this.screen.grabKeys = true; this.focus(); @@ -1740,9 +1773,9 @@ Textbox.prototype.setInput = function(callback) { // self.screen.program.restoreCursor(); self.screen.program.hideCursor(); // Wait for global keypress event to fire. - process.nextTick(function() { + self._timeout = setTimeout(function() { self.screen.grabKeys = false; - }); + }, 1); return err ? callback(err) : callback(null, value); diff --git a/test/widget.js b/test/widget.js index bbe9c48..628dd07 100644 --- a/test/widget.js +++ b/test/widget.js @@ -139,8 +139,6 @@ var stext = new blessed.ScrollableText({ content: lorem, fg: 'blue', bg: 'default', - barBg: 'default', - barFg: 'blue', border: { type: 'ascii', fg: 'default',