UNPKG

neo-neo-bblessed

Version:

A fork of neo-blessed (which is a fork of blessed) with bug fixes and maintenance.

3 lines (2 loc) 5.71 kB
var u=require("./node"),b=require("./box");function s(t){var e=this;if(!(this instanceof u))return new s(t);if(t=t||{},b.call(this,t),t.scrollable===!1)return this;this.scrollable=!0,this.childOffset=0,this.childBase=0,this.baseLimit=t.baseLimit||1/0,this.alwaysScroll=t.alwaysScroll,this.scrollbar=t.scrollbar,this.scrollbar&&(this.scrollbar.ch=this.scrollbar.ch||" ",this.style.scrollbar=this.style.scrollbar||this.scrollbar.style,this.style.scrollbar||(this.style.scrollbar={},this.style.scrollbar.fg=this.scrollbar.fg,this.style.scrollbar.bg=this.scrollbar.bg,this.style.scrollbar.bold=this.scrollbar.bold,this.style.scrollbar.underline=this.scrollbar.underline,this.style.scrollbar.inverse=this.scrollbar.inverse,this.style.scrollbar.invisible=this.scrollbar.invisible),(this.track||this.scrollbar.track)&&(this.track=this.scrollbar.track||this.track,this.style.track=this.style.scrollbar.track||this.style.track,this.track.ch=this.track.ch||" ",this.style.track=this.style.track||this.track.style,this.style.track||(this.style.track={},this.style.track.fg=this.track.fg,this.style.track.bg=this.track.bg,this.style.track.bold=this.track.bold,this.style.track.underline=this.track.underline,this.style.track.inverse=this.track.inverse,this.style.track.invisible=this.track.invisible),this.track.style=this.style.track),t.mouse&&this.on("mousedown",function(l){if(e._scrollingBar){delete e.screen._dragging,delete e._drag;return}var r=l.x-e.aleft,i=l.y-e.atop;if(r===e.width-e.iright-1){delete e.screen._dragging,delete e._drag;var n=(i-e.itop)/(e.height-e.iheight);e.setScrollPerc(n*100|0),e.screen.render();var o,a;e._scrollingBar=!0,e.onScreenEvent("mousedown",o=function(c){var h=c.y-e.atop,f=h/e.height;e.setScrollPerc(f*100|0),e.screen.render()}),e.onScreenEvent("mouseup",a=function(){e._scrollingBar=!1,e.removeScreenEvent("mousedown",o),e.removeScreenEvent("mouseup",a)})}})),t.mouse&&(this.on("wheeldown",function(){e.scroll(e.height/2|0||1),e.screen.render()}),this.on("wheelup",function(){e.scroll(-(e.height/2|0)||-1),e.screen.render()})),t.keys&&!t.ignoreKeys&&this.on("keypress",function(l,r){if(r.name==="up"||t.vi&&r.name==="k"){e.scroll(-1),e.screen.render();return}if(r.name==="down"||t.vi&&r.name==="j"){e.scroll(1),e.screen.render();return}if(t.vi&&r.name==="u"&&r.ctrl){e.scroll(-(e.height/2|0)||-1),e.screen.render();return}if(t.vi&&r.name==="d"&&r.ctrl){e.scroll(e.height/2|0||1),e.screen.render();return}if(t.vi&&r.name==="b"&&r.ctrl){e.scroll(-e.height||-1),e.screen.render();return}if(t.vi&&r.name==="f"&&r.ctrl){e.scroll(e.height||1),e.screen.render();return}if(t.vi&&r.name==="g"&&!r.shift){e.scrollTo(0),e.screen.render();return}if(t.vi&&r.name==="g"&&r.shift){e.scrollTo(e.getScrollHeight()),e.screen.render();return}}),this.on("parsed content",function(){e._recalculateIndex()}),e._recalculateIndex()}s.prototype.__proto__=b.prototype,s.prototype.type="scrollable-box",s.prototype.__defineGetter__("reallyScrollable",function(){return this.shrink?this.scrollable:this.getScrollHeight()>this.height}),s.prototype._scrollBottom=function(){if(!this.scrollable)return 0;if(this._isList)return this.items?this.items.length:0;if(this.lpos&&this.lpos._scrollBottom)return this.lpos._scrollBottom;var t=this.children.reduce(function(e,l){if(!l.detached){var r=l._getCoords(!1,!0);if(r)return Math.max(e,l.rtop+(r.yl-r.yi))}return Math.max(e,l.rtop+l.height)},0);return this.lpos&&(this.lpos._scrollBottom=t),t},s.prototype.setScroll=s.prototype.scrollTo=function(t,e){return this.scroll(0),this.scroll(t-(this.childBase+this.childOffset),e)},s.prototype.getScroll=function(){return this.childBase+this.childOffset},s.prototype.scroll=function(t,e){if(this.scrollable&&!this.detached){var l=this.height-this.iheight,r=this.childBase,i,n,o,a,c,h;return this.alwaysScroll||e?this.childOffset=t>0?l-1+t:t:this.childOffset+=t,this.childOffset>l-1?(i=this.childOffset-(l-1),this.childOffset-=i,this.childBase+=i):this.childOffset<0&&(i=this.childOffset,this.childOffset+=-i,this.childBase+=i),this.childBase<0?this.childBase=0:this.childBase>this.baseLimit&&(this.childBase=this.baseLimit),this.childBase===r?this.emit("scroll"):(this.parseContent(),c=this._clines.length-(this.height-this.iheight),c<0&&(c=0),h=this._scrollBottom()-(this.height-this.iheight),h<0&&(h=0),this.childBase=Math.min(this.childBase,Math.max(h,c)),this.childBase<0?this.childBase=0:this.childBase>this.baseLimit&&(this.childBase=this.baseLimit),n=this.lpos,n&&this.childBase!==r&&this.screen.cleanSides(this)&&(o=n.yi+this.itop,a=n.yl-this.ibottom-1,i=this.childBase-r,i>0&&i<l?this.screen.deleteLine(i,o,o,a):i<0&&-i<l&&(i=-i,this.screen.insertLine(i,o,o,a))),this.emit("scroll"))}},s.prototype._recalculateIndex=function(){var t,e;if(this.detached||!this.scrollable)return 0;t=this._clines.length-(this.height-this.iheight),t<0&&(t=0),e=this._scrollBottom()-(this.height-this.iheight),e<0&&(e=0),this.childBase=Math.min(this.childBase,Math.max(e,t)),this.childBase<0?this.childBase=0:this.childBase>this.baseLimit&&(this.childBase=this.baseLimit)},s.prototype.resetScroll=function(){if(this.scrollable)return this.childOffset=0,this.childBase=0,this.emit("scroll")},s.prototype.getScrollHeight=function(){return Math.max(this._clines.length,this._scrollBottom())},s.prototype.getScrollPerc=function(t){var e=this.lpos||this._getCoords();if(!e)return t?-1:0;var l=e.yl-e.yi-this.iheight,r=this.getScrollHeight(),i;return l<r?(this.alwaysScroll?i=this.childBase/(r-l):i=(this.childBase+this.childOffset)/(r-1),i*100):t?-1:0},s.prototype.setScrollPerc=function(t){var e=Math.max(this._clines.length,this._scrollBottom());return this.scrollTo(t/100*e|0)},module.exports=s; //# sourceMappingURL=scrollablebox.js.map