mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Use native (KDE/GNOME) file open dialogs on linux
This commit is contained in:
parent
e8136f659e
commit
341ae6b555
@ -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,
|
||||
|
@ -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):
|
||||
|
@ -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">
|
||||
|
@ -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 \
|
||||
|
Loading…
x
Reference in New Issue
Block a user