Source code for enaml.widgets.file_dialog
#------------------------------------------------------------------------------
# Copyright (c) 2012, Enthought, Inc.
# All rights reserved.
#------------------------------------------------------------------------------
from traits.api import Enum, Bool, Callable, List, Unicode
from enaml.core.messenger import Messenger
from enaml.core.trait_types import EnamlEvent
[docs]class FileDialog(Messenger):
""" A dialog widget that allows the user to open and save files and
directories.
"""
#: The title to use for the dialog.
title = Unicode
#: The mode of the dialog.
mode = Enum('open_file', 'open_files', 'save_file', 'directory')
#: The selected path in the dialog. This value will be used to set
#: the initial working directory and file, as appropriate, when the
#: dialog is opened. It will aslo be updated when the dialog is
#: closed and accepted.
path = Unicode
#: The list of selected paths in the dialog. It will be updated
#: when the dialog is closed and accepted. It is output only and
#: is only applicable for the `open_files` mode.
paths = List(Unicode)
#: The string filters used to restrict the user's selections.
filters = List(Unicode)
#: The selected filter from the list of filters. This value will be
#: used as the initial working filter when the dialog is opened. It
#: will also be updated when the dialog is closed and accepted.
selected_filter = Unicode
#: Whether to use a platform native dialog, when available.
native_dialog = Bool(True)
#: An enum indicating if the dialog was accepted or rejected by
#: the user. It will be updated when the dialog is closed. This
#: value is output only.
result = Enum('rejected', 'accepted')
#: An optional callback which will be invoked when the dialog is
#: closed. This is a convenience to make it easier to handle the
#: non-blocking behavior of the dialog. The callback must accept
#: a single argument, which will be the dialog instance.
callback = Callable
#: An event fired when the dialog is closed. The dialog state will
#: be updated before this event is fired.
closed = EnamlEvent
#: Whether to destroy the dialog widget on close. The default is
#: True since dialogs are typically used in a transitory fashion.
#: If this value is set to True, the dialog will be destroyed on
#: the completion of the `closed` event.
destroy_on_close = Bool(True)
#--------------------------------------------------------------------------
# Utility Methods
#--------------------------------------------------------------------------
[docs] def open(self):
""" Open the dialog for user interaction.
"""
if self.parent is None:
raise ValueError('FileDialog cannot be opened without a parent.')
content = {}
content['title'] = self.title
content['mode'] = self.mode
content['path'] = self.path
content['filters'] = self.filters
content['selected_filter'] = self.selected_filter
content['native_dialog'] = self.native_dialog
self.send_action('open', content)
#--------------------------------------------------------------------------
# Message Handling
#--------------------------------------------------------------------------
[docs] def on_action_closed(self, content):
""" Handle the 'closed' action from the client widget.
"""
self.result = content['result']
if self.result == 'accepted':
paths = content['paths']
self.paths = paths
self.path = paths[0] if paths else u''
self.selected_filter = content['selected_filter']
if self.callback:
self.callback(self)
self.closed()
if self.destroy_on_close:
self.destroy()