Mercurial > projects > dynamin
annotate dynamin/gui/windows_folder_dialog.d @ 106:acdbb30fee7e
Port to D2.
Most of the effort was dealing with immutable and const.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Mon, 17 Dec 2012 23:41:50 -0600 |
parents | 73060bc3f004 |
children |
rev | line source |
---|---|
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
1 |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
2 /* |
103
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
46
diff
changeset
|
3 * Copyright Jordan Miner |
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
4 * |
103
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
46
diff
changeset
|
5 * This Source Code Form is subject to the terms of the Mozilla Public |
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
46
diff
changeset
|
6 * License, v. 2.0. If a copy of the MPL was not distributed with this |
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
46
diff
changeset
|
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
8 * |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
9 */ |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
10 |
45
4eebc294a3ac
Rename DirectoryDialog to FolderDialog.
Jordan Miner <jminer7@gmail.com>
parents:
21
diff
changeset
|
11 module dynamin.gui.windows_folder_dialog; |
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
12 |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
13 public import Utf = tango.text.convert.Utf; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
14 |
45
4eebc294a3ac
Rename DirectoryDialog to FolderDialog.
Jordan Miner <jminer7@gmail.com>
parents:
21
diff
changeset
|
15 template FolderDialogBackend() { |
46
127b9d99c01c
Rename uses of 'directory' to 'folder' in method names and comments.
Jordan Miner <jminer7@gmail.com>
parents:
45
diff
changeset
|
16 extern(Windows) static int setSelectedFolder(HWND hwnd, |
21
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
17 UINT uMsg, LPARAM lParam, LPARAM lpData) { |
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
18 if(uMsg == BFFM_INITIALIZED) |
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
19 SendMessage(hwnd, BFFM_SETSELECTION, true, lpData); |
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
20 return 0; |
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
21 } |
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
22 |
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
23 DialogResult backend_showDialog() { |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
24 BROWSEINFO bi; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
25 //bi.hwndOwner = ; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
26 bi.lpszTitle = "Choose a folder:"; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
27 bi.ulFlags |= BIF_RETURNONLYFSDIRS; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
28 bi.ulFlags |= BIF_USENEWUI; |
46
127b9d99c01c
Rename uses of 'directory' to 'folder' in method names and comments.
Jordan Miner <jminer7@gmail.com>
parents:
45
diff
changeset
|
29 if(_folder) { |
127b9d99c01c
Rename uses of 'directory' to 'folder' in method names and comments.
Jordan Miner <jminer7@gmail.com>
parents:
45
diff
changeset
|
30 bi.lpfn = &setSelectedFolder; |
127b9d99c01c
Rename uses of 'directory' to 'folder' in method names and comments.
Jordan Miner <jminer7@gmail.com>
parents:
45
diff
changeset
|
31 bi.lParam = cast(LPARAM)toWcharPtr(_folder); |
21
d0ce1db78819
Directories can now be preselected on Windows
Jordan Miner <jminer7@gmail.com>
parents:
20
diff
changeset
|
32 } |
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
33 |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
34 ITEMIDLIST* pidl = SHBrowseForFolder(&bi); |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
35 if(!pidl) |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
36 return DialogResult.Cancel; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
37 wchar[MAX_PATH+1] dirBuffer; // MAX_PATH is 260 |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
38 if(!SHGetPathFromIDList(pidl, dirBuffer.ptr)) { |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
39 Stdout("GetPathFromIDList() failed").newline; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
40 return DialogResult.Cancel; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
41 } |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
42 CoTaskMemFree(pidl); |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
43 int index = MAX_PATH; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
44 foreach(i, c; dirBuffer) |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
45 if(c == 0) { // find first null |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
46 index = i; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
47 if(dirBuffer[i-1] != '\\') { |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
48 dirBuffer[i] = '\\'; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
49 index++; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
50 } |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
51 break; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
52 } |
106 | 53 _folder = cast(immutable)Utf.toString(dirBuffer[0..index]); |
18
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
54 return DialogResult.OK; |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
55 } |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
56 } |
836a064828e8
Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents:
diff
changeset
|
57 |