summaryrefslogtreecommitdiff
path: root/external/plyer/platforms/win/filechooser.py
diff options
context:
space:
mode:
Diffstat (limited to 'external/plyer/platforms/win/filechooser.py')
-rw-r--r--external/plyer/platforms/win/filechooser.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/external/plyer/platforms/win/filechooser.py b/external/plyer/platforms/win/filechooser.py
new file mode 100644
index 0000000..4d284dc
--- /dev/null
+++ b/external/plyer/platforms/win/filechooser.py
@@ -0,0 +1,112 @@
+'''
+Windows file chooser
+--------------------
+'''
+
+from plyer.facades import FileChooser
+from win32com.shell import shell, shellcon
+import os
+import win32gui
+import win32con
+import pywintypes
+
+
+class Win32FileChooser(object):
+ '''A native implementation of NativeFileChooser using the
+ Win32 API on Windows.
+
+ Not Implemented features (all dialogs):
+ * preview
+ * icon
+
+ Not implemented features (in directory selection only - it's limited
+ by Windows itself):
+ * preview
+ * window-icon
+ * multiple
+ * show_hidden
+ * filters
+ * path
+ '''
+
+ path = None
+ multiple = False
+ filters = []
+ preview = False
+ title = None
+ icon = None
+ show_hidden = False
+
+ def __init__(self, **kwargs):
+ # Simulate Kivy's behavior
+ for i in kwargs:
+ setattr(self, i, kwargs[i])
+
+ def run(self):
+ try:
+ if self.mode != "dir":
+ args = {}
+
+ if self.path:
+ args["InitialDir"] = os.path.dirname(self.path)
+ path = os.path.splitext(os.path.dirname(self.path))
+ args["File"] = path[0]
+ args["DefExt"] = path[1]
+ args["Title"] = self.title if self.title else "Pick a file..."
+ args["CustomFilter"] = 'Other file types\x00*.*\x00'
+ args["FilterIndex"] = 1
+
+ filters = ""
+ for f in self.filters:
+ if type(f) == str:
+ filters += (f + "\x00") * 2
+ else:
+ filters += f[0] + "\x00" + ";".join(f[1:]) + "\x00"
+ args["Filter"] = filters
+
+ flags = (win32con.OFN_EXTENSIONDIFFERENT |
+ win32con.OFN_OVERWRITEPROMPT)
+ if self.multiple:
+ flags |= win32con.OFN_ALLOWmultiple | win32con.OFN_EXPLORER
+ if self.show_hidden:
+ flags |= win32con.OFN_FORCESHOWHIDDEN
+ args["Flags"] = flags
+
+ if self.mode == "open":
+ self.fname, _, _ = win32gui.GetOpenFileNameW(**args)
+ elif self.mode == "save":
+ self.fname, _, _ = win32gui.GetSaveFileNameW(**args)
+
+ if self.fname:
+ if self.multiple:
+ seq = str(self.fname).split("\x00")
+ dir_n, base_n = seq[0], seq[1:]
+ self.selection = [os.path.join(dir_n, i)
+ for i in base_n]
+ else:
+ self.selection = str(self.fname).split("\x00")
+ else:
+ # From http://goo.gl/UDqCqo
+ pidl, display_name, image_list = shell.SHBrowseForFolder(
+ win32gui.GetDesktopWindow(),
+ None,
+ self.title if self.title else "Pick a folder...",
+ 0, None, None
+ )
+ self.selection = [str(shell.SHGetPathFromIDList(pidl))]
+
+ return self.selection
+ except (RuntimeError, pywintypes.error):
+ return None
+
+
+class WinFileChooser(FileChooser):
+ '''FileChooser implementation for Windows, using win3all.
+ '''
+
+ def _file_selection_dialog(self, **kwargs):
+ return Win32FileChooser(**kwargs).run()
+
+
+def instance():
+ return WinFileChooser()