summaryrefslogtreecommitdiff
path: root/external/plyer/platforms/macosx/filechooser.py
diff options
context:
space:
mode:
Diffstat (limited to 'external/plyer/platforms/macosx/filechooser.py')
-rw-r--r--external/plyer/platforms/macosx/filechooser.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/external/plyer/platforms/macosx/filechooser.py b/external/plyer/platforms/macosx/filechooser.py
new file mode 100644
index 0000000..5774cc4
--- /dev/null
+++ b/external/plyer/platforms/macosx/filechooser.py
@@ -0,0 +1,108 @@
+'''
+Mac OS X file chooser
+---------------------
+'''
+
+from plyer.facades import FileChooser
+from pyobjus import autoclass, objc_arr, objc_str
+from pyobjus.dylib_manager import load_framework, INCLUDE
+
+load_framework(INCLUDE.AppKit)
+NSURL = autoclass('NSURL')
+NSOpenPanel = autoclass('NSOpenPanel')
+NSSavePanel = autoclass('NSSavePanel')
+NSOKButton = 1
+
+
+class MacFileChooser(object):
+ '''A native implementation of file chooser dialogs using Apple's API
+ through pyobjus.
+
+ Not implemented features:
+ * filters (partial, wildcards are converted to extensions if possible.
+ Pass the Mac-specific "use_extensions" if you can provide
+ Mac OS X-compatible to avoid automatic conversion)
+ * multiple (only for save dialog. Available in open dialog)
+ * icon
+ * preview
+ '''
+
+ mode = "open"
+ path = None
+ multiple = False
+ filters = []
+ preview = False
+ title = None
+ icon = None
+ show_hidden = False
+ use_extensions = False
+
+ def __init__(self, **kwargs):
+ # Simulate Kivy's behavior
+ for i in kwargs:
+ setattr(self, i, kwargs[i])
+
+ def run(self):
+ panel = None
+ if self.mode in ("open", "dir"):
+ panel = NSOpenPanel.openPanel()
+ else:
+ panel = NSSavePanel.savePanel()
+
+ panel.setCanCreateDirectories_(True)
+
+ panel.setCanChooseDirectories_(self.mode == "dir")
+ panel.setCanChooseFiles_(self.mode != "dir")
+ panel.setShowsHiddenFiles_(self.show_hidden)
+
+ if self.title:
+ panel.setTitle_(objc_str(self.title))
+
+ if self.mode != "save" and self.multiple:
+ panel.setAllowsMultipleSelection_(True)
+
+ # Mac OS X does not support wildcards unlike the other platforms.
+ # This tries to convert wildcards to "extensions" when possible,
+ # ans sets the panel to also allow other file types, just to be safe.
+ if len(self.filters) > 0:
+ filthies = []
+ for f in self.filters:
+ if type(f) == str:
+ if not self.use_extensions:
+ if f.strip().endswith("*"):
+ continue
+ pystr = f.strip().split("*")[-1].split(".")[-1]
+ filthies.append(objc_str(pystr))
+ else:
+ for i in f[1:]:
+ if not self.use_extensions:
+ if f.strip().endswith("*"):
+ continue
+ pystr = f.strip().split("*")[-1].split(".")[-1]
+ filthies.append(objc_str(pystr))
+
+ ftypes_arr = objc_arr(filthies)
+ panel.setAllowedFileTypes_(ftypes_arr)
+ panel.setAllowsOtherFileTypes_(not self.use_extensions)
+
+ if self.path:
+ url = NSURL.fileURLWithPath_(self.path)
+ panel.setDirectoryURL_(url)
+
+ if panel.runModal_():
+ if self.mode == "save" or not self.multiple:
+ return [panel.filename().UTF8String()]
+ else:
+ return [i.UTF8String() for i in panel.filenames()]
+ return None
+
+
+class MacOSXFileChooser(FileChooser):
+ '''FileChooser implementation for Windows, using win3all.
+ '''
+ def _file_selection_dialog(self, **kwargs):
+ return MacFileChooser(**kwargs).run()
+
+
+def instance():
+ return MacOSXFileChooser()