Fix custom FileDialog

This commit is contained in:
Kovid Goyal 2007-08-02 01:17:46 +00:00
parent c5d4f81ccb
commit 618cfd9772
2 changed files with 2482 additions and 4219 deletions

View File

@ -14,8 +14,8 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
""" The GUI for libprs500. """ """ The GUI for libprs500. """
import sys, os, re, StringIO, traceback import sys, os, re, StringIO, traceback
from PyQt4.QtCore import QVariant, QSettings, QFileInfo from PyQt4.QtCore import QVariant, QSettings, QFileInfo, QObject, SIGNAL
from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, QIcon
from libprs500 import __appname__ as APP_TITLE from libprs500 import __appname__ as APP_TITLE
from libprs500 import __author__ from libprs500 import __author__
NONE = QVariant() #: Null value to return from the data function of item models NONE = QVariant() #: Null value to return from the data function of item models
@ -62,6 +62,7 @@ class FileIconProvider(QFileIconProvider):
'default' : 'unknown', 'default' : 'unknown',
'dir' : 'dir', 'dir' : 'dir',
'zero' : 'zero', 'zero' : 'zero',
'jpeg' : 'jpeg', 'jpeg' : 'jpeg',
'jpg' : 'jpeg', 'jpg' : 'jpeg',
'gif' : 'gif', 'gif' : 'gif',
@ -69,6 +70,9 @@ class FileIconProvider(QFileIconProvider):
'bmp' : 'bmp', 'bmp' : 'bmp',
'svg' : 'svg', 'svg' : 'svg',
'html' : 'html', 'html' : 'html',
'htm' : 'html',
'xhtml' : 'html',
'xhtm' : 'html',
'lit' : 'lit', 'lit' : 'lit',
'lrf' : 'lrf', 'lrf' : 'lrf',
'lrx' : 'lrx', 'lrx' : 'lrx',
@ -83,29 +87,41 @@ class FileIconProvider(QFileIconProvider):
self.icons = {} self.icons = {}
for key in self.__class__.ICONS.keys(): for key in self.__class__.ICONS.keys():
self.icons[key] = ':/images/mimetypes/'+self.__class__.ICONS[key]+'.svg' self.icons[key] = ':/images/mimetypes/'+self.__class__.ICONS[key]+'.svg'
for i in ('dir', 'default'):
self.icons[i] = QIcon(self.icons[i])
def load_icon(self, fileinfo):
def pixmap(self, fileinfo):
key = 'default' key = 'default'
icons = self.icons icons = self.icons
if fileinfo.isSymlink(): if fileinfo.isSymLink():
if not fileinfo.exists(): if not fileinfo.exists():
return icons['zero'] return icons['zero']
fileinfo = QFileInfo(fileinfo.readLink()) fileinfo = QFileInfo(fileinfo.readLink())
if fileinfo.isDir(): if fileinfo.isDir():
key = 'dir' key = 'dir'
else: else:
ext = qstring_to_unicode(fileinfo.extension(True)).lower() ext = qstring_to_unicode(fileinfo.completeSuffix()).lower()
key = [i for i in icons.keys() if i in ext] key = ext if ext in self.icons.keys() else 'default'
key = key[0] if key else 'default' if key == 'default' and ext.count('.') > 0:
if key: ext = ext.rpartition('.')[2]
key = key[0] key = ext if ext in self.icons.keys() else 'default'
candidate = icons[key] candidate = icons[key]
if isinstance(candidate, QPixmap): if isinstance(candidate, QIcon):
return candidate return candidate
pixmap = QPixmap(candidate) icon = QIcon(candidate)
icons[key] = pixmap icons[key] = icon
return pixmap if icon.isNull():
print 'null icon: ', key
return icon
def icon(self, arg):
if isinstance(arg, QFileInfo):
return self.load_icon(arg)
if arg == QFileIconProvider.Folder:
return self.icons['dir']
if arg == QFileIconProvider.File:
return self.icons['default']
return QFileIconProvider.icon(self, arg)
file_icon_provider = None file_icon_provider = None
@ -118,32 +134,36 @@ class FileDialog(QFileDialog):
name = '', name = '',
mode = QFileDialog.ExistingFiles, mode = QFileDialog.ExistingFiles,
): ):
QFileDialog.__init__(self, parent)
self.setModal(modal)
global file_icon_provider global file_icon_provider
if not file_icon_provider: if file_icon_provider is None:
file_icon_provider = FileIconProvider() file_icon_provider = FileIconProvider()
if not self.iconProvider() is file_icon_provider: QFileDialog.__init__(self, parent)
self.setIconProvider(file_icon_provider) self.setIconProvider(file_icon_provider)
self.setModal(modal)
settings = QSettings() settings = QSettings()
_dir = settings.value(name, QVariant(os.path.expanduser("~"))).toString() state = settings.value(name, QVariant()).toByteArray()
self.setDirectory(_dir) if not self.restoreState(state):
self.setDirectory(os.path.expanduser('~'))
self.dialog_name = name
ftext = '' ftext = ''
if filters: if filters:
for filter in filters: for filter in filters:
text, extensions = filter text, extensions = filter
extensions = ['.'+i if not i.startswith('.') else i for i in extensions] extensions = ['*.'+i if not i.startswith('.') else i for i in extensions]
ftext += '%s (%s);;'%(text, ' '.join(extensions)) ftext += '%s (%s);;'%(text, ' '.join(extensions))
if add_all_files_filter or not ftext: if add_all_files_filter or not ftext:
ftext += 'All files (*)' ftext += 'All files (*)'
self.setFilters(ftext) self.setFilter(ftext)
self.setWindowTitle(title) self.setWindowTitle(title)
QObject.connect(self, SIGNAL('accepted()'), self.save_dir)
def get_files(self): def get_files(self):
self.exec_()
return tuple(os.path.abspath(qstring_to_unicode(i)) for i in self.selectedFiles()) return tuple(os.path.abspath(qstring_to_unicode(i)) for i in self.selectedFiles())
def save_dir(self):
settings = QSettings()
settings.setValue(self.dialog_name, QVariant(self.saveState()))
def choose_files(window, name, title, def choose_files(window, name, title,
filters=[], all_files=True, select_only_single_file=False): filters=[], all_files=True, select_only_single_file=False):
@ -162,4 +182,6 @@ def choose_files(window, name, title,
fd = FileDialog(title=title, name=name, filters=filters, fd = FileDialog(title=title, name=name, filters=filters,
parent=window, add_all_files_filter=all_files, mode=mode, parent=window, add_all_files_filter=all_files, mode=mode,
) )
if fd.exec_() == QFileDialog.Accepted:
return fd.get_files() return fd.get_files()
return None

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 245 KiB

After

Width:  |  Height:  |  Size: 69 KiB