diff --git a/lib/widget.js b/lib/widget.js index 7921fdc..52da085 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -1438,6 +1438,33 @@ Element.prototype.__proto__ = Node.prototype; Element.prototype.type = 'element'; +Element.prototype.sattr = function(obj, fg, bg) { + var bold = obj.bold + , underline = obj.underline + , blink = obj.blink + , inverse = obj.inverse + , invisible = obj.invisible; + + // This used to be a loop, but I decided + // to unroll it for performance's sake. + if (typeof bold === 'function') bold = bold(this); + if (typeof underline === 'function') underline = underline(this); + if (typeof blink === 'function') blink = blink(this); + if (typeof inverse === 'function') inverse = inverse(this); + if (typeof invisible === 'function') invisible = invisible(this); + + if (typeof fg === 'function') fg = fg(this); + if (typeof bg === 'function') bg = bg(this); + + return ((((invisible ? 16 : 0) << 18) + | ((inverse ? 8 : 0) << 18) + | ((blink ? 4 : 0) << 18) + | ((underline ? 2 : 0) << 18)) + | ((bold ? 1 : 0) << 18) + | (colors.convert(fg) << 9)) + | colors.convert(bg); +}; + Element.prototype.onScreenEvent = function(type, listener) { var self = this; if (this.parent) { @@ -1988,10 +2015,10 @@ Box.prototype.render = function(stop) { if (stop) return ret; battr = this.border - ? sattr(this.border, this.border.fg, this.border.bg) + ? this.sattr(this.border, this.border.fg, this.border.bg) : 0; - dattr = sattr(this, this.fg, this.bg); + dattr = this.sattr(this, this.fg, this.bg); attr = dattr; // Check previous line for escape codes. @@ -2084,7 +2111,7 @@ outer: cell = lines[yi] && lines[yi][xi]; if (cell) { ch = this.scrollbar.ch || ' '; - attr = sattr(this, + attr = this.sattr(this, this.scrollbar.fg || this.fg, this.scrollbar.bg || this.bg); if (attr !== cell[0] || ch !== cell[1]) { @@ -2461,6 +2488,38 @@ function List(options) { this.selectedInverse = options.selectedInverse; this.selectedInvisible = options.selectedInvisible; + this.itemBg = cens(options.itemBg); + this.itemFg = cens(options.itemFg); + this.itemBold = options.itemBold; + this.itemUnderline = options.itemUnderline; + this.itemBlink = options.itemBlink; + this.itemInverse = options.itemInverse; + this.itemInvisible = options.itemInvisible; + +/* + if (!this.style.selected) { + this.style.selected = {}; + this.style.selected.bg = cens(options.selectedBg); + this.style.selected.fg = cens(options.selectedFg); + this.style.selected.bold = options.selectedBold; + this.style.selected.underline = options.selectedUnderline; + this.style.selected.blink = options.selectedBlink; + this.style.selected.inverse = options.selectedInverse; + this.style.selected.invisible = options.selectedInvisible; + } + + if (!this.style.item) { + this.style.item = {}; + this.style.item.bg = cens(options.itemBg); + this.style.item.fg = cens(options.itemFg); + this.style.item.bold = options.itemBold; + this.style.item.underline = options.itemUnderline; + this.style.item.blink = options.itemBlink; + this.style.item.inverse = options.itemInverse; + this.style.item.invisible = options.itemInvisible; + } +*/ + this.mouse = options.mouse || false; if (options.items) { @@ -2609,6 +2668,22 @@ List.prototype.add = function(item) { }; }); +/* + ['bg', 'fg', 'bold', 'underline', + 'blink', 'inverse', 'invisible'].forEach(function(name) { + // TODO: Move all specific options to their own object namespaces. + var iname = 'item' + name[0].toUpperCase() + name.substring(1) + , sname = 'selected' + name[0].toUpperCase() + name.substring(1); + options[name] = function() { + var attr = self.items[self.selected] === item + ? self[sname] + : self[iname]; + if (typeof attr === 'function') attr = attr(item); + return attr; + }; + }); +*/ + var item = new Box(options); this.append(item); @@ -3282,7 +3357,7 @@ ProgressBar.prototype.render = function(stop) { yi = yi + ((yl - yi) - (((yl - yi) * (this.filled / 100)) | 0)); } - dattr = sattr(this, this.barFg, this.barBg); + dattr = this.sattr(this, this.barFg, this.barBg); this.screen.fillRegion(dattr, this.ch, xi, xl, yi, yl); @@ -4226,33 +4301,6 @@ function hsort(obj) { }); } -function sattr(obj, fg, bg) { - var bold = obj.bold - , underline = obj.underline - , blink = obj.blink - , inverse = obj.inverse - , invisible = obj.invisible; - - // This used to be a loop, but I decided - // to unroll it for performance's sake. - if (typeof bold === 'function') bold = bold(obj); - if (typeof underline === 'function') underline = underline(obj); - if (typeof blink === 'function') blink = blink(obj); - if (typeof inverse === 'function') inverse = inverse(obj); - if (typeof invisible === 'function') invisible = invisible(obj); - - if (typeof fg === 'function') fg = fg(obj); - if (typeof bg === 'function') bg = bg(obj); - - return ((((invisible ? 16 : 0) << 18) - | ((inverse ? 8 : 0) << 18) - | ((blink ? 4 : 0) << 18) - | ((underline ? 2 : 0) << 18)) - | ((bold ? 1 : 0) << 18) - | (colors.convert(fg) << 9)) - | colors.convert(bg); -} - function cens(color) { return color != null ? color