diff --git a/core/art.js b/core/art.js index c8205c47..1d0358c2 100644 --- a/core/art.js +++ b/core/art.js @@ -333,9 +333,6 @@ function display(client, art, options, cb) { if(!mciInfo.id) { ++generatedId; } - - // mciCprQueue.push(mapKey); - // client.term.rawWrite(ansi.queryPos()); } }); diff --git a/core/menu_module.js b/core/menu_module.js index 804065a7..8fd2f5d2 100644 --- a/core/menu_module.js +++ b/core/menu_module.js @@ -56,7 +56,7 @@ exports.MenuModule = class MenuModule extends PluginModule { initSequence() { const self = this; const mciData = {}; - let pausePosition; + let pausePosition = {row: 0, column: 0}; const hasArt = () => { return _.isString(self.menuConfig.art) || @@ -84,19 +84,14 @@ exports.MenuModule = class MenuModule extends PluginModule { self.client.log.trace('Could not display art', { art : self.menuConfig.art, reason : err.message } ); } else { mciData.menu = artData.mciMap; + pausePosition.row = artData.height + 1; } + return callback(null); // any errors are non-fatal } ); }, - function moveToPromptLocation(callback) { - if(self.menuConfig.prompt) { - // :TODO: fetch and move cursor to prompt location, if supplied. See notes/etc. on placements - } - - return callback(null); - }, function displayPromptArt(callback) { if(!_.isString(self.menuConfig.prompt)) { return callback(null); @@ -106,30 +101,21 @@ exports.MenuModule = class MenuModule extends PluginModule { return callback(Errors.MissingConfig('Prompt specified but no "promptConfig" block found')); } + self.displayAsset( self.menuConfig.promptConfig.art, self.menuConfig.config, - (err, artData) => { - if(artData) { - mciData.prompt = artData.mciMap; + (err, promptArtData) => { + if(promptArtData) { + mciData.prompt = promptArtData.mciMap; + } + if(promptArtData.height != null) { + pausePosition.row = pausePosition.row + promptArtData.height; } return callback(err); // pass err here; prompts *must* have art } ); }, - function recordCursorPosition(callback) { - if(!self.shouldPause()) { - return callback(null); // cursor position not needed - } - - self.client.once('cursor position report', pos => { - pausePosition = { row : pos[0], col : 1 }; - self.client.log.trace('After art position recorded', pausePosition ); - return callback(null); - }); - - self.client.term.rawWrite(ansi.queryPos()); - }, function afterArtDisplayed(callback) { return self.mciReady(mciData, callback); }, @@ -512,7 +498,7 @@ exports.MenuModule = class MenuModule extends PluginModule { this.optionalMoveToPosition(position); - return theme.displayThemedPause(this.client, cb); + return theme.displayThemedPause(this.client, position, cb); } promptForInput( { formName, formId, promptName, prevFormName, position } = {}, options, cb) { diff --git a/core/theme.js b/core/theme.js index d8340b65..98643c40 100644 --- a/core/theme.js +++ b/core/theme.js @@ -551,6 +551,7 @@ function displayThemedPrompt(name, client, options, cb) { if(options.clearScreen) { client.term.rawWrite(ansi.resetScreen()); + options.position = {row: 1, column: 1}; } // @@ -583,12 +584,11 @@ function displayThemedPrompt(name, client, options, cb) { return callback(null, promptConfig, artInfo); } - client.once('cursor position report', pos => { - artInfo.startRow = pos[0] - artInfo.height; - return callback(null, promptConfig, artInfo); - }); + if(options.row != null) { + artInfo.startRow = options.row - artInfo.height; + } - client.term.rawWrite(ansi.queryPos()); + return callback(null, promptConfig, artInfo); }, function createMCIViews(promptConfig, artInfo, callback) { const assocViewController = usingTempViewController ? new ViewController( { client : client } ) : options.viewController; @@ -614,7 +614,9 @@ function displayThemedPrompt(name, client, options, cb) { }); }, function clearPauseArt(artInfo, assocViewController, callback) { - if(options.clearPrompt) { + // Only clear with height if clearPrompt is true and if we were able + // to determine the row + if(options.clearPrompt && artInfo.startRow) { if(artInfo.startRow && artInfo.height) { client.term.rawWrite(ansi.goto(artInfo.startRow, 1));