docs. keys. misc.
This commit is contained in:
parent
b92c0b7758
commit
87a5188de9
66
README.md
66
README.md
|
@ -103,10 +103,8 @@ box.on('click', function(data) {
|
||||||
screen.render();
|
screen.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
screen.on('keypress', function(ch, key) {
|
screen.key('escape', function(ch, key) {
|
||||||
if (key.name === 'escape') {
|
return process.exit(0);
|
||||||
return process.exit(0);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
screen.render();
|
screen.render();
|
||||||
|
@ -159,6 +157,8 @@ The base node which everything inherits from.
|
||||||
- **detach()** - remove node from its parent.
|
- **detach()** - remove node from its parent.
|
||||||
- **emitDescendants(type, args..., [iterator])** - emit event for element, and
|
- **emitDescendants(type, args..., [iterator])** - emit event for element, and
|
||||||
recursively emit same event for all descendants.
|
recursively emit same event for all descendants.
|
||||||
|
- **get(name, [default])** - get user property with a potential default value.
|
||||||
|
- **set(name, value)** - set user property to value.
|
||||||
|
|
||||||
|
|
||||||
#### Screen (from Node)
|
#### Screen (from Node)
|
||||||
|
@ -218,11 +218,24 @@ The screen on which every other node renders.
|
||||||
- **saveFocus()** - save the focused element.
|
- **saveFocus()** - save the focused element.
|
||||||
- **restoreFocus()** - restore the saved focused element.
|
- **restoreFocus()** - restore the saved focused element.
|
||||||
- **key(name, listener)** - bind a keypress listener for a specific key.
|
- **key(name, listener)** - bind a keypress listener for a specific key.
|
||||||
|
- **onceKey(name, listener)** - bind a keypress listener for a specific key
|
||||||
|
once.
|
||||||
|
- **unkey(name, listener)** - remove a keypress listener for a specific key.
|
||||||
- **spawn(file, args, options)** - spawn a process in the foreground, return to
|
- **spawn(file, args, options)** - spawn a process in the foreground, return to
|
||||||
blessed app after exit.
|
blessed app after exit.
|
||||||
- **exec(file, args, options, callback)** - spawn a process in the foreground,
|
- **exec(file, args, options, callback)** - spawn a process in the foreground,
|
||||||
return to blessed app after exit. executes callback on error or exit.
|
return to blessed app after exit. executes callback on error or exit.
|
||||||
- **readEditor([options], callback)** - read data from text editor.
|
- **readEditor([options], callback)** - read data from text editor.
|
||||||
|
- **setEffects(el, fel, over, out, effects, temp)** - set effects based on
|
||||||
|
two events and attributes.
|
||||||
|
- **insertLine(n, y, top, bottom)** - insert a line into the screen (using csr:
|
||||||
|
this bypasses the output buffer).
|
||||||
|
- **deleteLine(n, y, top, bottom)** - delete a line from the screen (using csr:
|
||||||
|
this bypasses the output buffer).
|
||||||
|
- **insertBottom(top, bottom)** - insert a line at the bottom of the screen.
|
||||||
|
- **insertTop(top, bottom)** - insert a line at the top of the screen.
|
||||||
|
- **deleteBottom(top, bottom)** - delete a line at the bottom of the screen.
|
||||||
|
- **deleteTop(top, bottom)** - delete a line at the top of the screen.
|
||||||
|
|
||||||
|
|
||||||
#### Element (from Node)
|
#### Element (from Node)
|
||||||
|
@ -291,13 +304,54 @@ The base element.
|
||||||
- **toggle()** - toggle hidden/shown.
|
- **toggle()** - toggle hidden/shown.
|
||||||
- **focus()** - focus element.
|
- **focus()** - focus element.
|
||||||
- **key(name, listener)** - bind a keypress listener for a specific key.
|
- **key(name, listener)** - bind a keypress listener for a specific key.
|
||||||
|
- **onceKey(name, listener)** - bind a keypress listener for a specific key
|
||||||
|
once.
|
||||||
|
- **unkey(name, listener)** - remove a keypress listener for a specific key.
|
||||||
|
- **onScreenEvent(type, listener)** - same as`el.on('screen', ...)` except this
|
||||||
|
will automatically cleanup listeners after the element is detached.
|
||||||
|
|
||||||
|
|
||||||
#### Box (from Element)
|
#### Box (from Element)
|
||||||
|
|
||||||
A box element which draws a simple box containing `content` or other elements.
|
A box element which draws a simple box containing `content` or other elements.
|
||||||
|
|
||||||
Inherits all options, properties, events, and methods from Element.
|
##### Options:
|
||||||
|
|
||||||
|
- inherits all from Element.
|
||||||
|
|
||||||
|
##### Properties:
|
||||||
|
|
||||||
|
- inherits all from Element.
|
||||||
|
|
||||||
|
##### Events:
|
||||||
|
|
||||||
|
- inherits all from Element.
|
||||||
|
|
||||||
|
##### Methods:
|
||||||
|
|
||||||
|
- inherits all from Element.
|
||||||
|
- **insertLine(i, line)** - insert a line into the box's content.
|
||||||
|
- **deleteLine(i)** - delete a line from the box's content.
|
||||||
|
- **getLine(i)** - get a line from the box's content.
|
||||||
|
- **setLine(i, line)** - set a line in the box's content.
|
||||||
|
- **clearLine(i)** - clear a line from the box's content.
|
||||||
|
- **insertTop(line)** - insert a line at the top of the box.
|
||||||
|
- **insertBottom(line)** - insert a line at the bottom of the box.
|
||||||
|
- **deleteTop()** - delete a line at the top of the box.
|
||||||
|
- **deleteBottom()** - delete a line at the bottom of the box.
|
||||||
|
|
||||||
|
|
||||||
|
#### Line (from Box)
|
||||||
|
|
||||||
|
A simple line which can be `ascii` or `bg` styled.
|
||||||
|
|
||||||
|
##### Options:
|
||||||
|
|
||||||
|
- inherits all from Box.
|
||||||
|
- **orientation** - can be `vertical` or `horizontal`.
|
||||||
|
- **type, bg, fg, ch** - treated the same as a border object.
|
||||||
|
|
||||||
|
Inherits all options, properties, events, and methods from Box.
|
||||||
|
|
||||||
|
|
||||||
#### Text (from Element)
|
#### Text (from Element)
|
||||||
|
@ -646,6 +700,7 @@ box.setContent('line 1\nline 2');
|
||||||
box.insertBottom('line 3');
|
box.insertBottom('line 3');
|
||||||
box.insertBottom('line 4');
|
box.insertBottom('line 4');
|
||||||
box.insertTop('line 0');
|
box.insertTop('line 0');
|
||||||
|
box.insertLine(1, 'line 1.5');
|
||||||
```
|
```
|
||||||
|
|
||||||
If your element has the same width as the screen, the line insertion will be
|
If your element has the same width as the screen, the line insertion will be
|
||||||
|
@ -658,6 +713,7 @@ Outputting:
|
||||||
```
|
```
|
||||||
| line 0 |
|
| line 0 |
|
||||||
| line 1 |
|
| line 1 |
|
||||||
|
| line 1.5 |
|
||||||
| line 2 |
|
| line 2 |
|
||||||
| line 3 |
|
| line 3 |
|
||||||
| line 4 |
|
| line 4 |
|
||||||
|
|
|
@ -128,13 +128,23 @@ Program.prototype.listen = function() {
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
this.input.on('keypress', function(ch, key) {
|
this.input.on('keypress', function(ch, key) {
|
||||||
key = key || 0;
|
key = key || { ch: ch };
|
||||||
|
|
||||||
if (key.name === 'undefined'
|
if (key.name === 'undefined'
|
||||||
&& (key.code === '[M' || key.code === '[I' || key.code === '[O')) {
|
&& (key.code === '[M' || key.code === '[I' || key.code === '[O')) {
|
||||||
// A mouse sequence. The readline module doesn't understand these.
|
// A mouse sequence. The readline module doesn't understand these.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var name = (key.ctrl ? 'C-' : '')
|
||||||
|
+ (key.meta ? 'M-' : '')
|
||||||
|
+ (key.shift && key.name ? 'S-' : '')
|
||||||
|
+ (key.name || ch);
|
||||||
|
|
||||||
|
key.full = name;
|
||||||
|
|
||||||
self.emit('keypress', ch, key);
|
self.emit('keypress', ch, key);
|
||||||
|
self.emit('key ' + name, ch, key);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.input.on('data', function(data) {
|
this.input.on('data', function(data) {
|
||||||
|
|
|
@ -201,6 +201,17 @@ Node.prototype.gon = function(type, callback) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Node.prototype.get = function(name, value) {
|
||||||
|
if (this.data.hasOwnProperty(name)) {
|
||||||
|
return this.data[name];
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
Node.prototype.set = function(name, value) {
|
||||||
|
return this.data[name] = value;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Screen
|
* Screen
|
||||||
*/
|
*/
|
||||||
|
@ -295,6 +306,18 @@ function Screen(options) {
|
||||||
if (type === 'keypress' || type.indexOf('key ') === 0) self._listenKeys();
|
if (type === 'keypress' || type.indexOf('key ') === 0) self._listenKeys();
|
||||||
if (type === 'mouse') self._listenMouse();
|
if (type === 'mouse') self._listenMouse();
|
||||||
}
|
}
|
||||||
|
if (type === 'mouse'
|
||||||
|
|| type === 'click'
|
||||||
|
|| type === 'mouseover'
|
||||||
|
|| type === 'mouseout'
|
||||||
|
|| type === 'mousedown'
|
||||||
|
|| type === 'mouseup'
|
||||||
|
|| type === 'mousewheel'
|
||||||
|
|| type === 'wheeldown'
|
||||||
|
|| type === 'wheelup'
|
||||||
|
|| type === 'mousemove') {
|
||||||
|
self._listenMouse();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,7 +442,7 @@ Screen.prototype._listenKeys = function(el) {
|
||||||
|
|
||||||
if (!grabKeys) {
|
if (!grabKeys) {
|
||||||
self.emit('keypress', ch, key);
|
self.emit('keypress', ch, key);
|
||||||
self.emit('key ' + (key.name || ch), ch, key);
|
self.emit('key ' + key.full, ch, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If something changed from the screen key handler, stop.
|
// If something changed from the screen key handler, stop.
|
||||||
|
@ -429,9 +452,9 @@ Screen.prototype._listenKeys = function(el) {
|
||||||
|
|
||||||
if (~self.input.indexOf(focused)) {
|
if (~self.input.indexOf(focused)) {
|
||||||
focused.emit('keypress', ch, key);
|
focused.emit('keypress', ch, key);
|
||||||
focused.emit('key ' + (key.name || ch), ch, key);
|
focused.emit('key ' + key.full, ch, key);
|
||||||
// self.emit('element keypress', focused, ch, key);
|
// self.emit('element keypress', focused, ch, key);
|
||||||
// self.emit('element key ' + (key.name || ch), focused, ch, key);
|
// self.emit('element key ' + key.full, focused, ch, key);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -804,16 +827,25 @@ Screen.prototype.fillRegion = function(attr, ch, xi, xl, yi, yl) {
|
||||||
};
|
};
|
||||||
|
|
||||||
Screen.prototype.key = function(key, listener) {
|
Screen.prototype.key = function(key, listener) {
|
||||||
return this.on('key ' + key, listener);
|
if (typeof key === 'string') key = [key];
|
||||||
|
key.forEach(function(key) {
|
||||||
|
return this.on('key ' + key, listener);
|
||||||
|
}, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
Screen.prototype.onceKey = function(key, listener) {
|
Screen.prototype.onceKey = function(key, listener) {
|
||||||
return this.once('key ' + key, listener);
|
if (typeof key === 'string') key = [key];
|
||||||
|
key.forEach(function(key) {
|
||||||
|
return this.once('key ' + key, listener);
|
||||||
|
}, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
Screen.prototype.unkey =
|
Screen.prototype.unkey =
|
||||||
Screen.prototype.removeKey = function(key, listener) {
|
Screen.prototype.removeKey = function(key, listener) {
|
||||||
return this.removeListener('key ' + key, listener);
|
if (typeof key === 'string') key = [key];
|
||||||
|
key.forEach(function(key) {
|
||||||
|
return this.removeListener('key ' + key, listener);
|
||||||
|
}, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
Screen.prototype.spawn = function(file, args, options) {
|
Screen.prototype.spawn = function(file, args, options) {
|
||||||
|
@ -1216,8 +1248,17 @@ Element.prototype.__defineGetter__('detached', function() {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
Element.prototype.key = function(key, listener) {
|
Element.prototype.key = function() {
|
||||||
return this.on('key ' + key, listener);
|
return Screen.prototype.key.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
Element.prototype.onceKey = function() {
|
||||||
|
return Screen.prototype.onceKey.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
Element.prototype.unkey =
|
||||||
|
Element.prototype.removeKey = function() {
|
||||||
|
return Screen.prototype.unkey.apply(this, arguments);
|
||||||
};
|
};
|
||||||
|
|
||||||
Element.prototype.clearPos = function() {
|
Element.prototype.clearPos = function() {
|
||||||
|
@ -2767,7 +2808,7 @@ function Button(options) {
|
||||||
self.press();
|
self.press();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.options.effects) {
|
if (this.options.defaultEffects) {
|
||||||
this.on('mouseover', function() {
|
this.on('mouseover', function() {
|
||||||
self.inverse = !self.options.inverse;
|
self.inverse = !self.options.inverse;
|
||||||
self.screen.render();
|
self.screen.render();
|
||||||
|
@ -2793,7 +2834,7 @@ Button.prototype.type = 'button';
|
||||||
Button.prototype.press = function() {
|
Button.prototype.press = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.emit('press');
|
this.emit('press');
|
||||||
if (this.border && this.options.effects) {
|
if (this.border && this.options.defaultEffects) {
|
||||||
var color = this.border.fg;
|
var color = this.border.fg;
|
||||||
this.border.fg = 2;
|
this.border.fg = 2;
|
||||||
this.screen.render();
|
this.screen.render();
|
||||||
|
@ -2985,6 +3026,14 @@ function sp(line, width, align) {
|
||||||
// But `jjjj` is:
|
// But `jjjj` is:
|
||||||
// |jj |
|
// |jj |
|
||||||
// |jj |
|
// |jj |
|
||||||
|
// A possibly related bug:
|
||||||
|
// For some reason (see jitsu-ui):
|
||||||
|
// {red-fg}my-app2{/red-fg} gets wrapped to:
|
||||||
|
// {red-fg}my-app\n2{/red-fg} when my-app2
|
||||||
|
// does not. Since escape codes are not printable
|
||||||
|
// characters, this means wrapContent is doing
|
||||||
|
// something wrong and determining length including
|
||||||
|
// at least 1 char from the escape code.
|
||||||
function wrapContent(content, width, tags, state) {
|
function wrapContent(content, width, tags, state) {
|
||||||
var lines = content.split('\n')
|
var lines = content.split('\n')
|
||||||
, out = [];
|
, out = [];
|
||||||
|
|
Loading…
Reference in New Issue