summaryrefslogtreecommitdiff
path: root/src/nigui/private/windows
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2019-09-23 23:07:18 +0200
committertrustable-code <krauter.simon@arcor.de>2019-09-23 23:07:18 +0200
commit9d9babe7491f791545ddb7730a573e9b21cd3fa6 (patch)
tree75d42e1e10eccb196127b48c43e455678f690578 /src/nigui/private/windows
parent20b7e0cdcbcf571c4bed1dc0460feff73be110e0 (diff)
downloadNiGui-9d9babe7491f791545ddb7730a573e9b21cd3fa6.tar.gz
NiGui-9d9babe7491f791545ddb7730a573e9b21cd3fa6.zip
Extend Checkbox and add Gtk implementation
- Add `checked=` to set the status - Add `onToggle` event to react on toggle by the user - Toggling works also by Space and Enter
Diffstat (limited to 'src/nigui/private/windows')
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim21
-rwxr-xr-xsrc/nigui/private/windows/windows.nim10
2 files changed, 27 insertions, 4 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index c94224e..d7372f4 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -1406,11 +1406,25 @@ method `enabled=`(button: NativeButton, enabled: bool) =
var pCheckboxOrigWndProc: pointer
proc pCheckboxWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.} =
+ let checkbox = cast[Checkbox](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
+
+ if uMsg == WM_LBUTTONDOWN:
+ checkbox.checked = not checkbox.checked # let the event see the new status
+ var evt = new ToggleEvent
+ evt.control = checkbox
+ checkbox.handleToggleEvent(evt)
+ checkbox.checked = not checkbox.checked
+
let comProcRes = pCommonControlWndProc(hWnd, uMsg, wParam, lParam)
if comProcRes == PWndProcResult_False:
return cast[pointer](false)
if comProcRes == PWndProcResult_True:
return cast[pointer](true)
+
+ # Avoid toggling the checkbox twice
+ if uMsg == WM_KEYDOWN and pWMParamsToKey(wParam, lParam) == Key_Space:
+ return
+
result = CallWindowProcW(pCheckboxOrigWndProc, hWnd, uMsg, wParam, lParam)
proc init(checkbox: NativeCheckbox) =
@@ -1429,6 +1443,13 @@ method `enabled=`(checkbox: NativeCheckbox, enabled: bool) =
method checked(checkbox: NativeCheckbox): bool =
result = cast[int](SendMessageA(checkbox.fHandle, BM_GETCHECK, nil, nil)) == BST_CHECKED
+method `checked=`(checkbox: NativeCheckbox, checked: bool) =
+ if checked:
+ discard SendMessageA(checkbox.fHandle, BM_SETCHECK, cast[pointer](BST_CHECKED), nil)
+ else:
+ discard SendMessageA(checkbox.fHandle, BM_SETCHECK, cast[pointer](BST_UNCHECKED), nil)
+ # app.processEvents
+
# ----------------------------------------------------------------------------------------
# Label
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index d271cac..df9e75a 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -37,12 +37,14 @@ const
BN_CLICKED* = 0
BM_SETSTYLE* = 244
BM_SETIMAGE* = 247
- BM_GETCHECK* = 0x00F0
+ BM_GETCHECK* = 240
+ BM_SETCHECK* = 241
+ BM_GETSTATE* = 242
BS_DEFPUSHBUTTON* = 0x00000001
BS_AUTOCHECKBOX* = 0x00000003
BS_GROUPBOX* = 0x00000007
- BST_UNCHECKED* = 0x0000
- BST_CHECKED* = 0x0001
+ BST_UNCHECKED* = 0
+ BST_CHECKED* = 1
CF_TEXT* = 1
COLOR_BTNFACE* = 15
COLOR_WINDOW* = 5
@@ -548,4 +550,4 @@ proc GetSaveFileNameW*(lpofn: var OpenFileName): bool {.importc: "GetSaveFileNam
# Shcore Procs
# ----------------------------------------------------------------------------------------
-type SetProcessDpiAwarenessType* = proc(value: int32): int32 {.gcsafe, stdcall.} # not available on Windows 7 \ No newline at end of file
+type SetProcessDpiAwarenessType* = proc(value: int32): int32 {.gcsafe, stdcall.} # not available on Windows 7