From 302afcdfc7aeea1c1c072264605ecbf913cacb83 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 4 May 2023 15:34:40 +0200 Subject: [PATCH] Markdown: Fix focus handling When the markdown editor is opened or switched to, the focus is set on the editor widget. We don't want the focus on the splitter, but on either the text editor or the preview, depending on what had focus before. Change-Id: Ib54899c6251f2c5362f95d990e7150b6fee0f1e1 Reviewed-by: David Schulz --- src/plugins/texteditor/markdowneditor.cpp | 45 +++++++++++++++++------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/plugins/texteditor/markdowneditor.cpp b/src/plugins/texteditor/markdowneditor.cpp index afdda1bfb4d..59a524226db 100644 --- a/src/plugins/texteditor/markdowneditor.cpp +++ b/src/plugins/texteditor/markdowneditor.cpp @@ -38,13 +38,15 @@ public: const bool textEditorRight = s->value(MARKDOWNVIEWER_TEXTEDITOR_RIGHT, kTextEditorRightDefault).toBool(); - // Left side + m_splitter = new Core::MiniSplitter; + + // preview auto browser = new QTextBrowser(); browser->setOpenExternalLinks(true); browser->setFrameShape(QFrame::NoFrame); new Utils::MarkdownHighlighter(browser->document()); - // Right side (hidable) + // editor m_textEditorWidget = new TextEditorWidget; m_textEditorWidget->setTextDocument(m_document); m_textEditorWidget->setupGenericHighlighter(); @@ -55,15 +57,22 @@ public: Core::ICore::addContextObject(context); if (textEditorRight) { - m_widget.addWidget(browser); - m_widget.addWidget(m_textEditorWidget); + m_splitter->addWidget(browser); + m_splitter->addWidget(m_textEditorWidget); } else { - m_widget.addWidget(m_textEditorWidget); - m_widget.addWidget(browser); + m_splitter->addWidget(m_textEditorWidget); + m_splitter->addWidget(browser); } setContext(Core::Context(MARKDOWNVIEWER_ID)); - setWidget(&m_widget); + + auto widget = new QWidget; + auto layout = new QVBoxLayout; + layout->setContentsMargins(0, 0, 0, 0); + widget->setLayout(layout); + layout->addWidget(m_splitter); + setWidget(widget); + m_widget->installEventFilter(this); auto togglePreviewVisible = new QToolButton; togglePreviewVisible->setText(Tr::tr("Show Preview")); @@ -124,12 +133,12 @@ public: }); connect(swapViews, &QToolButton::clicked, m_textEditorWidget, [this, toolbarLayout] { - QTC_ASSERT(m_widget.count() > 1, return); + QTC_ASSERT(m_splitter->count() > 1, return); // switch views auto placeholder = std::make_unique(); - auto second = m_widget.replaceWidget(1, placeholder.get()); - auto first = m_widget.replaceWidget(0, second); - m_widget.replaceWidget(1, first); + auto second = m_splitter->replaceWidget(1, placeholder.get()); + auto first = m_splitter->replaceWidget(0, second); + m_splitter->replaceWidget(1, first); // switch buttons const int rightIndex = toolbarLayout->count() - 2; QLayoutItem *right = toolbarLayout->takeAt(rightIndex); @@ -164,8 +173,20 @@ public: Core::IDocument *document() const override { return m_document.data(); } TextEditorWidget *textEditorWidget() const { return m_textEditorWidget; } + bool eventFilter(QObject *obj, QEvent *ev) override + { + if (obj == m_widget && ev->type() == QEvent::FocusIn) { + if (m_splitter->focusWidget()) + m_splitter->focusWidget()->setFocus(); + else + m_splitter->widget(0)->setFocus(); + return true; + } + return Core::IEditor::eventFilter(obj, ev); + } + private: - Core::MiniSplitter m_widget; + Core::MiniSplitter *m_splitter; TextEditorWidget *m_textEditorWidget; TextDocumentPtr m_document; QWidget m_toolbar;