Source code for enaml.qt.qt_file_dialog
#------------------------------------------------------------------------------
# Copyright (c) 2012, Enthought, Inc.
# All rights reserved.
#------------------------------------------------------------------------------
from .qt import qt_api
from .qt.QtGui import QFileDialog
from .qt_object import QtObject
# A mapping from the Enaml dialog modes to the name of the static method
# on QFileDialog which will launch the appropriate native dialog.
if qt_api == 'pyqt':
_NATIVE_METHOD_NAMES = {
'open_file': 'getOpenFileNameAndFilter',
'open_files': 'getOpenFileNamesAndFilter',
'save_file': 'getSaveFileNameAndFilter',
'directory': 'getExistingDirectory',
}
else:
_NATIVE_METHOD_NAMES = {
'open_file': 'getOpenFileName',
'open_files': 'getOpenFileNames',
'save_file': 'getSaveFileName',
'directory': 'getExistingDirectory',
}
[docs]class QtFileDialog(QtObject):
""" A Qt implementation of an Enaml FileDialog.
"""
#--------------------------------------------------------------------------
# Setup Methods
#--------------------------------------------------------------------------
[docs] def on_action_open(self, content):
""" Handle the 'open' action from the Enaml widget.
"""
if content['native_dialog']:
result = self._open_native(content)
else:
result = self._open_non_native(content)
self.send_action('closed', result)
#--------------------------------------------------------------------------
# Private API
#--------------------------------------------------------------------------
def _open_native(self, content):
""" Open a native dialog for the given configuration.
Parameters
----------
content : dict
The content dict sent by the Enaml widget for the `open`
action.
Returns
-------
result : dict
The content dict for the `closed` action to be sent back
to the Enaml widget.
"""
mode = content['mode']
assert mode in ('open_file', 'open_files', 'save_file', 'directory')
def unpack_content():
parent = self.parent_widget()
caption = content['title']
path = content['path']
filters = u';;'.join(content['filters'])
selected_filter = content['selected_filter']
if mode == 'directory':
args = (parent, caption, path)
else:
args = (parent, caption, path, filters, selected_filter)
return args
def pack_result(result):
if mode == 'directory':
paths = [result] if result else []
selected_filter = u''
elif mode == 'open_files':
paths, selected_filter = result
else:
p, selected_filter = result
paths = [p] if p else []
content = {}
if paths:
content['result'] = 'accepted'
content['paths'] = paths
content['selected_filter'] = selected_filter
else:
content['result'] = 'rejected'
return content
method = getattr(QFileDialog, _NATIVE_METHOD_NAMES[mode])
return pack_result(method(*unpack_content()))
def _open_non_native(self, content):
""" Open a non-native dialog for the given configuration.
Parameters
----------
content : dict
The content dict sent by the Enaml widget for the `open`
action.
Returns
-------
result : dict
The content dict for the `closed` action to be sent back
to the Enaml widget.
"""
mode = content['mode']
assert mode in ('open_file', 'open_files', 'save_file', 'directory')
dlg = QFileDialog(self.parent_widget())
if mode == 'open_file':
dlg.setAcceptMode(QFileDialog.AcceptOpen)
dlg.setFileMode(QFileDialog.ExistingFile)
elif mode == 'open_files':
dlg.setAcceptMode(QFileDialog.AcceptOpen)
dlg.setFileMode(QFileDialog.ExistingFiles)
elif mode == 'save_file':
dlg.setAcceptMode(QFileDialog.AcceptSave)
dlg.setFileMode(QFileDialog.AnyFile)
else:
dlg.setAcceptMode(QFileDialog.AcceptOpen)
dlg.setFileMode(QFileDialog.Directory)
dlg.setOption(QFileDialog.ShowDirsOnly, True)
caption = content['title']
path = content['path']
filters = content['filters']
selected_filter = content['selected_filter']
if caption:
dlg.setWindowTitle(caption)
dlg.setDirectory(path)
dlg.setNameFilters(filters)
dlg.selectNameFilter(selected_filter)
result = {}
if dlg.exec_():
result['result'] = 'accepted'
result['paths'] = dlg.selectedFiles()
result['selected_filter'] = dlg.selectedNameFilter()
else:
result['result'] = 'rejected'
return result