aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/windows/checkbox.cpp
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
committerStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
commit70e4841d311d68689724768157cc9cbfbde7a9fc (patch)
treeba9499f77d1258530a7e60aa6e1732c41d98161c /src/libui_sdl/libui/windows/checkbox.cpp
parent81747d6c34eb159481a6ca3f283d065fa3568617 (diff)
another UI attempt, I guess.
sorry.
Diffstat (limited to 'src/libui_sdl/libui/windows/checkbox.cpp')
-rw-r--r--src/libui_sdl/libui/windows/checkbox.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/windows/checkbox.cpp b/src/libui_sdl/libui/windows/checkbox.cpp
new file mode 100644
index 0000000..be425c0
--- /dev/null
+++ b/src/libui_sdl/libui/windows/checkbox.cpp
@@ -0,0 +1,117 @@
+// 7 april 2015
+#include "uipriv_windows.hpp"
+
+struct uiCheckbox {
+ uiWindowsControl c;
+ HWND hwnd;
+ void (*onToggled)(uiCheckbox *, void *);
+ void *onToggledData;
+};
+
+static BOOL onWM_COMMAND(uiControl *cc, HWND hwnd, WORD code, LRESULT *lResult)
+{
+ uiCheckbox *c = uiCheckbox(cc);
+ WPARAM check;
+
+ if (code != BN_CLICKED)
+ return FALSE;
+
+ // we didn't use BS_AUTOCHECKBOX (http://blogs.msdn.com/b/oldnewthing/archive/2014/05/22/10527522.aspx) so we have to manage the check state ourselves
+ check = BST_CHECKED;
+ if (SendMessage(c->hwnd, BM_GETCHECK, 0, 0) == BST_CHECKED)
+ check = BST_UNCHECKED;
+ SendMessage(c->hwnd, BM_SETCHECK, check, 0);
+
+ (*(c->onToggled))(c, c->onToggledData);
+ *lResult = 0;
+ return TRUE;
+}
+
+static void uiCheckboxDestroy(uiControl *cc)
+{
+ uiCheckbox *c = uiCheckbox(cc);
+
+ uiWindowsUnregisterWM_COMMANDHandler(c->hwnd);
+ uiWindowsEnsureDestroyWindow(c->hwnd);
+ uiFreeControl(uiControl(c));
+}
+
+uiWindowsControlAllDefaultsExceptDestroy(uiCheckbox)
+
+// from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing
+#define checkboxHeight 10
+// from http://msdn.microsoft.com/en-us/library/windows/desktop/bb226818%28v=vs.85%29.aspx
+#define checkboxXFromLeftOfBoxToLeftOfLabel 12
+
+static void uiCheckboxMinimumSize(uiWindowsControl *cc, int *width, int *height)
+{
+ uiCheckbox *c = uiCheckbox(cc);
+ uiWindowsSizing sizing;
+ int x, y;
+
+ x = checkboxXFromLeftOfBoxToLeftOfLabel;
+ y = checkboxHeight;
+ uiWindowsGetSizing(c->hwnd, &sizing);
+ uiWindowsSizingDlgUnitsToPixels(&sizing, &x, &y);
+ *width = x + uiWindowsWindowTextWidth(c->hwnd);
+ *height = y;
+}
+
+static void defaultOnToggled(uiCheckbox *c, void *data)
+{
+ // do nothing
+}
+
+char *uiCheckboxText(uiCheckbox *c)
+{
+ return uiWindowsWindowText(c->hwnd);
+}
+
+void uiCheckboxSetText(uiCheckbox *c, const char *text)
+{
+ uiWindowsSetWindowText(c->hwnd, text);
+ // changing the text might necessitate a change in the checkbox's size
+ uiWindowsControlMinimumSizeChanged(uiWindowsControl(c));
+}
+
+void uiCheckboxOnToggled(uiCheckbox *c, void (*f)(uiCheckbox *, void *), void *data)
+{
+ c->onToggled = f;
+ c->onToggledData = data;
+}
+
+int uiCheckboxChecked(uiCheckbox *c)
+{
+ return SendMessage(c->hwnd, BM_GETCHECK, 0, 0) == BST_CHECKED;
+}
+
+void uiCheckboxSetChecked(uiCheckbox *c, int checked)
+{
+ WPARAM check;
+
+ check = BST_CHECKED;
+ if (!checked)
+ check = BST_UNCHECKED;
+ SendMessage(c->hwnd, BM_SETCHECK, check, 0);
+}
+
+uiCheckbox *uiNewCheckbox(const char *text)
+{
+ uiCheckbox *c;
+ WCHAR *wtext;
+
+ uiWindowsNewControl(uiCheckbox, c);
+
+ wtext = toUTF16(text);
+ c->hwnd = uiWindowsEnsureCreateControlHWND(0,
+ L"button", wtext,
+ BS_CHECKBOX | WS_TABSTOP,
+ hInstance, NULL,
+ TRUE);
+ uiFree(wtext);
+
+ uiWindowsRegisterWM_COMMANDHandler(c->hwnd, onWM_COMMAND, uiControl(c));
+ uiCheckboxOnToggled(c, defaultOnToggled, NULL);
+
+ return c;
+}