mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Use native file dialogs on windows and OSX
This commit is contained in:
parent
e50f30392d
commit
e4b5027cee
@ -19,7 +19,7 @@ from PyQt4.QtCore import QVariant, QSettings, QFileInfo, QObject, SIGNAL, QBuffe
|
|||||||
from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \
|
from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \
|
||||||
QIcon, QTableView
|
QIcon, QTableView
|
||||||
from libprs500 import __appname__ as APP_TITLE
|
from libprs500 import __appname__ as APP_TITLE
|
||||||
from libprs500 import __author__
|
from libprs500 import __author__, islinux
|
||||||
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
|
||||||
|
|
||||||
BOOK_EXTENSIONS = ['lrf', 'lrx', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm',
|
BOOK_EXTENSIONS = ['lrf', 'lrx', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm',
|
||||||
@ -182,43 +182,77 @@ class FileDialog(QObject):
|
|||||||
):
|
):
|
||||||
QObject.__init__(self)
|
QObject.__init__(self)
|
||||||
initialize_file_icon_provider()
|
initialize_file_icon_provider()
|
||||||
self.fd = QFileDialog(parent)
|
|
||||||
self.fd.setFileMode(mode)
|
|
||||||
self.fd.setIconProvider(_file_icon_provider)
|
|
||||||
self.fd.setModal(modal)
|
|
||||||
settings = QSettings()
|
|
||||||
state = settings.value(name, QVariant()).toByteArray()
|
|
||||||
if not self.fd.restoreState(state):
|
|
||||||
self.fd.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.fd.setFilter(ftext)
|
|
||||||
self.fd.setWindowTitle(title)
|
settings = QSettings()
|
||||||
QObject.connect(self.fd, SIGNAL('accepted()'), self.save_dir)
|
self.dialog_name = name if name else 'dialog_' + title
|
||||||
self.exec_ = self.fd.exec_
|
self.selected_files = None
|
||||||
self.show = self.fd.show
|
self.fd = None
|
||||||
|
if islinux:
|
||||||
|
self.fd = QFileDialog(parent)
|
||||||
|
self.fd.setFileMode(mode)
|
||||||
|
self.fd.setIconProvider(_file_icon_provider)
|
||||||
|
self.fd.setModal(modal)
|
||||||
|
self.fd.setFilter(ftext)
|
||||||
|
self.fd.setWindowTitle(title)
|
||||||
|
state = settings.value(name, QVariant()).toByteArray()
|
||||||
|
if not self.fd.restoreState(state):
|
||||||
|
self.fd.setDirectory(os.path.expanduser('~'))
|
||||||
|
QObject.connect(self.fd, SIGNAL('accepted()'), self.save_dir)
|
||||||
|
self.accepted = self.fd.exec_() == QFileDialog.Accepted
|
||||||
|
else:
|
||||||
|
dir = settings.value(self.dialog_name, QVariant(os.path.expanduser('~'))).toString()
|
||||||
|
self.selected_files = []
|
||||||
|
if mode == QFileDialog.AnyFile:
|
||||||
|
f = qstring_to_unicode(
|
||||||
|
QFileDialog.getSaveFileName(parent, title, dir, ftext, ""))
|
||||||
|
if os.path.exists(f):
|
||||||
|
self.selected_files.append(f)
|
||||||
|
elif mode == QFileDialog.ExistingFile:
|
||||||
|
f = qstring_to_unicode(
|
||||||
|
QFileDialog.getOpenFileName(parent, title, dir, ftext, ""))
|
||||||
|
if os.path.exists(f):
|
||||||
|
self.selected_files.append(f)
|
||||||
|
elif mode == QFileDialog.ExistingFiles:
|
||||||
|
fs = QFileDialog.getOpenFileNames(parent, title, dir, ftext, "")
|
||||||
|
for f in fs:
|
||||||
|
if os.path.exists(qstring_to_unicode(f)):
|
||||||
|
self.selected_files.append(f)
|
||||||
|
else:
|
||||||
|
opts = QFileDialog.ShowDirsOnly if mode == QFileDialog.DirectoryOnly else QFileDialog.Option()
|
||||||
|
f = qstring_to_unicode(
|
||||||
|
QFileDialog.getExistingDirectory(parent, title, dir, opts))
|
||||||
|
if os.path.exists(f):
|
||||||
|
self.selected_files.append(f)
|
||||||
|
if self.selected_files:
|
||||||
|
settings.setValue(self.dialog_name, QVariant(os.path.dirname(self.selected_files[0])))
|
||||||
|
self.accepted = bool(self.selected_files)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_files(self):
|
def get_files(self):
|
||||||
return tuple(os.path.abspath(qstring_to_unicode(i)) for i in self.fd.selectedFiles())
|
if self.selected_files is None:
|
||||||
|
return tuple(os.path.abspath(qstring_to_unicode(i)) for i in self.fd.selectedFiles())
|
||||||
|
return tuple(self.selected_files)
|
||||||
|
|
||||||
def save_dir(self):
|
def save_dir(self):
|
||||||
settings = QSettings()
|
if self.fd:
|
||||||
settings.setValue(self.dialog_name, QVariant(self.fd.saveState()))
|
settings = QSettings()
|
||||||
|
settings.setValue(self.dialog_name, QVariant(self.fd.saveState()))
|
||||||
|
|
||||||
|
|
||||||
def choose_dir(window, name, title):
|
def choose_dir(window, name, title):
|
||||||
settings = QSettings()
|
fd = FileDialog(title, [], False, window, mode=QFileDialog.DirectoryOnly)
|
||||||
dir = settings.value(name, QVariant(os.path.expanduser('~'))).toString()
|
dir = fd.get_files()
|
||||||
dir = qstring_to_unicode(QFileDialog.getExistingDirectory(window, title, dir))
|
if dir:
|
||||||
if os.path.exists(dir):
|
return dir[0]
|
||||||
return dir
|
|
||||||
|
|
||||||
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):
|
||||||
@ -237,7 +271,7 @@ 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:
|
if fd.accepted:
|
||||||
return fd.get_files()
|
return fd.get_files()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -247,7 +281,7 @@ def choose_images(window, name, title, select_only_single_file=True):
|
|||||||
filters=[('Images', ['png', 'gif', 'jpeg', 'jpg', 'svg'])],
|
filters=[('Images', ['png', 'gif', 'jpeg', 'jpg', 'svg'])],
|
||||||
parent=window, add_all_files_filter=False, mode=mode,
|
parent=window, add_all_files_filter=False, mode=mode,
|
||||||
)
|
)
|
||||||
if fd.exec_() == QFileDialog.Accepted:
|
if fd.accepted:
|
||||||
return fd.get_files()
|
return fd.get_files()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user