diff --git a/.codecov.yml b/.codecov.yml index caa2118b..8a775495 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -20,6 +20,3 @@ parsers: macro: no comment: false - # layout: "reach,diff,flags,tree" - # behavior: default - # require_changes: no diff --git a/nw/gui/doceditor.py b/nw/gui/doceditor.py index 44238fc5..d7b64290 100644 --- a/nw/gui/doceditor.py +++ b/nw/gui/doceditor.py @@ -16,7 +16,7 @@ import nw from time import time from PyQt5.QtCore import Qt, QTimer, QSizeF -from PyQt5.QtWidgets import QTextEdit, QAction, QMenu, QShortcut +from PyQt5.QtWidgets import qApp, QTextEdit, QAction, QMenu, QShortcut from PyQt5.QtGui import QTextCursor, QTextOption, QIcon, QKeySequence, QFont, QColor, QPalette, QTextDocument from nw.project.document import NWDoc @@ -81,8 +81,8 @@ class GuiDocEditor(QTextEdit): # Custom Shortcuts QShortcut(QKeySequence("Ctrl+."), self, context=Qt.WidgetShortcut, activated=self._openSpellContext) - # QShortcut(Qt.Key_Return | Qt.ControlModifier, self, context=Qt.WidgetShortcut, activated=self._insertHardBreak) - # QShortcut(Qt.Key_Enter | Qt.ControlModifier, self, context=Qt.WidgetShortcut, activated=self._insertHardBreak) + QShortcut(Qt.Key_Return | Qt.ControlModifier, self, context=Qt.WidgetShortcut, activated=self._followTag) + QShortcut(Qt.Key_Enter | Qt.ControlModifier, self, context=Qt.WidgetShortcut, activated=self._followTag) # Set Up Word Count Thread and Timer self.wcInterval = self.mainConf.wordCountTimer @@ -352,10 +352,49 @@ class GuiDocEditor(QTextEdit): return + def mouseReleaseEvent(self, mEvent): + """If the mouse button is released and the control key is pressed, check if we're clicking + on a tag, and trigger the follow tag function. + """ + if qApp.keyboardModifiers() == Qt.ControlModifier: + theCursor = self.cursorForPosition(mEvent.pos()) + self._followTag(theCursor) + QTextEdit.mouseReleaseEvent(self, mEvent) + return + ## # Internal Functions ## + def _followTag(self, theCursor=None): + """Activated by Ctrl+Enter. Checks that we're in a block starting with '@'. We then find the + word under the cursor and check that it is after the ':'. If all this is fine, we have a tag + and can tell the document viewer to try and find and load the file where the tag is defined. + """ + + if theCursor is None: + theCursor = self.textCursor() + + theBlock = theCursor.block() + theText = theBlock.text() + + if len(theText) == 0: + return False + + if theText.startswith("@"): + + theCursor.select(QTextCursor.WordUnderCursor) + theWord = theCursor.selectedText() + cPos = theText.find(":") + wPos = theCursor.selectionStart() - theBlock.position() + if wPos <= cPos: + return False + + logger.verbose("Attempting to follow tag '%s'" % theWord) + self.theParent.docViewer.loadFromTag(theWord) + + return True + def _insertHardBreak(self): theCursor = self.textCursor() theCursor.beginEditBlock() diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index 76c57e67..39342036 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -115,6 +115,24 @@ class GuiDocViewer(QTextBrowser): return True + def loadFromTag(self, theTag): + + logger.debug("Loading document from tag '%s'" % theTag) + + if theTag in self.theParent.theIndex.tagIndex.keys(): + theTarget = self.theParent.theIndex.tagIndex[theTag] + else: + logger.debug("The tag was not found in the index") + return False + + if len(theTarget) != 3: + # Just to make sure the index is not messed up + return False + + self.loadText(theTarget[1]) + + return True + ## # Internal Functions ##