diff --git a/source/ncui/package.d b/source/ncui/package.d index 1cc91ed..5aa3ee0 100644 --- a/source/ncui/package.d +++ b/source/ncui/package.d @@ -18,3 +18,4 @@ public import ncui.lib.logger; // Виджеты public import ncui.widgets.container; public import ncui.widgets.button; +public import ncui.widgets.checkbox; diff --git a/source/ncui/widgets/checkbox.d b/source/ncui/widgets/checkbox.d new file mode 100644 index 0000000..40459af --- /dev/null +++ b/source/ncui/widgets/checkbox.d @@ -0,0 +1,97 @@ +module ncui.widgets.checkbox; + +import ncui.widgets.widget; +import ncui.core.event; +import ncui.core.window; +import ncui.engine.screen; +import ncui.engine.action; + +alias OnChange = void delegate(bool checked); + +final class Checkbox : IWidget +{ +private: + OnChange _onChange; + int _y; + int _x; + string _label; + bool _checked; + bool _enabled = true; + + void notifyChange() + { + if (_onChange !is null) + { + _onChange(_checked); + } + } + +public: + this(int y, int x, string label, bool checked = false, OnChange onChange = null) + { + _y = y; + _x = x; + _label = label; + _checked = checked; + _onChange = onChange; + } + + override @property bool focusable() + { + return true; + } + + override @property bool enabled() + { + return _enabled; + } + + void setChecked(bool checked) + { + if (_checked == checked) + { + return; + } + + _checked = checked; + notifyChange(); + } + + void toggle() + { + setChecked(!_checked); + } + + void setEnabled(bool enabled) + { + _enabled = enabled; + } + + void onChange(OnChange callback) + { + _onChange = callback; + } + + override void render(Window window, ScreenContext context, bool focused) + { + const string mark = _checked ? "x" : " "; + string checkbox = (focused ? "*" : "[") ~ mark ~ (focused ? "* " : "] ") ~ _label; + window.put(_y, _x, checkbox); + } + + override ScreenAction handle(ScreenContext context, KeyEvent event) + { + if (!_enabled) + { + return ScreenAction.none(); + } + + if (isEnter(event) || isSpace(event)) + { + toggle(); + return ScreenAction.none(); + } + + return ScreenAction.none(); + } +}