diff --git a/core/menu_view.js b/core/menu_view.js index f15491cf..dc2f5c81 100644 --- a/core/menu_view.js +++ b/core/menu_view.js @@ -29,6 +29,8 @@ function MenuView(options) { this.items = []; } + this.renderCache = {}; + this.caseInsensitiveHotKeys = miscUtil.valueWithDefault(options.caseInsensitiveHotKeys, true); this.setHotKeys(options.hotKeys); @@ -65,6 +67,7 @@ util.inherits(MenuView, View); MenuView.prototype.setItems = function(items) { if(Array.isArray(items)) { this.sorted = false; + this.renderCache = {}; // // Items can be an array of strings or an array of objects. @@ -98,6 +101,16 @@ MenuView.prototype.setItems = function(items) { } }; +MenuView.prototype.getRenderCacheItem = function(index, focusItem = false) { + const item = this.renderCache[index]; + return item && item[focusItem ? 'focus' : 'standard']; +}; + +MenuView.prototype.setRenderCacheItem = function(index, rendered, focusItem = false) { + this.renderCache[index] = this.renderCache[index] || {}; + this.renderCache[index][focusItem ? 'focus' : 'standard'] = rendered; +}; + MenuView.prototype.setSort = function(sort) { if(this.sorted || !Array.isArray(this.items) || 0 === this.items.length) { return; diff --git a/core/vertical_menu_view.js b/core/vertical_menu_view.js index 423ffc00..57570e16 100644 --- a/core/vertical_menu_view.js +++ b/core/vertical_menu_view.js @@ -64,6 +64,11 @@ function VerticalMenuView(options) { return; } + const cached = this.getRenderCacheItem(index, item.focused); + if(cached) { + return self.client.term.write(`${ansi.goto(item.row, self.position.col)}${cached}`); + } + let text; let sgr; if(item.focused && self.hasFocusItems()) { @@ -78,9 +83,9 @@ function VerticalMenuView(options) { sgr = (index === self.focusedItemIndex ? self.getFocusSGR() : self.getSGR()); } - self.client.term.write( - `${ansi.goto(item.row, self.position.col)}${sgr}${strUtil.pad(text, this.dimens.width, this.fillChar, this.justify)}` - ); + text = `${sgr}${strUtil.pad(text, this.dimens.width, this.fillChar, this.justify)}`; + self.client.term.write(`${ansi.goto(item.row, self.position.col)}${text}`); + this.setRenderCacheItem(index, text, item.focused); }; }