allow attributes to be functions.

This commit is contained in:
Christopher Jeffrey 2013-07-16 00:52:13 -05:00
parent b266f389e9
commit edc216fa37
2 changed files with 39 additions and 21 deletions

View File

@ -391,7 +391,7 @@ A scrollable list which can display selectable items.
##### Options:
- inherits all from ScrollableBox.
- **selectFg, selectedBg** - foreground and background for selected item,
- **selectedFg, selectedBg** - foreground and background for selected item,
treated like fg and bg.
- **selectedBold, selectedUnderline** - character attributes for selected item,
treated like bold and underline.

View File

@ -2575,10 +2575,8 @@ List.prototype.type = 'list';
List.prototype.add = function(item) {
var self = this;
var item = new Box({
var options = {
screen: this.screen,
fg: this.fg,
bg: this.bg,
content: item,
align: this.align || 'left',
top: this.items.length + (this.border ? 1 : 0) + this.padding,
@ -2586,9 +2584,23 @@ List.prototype.add = function(item) {
right: (this.border ? 1 : 0) + this.padding + 1,
tags: this.parseTags,
height: 1,
hoverBg: this.mouse ? this.options.itemHoverBg : null
hoverBg: this.mouse ? this.options.itemHoverBg : null,
hoverEffects: this.mouse ? this.options.itemHoverEffects : null
};
['bg', 'fg', 'bold', 'underline',
'blink', 'inverse', 'invisible'].forEach(function(name) {
// TODO: Move all specific options to their own object namespaces.
var sname = 'selected' + name[0].toUpperCase() + name.substring(1);
options[name] = function() {
return self.items[self.selected] === item
? self[sname]
: self[name];
};
});
var item = new Box(options);
this.append(item);
this.items.push(item);
@ -2656,17 +2668,6 @@ List.prototype.select = function(index) {
if (this.selected === index && this._listInitialized) return;
this._listInitialized = true;
// TODO: Handle this a less stupid way.
['bg', 'fg', 'bold', 'underline',
'blink', 'inverse', 'invisible'].forEach(function(name) {
if (this.items[this.selected]) {
this.items[this.selected][name] = this[name];
}
this.items[index][name] = this['selected'
+ name.substring(0, 1).toUpperCase()
+ name.substring(1)];
}, this);
var diff = index - this.selected;
this.selected = index;
this.scroll(diff);
@ -4200,11 +4201,28 @@ function hsort(obj) {
}
function sattr(obj, fg, bg) {
return ((((obj.invisible ? 16 : 0) << 18)
| ((obj.inverse ? 8 : 0) << 18)
| ((obj.blink ? 4 : 0) << 18)
| ((obj.underline ? 2 : 0) << 18))
| ((obj.bold ? 1 : 0) << 18)
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();
if (typeof underline === 'function') underline = underline();
if (typeof blink === 'function') blink = blink();
if (typeof inverse === 'function') inverse = inverse();
if (typeof invisible === 'function') invisible = invisible();
if (typeof fg === 'function') fg = fg();
if (typeof bg === 'function') bg = bg();
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);
}