ToC Editor: Right-click menu to perform various useful actions on entries in the ToC

This commit is contained in:
Kovid Goyal 2013-04-02 10:02:39 +05:30
parent 2eceaeb2ab
commit 800f0c19ff

View File

@ -14,7 +14,7 @@ from functools import partial
from PyQt4.Qt import (QPushButton, QFrame, QVariant, QMenu, QInputDialog, from PyQt4.Qt import (QPushButton, QFrame, QVariant, QMenu, QInputDialog,
QDialog, QVBoxLayout, QDialogButtonBox, QSize, QStackedWidget, QWidget, QDialog, QVBoxLayout, QDialogButtonBox, QSize, QStackedWidget, QWidget,
QLabel, Qt, pyqtSignal, QIcon, QTreeWidget, QGridLayout, QTreeWidgetItem, QLabel, Qt, pyqtSignal, QIcon, QTreeWidget, QGridLayout, QTreeWidgetItem,
QToolButton, QItemSelectionModel) QToolButton, QItemSelectionModel, QCursor)
from calibre.ebooks.oeb.polish.container import get_container, AZW3Container from calibre.ebooks.oeb.polish.container import get_container, AZW3Container
from calibre.ebooks.oeb.polish.toc import ( from calibre.ebooks.oeb.polish.toc import (
@ -358,6 +358,8 @@ class TreeWidget(QTreeWidget): # {{{
self.setMouseTracking(True) self.setMouseTracking(True)
self.in_drop_event = False self.in_drop_event = False
self.root = self.invisibleRootItem() self.root = self.invisibleRootItem()
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.show_context_menu)
def iteritems(self, parent=None): def iteritems(self, parent=None):
if parent is None: if parent is None:
@ -471,6 +473,12 @@ class TreeWidget(QTreeWidget): # {{{
p = item.parent() or self.root p = item.parent() or self.root
p.removeChild(item) p.removeChild(item)
def title_case(self):
from calibre.utils.titlecase import titlecase
for item in self.selectedItems():
t = unicode(item.data(0, Qt.DisplayRole).toString())
item.setData(0, Qt.DisplayRole, titlecase(t))
def keyPressEvent(self, ev): def keyPressEvent(self, ev):
if ev.key() == Qt.Key_Left and ev.modifiers() & Qt.CTRL: if ev.key() == Qt.Key_Left and ev.modifiers() & Qt.CTRL:
self.move_left() self.move_left()
@ -489,6 +497,25 @@ class TreeWidget(QTreeWidget): # {{{
ev.accept() ev.accept()
else: else:
return super(TreeWidget, self).keyPressEvent(ev) return super(TreeWidget, self).keyPressEvent(ev)
def show_context_menu(self, point):
item = self.currentItem()
if item is not None:
m = QMenu()
ci = unicode(item.data(0, Qt.DisplayRole).toString())
p = item.parent() or self.invisibleRootItem()
idx = p.indexOfChild(item)
if idx > 0:
m.addAction(QIcon(I('arrow-up.png')), _('Move "%s" up')%ci, self.move_up)
if idx + 1 < p.childCount():
m.addAction(QIcon(I('arrow-down.png')), _('Move "%s" down')%ci, self.move_down)
m.addAction(QIcon(I('trash.png')), _('Remove all selected items'), self.del_items)
if item.parent() is not None:
m.addAction(QIcon(I('back.png')), _('Unindent "%s"')%ci, self.move_left)
if idx > 0:
m.addAction(QIcon(I('forward.png')), _('Indent "%s"')%ci, self.move_right)
m.addAction(_('Change all selected items to title case'), self.title_case)
m.exec_(QCursor.pos())
# }}} # }}}
class TOCView(QWidget): # {{{ class TOCView(QWidget): # {{{