%PDF- %PDF-
| Direktori : /proc/thread-self/root/usr/lib/calibre/calibre/gui2/tweak_book/editor/smarts/ |
| Current File : //proc/thread-self/root/usr/lib/calibre/calibre/gui2/tweak_book/editor/smarts/utils.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
from qt.core import Qt, QTextCursor
def get_text_around_cursor(editor, before=True):
cursor = editor.textCursor()
cursor.clearSelection()
cursor.movePosition((QTextCursor.MoveOperation.StartOfBlock if before else QTextCursor.MoveOperation.EndOfBlock), QTextCursor.MoveMode.KeepAnchor)
text = editor.selected_text_from_cursor(cursor)
return cursor, text
get_text_before_cursor = get_text_around_cursor
get_text_after_cursor = lambda editor: get_text_around_cursor(editor, before=False)
def is_cursor_on_wrapped_line(editor):
cursor = editor.textCursor()
cursor.movePosition(QTextCursor.MoveOperation.StartOfLine)
sol = cursor.position()
cursor.movePosition(QTextCursor.MoveOperation.StartOfBlock)
return sol != cursor.position()
def get_leading_whitespace_on_block(editor, previous=False):
cursor = editor.textCursor()
block = cursor.block()
if previous:
block = block.previous()
if block.isValid():
text = block.text()
ntext = text.lstrip()
return text[:len(text)-len(ntext)]
return ''
def no_modifiers(ev, *args):
mods = ev.modifiers()
for mod_mask in args:
if int(mods & mod_mask):
return False
return True
def test_modifiers(ev, *args):
mods = ev.modifiers()
for mod_mask in args:
if not int(mods & mod_mask):
return False
return True
def smart_home(editor, ev):
if no_modifiers(ev, Qt.KeyboardModifier.ControlModifier) and not is_cursor_on_wrapped_line(editor):
cursor, text = get_text_before_cursor(editor)
cursor = editor.textCursor()
mode = QTextCursor.MoveMode.KeepAnchor if test_modifiers(ev, Qt.KeyboardModifier.ShiftModifier) else QTextCursor.MoveMode.MoveAnchor
cursor.movePosition(QTextCursor.MoveOperation.StartOfBlock, mode)
if text.strip() and text.lstrip() != text:
# Move to the start of text
cursor.movePosition(QTextCursor.MoveOperation.NextWord, mode)
editor.setTextCursor(cursor)
return True
return False
def expand_tabs(text, tw):
return text.replace('\t', ' ' * tw)
def smart_tab(editor, ev):
cursor, text = get_text_before_cursor(editor)
if not text.lstrip():
# cursor is preceded by only whitespace
tw = editor.tw
text = expand_tabs(text, tw)
spclen = len(text) - (len(text) % tw) + tw
cursor.insertText(' ' * spclen)
editor.setTextCursor(cursor)
return True
return False
def smart_backspace(editor, ev):
if editor.textCursor().hasSelection():
return False
cursor, text = get_text_before_cursor(editor)
if text and not text.lstrip():
# cursor is preceded by only whitespace
tw = editor.tw
text = expand_tabs(text, tw)
spclen = max(0, len(text) - (len(text) % tw) - tw)
cursor.insertText(' ' * spclen)
editor.setTextCursor(cursor)
return True
return False