Add an entry to save to disk when right clicking a format in the book details panel

This commit is contained in:
Kovid Goyal 2012-08-01 13:16:30 +05:30
parent ba2cae821e
commit 0d843a89ea
4 changed files with 52 additions and 13 deletions

View File

@ -73,8 +73,10 @@ class SaveToDiskAction(InterfaceAction):
self.save_to_disk(False, single_dir=True, self.save_to_disk(False, single_dir=True,
single_format=prefs['output_format']) single_format=prefs['output_format'])
def save_to_disk(self, checked, single_dir=False, single_format=None): def save_to_disk(self, checked, single_dir=False, single_format=None,
rows = self.gui.current_view().selectionModel().selectedRows() rows=None, write_opf=None, save_cover=None):
if rows is None:
rows = self.gui.current_view().selectionModel().selectedRows()
if not rows or len(rows) == 0: if not rows or len(rows) == 0:
return error_dialog(self.gui, _('Cannot save to disk'), return error_dialog(self.gui, _('Cannot save to disk'),
_('No books selected'), show=True) _('No books selected'), show=True)
@ -105,6 +107,10 @@ class SaveToDiskAction(InterfaceAction):
opts.write_opf = False opts.write_opf = False
opts.template = opts.send_template opts.template = opts.send_template
opts.single_dir = single_dir opts.single_dir = single_dir
if write_opf is not None:
opts.write_opf = write_opf
if save_cover is not None:
opts.save_cover = save_cover
self._saver = Saver(self.gui, self.gui.library_view.model().db, self._saver = Saver(self.gui, self.gui.library_view.model().db,
Dispatcher(self._books_saved), rows, path, opts, Dispatcher(self._books_saved), rows, path, opts,
spare_server=self.gui.spare_server) spare_server=self.gui.spare_server)
@ -114,6 +120,13 @@ class SaveToDiskAction(InterfaceAction):
self.gui.device_manager.save_books( self.gui.device_manager.save_books(
Dispatcher(self.books_saved), paths, path) Dispatcher(self.books_saved), paths, path)
def save_library_format_by_ids(self, book_ids, fmt, single_dir=True):
if isinstance(book_ids, int):
book_ids = [book_ids]
rows = list(self.gui.library_view.ids_to_rows(book_ids).itervalues())
rows = [self.gui.library_view.model().index(r, 0) for r in rows]
self.save_to_disk(True, single_dir=single_dir, single_format=fmt,
rows=rows, write_opf=False, save_cover=False)
def _books_saved(self, path, failures, error): def _books_saved(self, path, failures, error):
self._saver = None self._saver = None

View File

@ -383,6 +383,7 @@ class BookInfo(QWebView):
link_clicked = pyqtSignal(object) link_clicked = pyqtSignal(object)
remove_format = pyqtSignal(int, object) remove_format = pyqtSignal(int, object)
save_format = pyqtSignal(int, object)
def __init__(self, vertical, parent=None): def __init__(self, vertical, parent=None):
QWebView.__init__(self, parent) QWebView.__init__(self, parent)
@ -396,16 +397,23 @@ class BookInfo(QWebView):
palette.setBrush(QPalette.Base, Qt.transparent) palette.setBrush(QPalette.Base, Qt.transparent)
self.page().setPalette(palette) self.page().setPalette(palette)
self.css = P('templates/book_details.css', data=True).decode('utf-8') self.css = P('templates/book_details.css', data=True).decode('utf-8')
self.remove_format_action = QAction(QIcon(I('trash.png')), for x, icon in [('remove', 'trash.png'), ('save', 'save.png')]:
'', self) ac = QAction(QIcon(I(icon)), '', self)
self.remove_format_action.current_fmt = None ac.current_fmt = None
self.remove_format_action.triggered.connect(self.remove_format_triggerred) ac.triggered.connect(getattr(self, '%s_format_triggerred'%x))
setattr(self, '%s_format_action'%x, ac)
def remove_format_triggerred(self): def context_action_triggered(self, which):
f = self.remove_format_action.current_fmt f = getattr(self, '%s_format_action'%which).current_fmt
if f: if f:
book_id, fmt = f book_id, fmt = f
self.remove_format.emit(book_id, fmt) getattr(self, '%s_format'%which).emit(book_id, fmt)
def remove_format_triggerred(self):
self.context_action_triggered('remove')
def save_format_triggerred(self):
self.context_action_triggered('save')
def link_activated(self, link): def link_activated(self, link):
self._link_clicked = True self._link_clicked = True
@ -449,10 +457,12 @@ class BookInfo(QWebView):
import traceback import traceback
traceback.print_exc() traceback.print_exc()
else: else:
self.remove_format_action.current_fmt = (book_id, fmt) for a, t in [('remove', _('Delete the %s format')),
self.remove_format_action.setText(_('Delete the %s format')%parts[ ('save', _('Save the %s format to disk'))]:
2]) ac = getattr(self, '%s_format_action'%a)
menu.addAction(self.remove_format_action) ac.current_fmt = (book_id, fmt)
ac.setText(t%parts[2])
menu.addAction(ac)
if len(menu.actions()) > 0: if len(menu.actions()) > 0:
menu.exec_(ev.globalPos()) menu.exec_(ev.globalPos())
@ -551,6 +561,7 @@ class BookDetails(QWidget): # {{{
open_containing_folder = pyqtSignal(int) open_containing_folder = pyqtSignal(int)
view_specific_format = pyqtSignal(int, object) view_specific_format = pyqtSignal(int, object)
remove_specific_format = pyqtSignal(int, object) remove_specific_format = pyqtSignal(int, object)
save_specific_format = pyqtSignal(int, object)
remote_file_dropped = pyqtSignal(object, object) remote_file_dropped = pyqtSignal(object, object)
files_dropped = pyqtSignal(object, object) files_dropped = pyqtSignal(object, object)
cover_changed = pyqtSignal(object, object) cover_changed = pyqtSignal(object, object)
@ -618,6 +629,7 @@ class BookDetails(QWidget): # {{{
self._layout.addWidget(self.book_info) self._layout.addWidget(self.book_info)
self.book_info.link_clicked.connect(self.handle_click) self.book_info.link_clicked.connect(self.handle_click)
self.book_info.remove_format.connect(self.remove_specific_format) self.book_info.remove_format.connect(self.remove_specific_format)
self.book_info.save_format.connect(self.save_specific_format)
self.setCursor(Qt.PointingHandCursor) self.setCursor(Qt.PointingHandCursor)
def handle_click(self, link): def handle_click(self, link):

View File

@ -267,6 +267,8 @@ class LayoutMixin(object): # {{{
self.book_details.view_specific_format.connect(self.iactions['View'].view_format_by_id) self.book_details.view_specific_format.connect(self.iactions['View'].view_format_by_id)
self.book_details.remove_specific_format.connect( self.book_details.remove_specific_format.connect(
self.iactions['Remove Books'].remove_format_by_id) self.iactions['Remove Books'].remove_format_by_id)
self.book_details.save_specific_format.connect(
self.iactions['Save To Disk'].save_library_format_by_ids)
m = self.library_view.model() m = self.library_view.model()
if m.rowCount(None) > 0: if m.rowCount(None) > 0:

View File

@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en'
import os, itertools, operator import os, itertools, operator
from functools import partial from functools import partial
from future_builtins import map from future_builtins import map
from collections import OrderedDict
from PyQt4.Qt import (QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, from PyQt4.Qt import (QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal,
QModelIndex, QIcon, QItemSelection, QMimeData, QDrag, QApplication, QModelIndex, QIcon, QItemSelection, QMimeData, QDrag, QApplication,
@ -793,6 +794,17 @@ class BooksView(QTableView): # {{{
sm = self.selectionModel() sm = self.selectionModel()
sm.select(index, sm.ClearAndSelect|sm.Rows) sm.select(index, sm.ClearAndSelect|sm.Rows)
def ids_to_rows(self, ids):
row_map = OrderedDict()
ids = frozenset(ids)
m = self.model()
for row in xrange(m.rowCount(QModelIndex())):
if len(row_map) >= len(ids): break
c = m.id(row)
if c in ids:
row_map[c] = row
return row_map
def select_rows(self, identifiers, using_ids=True, change_current=True, def select_rows(self, identifiers, using_ids=True, change_current=True,
scroll=True): scroll=True):
''' '''