diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py
index b486bc1ecb..45c8031510 100644
--- a/src/calibre/gui2/library.py
+++ b/src/calibre/gui2/library.py
@@ -563,13 +563,19 @@ class BooksView(TableView):
if col > -1:
self.setItemDelegateForColumn(col, self.rating_delegate)
- def set_context_menu(self, edit_metadata, send_to_device, convert, view):
+ def set_context_menu(self, edit_metadata, send_to_device, convert, view, save, open_folder):
self.setContextMenuPolicy(Qt.DefaultContextMenu)
self.context_menu = QMenu(self)
- self.context_menu.addAction(edit_metadata)
- self.context_menu.addAction(send_to_device)
- self.context_menu.addAction(convert)
+ if edit_metadata is not None:
+ self.context_menu.addAction(edit_metadata)
+ if send_to_device is not None:
+ self.context_menu.addAction(send_to_device)
+ if convert is not None:
+ self.context_menu.addAction(convert)
self.context_menu.addAction(view)
+ self.context_menu.addAction(save)
+ if open_folder is not None:
+ self.context_menu.addAction(open_folder)
def contextMenuEvent(self, event):
self.context_menu.popup(event.globalPos())
diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py
index e7948c2cf3..261e25aa5c 100644
--- a/src/calibre/gui2/main.py
+++ b/src/calibre/gui2/main.py
@@ -193,6 +193,9 @@ class Main(MainWindow, Ui_MainWindow):
QObject.connect(self.action_view, SIGNAL("triggered(bool)"), self.view_book)
QObject.connect(self.view_menu.actions()[0], SIGNAL("triggered(bool)"), self.view_book)
QObject.connect(self.view_menu.actions()[1], SIGNAL("triggered(bool)"), self.view_specific_format)
+ self.connect(self.action_open_containing_folder, SIGNAL('triggered(bool)'), self.view_folder)
+ self.action_open_containing_folder.setShortcut(Qt.Key_O)
+ self.action_sync.setShortcut(Qt.Key_D)
self.action_sync.setMenu(sm)
self.action_edit.setMenu(md)
self.action_save.setMenu(self.save_menu)
@@ -222,7 +225,11 @@ class Main(MainWindow, Ui_MainWindow):
QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), self.do_advanced_search)
####################### Library view ########################
- self.library_view.set_context_menu(self.action_edit, self.action_sync, self.action_convert, self.action_view)
+ self.library_view.set_context_menu(self.action_edit, self.action_sync,
+ self.action_convert, self.action_view,
+ self.action_save, self.action_open_containing_folder)
+ self.memory_view.set_context_menu(None, None, None, self.action_view, self.action_save, None)
+ self.card_view.set_context_menu(None, None, None, self.action_view, self.action_save, None)
QObject.connect(self.library_view, SIGNAL('files_dropped(PyQt_PyObject)'),
self.files_dropped)
for func, target in [
@@ -1003,7 +1010,19 @@ class Main(MainWindow, Ui_MainWindow):
self.view_format(row, format)
else:
return
-
+
+ def view_folder(self, *args):
+ rows = self.current_view().selectionModel().selectedRows()
+ if self.current_view() is self.library_view:
+ if not rows or len(rows) == 0:
+ d = error_dialog(self, _('Cannot open folder'), _('No book selected'))
+ d.exec_()
+ return
+ for row in rows:
+ path = self.library_view.model().db.abspath(row.row())
+ QDesktopServices.openUrl(QUrl('file:'+path))
+
+
def view_book(self, triggered):
rows = self.current_view().selectionModel().selectedRows()
if self.current_view() is self.library_view:
@@ -1152,11 +1171,13 @@ class Main(MainWindow, Ui_MainWindow):
self.action_edit.setEnabled(True)
self.action_convert.setEnabled(True)
self.view_menu.actions()[1].setEnabled(True)
+ self.action_open_containing_folder.setEnabled(True)
else:
self.action_sync.setEnabled(False)
self.action_edit.setEnabled(False)
self.action_convert.setEnabled(False)
self.view_menu.actions()[1].setEnabled(False)
+ self.action_open_containing_folder.setEnabled(False)
def device_job_exception(self, job):
'''
diff --git a/src/calibre/gui2/main.ui b/src/calibre/gui2/main.ui
index 46f7c08bbd..200e54c38f 100644
--- a/src/calibre/gui2/main.ui
+++ b/src/calibre/gui2/main.ui
@@ -560,6 +560,15 @@
V
+
+
+
+ :/images/document_open.svg:/images/document_open.svg
+
+
+ Open containing folder
+
+