Fixes #1209515 by subclassing QFileDialog and attempting to urldecode any files not found

This commit is contained in:
Philip Ridout 2013-08-10 11:16:15 +01:00
parent 3ec0337649
commit 03638ddea6
8 changed files with 73 additions and 10 deletions

View File

@ -384,6 +384,7 @@ def create_separated_list(stringlist):
from eventreceiver import Receiver from eventreceiver import Receiver
from filedialog import FileDialog
from listwidgetwithdnd import ListWidgetWithDnD from listwidgetwithdnd import ListWidgetWithDnD
from formattingtags import FormattingTags from formattingtags import FormattingTags
from spelltextedit import SpellTextEdit from spelltextedit import SpellTextEdit

View File

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2013 Raoul Snyman #
# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
# Frode Woldsund, Martin Zibricky #
# --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
Provide a work around for a bug in QFileDialog (#1209515)
"""
import logging
import os
import urllib
from PyQt4 import QtCore, QtGui
from openlp.core.lib.ui import UiStrings
log = logging.getLogger(__name__)
class FileDialog(QtGui.QFileDialog):
def __init__(self):
QtGui.QFileDialog.__init__(self)
def getOpenFileNames(self, parent, title, path, filters):
files = QtGui.QFileDialog.getOpenFileNames(parent, title, path, filters)
file_list = QtCore.QStringList()
for file in files:
if not os.path.exists(file):
file = urllib.unquote(unicode(file))
if not os.path.exists(file):
QtGui.QMessageBox.information(self,
UiStrings().FNFT,
UiStrings().FNF % file)
continue
file_list.append(QtCore.QString(file))
return file_list

View File

@ -35,7 +35,7 @@ import re
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsManager, OpenLPToolbar, ServiceItem, \ from openlp.core.lib import FileDialog, SettingsManager, OpenLPToolbar, ServiceItem, \
StringContent, build_icon, translate, Receiver, ListWidgetWithDnD StringContent, build_icon, translate, Receiver, ListWidgetWithDnD
from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import UiStrings, create_widget_action, \ from openlp.core.lib.ui import UiStrings, create_widget_action, \
@ -337,7 +337,7 @@ class MediaManagerItem(QtGui.QWidget):
""" """
Add a file to the list widget to make it available for showing Add a file to the list widget to make it available for showing
""" """
files = QtGui.QFileDialog.getOpenFileNames( files = FileDialog().getOpenFileNames(
self, self.onNewPrompt, self, self.onNewPrompt,
SettingsManager.get_last_dir(self.settingsSection), SettingsManager.get_last_dir(self.settingsSection),
self.onNewFileMasks) self.onNewFileMasks)

View File

@ -77,8 +77,12 @@ class UiStrings(object):
self.Error = translate('OpenLP.Ui', 'Error') self.Error = translate('OpenLP.Ui', 'Error')
self.Export = translate('OpenLP.Ui', 'Export') self.Export = translate('OpenLP.Ui', 'Export')
self.File = translate('OpenLP.Ui', 'File') self.File = translate('OpenLP.Ui', 'File')
self.FNFT = unicode(translate('OpenLP.Ui',
'File Not Found'))
self.FNF = unicode(translate('OpenLP.Ui',
'File %s not found.\nPlease try selecting it individually.'))
self.FontSizePtUnit = translate('OpenLP.Ui', 'pt', self.FontSizePtUnit = translate('OpenLP.Ui', 'pt',
'Abbreviated font pointsize unit') 'Abbreviated font pointsize unit')ad
self.Help = translate('OpenLP.Ui', 'Help') self.Help = translate('OpenLP.Ui', 'Help')
self.Hours = translate('OpenLP.Ui', 'h', self.Hours = translate('OpenLP.Ui', 'h',
'The abbreviated unit for hours') 'The abbreviated unit for hours')

View File

@ -36,7 +36,7 @@ import re
from xml.etree.ElementTree import ElementTree, XML from xml.etree.ElementTree import ElementTree, XML
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, get_text_file_string, build_icon, \ from openlp.core.lib import FileDialog, OpenLPToolbar, get_text_file_string, build_icon, \
Receiver, SettingsManager, translate, check_item_selected, \ Receiver, SettingsManager, translate, check_item_selected, \
check_directory_exists, create_thumb, validate_thumb, ImageSource check_directory_exists, create_thumb, validate_thumb, ImageSource
from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, \ from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, \
@ -420,7 +420,7 @@ class ThemeManager(QtGui.QWidget):
attempting to extract OpenLP themes from those files. This process attempting to extract OpenLP themes from those files. This process
will load both OpenLP version 1 and version 2 themes. will load both OpenLP version 1 and version 2 themes.
""" """
files = QtGui.QFileDialog.getOpenFileNames(self, files = FileDialog().getOpenFileNames(self,
translate('OpenLP.ThemeManager', 'Select Theme Import File'), translate('OpenLP.ThemeManager', 'Select Theme Import File'),
SettingsManager.get_last_dir(self.settingsSection), SettingsManager.get_last_dir(self.settingsSection),
unicode(translate('OpenLP.ThemeManager', unicode(translate('OpenLP.ThemeManager',

View File

@ -150,7 +150,6 @@ class AppLocation(object):
check_directory_exists(path) check_directory_exists(path)
return path return path
def _get_os_dir_path(dir_type): def _get_os_dir_path(dir_type):
""" """
Return a path based on which OS and environment we are running in. Return a path based on which OS and environment we are running in.

View File

@ -34,7 +34,7 @@ import shutil
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, \ from openlp.core.lib import FileDialog, PluginStatus, Receiver, MediaType, translate, \
create_separated_list, check_directory_exists create_separated_list, check_directory_exists
from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, \ from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, \
critical_error_message_box, find_and_set_in_combo_box critical_error_message_box, find_and_set_in_combo_box
@ -757,7 +757,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
Loads file(s) from the filesystem. Loads file(s) from the filesystem.
""" """
filters = u'%s (*)' % UiStrings().AllFiles filters = u'%s (*)' % UiStrings().AllFiles
filenames = QtGui.QFileDialog.getOpenFileNames(self, filenames = FileDialog().getOpenFileNames(self,
translate('SongsPlugin.EditSongForm', 'Open File(s)'), translate('SongsPlugin.EditSongForm', 'Open File(s)'),
QtCore.QString(), filters) QtCore.QString(), filters)
for filename in filenames: for filename in filenames:

View File

@ -35,7 +35,7 @@ import os
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib import FileDialog, Receiver, SettingsManager, translate
from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.lib.ui import UiStrings, critical_error_message_box
from openlp.core.lib.settings import Settings from openlp.core.lib.settings import Settings
from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
@ -281,7 +281,7 @@ class SongImportForm(OpenLPWizard):
if filters: if filters:
filters += u';;' filters += u';;'
filters += u'%s (*)' % UiStrings().AllFiles filters += u'%s (*)' % UiStrings().AllFiles
filenames = QtGui.QFileDialog.getOpenFileNames(self, title, filenames = FileDialog().getOpenFileNames(self, title,
SettingsManager.get_last_dir(self.plugin.settingsSection, 1), SettingsManager.get_last_dir(self.plugin.settingsSection, 1),
filters) filters)
if filenames: if filenames: