forked from qt-creator/qt-creator
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 <david.schulz@qt.io>
This commit is contained in:
@@ -38,13 +38,15 @@ public:
|
|||||||
const bool textEditorRight
|
const bool textEditorRight
|
||||||
= s->value(MARKDOWNVIEWER_TEXTEDITOR_RIGHT, kTextEditorRightDefault).toBool();
|
= s->value(MARKDOWNVIEWER_TEXTEDITOR_RIGHT, kTextEditorRightDefault).toBool();
|
||||||
|
|
||||||
// Left side
|
m_splitter = new Core::MiniSplitter;
|
||||||
|
|
||||||
|
// preview
|
||||||
auto browser = new QTextBrowser();
|
auto browser = new QTextBrowser();
|
||||||
browser->setOpenExternalLinks(true);
|
browser->setOpenExternalLinks(true);
|
||||||
browser->setFrameShape(QFrame::NoFrame);
|
browser->setFrameShape(QFrame::NoFrame);
|
||||||
new Utils::MarkdownHighlighter(browser->document());
|
new Utils::MarkdownHighlighter(browser->document());
|
||||||
|
|
||||||
// Right side (hidable)
|
// editor
|
||||||
m_textEditorWidget = new TextEditorWidget;
|
m_textEditorWidget = new TextEditorWidget;
|
||||||
m_textEditorWidget->setTextDocument(m_document);
|
m_textEditorWidget->setTextDocument(m_document);
|
||||||
m_textEditorWidget->setupGenericHighlighter();
|
m_textEditorWidget->setupGenericHighlighter();
|
||||||
@@ -55,15 +57,22 @@ public:
|
|||||||
Core::ICore::addContextObject(context);
|
Core::ICore::addContextObject(context);
|
||||||
|
|
||||||
if (textEditorRight) {
|
if (textEditorRight) {
|
||||||
m_widget.addWidget(browser);
|
m_splitter->addWidget(browser);
|
||||||
m_widget.addWidget(m_textEditorWidget);
|
m_splitter->addWidget(m_textEditorWidget);
|
||||||
} else {
|
} else {
|
||||||
m_widget.addWidget(m_textEditorWidget);
|
m_splitter->addWidget(m_textEditorWidget);
|
||||||
m_widget.addWidget(browser);
|
m_splitter->addWidget(browser);
|
||||||
}
|
}
|
||||||
|
|
||||||
setContext(Core::Context(MARKDOWNVIEWER_ID));
|
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;
|
auto togglePreviewVisible = new QToolButton;
|
||||||
togglePreviewVisible->setText(Tr::tr("Show Preview"));
|
togglePreviewVisible->setText(Tr::tr("Show Preview"));
|
||||||
@@ -124,12 +133,12 @@ public:
|
|||||||
});
|
});
|
||||||
|
|
||||||
connect(swapViews, &QToolButton::clicked, m_textEditorWidget, [this, toolbarLayout] {
|
connect(swapViews, &QToolButton::clicked, m_textEditorWidget, [this, toolbarLayout] {
|
||||||
QTC_ASSERT(m_widget.count() > 1, return);
|
QTC_ASSERT(m_splitter->count() > 1, return);
|
||||||
// switch views
|
// switch views
|
||||||
auto placeholder = std::make_unique<QWidget>();
|
auto placeholder = std::make_unique<QWidget>();
|
||||||
auto second = m_widget.replaceWidget(1, placeholder.get());
|
auto second = m_splitter->replaceWidget(1, placeholder.get());
|
||||||
auto first = m_widget.replaceWidget(0, second);
|
auto first = m_splitter->replaceWidget(0, second);
|
||||||
m_widget.replaceWidget(1, first);
|
m_splitter->replaceWidget(1, first);
|
||||||
// switch buttons
|
// switch buttons
|
||||||
const int rightIndex = toolbarLayout->count() - 2;
|
const int rightIndex = toolbarLayout->count() - 2;
|
||||||
QLayoutItem *right = toolbarLayout->takeAt(rightIndex);
|
QLayoutItem *right = toolbarLayout->takeAt(rightIndex);
|
||||||
@@ -164,8 +173,20 @@ public:
|
|||||||
Core::IDocument *document() const override { return m_document.data(); }
|
Core::IDocument *document() const override { return m_document.data(); }
|
||||||
TextEditorWidget *textEditorWidget() const { return m_textEditorWidget; }
|
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:
|
private:
|
||||||
Core::MiniSplitter m_widget;
|
Core::MiniSplitter *m_splitter;
|
||||||
TextEditorWidget *m_textEditorWidget;
|
TextEditorWidget *m_textEditorWidget;
|
||||||
TextDocumentPtr m_document;
|
TextDocumentPtr m_document;
|
||||||
QWidget m_toolbar;
|
QWidget m_toolbar;
|
||||||
|
|||||||
Reference in New Issue
Block a user