diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py
index 161a4788c2..135591aa10 100644
--- a/src/calibre/gui2/actions/delete.py
+++ b/src/calibre/gui2/actions/delete.py
@@ -139,6 +139,21 @@ class DeleteAction(InterfaceAction):
return set([])
return set(map(self.gui.library_view.model().id, rows))
+ def remove_format_by_id(self, book_id, fmt):
+ title = self.gui.current_db.title(book_id, index_is_id=True)
+ if not confirm('
'+(_(
+ 'The %(fmt)s format will be permanently deleted from '
+ '%(title)s. Are you sure?')%dict(fmt=fmt, title=title))
+ +'
', 'library_delete_specific_format', self.gui):
+ return
+
+ self.gui.library_view.model().db.remove_format(book_id, fmt,
+ index_is_id=True, notify=False)
+ self.gui.library_view.model().refresh_ids([book_id])
+ self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(),
+ self.gui.library_view.currentIndex())
+ self.gui.tags_view.recount()
+
def delete_selected_formats(self, *args):
ids = self._get_selected_ids()
if not ids:
diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py
index a8e5e20a70..acf5a8927f 100644
--- a/src/calibre/gui2/book_details.py
+++ b/src/calibre/gui2/book_details.py
@@ -5,8 +5,8 @@ __license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal '
__docformat__ = 'restructuredtext en'
-from PyQt4.Qt import (QPixmap, QSize, QWidget, Qt, pyqtSignal, QUrl,
- QPropertyAnimation, QEasingCurve, QApplication, QFontInfo,
+from PyQt4.Qt import (QPixmap, QSize, QWidget, Qt, pyqtSignal, QUrl, QIcon,
+ QPropertyAnimation, QEasingCurve, QApplication, QFontInfo, QAction,
QSizePolicy, QPainter, QRect, pyqtProperty, QLayout, QPalette, QMenu)
from PyQt4.QtWebKit import QWebView
@@ -382,6 +382,7 @@ class CoverView(QWidget): # {{{
class BookInfo(QWebView):
link_clicked = pyqtSignal(object)
+ remove_format = pyqtSignal(int, object)
def __init__(self, vertical, parent=None):
QWebView.__init__(self, parent)
@@ -395,6 +396,16 @@ class BookInfo(QWebView):
palette.setBrush(QPalette.Base, Qt.transparent)
self.page().setPalette(palette)
self.css = P('templates/book_details.css', data=True).decode('utf-8')
+ self.remove_format_action = QAction(QIcon(I('trash.png')),
+ '', self)
+ self.remove_format_action.current_fmt = None
+ self.remove_format_action.triggered.connect(self.remove_format_triggerred)
+
+ def remove_format_triggerred(self):
+ f = self.remove_format_action.current_fmt
+ if f:
+ book_id, fmt = f
+ self.remove_format.emit(book_id, fmt)
def link_activated(self, link):
self._link_clicked = True
@@ -420,6 +431,32 @@ class BookInfo(QWebView):
else:
ev.ignore()
+ def contextMenuEvent(self, ev):
+ p = self.page()
+ mf = p.mainFrame()
+ r = mf.hitTestContent(ev.pos())
+ url = unicode(r.linkUrl().toString()).strip()
+ menu = p.createStandardContextMenu()
+ ca = self.pageAction(p.Copy)
+ for action in list(menu.actions()):
+ if action is not ca:
+ menu.removeAction(action)
+ if not r.isNull() and url.startswith('format:'):
+ parts = url.split(':')
+ try:
+ book_id, fmt = int(parts[1]), parts[2]
+ except:
+ import traceback
+ traceback.print_exc()
+ else:
+ self.remove_format_action.current_fmt = (book_id, fmt)
+ self.remove_format_action.setText(_('Delete the %s format')%parts[
+ 2])
+ menu.addAction(self.remove_format_action)
+ if len(menu.actions()) > 0:
+ menu.exec_(ev.globalPos())
+
+
# }}}
class DetailsLayout(QLayout): # {{{
@@ -513,6 +550,7 @@ class BookDetails(QWidget): # {{{
show_book_info = pyqtSignal()
open_containing_folder = pyqtSignal(int)
view_specific_format = pyqtSignal(int, object)
+ remove_specific_format = pyqtSignal(int, object)
remote_file_dropped = pyqtSignal(object, object)
files_dropped = pyqtSignal(object, object)
cover_changed = pyqtSignal(object, object)
@@ -579,6 +617,7 @@ class BookDetails(QWidget): # {{{
self.book_info = BookInfo(vertical, self)
self._layout.addWidget(self.book_info)
self.book_info.link_clicked.connect(self.handle_click)
+ self.book_info.remove_format.connect(self.remove_specific_format)
self.setCursor(Qt.PointingHandCursor)
def handle_click(self, link):
diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py
index d6332d71ac..9b63cd5ed8 100644
--- a/src/calibre/gui2/init.py
+++ b/src/calibre/gui2/init.py
@@ -265,6 +265,8 @@ class LayoutMixin(object): # {{{
type=Qt.QueuedConnection)
self.book_details.open_containing_folder.connect(self.iactions['View'].view_folder_for_id)
self.book_details.view_specific_format.connect(self.iactions['View'].view_format_by_id)
+ self.book_details.remove_specific_format.connect(
+ self.iactions['Remove Books'].remove_format_by_id)
m = self.library_view.model()
if m.rowCount(None) > 0: