diff --git a/js/term/widgets/log.js b/js/term/widgets/log.js new file mode 100644 index 0000000..7739c05 --- /dev/null +++ b/js/term/widgets/log.js @@ -0,0 +1,207 @@ +/** + ** ============================== + ** O O O OOOO + ** O O O O O O + ** O O O O O O + ** OOOO OOOO O OOO OOOO + ** O O O O O O O + ** O O O O O O O + ** OOOO OOOO O O OOOO + ** ============================== + ** Dr. Stefan Bosse http://www.bsslab.de + ** + ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED + ** BY THE AUTHOR(S). + ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, + ** MODIFIED, OR OTHERWISE USED IN A CONTEXT + ** OUTSIDE OF THE SOFTWARE SYSTEM. + ** + ** $AUTHORS: Stefan Bosse + ** $INITIAL: (C) 2013-2016, Christopher Jeffrey and contributors + ** $MODIFIED: by sbosse + ** $REVESIO: 1.3.2 + ** + ** $INFO: + ** + ** Logging Widget with Scrollbars + ** + ** options: { + ** scrollOnInput:boolean -- auto scroll + ** arrows?: {up:'[-]',down:'[+]',width:3,height:1,fg:'red',bg:'default'}} + ** + ** Usage: + + if (options.top == undefined) options.top=2; + if (options.left == undefined) options.left=1; + var obj = blessed.log({ + top: options.top, + left: options.left, + width: options.width||(self.screen.width-options.left*2), + height: options.height||(self.screen.height-options.top-4), + label: options.label||'Log', + mouse:true, + keys:true, + scrollback:100, + border: { + type: 'line' + }, + scrollbar: { + ch: ' ', + track: { + bg: 'yellow' + }, + style: { + fg: 'cyan', + inverse: true + } + }, + alwaysScroll:true, + scrollOnInput:true, + style: { + fg: 'white', + bg: 'black', + border: { + fg: 'green' + }, + focus: { + border: { + fg: 'red' + } + } + } + }); + screen.append(obj); + + + ** $ENDOFINFO + */ + +var options = { + version:'1.3.2' +} +/** + * Modules + */ +var Comp = Require('com/compat'); + +var util = require('util'); +var Helpers = Require('term/helpers'); +var Button = Require('term/widgets/button'); +var Arrows = Require('term/widgets/arrows'); + +var nextTick = global.setImmediate || process.nextTick.bind(process); + +var Node = Require('term/widgets/node'); +var ScrollableText = Require('term/widgets/scrollabletext'); + +/** + * Log + */ + +function Log(options) { + var self = this, bbox; + + if (!instanceOf(this,Node)) { + return new Log(options); + } + + options = options || {}; + + ScrollableText.call(this, options); + + this.scrollback = options.scrollback != null + ? options.scrollback + : Infinity; + this.scrollOnInput = options.scrollOnInput; + this._updating=false; + + if (options.arrows) + Arrows( + self, + options, + function () { self.scroll(-2)}, + function () { self.scroll(2)} + ); + + this.on('set content', function() { + if (!self._updating && !self._userScrolled && self.scrollOnInput) { + self._updating=true; + setTimeout(function() { + self.setScrollPerc(100); + self._userScrolled = false; + self._updating=false; + self.screen.render(); + },20); + } + }); +} + +//Log.prototype.__proto__ = ScrollableText.prototype; +inheritPrototype(Log,ScrollableText); + +Log.prototype.type = 'log'; + +Log.prototype.log = +Log.prototype.add = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'object') { + args[0] = util.inspect(args[0], true, 20, true); + } + var text = util.format.apply(util, args); + this.emit('log', text); + var ret = this.pushLine(text); + + //if (this._clines.fake.length > this.scrollback) { + // this.shiftLine(0, (this.scrollback / 3) | 0); + // } + return ret; +}; + +Log.prototype.clear = function() { + if (this._userScrolled) this.setScrollPerc(100); + this.setContent(''); + this.resetScroll(); +} + +Log.prototype._scroll = Log.prototype.scroll; +Log.prototype.scroll = function(offset, always) { + if (offset>this.getScrollHeight() || (this.getScrollHeight()+offset)<0) return; + if (offset === 0) return this._scroll(offset, always); + this._userScrolled = true; + var ret = this._scroll(offset, always); + if (this.getScrollPerc() === 100) { + this._userScrolled = false; + } + return ret; +}; + +/** + * Expose + */ + +module.exports = Log; + + + +Log.prototype.logold = function(str) { + var i; + this.logLines.push(str) + if (this.logLines.length==1) { + this.setContent(str); + } + else if (this.logLines.length>this.options.bufferLength) { + this.logLines.shift(); + this.setContent(this.logLines[0]); + for(i=1;i