mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
Fix custom FileDialog
This commit is contained in:
parent
c5d4f81ccb
commit
618cfd9772
@ -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 |
Loading…
x
Reference in New Issue
Block a user