diff --git a/src/calibre/gui2/tweak_book/editor/snippets.py b/src/calibre/gui2/tweak_book/editor/snippets.py
index 0a31944c3c..6d35c034ef 100644
--- a/src/calibre/gui2/tweak_book/editor/snippets.py
+++ b/src/calibre/gui2/tweak_book/editor/snippets.py
@@ -14,7 +14,7 @@ from operator import attrgetter, itemgetter
from PyQt5.Qt import (
Qt, QObject, QSize, QVBoxLayout, QStackedLayout, QWidget, QLineEdit,
QToolButton, QIcon, QHBoxLayout, QPushButton, QListWidget, QListWidgetItem,
- QGridLayout, QPlainTextEdit, QLabel, QFrame)
+ QGridLayout, QPlainTextEdit, QLabel, QFrame, QDialog, QDialogButtonBox)
from calibre.gui2 import error_dialog
from calibre.gui2.tweak_book.editor import all_text_syntaxes
@@ -477,25 +477,27 @@ class EditSnippet(QWidget):
key = snip_key(self.trig.text(), '*')
return {key: self.snip}
+ def apply_snip(self, snip, creating_snippet=None):
+ self.creating_snippet = not snip if creating_snippet is None else creating_snippet
+ self.heading.setText('
' + (_('Create a snippet') if self.creating_snippet else _('Edit snippet')))
+ snip = snip or {}
+ self.name.setText(snip.get('description') or '')
+ self.trig.setText(snip.get('trigger') or '')
+ self.template.setPlainText(snip.get('template') or '')
+
+ ftypes = snip.get('syntaxes', ())
+ for i in xrange(self.types.count()):
+ i = self.types.item(i)
+ ftype = i.data(Qt.UserRole)
+ i.setCheckState(Qt.Checked if ftype in ftypes else Qt.Unchecked)
+ if self.creating_snippet:
+ self.types.item(0).setCheckState(Qt.Checked)
+ (self.name if self.creating_snippet else self.template).setFocus(Qt.OtherFocusReason)
+
@dynamic_property
def snip(self):
def fset(self, snip):
- self.creating_snippet = not snip
- self.heading.setText('' + (_('Create a snippet') if self.creating_snippet else _('Edit snippet')))
- snip = snip or {}
- self.name.setText(snip.get('description') or '')
- self.trig.setText(snip.get('trigger') or '')
- self.template.setPlainText(snip.get('template') or '')
-
- ftypes = snip.get('syntaxes', ())
- for i in xrange(self.types.count()):
- i = self.types.item(i)
- ftype = i.data(Qt.UserRole)
- i.setCheckState(Qt.Checked if ftype in ftypes else Qt.Unchecked)
- if self.creating_snippet:
- self.types.item(0).setCheckState(Qt.Checked)
- (self.name if self.creating_snippet else self.template).setFocus(Qt.OtherFocusReason)
-
+ self.apply_snip(snip)
def fget(self):
ftypes = []
for i in xrange(self.types.count()):
@@ -565,6 +567,11 @@ class UserSnippets(Dialog):
b.clicked.connect(self.remove_snippet)
l.addWidget(b)
+ self.add_button = b = QToolButton(self)
+ b.setIcon(QIcon(I('config.png'))), b.setText(_('Change &built-in')), b.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
+ b.clicked.connect(self.change_builtin)
+ l.addWidget(b)
+
for i, snip in enumerate(sorted(user_snippets.get('snippets', []), key=itemgetter('trigger'))):
item = self.snip_to_item(snip)
if i == 0:
@@ -642,6 +649,25 @@ class UserSnippets(Dialog):
item = matches[0]
self.snip_list.setCurrentItem(item)
self.snip_list.scrollToItem(item)
+
+ def change_builtin(self):
+ d = QDialog(self)
+ lw = QListWidget(d)
+ for (trigger, syntaxes), snip in builtin_snippets.iteritems():
+ snip = copy.deepcopy(snip)
+ snip['trigger'], snip['syntaxes'] = trigger, syntaxes
+ i = QListWidgetItem(self.snip_to_text(snip), lw)
+ i.setData(Qt.UserRole, snip)
+ d.l = l = QVBoxLayout(d)
+ l.addWidget(QLabel(_('Choose the built-in snippet to modify:')))
+ l.addWidget(lw)
+ lw.itemDoubleClicked.connect(d.accept)
+ d.bb = bb = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+ l.addWidget(bb)
+ bb.accepted.connect(d.accept), bb.rejected.connect(d.reject)
+ if d.exec_() == d.Accepted and lw.currentItem() is not None:
+ self.stack.setCurrentIndex(1)
+ self.edit_snip.apply_snip(lw.currentItem().data(Qt.UserRole), creating_snippet=True)
# }}}
if __name__ == '__main__':