Use native (KDE/GNOME) file open dialogs on linux

This commit is contained in:
Kovid Goyal 2009-09-11 11:11:18 -06:00
parent e8136f659e
commit 341ae6b555
4 changed files with 32 additions and 180 deletions

View File

@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
""" The GUI """
import os
from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, QSize, \
QByteArray, QUrl, QTranslator, QCoreApplication, QThread
QByteArray, QTranslator, QCoreApplication, QThread
from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \
QIcon, QTableView, QApplication, QDialog, QPushButton
@ -23,8 +23,6 @@ ALL_COLUMNS = ['title', 'authors', 'size', 'timestamp', 'rating', 'publisher',
def _config():
c = Config('gui', 'preferences for the calibre GUI')
c.add_opt('frequently_used_directories', default=[],
help=_('Frequently used directories'))
c.add_opt('send_to_storage_card_by_default', default=False,
help=_('Send file to storage card instead of main memory by default'))
c.add_opt('confirm_delete', default=False,
@ -379,15 +377,8 @@ def file_icon_provider():
global _file_icon_provider
return _file_icon_provider
_sidebar_directories = []
def set_sidebar_directories(dirs):
global _sidebar_directories
if dirs is None:
dirs = config['frequently_used_directories']
_sidebar_directories = [QUrl.fromLocalFile(i) for i in dirs]
class FileDialog(QObject):
def __init__(self, title='Choose Files',
def __init__(self, title=_('Choose Files'),
filters=[],
add_all_files_filter=True,
parent=None,
@ -396,7 +387,6 @@ class FileDialog(QObject):
mode = QFileDialog.ExistingFiles,
):
QObject.__init__(self)
initialize_file_icon_provider()
ftext = ''
if filters:
for filter in filters:
@ -412,42 +402,27 @@ class FileDialog(QObject):
self.selected_files = None
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.setNameFilter(ftext)
self.fd.setWindowTitle(title)
state = dynamic[self.dialog_name]
if not state or not self.fd.restoreState(state):
self.fd.setDirectory(os.path.expanduser('~'))
osu = [i for i in self.fd.sidebarUrls()]
self.fd.setSidebarUrls(osu + _sidebar_directories)
QObject.connect(self.fd, SIGNAL('accepted()'), self.save_dir)
self.accepted = self.fd.exec_() == QFileDialog.Accepted
else:
dir = dynamic.get(self.dialog_name, os.path.expanduser('~'))
initial_dir = dynamic.get(self.dialog_name, os.path.expanduser('~'))
if not isinstance(initial_dir, basestring):
initial_dir = os.path.expanduser('~')
self.selected_files = []
if mode == QFileDialog.AnyFile:
f = qstring_to_unicode(
QFileDialog.getSaveFileName(parent, title, dir, ftext, ""))
if os.path.exists(f):
f = unicode(QFileDialog.getSaveFileName(parent, title, initial_dir, ftext, ""))
if f and 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):
f = unicode(QFileDialog.getOpenFileName(parent, title, initial_dir, ftext, ""))
if f and os.path.exists(f):
self.selected_files.append(f)
elif mode == QFileDialog.ExistingFiles:
fs = QFileDialog.getOpenFileNames(parent, title, dir, ftext, "")
fs = QFileDialog.getOpenFileNames(parent, title, initial_dir, ftext, "")
for f in fs:
if os.path.exists(qstring_to_unicode(f)):
f = unicode(f)
if f and os.path.exists(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))
f = unicode(QFileDialog.getExistingDirectory(parent, title, initial_dir, opts))
if os.path.exists(f):
self.selected_files.append(f)
if self.selected_files:
@ -459,16 +434,10 @@ class FileDialog(QObject):
self.accepted = bool(self.selected_files)
def get_files(self):
if islinux and self.fd.result() != self.fd.Accepted:
return tuple()
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):
if self.fd:
dynamic[self.dialog_name] = self.fd.saveState()
def choose_dir(window, name, title):
fd = FileDialog(title, [], False, window, name=name,

View File

@ -354,14 +354,10 @@ class ConfigDialog(QDialog, Ui_Dialog):
self.connect(self.input_up, SIGNAL('clicked()'), self.up_input)
self.connect(self.input_down, SIGNAL('clicked()'), self.down_input)
dirs = config['frequently_used_directories']
rn = config['use_roman_numerals_for_series_number']
self.timeout.setValue(prefs['network_timeout'])
self.roman_numerals.setChecked(rn)
self.new_version_notification.setChecked(config['new_version_notification'])
self.directory_list.addItems(dirs)
self.connect(self.add_button, SIGNAL('clicked(bool)'), self.add_dir)
self.connect(self.remove_button, SIGNAL('clicked(bool)'), self.remove_dir)
if not islinux:
self.dirs_box.setVisible(False)
@ -676,15 +672,6 @@ class ConfigDialog(QDialog, Ui_Dialog):
if dir:
self.location.setText(dir)
def add_dir(self):
dir = choose_dir(self, 'Add freq dir dialog', 'select directory')
if dir:
self.directory_list.addItem(dir)
def remove_dir(self):
idx = self.directory_list.currentRow()
if idx >= 0:
self.directory_list.takeItem(idx)
def accept(self):
mcs = unicode(self.max_cover_size.text()).strip()
@ -751,10 +738,6 @@ class ConfigDialog(QDialog, Ui_Dialog):
d.exec_()
else:
self.database_location = os.path.abspath(path)
self.directories = [
qstring_to_unicode(self.directory_list.item(i).text()) for i in \
range(self.directory_list.count())]
config['frequently_used_directories'] = self.directories
QDialog.accept(self)
class VacThread(QThread):

View File

@ -281,103 +281,6 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="dirs_box">
<property name="title">
<string>Frequently used directories</string>
</property>
<layout class="QGridLayout" name="_5">
<item row="0" column="0">
<layout class="QHBoxLayout" name="_6">
<item>
<widget class="QListWidget" name="directory_list">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="iconSize">
<size>
<width>22</width>
<height>22</height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="_7">
<item>
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="add_button">
<property name="toolTip">
<string>Add a directory to the frequently used directories list</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/plus.svg</normaloff>:/images/plus.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="remove_button">
<property name="toolTip">
<string>Remove a directory from the frequently used directories list</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/list_remove.svg</normaloff>:/images/list_remove.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page">

View File

@ -25,7 +25,7 @@ from calibre.utils.ipc.server import Server
from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \
initialize_file_icon_provider, question_dialog,\
pixmap_to_data, choose_dir, ORG_NAME, \
set_sidebar_directories, Dispatcher, \
Dispatcher, \
Application, available_height, \
max_available_height, config, info_dialog, \
available_width, GetMetadata
@ -1486,8 +1486,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.save_menu.actions()[2].setText(
_('Save only %s format to disk')%
prefs['output_format'].upper())
if hasattr(d, 'directories'):
set_sidebar_directories(d.directories)
self.library_view.model().read_config()
self.create_device_menu()
@ -1646,7 +1644,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
geometry = config['main_window_geometry']
if geometry is not None:
self.restoreGeometry(geometry)
set_sidebar_directories(None)
self.tool_bar.setIconSize(config['toolbar_icon_size'])
self.tool_bar.setToolButtonStyle(
Qt.ToolButtonTextUnderIcon if \