log.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * log.js - log element for blessed
  3. * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).
  4. * https://github.com/chjj/blessed
  5. */
  6. /**
  7. * Modules
  8. */
  9. var util = require('util');
  10. var nextTick = global.setImmediate || process.nextTick.bind(process);
  11. var Node = require('./node');
  12. var ScrollableText = require('./scrollabletext');
  13. /**
  14. * Log
  15. */
  16. function Log(options) {
  17. var self = this;
  18. if (!(this instanceof Node)) {
  19. return new Log(options);
  20. }
  21. options = options || {};
  22. ScrollableText.call(this, options);
  23. this.scrollback = options.scrollback != null
  24. ? options.scrollback
  25. : Infinity;
  26. this.scrollOnInput = options.scrollOnInput;
  27. this.on('set content', function() {
  28. if (!self._userScrolled || self.scrollOnInput) {
  29. nextTick(function() {
  30. self.setScrollPerc(100);
  31. self._userScrolled = false;
  32. self.screen.render();
  33. });
  34. }
  35. });
  36. }
  37. Log.prototype.__proto__ = ScrollableText.prototype;
  38. Log.prototype.type = 'log';
  39. Log.prototype.log =
  40. Log.prototype.add = function() {
  41. var args = Array.prototype.slice.call(arguments);
  42. if (typeof args[0] === 'object') {
  43. args[0] = util.inspect(args[0], true, 20, true);
  44. }
  45. var text = util.format.apply(util, args);
  46. this.emit('log', text);
  47. var ret = this.pushLine(text);
  48. if (this._clines.fake.length > this.scrollback) {
  49. this.shiftLine(0, (this.scrollback / 3) | 0);
  50. }
  51. return ret;
  52. };
  53. Log.prototype._scroll = Log.prototype.scroll;
  54. Log.prototype.scroll = function(offset, always) {
  55. if (offset === 0) return this._scroll(offset, always);
  56. this._userScrolled = true;
  57. var ret = this._scroll(offset, always);
  58. if (this.getScrollPerc() === 100) {
  59. this._userScrolled = false;
  60. }
  61. return ret;
  62. };
  63. /**
  64. * Expose
  65. */
  66. module.exports = Log;