From b5a4e263e86f13aa728816af1e772b3688c74f1d Mon Sep 17 00:00:00 2001 From: John Schember Date: Sun, 23 Jan 2011 12:51:08 -0500 Subject: [PATCH] Implement ticket #7834: Enhance Send Specific Formats dialog to better display existing formats. --- src/calibre/gui2/device.py | 20 +++- .../gui2/dialogs/choose_format_device.py | 53 +++++++++ .../gui2/dialogs/choose_format_device.ui | 111 ++++++++++++++++++ 3 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 src/calibre/gui2/dialogs/choose_format_device.py create mode 100644 src/calibre/gui2/dialogs/choose_format_device.ui diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 28b5e178ac..8a0a368cd3 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -13,7 +13,7 @@ from calibre.customize.ui import available_input_formats, available_output_forma device_plugins from calibre.devices.interface import DevicePlugin from calibre.devices.errors import UserFeedback, OpenFeedback -from calibre.gui2.dialogs.choose_format import ChooseFormatDialog +from calibre.gui2.dialogs.choose_format_device import ChooseFormatDeviceDialog from calibre.utils.ipc.job import BaseJob from calibre.devices.scanner import DeviceScanner from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \ @@ -826,8 +826,22 @@ class DeviceMixin(object): # {{{ fmt = None if specific: - d = ChooseFormatDialog(self, _('Choose format to send to device'), - self.device_manager.device.settings().format_map) + formats = [] + aval_out_formats = available_output_formats() + format_count = {} + for row in rows: + for f in self.library_view.model().db.formats(row.row()).split(','): + f = f.lower() + if format_count.has_key(f): + format_count[f] += 1 + else: + format_count[f] = 1 + for f in self.device_manager.device.settings().format_map: + if f in format_count.keys(): + formats.append((f, _('%i of %i Books' % (format_count[f], len(rows))), True if f in aval_out_formats else False)) + elif f in aval_out_formats: + formats.append((f, _('0 of %i Books' % len(rows)), True)) + d = ChooseFormatDeviceDialog(self, _('Choose format to send to device'), formats) if d.exec_() != QDialog.Accepted: return if d.format(): diff --git a/src/calibre/gui2/dialogs/choose_format_device.py b/src/calibre/gui2/dialogs/choose_format_device.py new file mode 100644 index 0000000000..fde00bb70a --- /dev/null +++ b/src/calibre/gui2/dialogs/choose_format_device.py @@ -0,0 +1,53 @@ +__license__ = 'GPL v3' +__copyright__ = '2011, John Schember ' + +from PyQt4.Qt import QDialog, QTreeWidgetItem, QIcon, SIGNAL + +from calibre.gui2 import file_icon_provider +from calibre.gui2.dialogs.choose_format_device_ui import Ui_ChooseFormatDeviceDialog + +class ChooseFormatDeviceDialog(QDialog, Ui_ChooseFormatDeviceDialog): + + def __init__(self, window, msg, formats): + ''' + formats is a list of tuples: [(format, exists, convertable)]. + format: Lower case format identifier. E.G. mobi + exists: String representing the number of books that + exist in the format. + convertable: True if the format is a convertable format. + formats should be ordered in the device's preferred format ordering. + ''' + QDialog.__init__(self, window) + Ui_ChooseFormatDeviceDialog.__init__(self) + self.setupUi(self) + self.connect(self.formats, SIGNAL('activated(QModelIndex)'), + self.activated_slot) + + self.msg.setText(msg) + for i, (format, exists, convertable) in enumerate(formats): + t_item = QTreeWidgetItem() + t_item.setIcon(0, file_icon_provider().icon_from_ext(format.lower())) + t_item.setText(0, format.upper()) + t_item.setText(1, exists) + if convertable: + t_item.setIcon(2, QIcon(I('ok.png'))) + self.formats.addTopLevelItem(t_item) + if i == 0: + self.formats.setCurrentItem(t_item) + t_item.setSelected(True) + self.formats.resizeColumnToContents(2) + self.formats.resizeColumnToContents(1) + self.formats.resizeColumnToContents(0) + self.formats.header().resizeSection(0, self.formats.header().sectionSize(0) * 2) + self._format = None + + def activated_slot(self, *args): + self.accept() + + def format(self): + return self._format + + def accept(self): + self._format = unicode(self.formats.currentItem().text(0)) + return QDialog.accept(self) + diff --git a/src/calibre/gui2/dialogs/choose_format_device.ui b/src/calibre/gui2/dialogs/choose_format_device.ui new file mode 100644 index 0000000000..c52a728d16 --- /dev/null +++ b/src/calibre/gui2/dialogs/choose_format_device.ui @@ -0,0 +1,111 @@ + + + ChooseFormatDeviceDialog + + + + 0 + 0 + 507 + 377 + + + + Choose Format + + + + :/images/mimetypes/unknown.png:/images/mimetypes/unknown.png + + + + + + TextLabel + + + + + + + true + + + + 64 + 64 + + + + true + + + + Format + + + + + Existing + + + AlignLeft|AlignVCenter + + + + + Convertable + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + ChooseFormatDeviceDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ChooseFormatDeviceDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +