56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
""" Contains the automatic generic indenter """
|
|
from pyqode.core.api import TextHelper
|
|
from pyqode.core.api.mode import Mode
|
|
from pyqode.qt.QtCore import Qt
|
|
|
|
|
|
class AutoIndentMode(Mode):
|
|
""" Indents text automatically.
|
|
Generic indenter mode that indents the text when the user press RETURN.
|
|
|
|
You can customize this mode by overriding
|
|
:meth:`pyqode.core.modes.AutoIndentMode._get_indent`
|
|
"""
|
|
def __init__(self):
|
|
super(AutoIndentMode, self).__init__()
|
|
|
|
def _get_indent(self, cursor):
|
|
"""
|
|
Return the indentation text (a series of spaces or tabs)
|
|
|
|
:param cursor: QTextCursor
|
|
|
|
:returns: Tuple (text before new line, text after new line)
|
|
"""
|
|
indent = TextHelper(self.editor).line_indent() * ' '
|
|
return "", indent
|
|
|
|
def on_state_changed(self, state):
|
|
if state is True:
|
|
self.editor.key_pressed.connect(self._on_key_pressed)
|
|
else:
|
|
self.editor.key_pressed.disconnect(self._on_key_pressed)
|
|
|
|
def _on_key_pressed(self, event):
|
|
"""
|
|
Auto indent if the released key is the return key.
|
|
:param event: the key event
|
|
"""
|
|
if not event.isAccepted():
|
|
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
|
|
cursor = self.editor.textCursor()
|
|
pre, post = self._get_indent(cursor)
|
|
cursor.beginEditBlock()
|
|
cursor.insertText("%s\n%s" % (pre, post))
|
|
|
|
# eats possible whitespaces
|
|
cursor.movePosition(cursor.WordRight, cursor.KeepAnchor)
|
|
txt = cursor.selectedText()
|
|
if txt.startswith(' '):
|
|
new_txt = txt.replace(" ", '')
|
|
if len(txt) > len(new_txt):
|
|
cursor.insertText(new_txt)
|
|
cursor.endEditBlock()
|
|
event.accept()
|