diff --git a/js/term/widgets/radiobutton.js b/js/term/widgets/radiobutton.js new file mode 100644 index 0000000..7f17c2f --- /dev/null +++ b/js/term/widgets/radiobutton.js @@ -0,0 +1,111 @@ +/** + ** ============================== + ** 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.3.1 + ** + ** $INFO: + ** + ** radiobutton.js - radio button element for blessed + ** + ** Added: + ** - Simplified group management (using options.group identifier instead radioset parent) + ** + ** Usage: + ** + ** var obj = blessed.radiobutton({ + ** checked: options.value||false, + ** left: options.left, + ** right : options.right, + ** top: options.top||0, + ** group:options.group, + ** mouse: true, + ** inputOnFocus: true, + ** height: 1, + ** text:options.text||'empty' + ** }); + ** screen.append(obj); + ** obj.on('select',function); + ** + ** Events: + ** 'check' 'uncheck' 'select' + ** $ENDOFINFO + */ + +/** + * Modules + */ +var Comp = Require('com/compat'); + +var Node = Require('term/widgets/node'); +var Checkbox = Require('term/widgets/checkbox'); + +/** + * RadioButton + */ + +function RadioButton(options) { + var self = this; + + if (!instanceOf(this,Node)) { + return new RadioButton(options); + } + + options = options || {}; + this.group=options.group; + Checkbox.call(this, options); + + this.on('check', function() { + var el = self, + group=self.group; + while (el = el.parent) { + if (el.type === 'radio-set' + || el.type === 'form') break; + } + el = el || self.parent; + var index=0; + el.forDescendants(function(el) { + if (el.type !== 'radio-button' || el === self || el.group!=group) { + return; + } + index++; + el.uncheck(); + }); + }); +} + +//RadioButton.prototype.__proto__ = Checkbox.prototype; +inheritPrototype(RadioButton,Checkbox); + +RadioButton.prototype.type = 'radio-button'; + +RadioButton.prototype.render = function() { + this.clearPos(true); + this.setContent('(' + (this.checked ? '*' : ' ') + ') ' + this.text, true); + return this._render(); +}; + +RadioButton.prototype.toggle = RadioButton.prototype.check; + +/** + * Expose + */ + +module.exports = RadioButton;