diff options
Diffstat (limited to 'src/nigui')
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 11 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 15 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 15 |
3 files changed, 38 insertions, 3 deletions
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index bf4b1ab..c5a7fdb 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -402,7 +402,6 @@ proc alert(window: Window, message: string, title = "Message") = method run*(dialog: OpenFileDialog) = dialog.files = @[] var chooser = gtk_file_chooser_dialog_new(dialog.title, nil, GTK_FILE_CHOOSER_ACTION_OPEN, "Cancel", GTK_RESPONSE_CANCEL, "Open", GTK_RESPONSE_ACCEPT, nil) - # Issue: When a title is passed, the dialog is shown without a title discard gtk_file_chooser_set_current_folder(chooser, dialog.directory) gtk_file_chooser_set_select_multiple(chooser, dialog.multiple) let res = gtk_dialog_run(chooser) @@ -415,7 +414,6 @@ method run*(dialog: OpenFileDialog) = method run(dialog: SaveFileDialog) = var chooser = gtk_file_chooser_dialog_new(dialog.title, nil, GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, nil) - # Issue: When a title is passed, the dialog is shown without a title let res = gtk_dialog_run(chooser) discard gtk_file_chooser_set_current_folder(chooser, dialog.directory) if dialog.defaultName.len > 0: @@ -426,6 +424,15 @@ method run(dialog: SaveFileDialog) = dialog.file = "" gtk_widget_destroy(chooser) +method run*(dialog: SelectDirectoryDialog) = + dialog.selectedDirectory = "" + var chooser = gtk_file_chooser_dialog_new(dialog.title, nil, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, "Cancel", GTK_RESPONSE_CANCEL, "Select", GTK_RESPONSE_ACCEPT, nil) + discard gtk_file_chooser_set_current_folder(chooser, dialog.startDirectory) + let res = gtk_dialog_run(chooser) + if res == GTK_RESPONSE_ACCEPT: + dialog.selectedDirectory = $gtk_file_chooser_get_filename(chooser) + gtk_widget_destroy(chooser) + # ---------------------------------------------------------------------------------------- # Timers 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.} # ---------------------------------------------------------------------------------------- |
