TextEditor: Fix scrolling state after splitting

And when restoring editors in other ways (like from a session).

When splitting, the new editor was always scrolling to make the text
cursor visible, even if it wasn't visible in the original.

1. open editor with long contents
2. scroll away from the text cursor, so the line isn't visible
3. split and wonder

or 3. close and re-open Qt Creator, and restore the session

Our code already does set the state of the new editor to the old one,
but that state was destroyed by QPlainTextEdit::showEvent, which scrolls
on first show if text was added to the document.
So, wrap the showEvent with save/restoreState on first show.

Change-Id: I95e0b4e963ebb33d13ce020affaf7fc7f94c9257
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2020-02-26 13:04:30 +01:00
parent af52b65d6a
commit c912ee6862

View File

@@ -651,6 +651,7 @@ public:
MarginSettings m_marginSettings; MarginSettings m_marginSettings;
// apply when making visible the first time, for the split case // apply when making visible the first time, for the split case
bool m_fontSettingsNeedsApply = true; bool m_fontSettingsNeedsApply = true;
bool m_wasNotYetShown = true;
BehaviorSettings m_behaviorSettings; BehaviorSettings m_behaviorSettings;
int extraAreaSelectionAnchorBlockNumber = -1; int extraAreaSelectionAnchorBlockNumber = -1;
@@ -7204,10 +7205,20 @@ void TextEditorWidget::encourageApply()
void TextEditorWidget::showEvent(QShowEvent* e) void TextEditorWidget::showEvent(QShowEvent* e)
{ {
triggerPendingUpdates(); triggerPendingUpdates();
// QPlainTextEdit::showEvent scrolls to make the cursor visible on first show
// which we don't want, since we restore previous states when
// opening editors, and when splitting/duplicating.
// So restore the previous state after that.
QByteArray state;
if (d->m_wasNotYetShown)
state = saveState();
QPlainTextEdit::showEvent(e); QPlainTextEdit::showEvent(e);
if (d->m_wasNotYetShown) {
restoreState(state);
d->m_wasNotYetShown = false;
}
} }
void TextEditorWidgetPrivate::applyFontSettingsDelayed() void TextEditorWidgetPrivate::applyFontSettingsDelayed()
{ {
m_fontSettingsNeedsApply = true; m_fontSettingsNeedsApply = true;