summaryrefslogtreecommitdiff
path: root/src/nigui/private/windows
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2019-11-03 20:06:04 +0100
committertrustable-code <krauter.simon@arcor.de>2019-11-03 20:06:04 +0100
commitfe3db61a8c890ebbd8661ee2eaabfdd6f2121c95 (patch)
tree5aafef584a645be29592ccd54d178ed54d2df0b9 /src/nigui/private/windows
parent2ec9ad141413d79e3221161d52adb74f34f193e9 (diff)
downloadNiGui-fe3db61a8c890ebbd8661ee2eaabfdd6f2121c95.tar.gz
NiGui-fe3db61a8c890ebbd8661ee2eaabfdd6f2121c95.zip
Add SelectDirectoryDialog
Fixes #67
Diffstat (limited to 'src/nigui/private/windows')
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim15
-rwxr-xr-xsrc/nigui/private/windows/windows.nim15
2 files changed, 29 insertions, 1 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index f110722..05b0f8b 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -499,6 +499,7 @@ method run*(dialog: OpenFileDialog) =
method run(dialog: SaveFileDialog) =
const maxCharacters = 500
+ dialog.file = ""
var ofn: OpenFileName
ofn.lStructSize = OpenFileName.sizeOf.int32
ofn.lpstrTitle = dialog.title.pUtf8ToUtf16()
@@ -517,11 +518,23 @@ method run(dialog: SaveFileDialog) =
if ret:
dialog.file = pUtf16ToUtf8(s, true)
else:
- dialog.file = ""
let e = CommDlgExtendedError()
if e != 0:
raiseError("CommDlg Error Code: " & $e)
+method run*(dialog: SelectDirectoryDialog) =
+ ## Notes: `dialog.startDirectory` is not supported.
+ const maxCharacters = 5000
+ dialog.selectedDirectory = ""
+ var bi: BrowseInfo
+ bi.lpszTitle = dialog.title.pUtf8ToUtf16()
+ bi.ulFlags = BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE
+ let pidl = SHBrowseForFolderW(bi)
+ if pidl != nil:
+ var s = newString(maxCharacters * 2)
+ SHGetPathFromIDListW(pidl, s)
+ dialog.selectedDirectory = pUtf16ToUtf8(s, true)
+
# ----------------------------------------------------------------------------------------
# Timers
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index 0cd0add..a9b275d 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -34,6 +34,8 @@ const
ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID* = 4
ACTCTX_FLAG_RESOURCE_NAME_VALID* = 8
ACTCTX_FLAG_SET_PROCESS_DEFAULT* = 16
+ BIF_RETURNONLYFSDIRS* = 0x00000001
+ BIF_NEWDIALOGSTYLE* = 0x00000040
BN_CLICKED* = 0
BM_SETSTYLE* = 244
BM_SETIMAGE* = 247
@@ -348,6 +350,17 @@ type
Scan0*: ptr UncheckedArray[byte]
Reserved: pointer
+ BrowseInfo* = object
+ hwndOwner*: pointer
+ pidlRoot*: pointer
+ pszDisplayName*: cstring
+ lpszTitle*: cstring
+ ulFlags*: uint
+ lpfn*: pointer
+ lParam*: pointer
+ iImage*: int32
+
+
# ----------------------------------------------------------------------------------------
# Replacement for Windows Macros
@@ -529,6 +542,8 @@ proc GdipBitmapUnlockBits*(bitmap: pointer, lockedBitmapData: var BitmapData): i
proc DragAcceptFiles*(hWnd: pointer, fAccept: bool) {.importc: "DragAcceptFiles", libShell32.}
proc DragQueryFileW*(hDrop: pointer, iFile: uint32, lpszFile: cstring, cch: int32): int32 {.importc: "DragQueryFileW", libShell32.}
proc DragFinish*(hDrop: pointer) {.importc: "DragFinish", libShell32.}
+proc SHBrowseForFolderW*(lpbi: var BrowseInfo): pointer {.importc: "SHBrowseForFolderW", libShell32.}
+proc SHGetPathFromIDListW*(pidl: pointer, pszPath: cstring) {.importc: "SHGetPathFromIDListW", libShell32.}
# ----------------------------------------------------------------------------------------