77
88from Orange .data .io import FileFormat
99from Orange .widgets .settings import Setting
10+ from Orange .util import deprecated
1011
1112
1213def fix_extension (ext , format , suggested_ext , suggested_format ):
@@ -41,6 +42,7 @@ def format_filter(writer):
4142 return '{} (*{})' .format (writer .DESCRIPTION , ' *' .join (writer .EXTENSIONS ))
4243
4344
45+ @deprecated
4446def dialog_formats ():
4547 """
4648 Return readable file types for QFileDialogs.
@@ -53,59 +55,56 @@ def dialog_formats():
5355
5456
5557def get_file_name (start_dir , start_filter , file_formats ):
56- """
57- Get filename for the given possible file formats
58+ return open_filename_dialog_save (start_dir , start_filter ,
59+ sorted (set (file_formats .values ()), key = lambda x : x .PRIORITY ))
60+
5861
62+ def open_filename_dialog_save (start_dir , start_filter , file_formats ):
63+ """
5964 The function uses the standard save file dialog with filters from the
6065 given file formats. Extension is added automatically, if missing. If the
6166 user enters file extension that does not match the file format, (s)he is
6267 given a dialog to decide whether to fix the extension or the format.
6368
64- Function also returns the writer and filter to cover the case where the
65- same extension appears in multiple filters. Although `file_format` is a
66- dictionary that associates its extension with one writer, writers can
67- still have other extensions that are allowed.
68-
6969 Args:
7070 start_dir (str): initial directory, optionally including the filename
7171 start_filter (str): initial filter
72- file_formats (dict {extension: Orange.data.io.FileFormat} ): file formats
72+ file_formats (a list of Orange.data.io.FileFormat): file formats
7373 Returns:
7474 (filename, writer, filter), or `(None, None, None)` on cancel
7575 """
76- writers = sorted (set (file_formats .values ()), key = lambda w : w .PRIORITY )
77- filters = [format_filter (w ) for w in writers ]
78- if start_filter not in filters :
79- start_filter = filters [0 ]
80-
8176 while True :
82- filename , filter = QFileDialog .getSaveFileName (
83- None , 'Save As...' , start_dir , ';;' .join (filters ), start_filter )
77+ dialog = QFileDialog .getSaveFileName
78+ filename , format , filter = \
79+ open_filename_dialog (start_dir , start_filter , file_formats ,
80+ add_all = False , title = "Save as..." , dialog = dialog )
8481 if not filename :
8582 return None , None , None
8683
87- writer = writers [filters .index (filter )]
8884 base , ext = os .path .splitext (filename )
8985 if not ext :
90- filename += writer .EXTENSIONS [0 ]
91- elif ext not in writer .EXTENSIONS :
92- format = writer .DESCRIPTION
93- suggested_ext = writer .EXTENSIONS [0 ]
94- suggested_format = \
95- ext in file_formats and file_formats [ext ].DESCRIPTION
96- res = fix_extension (ext , format , suggested_ext , suggested_format )
86+ filename += format .EXTENSIONS [0 ]
87+ elif ext not in format .EXTENSIONS :
88+ suggested_ext = format .EXTENSIONS [0 ]
89+ suggested_format = False
90+ for f in file_formats : # find the first format
91+ if ext in f .EXTENSIONS :
92+ suggested_format = f
93+ break
94+ res = fix_extension (ext , format .DESCRIPTION , suggested_ext ,
95+ suggested_format .DESCRIPTION if suggested_format else False )
9796 if res == fix_extension .CANCEL :
9897 continue
9998 if res == fix_extension .CHANGE_EXT :
10099 filename = base + suggested_ext
101100 elif res == fix_extension .CHANGE_FORMAT :
102- writer = file_formats [ ext ]
103- filter = format_filter (writer )
104- return filename , writer , filter
101+ format = suggested_format
102+ filter = format_filter (format )
103+ return filename , format , filter
105104
106105
107- def open_filename_dialog (start_dir , start_filter , file_formats , title = "Open..." ,
108- dialog = None ):
106+ def open_filename_dialog (start_dir , start_filter , file_formats ,
107+ add_all = True , title = "Open..." , dialog = None ):
109108 """
110109 Open file dialog with file formats.
111110
@@ -116,6 +115,7 @@ def open_filename_dialog(start_dir, start_filter, file_formats, title="Open...",
116115 start_dir (str): initial directory, optionally including the filename
117116 start_filter (str): initial filter
118117 file_formats (a list of Orange.data.io.FileFormat): file formats
118+ add_all (bool): add a filter for all supported extensions
119119 title (str): title of the dialog
120120 dialog: a function that creates a QT dialog
121121 Returns:
@@ -125,12 +125,13 @@ def open_filename_dialog(start_dir, start_filter, file_formats, title="Open...",
125125 filters = [format_filter (f ) for f in file_formats ]
126126
127127 # add all readable files option
128- all_extensions = set ()
129- for f in file_formats :
130- all_extensions .update (f .EXTENSIONS )
131- file_formats .insert (0 , None )
132- filters .insert (0 , "All readable files (*{})" .format (
133- ' *' .join (sorted (all_extensions ))))
128+ if add_all :
129+ all_extensions = set ()
130+ for f in file_formats :
131+ all_extensions .update (f .EXTENSIONS )
132+ file_formats .insert (0 , None )
133+ filters .insert (0 , "All readable files (*{})" .format (
134+ ' *' .join (sorted (all_extensions ))))
134135
135136 if start_filter not in filters :
136137 start_filter = filters [0 ]
0 commit comments