diff --git a/js/term/widgets/checkbox.js b/js/term/widgets/checkbox.js new file mode 100644 index 0000000..81ffb57 --- /dev/null +++ b/js/term/widgets/checkbox.js @@ -0,0 +1,138 @@ +/** + ** ============================== + ** 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, Stefan Bosse + ** $INITIAL: (C) 2013-2015, Christopher Jeffrey and contributors + ** $MODIFIED: by sbosse (2017-2021) + ** $REVESIO: 1.4.1 + ** + ** $INFO: + ** + ** checkbox.js - checkbox element for blessed + ** + ** Usage: + ** + ** var obj = blessed.checkbox({ + ** checked: options.value||false, + ** left: options.left, + ** right : options.right, + ** top: options.top||0, + ** mouse: true, + ** inputOnFocus: true, + ** height: 1, + ** text:options.text||'empty' + ** }); + ** screen.append(obj); + ** obj.on('check',function () {}); + ** + ** Events: + ** 'check' 'uncheck' 'select' + ** + ** + ** $ENDOFINFO + */ + +/** + * Modules + */ +var Comp = Require('com/compat'); + +var Node = Require('term/widgets/node'); +var Input = Require('term/widgets/input'); + +/** + * Checkbox + */ + +function Checkbox(options) { + var self = this; + + if (!instanceOf(this,Node)) { + return new Checkbox(options); + } + + options = options || {}; + + Input.call(this, options); + + this.text = options.content || options.text || ''; + this.checked = this.value = options.checked || false; + + this.on('keypress', function(ch, key) { + if (key.name === 'enter' || key.name === 'space') { + self.toggle(); + self.screen.render(); + } + }); + + if (options.mouse) { + this.on('click', function() { + self.toggle(); + self.screen.render(); + }); + } + + this.on('focus', function() { + var lpos = self.lpos; + if (!lpos) return; + self.screen.program.lsaveCursor('checkbox'); + self.screen.program.cup(lpos.yi, lpos.xi + 1); + self.screen.program.showCursor(); + }); + + this.on('blur', function() { + self.screen.program.lrestoreCursor('checkbox', true); + }); +} + +//Checkbox.prototype.__proto__ = Input.prototype; +inheritPrototype(Checkbox,Input); + +Checkbox.prototype.type = 'checkbox'; + +Checkbox.prototype.render = function() { + this.clearPos(true); + this.setContent('[' + (this.checked ? 'x' : ' ') + '] ' + this.text, true); + return this._render(); +}; + +Checkbox.prototype.check = function() { + if (this.checked) return; + this.checked = this.value = true; + this.emit('check',this); + this.emit('select',true); +}; + +Checkbox.prototype.uncheck = function() { + if (!this.checked) return; + this.checked = this.value = false; + this.emit('uncheck',this); + this.emit('select',false); +}; + +Checkbox.prototype.toggle = function() { + return this.checked + ? this.uncheck() + : this.check(); +}; + +/** + * Expose + */ + +module.exports = Checkbox;