major cleanup. remove old code.
This commit is contained in:
parent
f431e98c03
commit
4f0f9e53d7
|
@ -146,6 +146,8 @@ The base node which everything inherits from.
|
|||
- **append(node)** - append a node to this node's children.
|
||||
- **remove(node)** - remove child node from node.
|
||||
- **detach()** - remove node from its parent.
|
||||
- **emitDescendants(type, args..., [iterator])** - emit event for element, and
|
||||
recursively emit same event for all descendants.
|
||||
|
||||
|
||||
#### Screen (from Node)
|
||||
|
|
234
lib/widget.js
234
lib/widget.js
|
@ -68,6 +68,10 @@ Node.prototype.prepend = function(element) {
|
|||
el.emit('attach');
|
||||
if (el.children) el.children.forEach(emit);
|
||||
})(element);
|
||||
|
||||
//element.emitDescendants('attach', function(el) {
|
||||
// el._detached = false;
|
||||
//});
|
||||
};
|
||||
|
||||
Node.prototype.append = function(element) {
|
||||
|
@ -92,6 +96,10 @@ Node.prototype.append = function(element) {
|
|||
el.emit('attach');
|
||||
if (el.children) el.children.forEach(emit);
|
||||
})(element);
|
||||
|
||||
//element.emitDescendants('attach', function(el) {
|
||||
// el._detached = false;
|
||||
//});
|
||||
};
|
||||
|
||||
Node.prototype.remove = function(element) {
|
||||
|
@ -121,12 +129,33 @@ Node.prototype.remove = function(element) {
|
|||
el.emit('detach');
|
||||
if (el.children) el.children.forEach(emit);
|
||||
})(element);
|
||||
|
||||
//element.emitDescendants('detach', function(el) {
|
||||
// el._detached = true;
|
||||
//});
|
||||
};
|
||||
|
||||
Node.prototype.detach = function(element) {
|
||||
this.parent.remove(element);
|
||||
};
|
||||
|
||||
Node.prototype.emitDescendants = function() {
|
||||
var args = Array.prototype.slice(arguments)
|
||||
, iter;
|
||||
|
||||
if (typeof args[args.length-1] === 'function') {
|
||||
iter = args.pop();
|
||||
}
|
||||
|
||||
(function emit(el) {
|
||||
if (iter) iter(el);
|
||||
el.emit.apply(el, args);
|
||||
if (el.children) {
|
||||
el.children.forEach(emit);
|
||||
}
|
||||
})(this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Screen
|
||||
*/
|
||||
|
@ -735,7 +764,9 @@ function Element(options) {
|
|||
|
||||
this.parseTags = options.parseTags || options.tags;
|
||||
// TODO: Maybe simply set _pcontent with _parseTags result.
|
||||
this.content = this._parseTags(options.content || '');
|
||||
//this.content = this._parseTags(options.content || '');
|
||||
|
||||
this.setContent(options.content || '');
|
||||
|
||||
if (options.label) {
|
||||
this.append(new Box({
|
||||
|
@ -777,15 +808,7 @@ function Element(options) {
|
|||
self.parseContent();
|
||||
});
|
||||
|
||||
this.parseContent();
|
||||
|
||||
//if (this.parent) {
|
||||
// this.parseContent();
|
||||
//} else {
|
||||
// this.once('reparent', function() {
|
||||
// self.parseContent();
|
||||
// });
|
||||
//}
|
||||
//this.parseContent();
|
||||
}
|
||||
|
||||
Element.prototype.__proto__ = Node.prototype;
|
||||
|
@ -808,17 +831,19 @@ Element.prototype.emit = function(type) {
|
|||
*/
|
||||
|
||||
Element.prototype.parseContent = function() {
|
||||
if (!this.content) return;
|
||||
if (this.detached) return;
|
||||
if (this.detached) return false;
|
||||
|
||||
var w = this.width - (this.border ? 2 : 0);
|
||||
if (this._clines == null
|
||||
|| this._clines.width !== w
|
||||
|| this._clines.content !== this.content) {
|
||||
this._clines = wrapContent(this.content, w, this.align);
|
||||
this._clines.width = w;
|
||||
this._clines.content = this.content;
|
||||
this._pcontent = this._clines.join('\n');
|
||||
this.emit('parsed content');
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
Element.prototype.hide = function() {
|
||||
|
@ -858,14 +883,14 @@ Element.prototype.focus = function() {
|
|||
this.screen.emit('element focus', old, this);
|
||||
};
|
||||
|
||||
Element.prototype.setContent = function(content) {
|
||||
Element.prototype.setContent = function(content, noClear) {
|
||||
//var ret = this.render(true);
|
||||
var ret = this._lastPos;
|
||||
// TODO: Maybe simply set _pcontent with _parseTags result.
|
||||
// text = text.replace(/\x1b(?!\[[\d;]*m)/g, '');
|
||||
this.content = this._parseTags(content || '');
|
||||
this.parseContent();
|
||||
if (ret) {
|
||||
if (ret && !noClear) {
|
||||
//if (ret && !this.hidden) {
|
||||
this.screen.clearRegion(ret.xi, ret.xl, ret.yi, ret.yl);
|
||||
}
|
||||
|
@ -1213,23 +1238,12 @@ Box.prototype.__proto__ = Element.prototype;
|
|||
|
||||
// TODO: Optimize. Move elsewhere.
|
||||
Box.prototype._getShrinkSize = function(content) {
|
||||
if (this._clines) {
|
||||
return {
|
||||
height: this._clines.length,
|
||||
width: this._clines.reduce(function(current, line) {
|
||||
line = line.replace(/\x1b\[[\d;]*m/g, '');
|
||||
return line.length > current
|
||||
? line.length //+ (lines.length > 1 ? 1 : 0) // for newlines
|
||||
: current;
|
||||
}, 0)
|
||||
};
|
||||
}
|
||||
var lines = content.replace(/\x1b\[[\d;]*m/g, '').split('\n');
|
||||
return {
|
||||
height: lines.length,
|
||||
width: lines.reduce(function(current, line) {
|
||||
height: this._clines.length,
|
||||
width: this._clines.reduce(function(current, line) {
|
||||
line = line.replace(/\x1b\[[\d;]*m/g, '');
|
||||
return line.length > current
|
||||
? line.length //+ (lines.length > 1 ? 1 : 0) // for newlines
|
||||
? line.length
|
||||
: current;
|
||||
}, 0)
|
||||
};
|
||||
|
@ -1242,6 +1256,8 @@ Box.prototype.render = function(stop) {
|
|||
// NOTE: Maybe move this `hidden` check down below `stop` check and return `ret`.
|
||||
if (this.hidden) return;
|
||||
|
||||
this.parseContent();
|
||||
|
||||
var lines = this.screen.lines
|
||||
, xi_ = this.left
|
||||
, xi
|
||||
|
@ -1282,86 +1298,6 @@ Box.prototype.render = function(stop) {
|
|||
}
|
||||
}
|
||||
|
||||
// NOTE: Could simply change some offsets around and move this below the
|
||||
// shrink block. Could also stop passing a string to _getShrinkSize.
|
||||
/*
|
||||
if (this.align === 'center' || this.align === 'right') {
|
||||
content = '{' + this.align + '}' + content + '{/' + this.align + '}';
|
||||
} else
|
||||
*/
|
||||
|
||||
/*
|
||||
if (this.align === 'center' || this.align === 'right') {
|
||||
var ncontent = content.replace(/\x1b\[[\d;]*m/g, '')
|
||||
, width = this.width - (this.border ? 2 : 0) - this.padding * 2;
|
||||
if (ncontent.length < width) {
|
||||
var s = width - ncontent.length;
|
||||
if (this.align === 'center') {
|
||||
s = Array(((s / 2 | 0) - (this.border ? 1 : 0)) + 1).join(' ');
|
||||
content = s + content + (this.shrink ? s : '');
|
||||
//s = (s / 2 | 0) - (this.border ? 1 : 0);
|
||||
//ci -= s;
|
||||
//xl += s * 2;
|
||||
} else {
|
||||
s -= this.left; // this shouldn't be necessary
|
||||
s = Array((s - (this.border ? 2 : 0)) + 1).join(' ');
|
||||
content = s + content;
|
||||
//s = s - (this.border ? 2 : 0);
|
||||
//ci -= s;
|
||||
//xl += s;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
//if (!this._pcontent && this.content) {
|
||||
// this._clines = wrapContent(this.content, this.width - (this.border ? 2 : 0));
|
||||
// this._pcontent = this._clines.join('\n');
|
||||
// content = this._pcontent;
|
||||
// //content = wrapContent(this.content, this.width - (this.border ? 2 : 0)).join('\n');
|
||||
//}
|
||||
|
||||
/*
|
||||
if (this.tags || this.align) {
|
||||
var self = this;
|
||||
content = content.replace(/(^|\n){(center|right)}([^\0]+?){\/\2}(?=\n|$)/g, function(_, start, align, text) {
|
||||
var lines = text.trim().split('\n')
|
||||
, line
|
||||
, i = 0
|
||||
, width = self.width - (self.border ? 2 : 0) - self.padding * 2
|
||||
, out = ''
|
||||
, len
|
||||
, s;
|
||||
|
||||
for (; i < lines.length; i++) {
|
||||
line = lines[i];
|
||||
len = line.replace(/\x1b\[[\d;]*m/g, '').length;
|
||||
s = width - len;
|
||||
|
||||
if (s < 0) {
|
||||
out += '\n' + line;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (align === 'center') {
|
||||
s = Array(((s / 2 | 0) - (self.border ? 1 : 0)) + 1).join(' ');
|
||||
out += '\n' + s + line + (self.shrink ? s : '');
|
||||
} else {
|
||||
s -= self.left; // this shouldn't be necessary
|
||||
s = Array((s - (self.border ? 2 : 0)) + 1).join(' ');
|
||||
out += '\n' + s + line;
|
||||
}
|
||||
}
|
||||
|
||||
if (out[0] === '\n' && !start) {
|
||||
out = out.substring(1);
|
||||
}
|
||||
|
||||
return out;
|
||||
});
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Check for 'center', recalculate yi, and xi. Better yet, simply
|
||||
// move this check into this.left/width/etc.
|
||||
if (this.shrink) {
|
||||
|
@ -1375,17 +1311,15 @@ Box.prototype.render = function(stop) {
|
|||
xl = xi_ + w + (this.border ? 2 : 0) + this.padding;
|
||||
//xl++; // make it one cell wider for newlines
|
||||
}
|
||||
if (this.options.top == null && this.options.bottom != null) {
|
||||
yi_ = yl - h - (this.border ? 2 : 0) - this.padding;
|
||||
} else {
|
||||
yl = yi_ + h + (this.border ? 2 : 0) + this.padding;
|
||||
if (this.childBase == null) {
|
||||
if (this.options.top == null && this.options.bottom != null) {
|
||||
yi_ = yl - h - (this.border ? 2 : 0) - this.padding;
|
||||
} else {
|
||||
yl = yi_ + h + (this.border ? 2 : 0) + this.padding;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//if (this.options.vshrink && this._clines) {
|
||||
// yl = yi_ + this._clines.length + (this.border ? 2 : 0) + this.padding;
|
||||
//}
|
||||
|
||||
var ret = this._lastPos = {
|
||||
xi: xi_,
|
||||
xl: xl,
|
||||
|
@ -1936,29 +1870,9 @@ function ScrollableText(options) {
|
|||
});
|
||||
}
|
||||
|
||||
/*
|
||||
this.screen.on('resize', function() {
|
||||
this.on('parsed content', function() {
|
||||
self._recalculateIndex();
|
||||
});
|
||||
|
||||
this.on('resize', function() {
|
||||
self._recalculateIndex();
|
||||
});
|
||||
|
||||
//this._clines = [];
|
||||
//this._pcontent = '';
|
||||
this.contentIndex = 0;
|
||||
|
||||
// Not technically necessary, but can't hurt.
|
||||
this._recalculateIndex();
|
||||
|
||||
if (!this.parent) {
|
||||
// Not technically necessary, but can't hurt.
|
||||
this.once('reparent', function() {
|
||||
self._recalculateIndex();
|
||||
});
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
ScrollableText.prototype.__proto__ = ScrollableBox.prototype;
|
||||
|
@ -1980,13 +1894,7 @@ ScrollableText.prototype.scroll = function(offset) {
|
|||
// feeds. This allows us to take preformatted text output from other programs
|
||||
// and put it in a scrollable text box.
|
||||
if (this.content != null) {
|
||||
this._parseContent();
|
||||
//w = this.width - (this.border ? 2 : 0);
|
||||
//if (this._clines == null || this._clines.width !== w) {
|
||||
// this._clines = wrapContent(this.content, w);
|
||||
// this._clines.content = this.content;
|
||||
// this._pcontent = this._clines.join('\n');
|
||||
//}
|
||||
this.parseContent();
|
||||
|
||||
max = this._clines.length - 1 - (this.height - (this.border ? 2 : 0));
|
||||
if (max < 0) max = 0;
|
||||
|
@ -2006,17 +1914,8 @@ ScrollableText.prototype.scroll = function(offset) {
|
|||
return ret;
|
||||
};
|
||||
|
||||
ScrollableText.prototype._setContent = ScrollableText.prototype.setContent;
|
||||
ScrollableText.prototype.setContent = function(content) {
|
||||
var ret = this._setContent(content);
|
||||
//this._recalculateIndex();
|
||||
return ret;
|
||||
};
|
||||
|
||||
ScrollableText.prototype._recalculateIndex = function() {
|
||||
if (this.detached) return;
|
||||
//this._clines = wrapContent(this.content, this.width - (this.border ? 2 : 0));
|
||||
//this._pcontent = this._clines.join('\n');
|
||||
|
||||
var max = this._clines.length - 1 - (this.height - (this.border ? 2 : 0));
|
||||
if (max < 0) max = 0;
|
||||
|
@ -2031,14 +1930,6 @@ ScrollableText.prototype._recalculateIndex = function() {
|
|||
this.contentIndex = t;
|
||||
};
|
||||
|
||||
ScrollableText.prototype._parseContent = ScrollableText.prototype.parseContent;
|
||||
ScrollableText.prototype.parseContent = function(content) {
|
||||
var ret = this._parseContent();
|
||||
this._recalculateIndex();
|
||||
return ret;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Input
|
||||
*/
|
||||
|
@ -2139,10 +2030,11 @@ Textbox.prototype._listener = function(ch, key) {
|
|||
Textbox.prototype._render = Input.prototype.render;
|
||||
Textbox.prototype.render = function(stop) {
|
||||
var content = this.content;
|
||||
// NOTE: This workaround will never work with _pcontent.
|
||||
this.content = this.content.slice(-(this.width - (this.border ? 2 : 0) - 1));
|
||||
//this.content = this.content.slice(-(this.width - (this.border ? 2 : 0) - 1));
|
||||
this.setContent(content.slice(-(this.width - (this.border ? 2 : 0) - 1)), true);
|
||||
var ret = this._render(stop);
|
||||
this.content = content;
|
||||
//this.content = content;
|
||||
this.setContent(content, true);
|
||||
if (stop) return ret;
|
||||
return ret;
|
||||
};
|
||||
|
@ -2451,6 +2343,13 @@ function wrapContent(content, width, state) {
|
|||
var lines = content.split('\n')
|
||||
, out = [];
|
||||
|
||||
if (!content) {
|
||||
out.width = width;
|
||||
out.content = content || '';
|
||||
out.push(content || '');
|
||||
return out;
|
||||
}
|
||||
|
||||
lines.forEach(function(line) {
|
||||
var align = state
|
||||
, cap;
|
||||
|
@ -2517,6 +2416,7 @@ function wrapContent(content, width, state) {
|
|||
});
|
||||
|
||||
out.width = width;
|
||||
out.content = content;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue