summaryrefslogtreecommitdiff
path: root/misc/pylib/robofab/interface/mac/getFileOrFolder.py
blob: da7edff61cb0b2816c691c6c592758c0c00de9fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""This module provides two functions, very similar to
EasyDialogs.AskFileForOpen() and EasyDialogs.AskFolder(): GetFile() and
GetFileOrFolder(). The main difference is that the functions here fully
support "packages" or "bundles", ie. folders that appear to be files in
the finder and open/save dialogs. The second difference is that
GetFileOrFolder() allows the user to select a file _or_ a folder.
"""


__all__ = ["GetFile", "GetFileOrFolder"]


from EasyDialogs import _process_Nav_args, _interact
import Nav
import Carbon.File


# Lots of copy/paste from EasyDialogs.py, for one because althought the
# EasyDialogs counterparts take a million options, they don't take the
# one option I need: the flag to support packages...

kNavSupportPackages = 0x00001000


def GetFile(message=None, title=None, directory=None, fileName=None, allowsMultipleSelection=False, fileTypes=None):
	"""Ask the user to select a file.
	
	Some of these arguments are not supported:
	    title, directory, fileName, allowsMultipleSelection and fileTypes are here for compatibility reasons.
	"""
	default_flags = 0x56 | kNavSupportPackages
	args, tpwanted = _process_Nav_args(default_flags, message=message)
	_interact()
	try:
		rr = Nav.NavChooseFile(args)
		good = 1
	except Nav.error, arg:
		if arg[0] != -128: # userCancelledErr
			raise Nav.error, arg
		return None
	if not rr.validRecord or not rr.selection:
		return None
	if issubclass(tpwanted, Carbon.File.FSRef):
		return tpwanted(rr.selection_fsr[0])
	if issubclass(tpwanted, Carbon.File.FSSpec):
		return tpwanted(rr.selection[0])
	if issubclass(tpwanted, str):
		return tpwanted(rr.selection_fsr[0].as_pathname())
	if issubclass(tpwanted, unicode):
		return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
	raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)


def GetFileOrFolder(message=None, title=None, directory=None, fileName=None, allowsMultipleSelection=False, fileTypes=None):
	"""Ask the user to select a file or a folder.

	Some of these arguments are not supported:
	    title, directory, fileName, allowsMultipleSelection and fileTypes are here for compatibility reasons.
	"""
	default_flags = 0x17 | kNavSupportPackages
	args, tpwanted = _process_Nav_args(default_flags, message=message)
	_interact()
	try:
		rr = Nav.NavChooseObject(args)
		good = 1
	except Nav.error, arg:
		if arg[0] != -128: # userCancelledErr
			raise Nav.error, arg
		return None
	if not rr.validRecord or not rr.selection:
		return None
	if issubclass(tpwanted, Carbon.File.FSRef):
		return tpwanted(rr.selection_fsr[0])
	if issubclass(tpwanted, Carbon.File.FSSpec):
		return tpwanted(rr.selection[0])
	if issubclass(tpwanted, str):
		return tpwanted(rr.selection_fsr[0].as_pathname())
	if issubclass(tpwanted, unicode):
		return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
	raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)