all files / lib/ui/ PaneList.js

67.19% Statements 43/64
21.05% Branches 4/19
50% Functions 7/14
76.36% Lines 42/55
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106                                                                                                 25×                                
var _ = require('lodash');
 
var util = require('slap-util');
var BaseWidget = require('base-widget');
 
var Pane = require('./Pane');
var Slap = require('./Slap');
 
PaneList.prototype.__proto__ = Pane.prototype;
function PaneList (opts) {
  var self = this;
 
  Iif (!(self instanceof PaneList)) return new PaneList(opts);
 
  Pane.call(self, _.merge({}, Slap.global.options.paneList, opts));
 
  self.topContent = new BaseWidget(_.merge({
    parent: self,
    tags: true,
    shrink: true,
    top: 1,
    left: 'center',
    style: self.options.style
  }, self.options.topContent));
 
  var listOpts = _.merge({
    parent: self,
    mouse: true,
    keys: true,
    focusable: true,
    tags: true,
    top: 3,
    style: self.options.style
  }, self.options.list);
  self.list = new BaseWidget.blessed.List(listOpts);
  BaseWidget.call(self.list, listOpts);
}
 
PaneList.prototype.close = function () {
  // Don't actually close anything, just act closed and maybe setFront another pane
  var self = this;
  var slap = self.screen.slap;
  if (self === slap.getCurrentPane()) {
    var prevPane = slap.getPrevPane();
    if (prevPane) prevPane.setCurrent();
  }
  return true;
};
 
PaneList.prototype.getTitle = function () {
  return util.markup("<PaneList>", this.style.paneList).toString();
};
 
PaneList.prototype._initHandlers = function () {
  var self = this;
  var slap = self.screen.slap;
 
  self.on('element mousedown', function (el) { self.focus(); });
 
  slap.on('element keypress', function (el, ch, key) {
    if (!(el === self || el.hasAncestor(self))) return;
    switch (self.resolveBinding(key)) {
      case 'cancel':
        var prevPane = slap.getPrevPane();
        if (prevPane) prevPane.setCurrent();
        return false;
    }
  });
 
  self.on('focus', function () { self.screen.program.hideCursor(); });
 
  self.update();
  ['adopt', 'remove'].forEach(function (evt) {
    slap.on('element '+evt, function (parent, child) {
      Iif (child instanceof Pane) setImmediate(function () { self.update(); });
    });
  });
 
  self.list.on('select', function (_, i) {
    slap._stopKeyPropagation().then(function () {
      slap.panes[i].setCurrent();
    });
  });
 
  return Pane.prototype._initHandlers.apply(self, arguments);
};
PaneList.prototype.update = function () {
  var self = this;
  var slap = self.screen.slap;
 
  var list = self.list;
  var items = slap.panes.reduce(function (items, pane) {
    var title = pane.getTitle();
    Eif (title !== null) items.push(title);
    return items;
  }, []);
  list.setItems(items);
 
  var topContent = self.topContent;
  topContent.setContent(items.length+" pane"+(items.length === 1 ? '' : 's')+" open");
 
  return self;
};
 
module.exports = PaneList;