90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
This module contains the care line highlighter mode
|
|
"""
|
|
from pyqode.qt import QtGui
|
|
|
|
from pyqode.core.api.decoration import TextDecoration
|
|
from pyqode.core.api.mode import Mode
|
|
|
|
|
|
class LineHighlighterMode(Mode):
|
|
""" Highlights a line in the editor."""
|
|
|
|
@property
|
|
def background(self):
|
|
"""
|
|
Background color of the highlighted line.
|
|
"""
|
|
return self._color
|
|
|
|
@background.setter
|
|
def background(self, value):
|
|
self._color = value
|
|
self.refresh()
|
|
# propagate changes to every clone
|
|
if self.editor:
|
|
for clone in self.editor.clones:
|
|
try:
|
|
clone.modes.get(self.__class__).background = value
|
|
except KeyError:
|
|
# this should never happen since we're working with clones
|
|
pass
|
|
|
|
@property
|
|
def line(self):
|
|
if self._block:
|
|
return self._block.blockNumber()
|
|
else:
|
|
return self._block
|
|
|
|
@line.setter
|
|
def line(self, value):
|
|
if value is None:
|
|
self._block = value
|
|
self._clear_deco()
|
|
else:
|
|
self._block = self.editor.document().findBlockByNumber(value)
|
|
self.refresh()
|
|
|
|
def __init__(self):
|
|
super(LineHighlighterMode, self).__init__()
|
|
self._decoration = None
|
|
self._block = None
|
|
self._color = QtGui.QColor('#DD8080')
|
|
|
|
def on_state_changed(self, state):
|
|
if state:
|
|
self.editor.new_text_set.connect(self.refresh)
|
|
self.refresh()
|
|
else:
|
|
self.editor.new_text_set.disconnect(self.refresh)
|
|
self._clear_deco()
|
|
|
|
def on_install(self, editor):
|
|
super(LineHighlighterMode, self).on_install(editor)
|
|
self.refresh()
|
|
|
|
def _clear_deco(self):
|
|
""" Clear line decoration """
|
|
if self._decoration:
|
|
self.editor.decorations.remove(self._decoration)
|
|
self._decoration = None
|
|
|
|
def refresh(self):
|
|
"""
|
|
Updates the current line decoration
|
|
"""
|
|
if self.enabled and self.line:
|
|
self._clear_deco()
|
|
brush = QtGui.QBrush(self._color)
|
|
self._decoration = TextDecoration(
|
|
self.editor.textCursor(), start_line=self.line)
|
|
self._decoration.set_background(brush)
|
|
self._decoration.set_full_width()
|
|
self._decoration.draw_order = 255
|
|
self.editor.decorations.append(self._decoration)
|
|
|
|
def clone_settings(self, original):
|
|
self.background = original.background
|