1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
"""
This module contains the text decoration API.
"""
from pyqode.qt import QtWidgets, QtCore, QtGui
class TextDecoration(QtWidgets.QTextEdit.ExtraSelection):
"""
Helper class to quickly create a text decoration. The text decoration is an
utility class that adds a few utility methods to QTextEdit.ExtraSelection.
In addition to the helper methods, a tooltip can be added to a decoration.
(useful for errors markers and so on...)
Text decoration expose a **clicked** signal stored in a separate QObject:
:attr:`pyqode.core.api.TextDecoration.Signals`
.. code-block:: python
deco = TextDecoration()
deco.signals.clicked.connect(a_slot)
def a_slot(decoration):
print(decoration)
"""
class Signals(QtCore.QObject):
"""
Holds the signals for a TextDecoration (since we cannot make it a
QObject, we need to store its signals in an external QObject).
"""
#: Signal emitted when a TextDecoration has been clicked.
clicked = QtCore.Signal(object)
def __init__(self, cursor_or_bloc_or_doc, start_pos=None, end_pos=None,
start_line=None, end_line=None, draw_order=0, tooltip=None,
full_width=False):
"""
Creates a text decoration.
.. note:: start_pos/end_pos and start_line/end_line pairs let you
easily specify the selected text. You should use one pair or the
other or they will conflict between each others. If you don't
specify any values, the selection will be based on the cursor.
:param cursor_or_bloc_or_doc: Reference to a valid
QTextCursor/QTextBlock/QTextDocument
:param start_pos: Selection start position
:param end_pos: Selection end position
:param start_line: Selection start line.
:param end_line: Selection end line.
:param draw_order: The draw order of the selection, highest values will
appear on top of the lowest values.
:param tooltip: An optional tooltips that will be automatically shown
when the mouse cursor hover the decoration.
:param full_width: True to select the full line width.
.. note:: Use the cursor selection if startPos and endPos are none.
"""
super(TextDecoration, self).__init__()
self.signals = self.Signals()
self.draw_order = draw_order
self.tooltip = tooltip
self.cursor = QtGui.QTextCursor(cursor_or_bloc_or_doc)
if full_width:
self.set_full_width(full_width)
if start_pos is not None:
self.cursor.setPosition(start_pos)
if end_pos is not None:
self.cursor.setPosition(end_pos, QtGui.QTextCursor.KeepAnchor)
if start_line is not None:
self.cursor.movePosition(self.cursor.Start, self.cursor.MoveAnchor)
self.cursor.movePosition(self.cursor.Down, self.cursor.MoveAnchor,
start_line)
if end_line is not None:
self.cursor.movePosition(self.cursor.Down, self.cursor.KeepAnchor,
end_line - start_line)
def contains_cursor(self, cursor):
"""
Checks if the textCursor is in the decoration
:param cursor: The text cursor to test
:type cursor: QtGui.QTextCursor
:returns: True if the cursor is over the selection
"""
start = self.cursor.selectionStart()
end = self.cursor.selectionEnd()
if cursor.atBlockEnd():
end -= 1
return start <= cursor.position() <= end
def set_as_bold(self):
""" Uses bold text """
self.format.setFontWeight(QtGui.QFont.Bold)
def set_foreground(self, color):
""" Sets the foreground color.
:param color: Color
:type color: QtGui.QColor
"""
self.format.setForeground(color)
def set_background(self, brush):
"""
Sets the background brush.
:param brush: Brush
:type brush: QtGui.QBrush
"""
self.format.setBackground(brush)
def set_outline(self, color):
"""
Uses an outline rectangle.
:param color: Color of the outline rect
:type color: QtGui.QColor
"""
self.format.setProperty(QtGui.QTextFormat.OutlinePen,
QtGui.QPen(color))
def select_line(self):
"""
Select the entire line but starts at the first non whitespace character
and stops at the non-whitespace character.
:return:
"""
self.cursor.movePosition(self.cursor.StartOfBlock)
text = self.cursor.block().text()
lindent = len(text) - len(text.lstrip())
self.cursor.setPosition(self.cursor.block().position() + lindent)
self.cursor.movePosition(self.cursor.EndOfBlock,
self.cursor.KeepAnchor)
def set_full_width(self, flag=True, clear=True):
"""
Enables FullWidthSelection (the selection does not stops at after the
character instead it goes up to the right side of the widget).
:param flag: True to use full width selection.
:type flag: bool
:param clear: True to clear any previous selection. Default is True.
:type clear: bool
"""
if clear:
self.cursor.clearSelection()
self.format.setProperty(QtGui.QTextFormat.FullWidthSelection, flag)
def set_as_underlined(self, color=QtCore.Qt.blue):
"""
Underlines the text
:param color: underline color.
"""
self.format.setUnderlineStyle(
QtGui.QTextCharFormat.SingleUnderline)
self.format.setUnderlineColor(color)
def set_as_spell_check(self, color=QtCore.Qt.blue):
""" Underlines text as a spellcheck error.
:param color: Underline color
:type color: QtGui.QColor
"""
self.format.setUnderlineStyle(
QtGui.QTextCharFormat.SpellCheckUnderline)
self.format.setUnderlineColor(color)
def set_as_error(self, color=QtCore.Qt.red):
""" Highlights text as a syntax error.
:param color: Underline color
:type color: QtGui.QColor
"""
self.format.setUnderlineStyle(
QtGui.QTextCharFormat.WaveUnderline)
self.format.setUnderlineColor(color)
def set_as_warning(self, color=QtGui.QColor("orange")):
"""
Highlights text as a syntax warning
:param color: Underline color
:type color: QtGui.QColor
"""
self.format.setUnderlineStyle(
QtGui.QTextCharFormat.WaveUnderline)
self.format.setUnderlineColor(color)
|