From 3cdc02d38274d42a0a25a50e3ed9de2c5ad264f0 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 29 Apr 2016 14:41:08 +0200 Subject: [PATCH] QWidgetTextControl: only show cursor when having focus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit d3dcc6f introduced a regression to QTextEdit, leaving it to always show the cursor regardless of focus. The reason is that QTextArea used to toggle visibilty by setting the cursor blink rate. What it really wanted to do was to set cursor visibility explicit. This patch implements function setCursorVisible, and updates the places that used to call setBlinkingCursorEnabled to instead call setCursorVisible (where it makes sense). Change-Id: I58ea965178d4faaf5b09f6f6a37a37d5e8b99c97 Reviewed-by: Jan Arve Sæther --- src/widgets/widgets/qwidgettextcontrol.cpp | 22 ++++++++++++++------ src/widgets/widgets/qwidgettextcontrol_p_p.h | 2 ++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index 571563d29a2..52eb4e40784 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -112,7 +112,7 @@ static QTextLine currentTextLine(const QTextCursor &cursor) } QWidgetTextControlPrivate::QWidgetTextControlPrivate() - : doc(0), cursorOn(false), blinkingEnabled(false), cursorIsFocusIndicator(false), + : doc(0), cursorOn(false), blinkingEnabled(true), cursorVisible(false), cursorIsFocusIndicator(false), #ifndef Q_OS_ANDROID interactionFlags(Qt::TextEditorInteraction), #else @@ -685,6 +685,16 @@ void QWidgetTextControlPrivate::_q_documentLayoutChanged() } +void QWidgetTextControlPrivate::setCursorVisible(bool visible) +{ + if (cursorVisible == visible) + return; + + cursorVisible = visible; + + updateCursorBlinking(); +} + void QWidgetTextControlPrivate::setBlinkingCursorEnabled(bool enable) { if (blinkingEnabled == enable) @@ -703,13 +713,13 @@ void QWidgetTextControlPrivate::setBlinkingCursorEnabled(bool enable) void QWidgetTextControlPrivate::updateCursorBlinking() { cursorBlinkTimer.stop(); - if (blinkingEnabled) { + if (cursorVisible && blinkingEnabled) { int flashTime = QGuiApplication::styleHints()->cursorFlashTime(); if (flashTime >= 2) cursorBlinkTimer.start(flashTime / 2, q_func()); } - cursorOn = true; + cursorOn = cursorVisible; repaintCursor(); } @@ -2170,13 +2180,13 @@ void QWidgetTextControlPrivate::focusEvent(QFocusEvent *e) #endif cursorOn = (interactionFlags & (Qt::TextSelectableByKeyboard | Qt::TextEditable)); if (interactionFlags & Qt::TextEditable) { - setBlinkingCursorEnabled(true); + setCursorVisible(true); } #ifdef QT_KEYPAD_NAVIGATION } #endif } else { - setBlinkingCursorEnabled(false); + setCursorVisible(false); if (cursorIsFocusIndicator && e->reason() != Qt::ActiveWindowFocusReason @@ -2985,7 +2995,7 @@ void QWidgetTextControl::setTextInteractionFlags(Qt::TextInteractionFlags flags) d->interactionFlags = flags; if (d->hasFocus) - d->setBlinkingCursorEnabled(flags & Qt::TextEditable); + d->setCursorVisible(flags & Qt::TextEditable); } Qt::TextInteractionFlags QWidgetTextControl::textInteractionFlags() const diff --git a/src/widgets/widgets/qwidgettextcontrol_p_p.h b/src/widgets/widgets/qwidgettextcontrol_p_p.h index 16a3a153cc3..e9b3589c5cc 100644 --- a/src/widgets/widgets/qwidgettextcontrol_p_p.h +++ b/src/widgets/widgets/qwidgettextcontrol_p_p.h @@ -111,6 +111,7 @@ public: void _q_emitCursorPosChanged(const QTextCursor &someCursor); void _q_contentsChanged(int from, int charsRemoved, int charsAdded); + void setCursorVisible(bool visible); void setBlinkingCursorEnabled(bool enable); void updateCursorBlinking(); @@ -177,6 +178,7 @@ public: QTextDocument *doc; bool cursorOn; bool blinkingEnabled; + bool cursorVisible; QTextCursor cursor; bool cursorIsFocusIndicator; QTextCharFormat lastCharFormat;