aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/windows/button.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/button.cpp
parent81747d6c34eb159481a6ca3f283d065fa3568617 (diff)
another UI attempt, I guess.
sorry.
Diffstat (limited to 'src/libui_sdl/libui/windows/button.cpp')
-rw-r--r--src/libui_sdl/libui/windows/button.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/windows/button.cpp b/src/libui_sdl/libui/windows/button.cpp
new file mode 100644
index 0000000..3b12e72
--- /dev/null
+++ b/src/libui_sdl/libui/windows/button.cpp
@@ -0,0 +1,104 @@
+// 7 april 2015
+#include "uipriv_windows.hpp"
+
+struct uiButton {
+ uiWindowsControl c;
+ HWND hwnd;
+ void (*onClicked)(uiButton *, void *);
+ void *onClickedData;
+};
+
+static BOOL onWM_COMMAND(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult)
+{
+ uiButton *b = uiButton(c);
+
+ if (code != BN_CLICKED)
+ return FALSE;
+ (*(b->onClicked))(b, b->onClickedData);
+ *lResult = 0;
+ return TRUE;
+}
+
+static void uiButtonDestroy(uiControl *c)
+{
+ uiButton *b = uiButton(c);
+
+ uiWindowsUnregisterWM_COMMANDHandler(b->hwnd);
+ uiWindowsEnsureDestroyWindow(b->hwnd);
+ uiFreeControl(uiControl(b));
+}
+
+uiWindowsControlAllDefaultsExceptDestroy(uiButton)
+
+// from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing
+#define buttonHeight 14
+
+static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height)
+{
+ uiButton *b = uiButton(c);
+ SIZE size;
+ uiWindowsSizing sizing;
+ int y;
+
+ // try the comctl32 version 6 way
+ size.cx = 0; // explicitly ask for ideal size
+ size.cy = 0;
+ if (SendMessageW(b->hwnd, BCM_GETIDEALSIZE, 0, (LPARAM) (&size)) != FALSE) {
+ *width = size.cx;
+ *height = size.cy;
+ return;
+ }
+
+ // that didn't work; fall back to using Microsoft's metrics
+ // Microsoft says to use a fixed width for all buttons; this isn't good enough
+ // use the text width instead, with some edge padding
+ *width = uiWindowsWindowTextWidth(b->hwnd) + (2 * GetSystemMetrics(SM_CXEDGE));
+ y = buttonHeight;
+ uiWindowsGetSizing(b->hwnd, &sizing);
+ uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &y);
+ *height = y;
+}
+
+static void defaultOnClicked(uiButton *b, void *data)
+{
+ // do nothing
+}
+
+char *uiButtonText(uiButton *b)
+{
+ return uiWindowsWindowText(b->hwnd);
+}
+
+void uiButtonSetText(uiButton *b, const char *text)
+{
+ uiWindowsSetWindowText(b->hwnd, text);
+ // changing the text might necessitate a change in the button's size
+ uiWindowsControlMinimumSizeChanged(uiWindowsControl(b));
+}
+
+void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
+{
+ b->onClicked = f;
+ b->onClickedData = data;
+}
+
+uiButton *uiNewButton(const char *text)
+{
+ uiButton *b;
+ WCHAR *wtext;
+
+ uiWindowsNewControl(uiButton, b);
+
+ wtext = toUTF16(text);
+ b->hwnd = uiWindowsEnsureCreateControlHWND(0,
+ L"button", wtext,
+ BS_PUSHBUTTON | WS_TABSTOP,
+ hInstance, NULL,
+ TRUE);
+ uiFree(wtext);
+
+ uiWindowsRegisterWM_COMMANDHandler(b->hwnd, onWM_COMMAND, uiControl(b));
+ uiButtonOnClicked(b, defaultOnClicked, NULL);
+
+ return b;
+}