root / grc / src / gui / FileDialogs.py @ d9f284cb
History | View | Annotate | Download (6.2 kB)
| 1 | """
|
|---|---|
| 2 | Copyright 2007 Free Software Foundation, Inc.
|
| 3 | This file is part of GNU Radio
|
| 4 | |
| 5 | GNU Radio Companion is free software; you can redistribute it and/or
|
| 6 | modify it under the terms of the GNU General Public License
|
| 7 | as published by the Free Software Foundation; either version 2
|
| 8 | of the License, or (at your option) any later version.
|
| 9 | |
| 10 | GNU Radio Companion is distributed in the hope that it will be useful,
|
| 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| 13 | GNU General Public License for more details.
|
| 14 | |
| 15 | You should have received a copy of the GNU General Public License
|
| 16 | along with this program; if not, write to the Free Software
|
| 17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
| 18 | """
|
| 19 | |
| 20 | import pygtk |
| 21 | pygtk.require('2.0')
|
| 22 | import gtk |
| 23 | from Dialogs import MessageDialogHelper |
| 24 | from Constants import \ |
| 25 | DEFAULT_FILE_PATH, IMAGE_FILE_EXTENSION, \ |
| 26 | NEW_FLOGRAPH_TITLE
|
| 27 | import Preferences |
| 28 | from os import path |
| 29 | |
| 30 | OPEN_FLOW_GRAPH = 'open flow graph'
|
| 31 | SAVE_FLOW_GRAPH = 'save flow graph'
|
| 32 | SAVE_IMAGE = 'save image'
|
| 33 | |
| 34 | ##the filter for flow graph files
|
| 35 | def get_flow_graph_files_filter(): |
| 36 | filter = gtk.FileFilter() |
| 37 | filter.set_name('Flow Graph Files') |
| 38 | filter.add_pattern('*'+Preferences.file_extension()) |
| 39 | filter.add_pattern('*.xml') #TEMP |
| 40 | return filter |
| 41 | |
| 42 | ##the filter for image files
|
| 43 | def get_image_files_filter(): |
| 44 | filter = gtk.FileFilter() |
| 45 | filter.set_name('Image Files') |
| 46 | filter.add_pattern('*'+IMAGE_FILE_EXTENSION) |
| 47 | return filter |
| 48 | |
| 49 | ##the filter for all files
|
| 50 | def get_all_files_filter(): |
| 51 | filter = gtk.FileFilter() |
| 52 | filter.set_name('All Files') |
| 53 | filter.add_pattern('*') |
| 54 | return filter |
| 55 | |
| 56 | class FileDialogHelper(gtk.FileChooserDialog): |
| 57 | """
|
| 58 | A wrapper class for the gtk file chooser dialog.
|
| 59 | Implement a file chooser dialog with only necessary parameters.
|
| 60 | """ |
| 61 | |
| 62 | def __init__(self, action, title): |
| 63 | """
|
| 64 | FileDialogHelper contructor.
|
| 65 | Create a save or open dialog with cancel and ok buttons.
|
| 66 | Use standard settings: no multiple selection, local files only, and the * filter.
|
| 67 | @param action gtk.FILE_CHOOSER_ACTION_OPEN or gtk.FILE_CHOOSER_ACTION_SAVE
|
| 68 | @param title the title of the dialog (string)
|
| 69 | """ |
| 70 | ok_stock = {gtk.FILE_CHOOSER_ACTION_OPEN : 'gtk-open', gtk.FILE_CHOOSER_ACTION_SAVE : 'gtk-save'}[action]
|
| 71 | gtk.FileChooserDialog.__init__(self, title, None, action, ('gtk-cancel', gtk.RESPONSE_CANCEL, ok_stock, gtk.RESPONSE_OK)) |
| 72 | self.set_select_multiple(False) |
| 73 | self.set_local_only(True) |
| 74 | self.add_filter(get_all_files_filter())
|
| 75 | |
| 76 | class FileDialog(FileDialogHelper): |
| 77 | """A dialog box to save or open flow graph files. This is a base class, do not use."""
|
| 78 | |
| 79 | def __init__(self, current_file_path=''): |
| 80 | """
|
| 81 | FileDialog constructor.
|
| 82 | @param current_file_path the current directory or path to the open flow graph
|
| 83 | """ |
| 84 | if not current_file_path: current_file_path = path.join(DEFAULT_FILE_PATH, NEW_FLOGRAPH_TITLE + Preferences.file_extension()) |
| 85 | if self.type == OPEN_FLOW_GRAPH: |
| 86 | FileDialogHelper.__init__(self, gtk.FILE_CHOOSER_ACTION_OPEN, 'Open a Flow Graph from a File...') |
| 87 | self.add_and_set_filter(get_flow_graph_files_filter())
|
| 88 | self.set_select_multiple(True) |
| 89 | elif self.type == SAVE_FLOW_GRAPH: |
| 90 | FileDialogHelper.__init__(self, gtk.FILE_CHOOSER_ACTION_SAVE, 'Save a Flow Graph to a File...') |
| 91 | self.add_and_set_filter(get_flow_graph_files_filter())
|
| 92 | self.set_current_name(path.basename(current_file_path)) #show the current filename |
| 93 | elif self.type == SAVE_IMAGE: |
| 94 | FileDialogHelper.__init__(self, gtk.FILE_CHOOSER_ACTION_SAVE, 'Save a Flow Graph Screen Shot...') |
| 95 | self.add_and_set_filter(get_image_files_filter())
|
| 96 | current_file_path = current_file_path + IMAGE_FILE_EXTENSION |
| 97 | self.set_current_name(path.basename(current_file_path)) #show the current filename |
| 98 | self.set_current_folder(path.dirname(current_file_path)) #current directory |
| 99 | |
| 100 | def add_and_set_filter(self, filter): |
| 101 | """
|
| 102 | Add the gtk file filter to the list of filters and set it as the default file filter.
|
| 103 | @param filter a gtk file filter.
|
| 104 | """ |
| 105 | self.add_filter(filter) |
| 106 | self.set_filter(filter) |
| 107 | |
| 108 | def get_rectified_filename(self): |
| 109 | """
|
| 110 | Run the dialog and get the filename.
|
| 111 | If this is a save dialog and the file name is missing the extension, append the file extension.
|
| 112 | If the file name with the extension already exists, show a overwrite dialog.
|
| 113 | If this is an open dialog, return a list of filenames.
|
| 114 | @return the complete file path
|
| 115 | """ |
| 116 | if gtk.FileChooserDialog.run(self) != gtk.RESPONSE_OK: return None #response was cancel |
| 117 | #############################################
|
| 118 | # Handle Save Dialogs
|
| 119 | #############################################
|
| 120 | if self.type in (SAVE_FLOW_GRAPH, SAVE_IMAGE): |
| 121 | filename = self.get_filename()
|
| 122 | for extension, filter in ( |
| 123 | (Preferences.file_extension(), get_flow_graph_files_filter()), |
| 124 | (IMAGE_FILE_EXTENSION, get_image_files_filter()), |
| 125 | ): #append the missing file extension if the filter matches
|
| 126 | if filename[len(filename)-len(extension):] != extension \ |
| 127 | and filter == self.get_filter(): filename += extension |
| 128 | self.set_current_name(path.basename(filename)) #show the filename with extension |
| 129 | if path.exists(filename): #ask the user to confirm overwrite |
| 130 | if MessageDialogHelper(
|
| 131 | gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, 'Confirm Overwrite!',
|
| 132 | 'File <b>"%s"</b> Exists!\nWould you like to overwrite the existing file?'%filename,
|
| 133 | ) == gtk.RESPONSE_NO: return self.get_rectified_filename() |
| 134 | return filename
|
| 135 | #############################################
|
| 136 | # Handle Open Dialogs
|
| 137 | #############################################
|
| 138 | elif self.type in (OPEN_FLOW_GRAPH,): |
| 139 | filenames = self.get_filenames()
|
| 140 | for filename in filenames: |
| 141 | if not path.exists(filename): #show a warning and re-run |
| 142 | MessageDialogHelper( |
| 143 | gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, 'Cannot Open!',
|
| 144 | 'File <b>"%s"</b> Does not Exist!'%filename,
|
| 145 | ) |
| 146 | return self.get_rectified_filename() |
| 147 | return filenames
|
| 148 | |
| 149 | def run(self): |
| 150 | """
|
| 151 | Get the filename and destroy the dialog.
|
| 152 | @return the filename or None if a close/cancel occured.
|
| 153 | """ |
| 154 | filename = self.get_rectified_filename()
|
| 155 | self.destroy()
|
| 156 | return filename
|
| 157 | |
| 158 | class OpenFlowGraphFileDialog(FileDialog): type = OPEN_FLOW_GRAPH |
| 159 | class SaveFlowGraphFileDialog(FileDialog): type = SAVE_FLOW_GRAPH |
| 160 | class SaveImageFileDialog(FileDialog): type = SAVE_IMAGE |