74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Contains the python indenter.
|
|
"""
|
|
from pyqode.qt import QtGui
|
|
from pyqode.core.modes import IndenterMode
|
|
|
|
|
|
class PyIndenterMode(IndenterMode):
|
|
"""
|
|
Extends the core indenter to add the ability to always indent the whole
|
|
line instead of inserting a tab at the cursor position. This behaviour can
|
|
be turned off at runtime by setting :attr:`tab_always_indent` to False.
|
|
"""
|
|
@property
|
|
def tab_always_indent(self):
|
|
"""
|
|
When this flag is set to True, any call to indent will indent the whole
|
|
line instead of inserting a tab at the cursor position.
|
|
"""
|
|
return self._tab_always_indent
|
|
|
|
@tab_always_indent.setter
|
|
def tab_always_indent(self, value):
|
|
self._tab_always_indent = value
|
|
if self.editor:
|
|
for c in self.editor.clones:
|
|
try:
|
|
c.modes.get(self.__class__).tab_always_indent = value
|
|
except KeyError:
|
|
pass
|
|
|
|
def __init__(self):
|
|
super(PyIndenterMode, self).__init__()
|
|
self._tab_always_indent = None
|
|
self.tab_always_indent = True
|
|
|
|
def indent(self):
|
|
"""
|
|
Performs an indentation
|
|
"""
|
|
if not self.tab_always_indent:
|
|
super(PyIndenterMode, self).indent()
|
|
else:
|
|
cursor = self.editor.textCursor()
|
|
assert isinstance(cursor, QtGui.QTextCursor)
|
|
if cursor.hasSelection():
|
|
self.indent_selection(cursor)
|
|
else:
|
|
# simply insert indentation at the cursor position
|
|
tab_len = self.editor.tab_length
|
|
cursor.beginEditBlock()
|
|
if self.editor.use_spaces_instead_of_tabs:
|
|
cursor.insertText(tab_len * " ")
|
|
else:
|
|
cursor.insertText('\t')
|
|
cursor.endEditBlock()
|
|
self.editor.setTextCursor(cursor)
|
|
|
|
def unindent(self):
|
|
"""
|
|
Performs an un-indentation
|
|
"""
|
|
if self.tab_always_indent:
|
|
cursor = self.editor.textCursor()
|
|
if not cursor.hasSelection():
|
|
cursor.select(cursor.LineUnderCursor)
|
|
self.unindent_selection(cursor)
|
|
else:
|
|
super(PyIndenterMode, self).unindent()
|
|
|
|
def clone_settings(self, original):
|
|
self.tab_always_indent = original.tab_always_indent
|