diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py
index 61f5e8f7f2..2a451e5eda 100644
--- a/src/calibre/gui2/comments_editor.py
+++ b/src/calibre/gui2/comments_editor.py
@@ -589,7 +589,7 @@ class EditorWidget(QTextEdit, LineEditECM): # {{{
def do_insert_hr(self, *args):
with self.editing_cursor() as c:
- c.movePosition(c.EndOfBlock, c.MoveAnchor)
+ c.movePosition(QTextCursor.MoveOperation.EndOfBlock, c.MoveAnchor)
c.insertHtml('
')
def do_insert_link(self, *args):
diff --git a/src/calibre/gui2/css_transform_rules.py b/src/calibre/gui2/css_transform_rules.py
index 612befc8a4..6ecb501fba 100644
--- a/src/calibre/gui2/css_transform_rules.py
+++ b/src/calibre/gui2/css_transform_rules.py
@@ -5,7 +5,7 @@
from PyQt5.Qt import (
QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QLineEdit,
- QPushButton, QSize, pyqtSignal, QMenu, QDialogButtonBox
+ QPushButton, QSize, pyqtSignal, QMenu, QDialogButtonBox, QTextCursor
)
from calibre.ebooks.css_transform_rules import (
@@ -211,7 +211,7 @@ class Tester(Dialog): # {{{
t.load_text('/* %s */\n' % _('Enter CSS rules below and click the "Test" button'), 'css')
la.setBuddy(t)
c = t.textCursor()
- c.movePosition(c.End)
+ c.movePosition(QTextCursor.MoveOperation.End)
t.setTextCursor(c)
self.h = h = QHBoxLayout()
l.addLayout(h)
diff --git a/src/calibre/gui2/tweak_book/diff/view.py b/src/calibre/gui2/tweak_book/diff/view.py
index cd3a57b5e5..b8ab1b9f14 100644
--- a/src/calibre/gui2/tweak_book/diff/view.py
+++ b/src/calibre/gui2/tweak_book/diff/view.py
@@ -522,7 +522,7 @@ class DiffSplit(QSplitter): # {{{
def finalize(self):
for v in (self.left, self.right):
c = v.textCursor()
- c.movePosition(c.Start)
+ c.movePosition(QTextCursor.MoveOperation.Start)
v.setTextCursor(c)
self.update()
@@ -536,14 +536,14 @@ class DiffSplit(QSplitter): # {{{
self.right.headers.append((self.right.blockCount() - 1, right_name))
for v in (self.left, self.right):
c = v.textCursor()
- c.movePosition(c.End)
+ c.movePosition(QTextCursor.MoveOperation.End)
(c.insertBlock(), c.insertBlock(), c.insertBlock())
with BusyCursor():
if is_identical:
for v in (self.left, self.right):
c = v.textCursor()
- c.movePosition(c.End)
+ c.movePosition(QTextCursor.MoveOperation.End)
c.insertText('[%s]\n\n' % _('The files are identical'))
elif left_name != right_name and not left_text and not right_text:
self.add_text_diff(_('[This file was renamed to %s]') % right_name, _('[This file was renamed from %s]') % left_name, context, None)
@@ -605,10 +605,10 @@ class DiffSplit(QSplitter): # {{{
QApplication.processEvents(QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents | QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers)
for v, img, size in ((self.left, left_img, len(left_data)), (self.right, right_img, len(right_data))):
c = v.textCursor()
- c.movePosition(c.End)
+ c.movePosition(QTextCursor.MoveOperation.End)
start = c.block().blockNumber()
lines, w = self.get_lines_for_image(img, v)
- c.movePosition(c.StartOfBlock)
+ c.movePosition(QTextCursor.MoveOperation.StartOfBlock)
if size > 0:
c.beginEditBlock()
c.insertText(_('Size: {0} Resolution: {1}x{2}').format(human_readable(size), img.width(), img.height()))
@@ -638,12 +638,12 @@ class DiffSplit(QSplitter): # {{{
top, bot, kind = v.changes[i]
c = QTextCursor(v.document().findBlockByNumber(top+1))
c.beginEditBlock()
- c.movePosition(c.StartOfBlock)
+ c.movePosition(QTextCursor.MoveOperation.StartOfBlock)
if delta > 0:
for _ in range(delta):
c.insertBlock()
else:
- c.movePosition(c.NextBlock, c.KeepAnchor, -delta)
+ c.movePosition(QTextCursor.MoveOperation.NextBlock, c.KeepAnchor, -delta)
c.removeSelectedText()
c.endEditBlock()
v.images[top] = (img, w, lines)
@@ -678,7 +678,7 @@ class DiffSplit(QSplitter): # {{{
if len(left_text) == len(right_text) and left_text == right_text:
for v in (self.left, self.right):
c = v.textCursor()
- c.movePosition(c.End)
+ c.movePosition(QTextCursor.MoveOperation.End)
c.insertText('[%s]\n\n' % _('The files are identical after beautifying'))
return
@@ -690,7 +690,7 @@ class DiffSplit(QSplitter): # {{{
left_highlight, right_highlight = get_highlighter(self.left, left_text, syntax), get_highlighter(self.right, right_text, syntax)
cl, cr = self.left_cursor, self.right_cursor = self.left.textCursor(), self.right.textCursor()
cl.beginEditBlock(), cr.beginEditBlock()
- cl.movePosition(cl.End), cr.movePosition(cr.End)
+ cl.movePosition(QTextCursor.MoveOperation.End), cr.movePosition(QTextCursor.MoveOperation.End)
self.left_insert = partial(self.do_insert, cl, left_highlight, self.left.line_number_map)
self.right_insert = partial(self.do_insert, cr, right_highlight, self.right.line_number_map)
diff --git a/src/calibre/gui2/tweak_book/editor/smarts/css.py b/src/calibre/gui2/tweak_book/editor/smarts/css.py
index 6b8099ff67..cbaf93d3e7 100644
--- a/src/calibre/gui2/tweak_book/editor/smarts/css.py
+++ b/src/calibre/gui2/tweak_book/editor/smarts/css.py
@@ -7,7 +7,7 @@ __copyright__ = '2014, Kovid Goyal '
import re
-from PyQt5.Qt import Qt
+from PyQt5.Qt import Qt, QTextCursor
from calibre.gui2.tweak_book import current_container
from calibre.gui2.tweak_book.editor.smarts import NullSmarts
@@ -77,7 +77,7 @@ class Smarts(NullSmarts):
def get_completion_data(self, editor, ev=None):
c = editor.textCursor()
- c.movePosition(c.StartOfLine, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.StartOfLine, c.KeepAnchor)
text = c.selectedText()
m = self.complete_attr_pat.search(text)
if m is None:
diff --git a/src/calibre/gui2/tweak_book/editor/smarts/html.py b/src/calibre/gui2/tweak_book/editor/smarts/html.py
index fad4c1bad1..a35e09c577 100644
--- a/src/calibre/gui2/tweak_book/editor/smarts/html.py
+++ b/src/calibre/gui2/tweak_book/editor/smarts/html.py
@@ -321,10 +321,10 @@ class Smarts(NullSmarts):
def add_tag(tag):
a = QTextEdit.ExtraSelection()
a.cursor, a.format = editor.textCursor(), editor.match_paren_format
- a.cursor.setPosition(tag.start_block.position()), a.cursor.movePosition(a.cursor.EndOfBlock, a.cursor.KeepAnchor)
+ a.cursor.setPosition(tag.start_block.position()), a.cursor.movePosition(a.QTextCursor.MoveOperation.EndOfBlock, a.cursor.KeepAnchor)
text = unicode_type(a.cursor.selectedText())
start_pos = utf16_length(text[:tag.start_offset])
- a.cursor.setPosition(tag.end_block.position()), a.cursor.movePosition(a.cursor.EndOfBlock, a.cursor.KeepAnchor)
+ a.cursor.setPosition(tag.end_block.position()), a.cursor.movePosition(a.QTextCursor.MoveOperation.EndOfBlock, a.cursor.KeepAnchor)
text = unicode_type(a.cursor.selectedText())
end_pos = utf16_length(text[:tag.end_offset + 1])
a.cursor.setPosition(tag.start_block.position() + start_pos)
@@ -805,7 +805,7 @@ class Smarts(NullSmarts):
if in_text:
# Add remaining text in block
c.setPosition(block.position() + boundaries[-1].offset + 1)
- c.movePosition(c.EndOfBlock, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.EndOfBlock, c.KeepAnchor)
if c.hasSelection():
append(c.selectedText() + '\n', c.anchor())
block = block.next()
diff --git a/src/calibre/gui2/tweak_book/editor/smarts/utils.py b/src/calibre/gui2/tweak_book/editor/smarts/utils.py
index 101e0941e2..4a136abb8c 100644
--- a/src/calibre/gui2/tweak_book/editor/smarts/utils.py
+++ b/src/calibre/gui2/tweak_book/editor/smarts/utils.py
@@ -5,13 +5,13 @@
__license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal '
-from PyQt5.Qt import Qt
+from PyQt5.Qt import Qt, QTextCursor
def get_text_around_cursor(editor, before=True):
cursor = editor.textCursor()
cursor.clearSelection()
- cursor.movePosition((cursor.StartOfBlock if before else cursor.EndOfBlock), cursor.KeepAnchor)
+ cursor.movePosition((QTextCursor.MoveOperation.StartOfBlock if before else QTextCursor.MoveOperation.EndOfBlock), cursor.KeepAnchor)
text = editor.selected_text_from_cursor(cursor)
return cursor, text
@@ -22,9 +22,9 @@ get_text_after_cursor = lambda editor: get_text_around_cursor(editor, before=Fal
def is_cursor_on_wrapped_line(editor):
cursor = editor.textCursor()
- cursor.movePosition(cursor.StartOfLine)
+ cursor.movePosition(QTextCursor.MoveOperation.StartOfLine)
sol = cursor.position()
- cursor.movePosition(cursor.StartOfBlock)
+ cursor.movePosition(QTextCursor.MoveOperation.StartOfBlock)
return sol != cursor.position()
@@ -61,10 +61,10 @@ def smart_home(editor, ev):
cursor, text = get_text_before_cursor(editor)
cursor = editor.textCursor()
mode = cursor.KeepAnchor if test_modifiers(ev, Qt.KeyboardModifier.ShiftModifier) else cursor.MoveAnchor
- cursor.movePosition(cursor.StartOfBlock, mode)
+ cursor.movePosition(QTextCursor.MoveOperation.StartOfBlock, mode)
if text.strip() and text.lstrip() != text:
# Move to the start of text
- cursor.movePosition(cursor.NextWord, mode)
+ cursor.movePosition(QTextCursor.MoveOperation.NextWord, mode)
editor.setTextCursor(cursor)
return True
return False
diff --git a/src/calibre/gui2/tweak_book/editor/syntax/base.py b/src/calibre/gui2/tweak_book/editor/syntax/base.py
index bae26c262c..ac1442b4bf 100644
--- a/src/calibre/gui2/tweak_book/editor/syntax/base.py
+++ b/src/calibre/gui2/tweak_book/editor/syntax/base.py
@@ -136,7 +136,7 @@ class SyntaxHighlighter(object):
if not last_block.isValid():
last_block = doc.lastBlock()
end_cursor = QTextCursor(last_block)
- end_cursor.movePosition(end_cursor.EndOfBlock)
+ end_cursor.movePosition(QTextCursor.MoveOperation.EndOfBlock)
self.requests.append((start_cursor, end_cursor))
QTimer.singleShot(0, self.do_one_block)
@@ -158,7 +158,7 @@ class SyntaxHighlighter(object):
except AttributeError:
self.requests.clear()
return
- ok = start_cursor.movePosition(start_cursor.NextBlock)
+ ok = start_cursor.movePosition(QTextCursor.MoveOperation.NextBlock)
if not ok:
self.requests.popleft()
return
diff --git a/src/calibre/gui2/tweak_book/editor/text.py b/src/calibre/gui2/tweak_book/editor/text.py
index 7a1fbf6847..24fc698a5b 100644
--- a/src/calibre/gui2/tweak_book/editor/text.py
+++ b/src/calibre/gui2/tweak_book/editor/text.py
@@ -6,17 +6,15 @@
import importlib
import os
import re
+import regex
import textwrap
import unicodedata
-from polyglot.builtins import unicode_type, map, range, as_unicode
-
from PyQt5.Qt import (
QColor, QColorDialog, QFont, QFontDatabase, QKeySequence, QPainter, QPalette,
- QPlainTextEdit, QRect, QSize, Qt, QTextEdit, QTextFormat, QTimer, QToolTip,
- QWidget, pyqtSignal
+ QPlainTextEdit, QRect, QSize, Qt, QTextCursor, QTextEdit, QTextFormat, QTimer,
+ QToolTip, QWidget, pyqtSignal
)
-import regex
from calibre import prepare_string_for_xml
from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, css_text
from calibre.ebooks.oeb.polish.replace import get_recommended_folders
@@ -42,6 +40,7 @@ from calibre.utils.icu import (
)
from calibre.utils.img import image_to_data
from calibre.utils.titlecase import titlecase
+from polyglot.builtins import as_unicode, map, range, unicode_type
def get_highlighter(syntax):
@@ -308,22 +307,22 @@ class TextEdit(PlainTextEdit):
lnum = max(1, min(self.blockCount(), lnum))
c = self.textCursor()
c.clearSelection()
- c.movePosition(c.Start)
- c.movePosition(c.NextBlock, n=lnum - 1)
- c.movePosition(c.StartOfLine)
- c.movePosition(c.EndOfLine, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.Start)
+ c.movePosition(QTextCursor.MoveOperation.NextBlock, n=lnum - 1)
+ c.movePosition(QTextCursor.MoveOperation.StartOfLine)
+ c.movePosition(QTextCursor.MoveOperation.EndOfLine, c.KeepAnchor)
text = unicode_type(c.selectedText()).rstrip('\0')
if col is None:
- c.movePosition(c.StartOfLine)
+ c.movePosition(QTextCursor.MoveOperation.StartOfLine)
lt = text.lstrip()
if text and lt and lt != text:
- c.movePosition(c.NextWord)
+ c.movePosition(QTextCursor.MoveOperation.NextWord)
else:
c.setPosition(c.block().position() + col)
if c.blockNumber() + 1 > lnum:
# We have moved past the end of the line
c.setPosition(c.block().position())
- c.movePosition(c.EndOfBlock)
+ c.movePosition(QTextCursor.MoveOperation.EndOfBlock)
self.setTextCursor(c)
self.ensureCursorVisible()
@@ -440,12 +439,12 @@ class TextEdit(PlainTextEdit):
' Are you sure you want to proceed?'), 'edit-book-confirm-sort-css', parent=self, config_set=tprefs):
c = self.textCursor()
c.beginEditBlock()
- c.movePosition(c.Start), c.movePosition(c.End, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.Start), c.movePosition(QTextCursor.MoveOperation.End, c.KeepAnchor)
text = unicode_type(c.selectedText()).replace(PARAGRAPH_SEPARATOR, '\n').rstrip('\0')
from calibre.ebooks.oeb.polish.css import sort_sheet
text = css_text(sort_sheet(current_container(), text))
c.insertText(text)
- c.movePosition(c.Start)
+ c.movePosition(QTextCursor.MoveOperation.Start)
c.endEditBlock()
self.setTextCursor(c)
@@ -457,10 +456,10 @@ class TextEdit(PlainTextEdit):
c.clearSelection()
if complete:
# Search the entire text
- c.movePosition(c.End if reverse else c.Start)
- pos = c.Start if reverse else c.End
+ c.movePosition(QTextCursor.MoveOperation.End if reverse else QTextCursor.MoveOperation.Start)
+ pos = QTextCursor.MoveOperation.Start if reverse else QTextCursor.MoveOperation.End
if wrap and not complete:
- pos = c.End if reverse else c.Start
+ pos = QTextCursor.MoveOperation.End if reverse else QTextCursor.MoveOperation.Start
c.movePosition(pos, c.KeepAnchor)
raw = unicode_type(c.selectedText()).replace(PARAGRAPH_SEPARATOR, '\n').rstrip('\0')
m = pat.search(raw)
@@ -496,10 +495,10 @@ class TextEdit(PlainTextEdit):
c.clearSelection()
if complete:
# Search the entire text
- c.movePosition(c.End if reverse else c.Start)
- pos = c.Start if reverse else c.End
+ c.movePosition(QTextCursor.MoveOperation.End if reverse else QTextCursor.MoveOperation.Start)
+ pos = QTextCursor.MoveOperation.Start if reverse else QTextCursor.MoveOperation.End
if wrap and not complete:
- pos = c.End if reverse else c.Start
+ pos = QTextCursor.MoveOperation.End if reverse else QTextCursor.MoveOperation.Start
c.movePosition(pos, c.KeepAnchor)
if hasattr(self.smarts, 'find_text'):
self.highlighter.join()
@@ -528,8 +527,8 @@ class TextEdit(PlainTextEdit):
c = self.textCursor()
c.setPosition(c.position())
if not from_cursor:
- c.movePosition(c.Start)
- c.movePosition(c.End, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.Start)
+ c.movePosition(QTextCursor.MoveOperation.End, c.KeepAnchor)
def find_first_word(haystack):
match_pos, match_word = -1, None
@@ -555,14 +554,14 @@ class TextEdit(PlainTextEdit):
self.centerCursor()
return True
c.setPosition(c.position())
- c.movePosition(c.End, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.End, c.KeepAnchor)
return False
def find_next_spell_error(self, from_cursor=True):
c = self.textCursor()
if not from_cursor:
- c.movePosition(c.Start)
+ c.movePosition(QTextCursor.MoveOperation.Start)
block = c.block()
while block.isValid():
for r in block.layout().additionalFormats():
@@ -600,7 +599,7 @@ class TextEdit(PlainTextEdit):
def go_to_anchor(self, anchor):
if anchor is TOP:
c = self.textCursor()
- c.movePosition(c.Start)
+ c.movePosition(QTextCursor.MoveOperation.Start)
self.setTextCursor(c)
return True
base = r'''%%s\s*=\s*['"]{0,1}%s''' % regex.escape(anchor)
@@ -726,7 +725,7 @@ class TextEdit(PlainTextEdit):
def recheck_word(self, word, locale):
c = self.textCursor()
- c.movePosition(c.Start)
+ c.movePosition(QTextCursor.MoveOperation.Start)
block = c.block()
while block.isValid():
for r in block.layout().additionalFormats():
@@ -956,7 +955,7 @@ version="1.1" width="100%%" height="100%%" viewBox="0 0 {w} {h}" preserveAspectR
c = self.textCursor()
c.clearSelection()
c.setPosition(0)
- c.movePosition(c.End, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.End, c.KeepAnchor)
self.setTextCursor(c)
def rename_block_tag(self, new_name):
diff --git a/src/calibre/gui2/tweak_book/editor/widget.py b/src/calibre/gui2/tweak_book/editor/widget.py
index b7b06f07b9..eb80ac890f 100644
--- a/src/calibre/gui2/tweak_book/editor/widget.py
+++ b/src/calibre/gui2/tweak_book/editor/widget.py
@@ -476,7 +476,7 @@ class Editor(QMainWindow):
col = c.positionInBlock()
if not c.atStart():
c.clearSelection()
- c.movePosition(c.PreviousCharacter, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.PreviousCharacter, c.KeepAnchor)
char = unicode_type(c.selectedText()).rstrip('\0')
return (c.blockNumber() + 1, col, char)
diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py
index 0ef24a221f..a52caf8dd9 100644
--- a/src/calibre/gui2/widgets2.py
+++ b/src/calibre/gui2/widgets2.py
@@ -9,7 +9,7 @@ from PyQt5.Qt import (
QComboBox, QDate, QDateTime, QDateTimeEdit, QDialog, QDialogButtonBox, QFont,
QFontInfo, QFontMetrics, QIcon, QKeySequence, QLabel, QLayout, QMenu, QMimeData,
QPalette, QPixmap, QPoint, QPushButton, QRect, QScrollArea, QSize, QSizePolicy,
- QStyle, QStyledItemDelegate, Qt, QTabWidget, QTextBrowser, QToolButton,
+ QStyle, QStyledItemDelegate, Qt, QTabWidget, QTextBrowser, QToolButton, QTextCursor,
QUndoCommand, QUndoStack, QUrl, QWidget, pyqtSignal
)
@@ -558,8 +558,8 @@ def to_plain_text(self):
# that
c = self.textCursor()
c.clearSelection()
- c.movePosition(c.Start)
- c.movePosition(c.End, c.KeepAnchor)
+ c.movePosition(QTextCursor.MoveOperation.Start)
+ c.movePosition(QTextCursor.MoveOperation.End, c.KeepAnchor)
ans = c.selectedText().replace(PARAGRAPH_SEPARATOR, '\n')
# QTextCursor pads the return value of selectedText with null bytes if
# non BMP characters such as 0x1f431 are present.