diff --git a/lib/widget.js b/lib/widget.js index cd52ec2..34fff1a 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -5697,7 +5697,8 @@ function Listbar(options) { options = options || {}; this.items = []; - this.commands = options.commands; + this.ritems = []; + this.commands = []; this.leftBase = 0; this.leftOffset = 0; @@ -5714,17 +5715,18 @@ function Listbar(options) { */ // XXX Make consistent with vertical lists. - if (this.style.selected) { - this.style.item = this.style.item || merge({}, this.style); - this.style.item.focus = this.style.selected; - } + //if (this.style.selected) { + // this.style.item = this.style.item || merge({}, this.style); + // this.style.item.focus = this.style.selected; + //} if (options.commands || options.items) { this.setItems(options.commands || options.items); } if (options.keys) { - this.on('element keypress', function(el, ch, key) { + this.on('keypress', function(ch, key) { + //this.on('element keypress', function(el, ch, key) { if (key.name === 'left' || (options.vi && key.name === 'h')) { self.sel(-1); self.screen.render(); @@ -5739,6 +5741,10 @@ function Listbar(options) { || (options.vi && key.name === 'k' && !key.shift)) { self.emit('action', self.items[self.selected], self.selected); self.emit('select', self.items[self.selected], self.selected); + var item = self.items[self.selected]; + //item.press(); + if (item._.cmd.callback) item._.cmd.callback(); + self.screen.render(); return; } if (key.name === 'escape' || (options.vi && key.name === 'q')) { @@ -5754,10 +5760,13 @@ function Listbar(options) { if (/^[0-9]$/.test(ch)) { var i = +ch - 1; if (!~i) i = 9; - var button = self.items[i]; - if (button) { - button.press(); - button.focus(); + var item = self.items[i]; + if (item) { + //item.press(); + //item.focus(); + if (item._.cmd.callback) item._.cmd.callback(); + self.select(i); + self.screen.render(); } } }); @@ -5765,7 +5774,8 @@ function Listbar(options) { this.on('focus', function() { if (self.items[self.selected]) { - self.items[self.selected].focus(); + //self.items[self.selected].focus(); + self.select(self.selected); } }); } @@ -5778,8 +5788,6 @@ Listbar.prototype.__defineGetter__('selected', function() { return this.leftBase + this.leftOffset; }); -Listbar.prototype.setOptions = -Listbar.prototype.setCommands = Listbar.prototype.setItems = function(commands) { if (Array.isArray(commands)) { commands = commands.reduce(function(obj, text, i) { @@ -5795,6 +5803,8 @@ Listbar.prototype.setItems = function(commands) { } }); + this.ritems = Object.keys(commands); + this.items.forEach(function(el) { el.detach(); }); @@ -5809,7 +5819,7 @@ Listbar.prototype.setItems = function(commands) { var cmd = commands[name] , title , len - , button; + , item; title = (cmd.prefix != null ? '{light-black-fg}' + cmd.prefix @@ -5819,7 +5829,7 @@ Listbar.prototype.setItems = function(commands) { len = ((cmd.prefix != null ? cmd.prefix + ':' : '') + name).length; - button = new Button({ + var options = { parent: self, top: 0, left: drawn + 1, @@ -5831,17 +5841,35 @@ Listbar.prototype.setItems = function(commands) { tags: true, mouse: true, style: merge({}, self.style.item) + //style: {} + }; + + if (self.screen.autoPadding) { + ; + } + + ['bg', 'fg', 'bold', 'underline', + 'blink', 'inverse', 'invisible'].forEach(function(name) { + options.style[name] = function() { + var attr = self.items[self.selected] === item + ? self.style.selected[name] + : self.style.item[name]; + if (typeof attr === 'function') attr = attr(item); + return attr; + }; }); - self._[name] = button; - cmd.element = button; - self.items.push(button); - button._.cmd = cmd; + item = new Button(options); + + self._[name] = item; + cmd.element = item; + self.items.push(item); + item._.cmd = cmd; if (cmd.callback) { - button.on('press', cmd.callback); + item.on('press', cmd.callback); if (cmd.keys) { - screen.key(cmd.keys, cmd.callback); + self.screen.key(cmd.keys, cmd.callback); } } @@ -5851,6 +5879,140 @@ Listbar.prototype.setItems = function(commands) { this.select(0); }; +Listbar.prototype.setItems = function(commands) { + var self = this; + + if (!Array.isArray(commands)) { + commands = Object.keys(commands).reduce(function(obj, key, i) { + var cmd = commands[key] + , cb; + + if (typeof cmd === 'function') { + cb = cmd; + cmd = { callback: cb }; + } + + if (cmd.text == null) cmd.text = key; + if (cmd.prefix == null) cmd.prefix = ++i + ''; + + if (cmd.text == null && cmd.callback) { + cmd.text = cmd.callback.name; + } + + obj.push(cmd); + + return obj; + }, []); + } + + this.items.forEach(function(el) { + el.detach(); + }); + + this.items = []; + this.ritems = []; + this.commands = []; + + commands.forEach(function(cmd) { + self.appendItem(cmd); + }); +}; + +Listbar.prototype.appendItem = function(item, callback) { + var self = this + , prev = this.items[this.items.length - 1] + , drawn = prev ? prev.left + prev.width : 0 + , cmd + , title + , len; + + if (typeof item === 'object') { + cmd = item; + } + + if (typeof item === 'string') { + cmd = { prefix: (this.items.length + 1) + '', text: item, callback: callback }; + } + + if (typeof item === 'function') { + cmd = { prefix: (this.items.length + 1) + '', text: item.name, callback: item }; + } + + title = (cmd.prefix != null ? '{light-black-fg}' + + cmd.prefix + + '{/light-black-fg}' + + ':' : '') + + cmd.text; + + len = ((cmd.prefix != null ? cmd.prefix + ':' : '') + cmd.text).length; + + var options = { + screen: this.screen, + top: 0, + left: drawn + 1, + height: 1, + content: title, + width: len + 2, + align: 'center', + autoFocus: false, + tags: true, + mouse: true, + style: merge({}, this.style.item) + }; + + if (this.screen.autoPadding) { + ; + } else { + options.top += this.itop; + options.left += this.ileft; + } + + ['bg', 'fg', 'bold', 'underline', + 'blink', 'inverse', 'invisible'].forEach(function(name) { + options.style[name] = function() { + var attr = self.items[self.selected] === el + ? self.style.selected[name] + : self.style.item[name]; + if (typeof attr === 'function') attr = attr(el); + return attr; + }; + }); + + var el = new Button(options); + + this._[cmd.text] = el; + cmd.element = el; + el._.cmd = cmd; + + this.ritems.push(cmd.text); + this.items.push(el); + this.commands.push(cmd); + this.append(el); + + if (cmd.callback) { + el.on('press', cmd.callback); + if (cmd.keys) { + this.screen.key(cmd.keys, cmd.callback); + } + } + + if (this.items.length === 1) { + this.select(0); + } + + if (0) if (this.mouse) { + el.on('click', function(data) { + if (self.items[self.selected] === el) { + self.emit('action', el, self.selected); + self.emit('select', el, self.selected); + return; + } + self.select(el); + self.screen.render(); + }); + } +}; + Listbar.prototype.render = function() { var self = this , drawn = 0; @@ -5924,7 +6086,7 @@ Listbar.prototype.select = function(offset) { }, null, 2)); */ - el.focus(); + //el.focus(); }; Listbar.prototype.sel = function(i) {