diff --git a/js/term/widgets/prompt.js b/js/term/widgets/prompt.js new file mode 100644 index 0000000..61fc9a5 --- /dev/null +++ b/js/term/widgets/prompt.js @@ -0,0 +1,146 @@ +/** + ** ============================== + ** 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: Christopher Jeffrey and contributors, Stefan Bosse + ** $INITIAL: (C) 2013-2015, Christopher Jeffrey and contributors + ** $MODIFIED: by sbosse (2016-2017) + ** $REVESIO: 1.2.1 + ** + ** $INFO: + ** + ** prompt.js - prompt element for blessed + ** + ** $ENDOFINFO + */ + +/** + * Modules + */ +var Comp = Require('com/compat'); + +var Node = Require('term/widgets/node'); +var Box = Require('term/widgets/box'); +var Button = Require('term/widgets/button'); +var Textbox = Require('term/widgets/textbox'); + +/** + * Prompt + */ + +function Prompt(options) { + if (!instanceOf(this, Node)) { + return new Prompt(options); + } + + options = options || {}; + + options.hidden = true; + + Box.call(this, options); + + this._.input = new Textbox({ + parent: this, + top: 3, + height: 1, + left: 2, + right: 2, + bg: 'black' + }); + + this._.okay = new Button({ + parent: this, + top: 5, + height: 1, + left: 2, + width: 6, + content: 'Okay', + align: 'center', + bg: 'black', + hoverBg: 'blue', + autoFocus: false, + mouse: true + }); + + this._.cancel = new Button({ + parent: this, + top: 5, + height: 1, + shrink: true, + left: 10, + width: 8, + content: 'Cancel', + align: 'center', + bg: 'black', + hoverBg: 'blue', + autoFocus: false, + mouse: true + }); +} + +//Prompt.prototype.__proto__ = Box.prototype; +inheritPrototype(Prompt,Box); + +Prompt.prototype.type = 'prompt'; + +Prompt.prototype.input = +Prompt.prototype.setInput = +Prompt.prototype.readInput = function(text, value, callback) { + var self = this; + var okay, cancel; + + if (!callback) { + callback = value; + value = ''; + } + + // Keep above: + // var parent = this.parent; + // this.detach(); + // parent.append(this); + + this.show(); + this.setContent(' ' + text); + + this._.input.value = value; + + this.screen.saveFocus(); + + this._.okay.on('press', okay = function() { + self._.input.submit(); + }); + + this._.cancel.on('press', cancel = function() { + self._.input.cancel(); + }); + + this._.input.readInput(function(err, data) { + self.hide(); + self.screen.restoreFocus(); + self._.okay.removeListener('press', okay); + self._.cancel.removeListener('press', cancel); + return callback(err, data); + }); + + this.screen.render(); +}; + +/** + * Expose + */ + +module.exports = Prompt;