From 55f0c619708da64e5125640e2e4ea9c419dc8203 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Fri, 9 Jan 2026 21:55:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8C=20checkbox.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ncui/package.d | 1 + source/ncui/widgets/checkbox.d | 97 ++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 source/ncui/widgets/checkbox.d 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(); + } +}