From 0269626a17baa00e7fd949ab8ca697ea47029175 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 14 Nov 2023 11:15:21 +0100 Subject: [PATCH] Make LineColumnButton re-usable Change-Id: I34e755018eef41e7e7cf254ccba72a1ec5a1c5ff Reviewed-by: David Schulz --- src/plugins/texteditor/texteditor.cpp | 174 +++++++++++++------------- src/plugins/texteditor/texteditor.h | 17 +++ 2 files changed, 106 insertions(+), 85 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index d4820b16665..bb86f7d0290 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -148,114 +148,118 @@ using ListTransformationMethod = void(QStringList &); static constexpr char dropProperty[] = "dropProp"; -class LineColumnButton : public QToolButton +class LineColumnButtonPrivate { - Q_OBJECT public: - LineColumnButton(TextEditorWidget *parent) - : QToolButton(parent) - , m_editor(parent) - { - connect(m_editor, &QPlainTextEdit::cursorPositionChanged, this, &LineColumnButton::update); - connect(this, &QToolButton::pressed, ActionManager::instance(), [this] { - emit m_editor->activateEditor(EditorManager::IgnoreNavigationHistory); - QMetaObject::invokeMethod(ActionManager::instance(), [] { + QSize m_maxSize; + TextEditorWidget *m_editor; +}; + +} // namespace Internal + +LineColumnButton::LineColumnButton(TextEditorWidget *parent) + : QToolButton(parent) + , m_d(new LineColumnButtonPrivate) +{ + m_d->m_editor = parent; + connect(m_d->m_editor, &QPlainTextEdit::cursorPositionChanged, this, &LineColumnButton::update); + connect(this, &QToolButton::clicked, ActionManager::instance(), [this] { + emit m_d->m_editor->activateEditor(EditorManager::IgnoreNavigationHistory); + QMetaObject::invokeMethod( + ActionManager::instance(), + [] { if (Command *cmd = ActionManager::command(Core::Constants::GOTO)) { if (QAction *act = cmd->action()) act->trigger(); } - }, Qt::QueuedConnection); - }); + }, + Qt::QueuedConnection); + }); +} + +LineColumnButton::~LineColumnButton() = default; + +void LineColumnButton::update() +{ + const Utils::MultiTextCursor &cursors = m_d->m_editor->multiTextCursor(); + QString text; + if (cursors.hasMultipleCursors()) { + text = Tr::tr("Cursors: %2").arg(cursors.cursorCount()); + } else { + const QTextCursor cursor = cursors.mainCursor(); + const QTextBlock block = cursor.block(); + const int line = block.blockNumber() + 1; + const TabSettings &tabSettings = m_d->m_editor->textDocument()->tabSettings(); + const int column = tabSettings.columnAt(block.text(), cursor.positionInBlock()) + 1; + text = Tr::tr("Line: %1, Col: %2").arg(line).arg(column); + const QString toolTipText = Tr::tr("Cursor position: %1"); + setToolTip(toolTipText.arg(cursor.position())); } + int selection = 0; + for (const QTextCursor &cursor : cursors) + selection += cursor.selectionEnd() - cursor.selectionStart(); + if (selection > 0) + text += " " + Tr::tr("(Sel: %1)").arg(selection); + setText(text); +} -private: - void update() - { - const Utils::MultiTextCursor &cursors = m_editor->multiTextCursor(); - QString text; - if (cursors.hasMultipleCursors()) { - text = Tr::tr("Cursors: %2").arg(cursors.cursorCount()); - } else { - const QTextCursor cursor = cursors.mainCursor(); - const QTextBlock block = cursor.block(); - const int line = block.blockNumber() + 1; - const TabSettings &tabSettings = m_editor->textDocument()->tabSettings(); - const int column = tabSettings.columnAt(block.text(), cursor.positionInBlock()) + 1; - text = Tr::tr("Line: %1, Col: %2").arg(line).arg(column); - const QString toolTipText = Tr::tr("Cursor position: %1"); - setToolTip(toolTipText.arg(cursor.position())); - } - int selection = 0; - for (const QTextCursor &cursor : cursors) - selection += cursor.selectionEnd() - cursor.selectionStart(); - if (selection > 0) - text += " " + Tr::tr("(Sel: %1)").arg(selection); - setText(text); - } +bool LineColumnButton::event(QEvent *event) +{ + if (event->type() != QEvent::ToolTip) + return QToolButton::event(event); - bool event(QEvent *event) override - { - if (event->type() != QEvent::ToolTip) - return QToolButton::event(event); + QString tooltipText = "\n"; - QString tooltipText = "
\n"; + const MultiTextCursor multiCursor = m_d->m_editor->multiTextCursor(); + const QList cursors = multiCursor.cursors().mid(0, 15); - const MultiTextCursor multiCursor = m_editor->multiTextCursor(); - const QList cursors = multiCursor.cursors().mid(0, 15); + tooltipText += ""; + tooltipText += QString("").arg(Tr::tr("Cursors:")); + tooltipText += QString("").arg(multiCursor.cursorCount()); + tooltipText += "\n"; + auto addRow = [&](const QString header, auto cellText) { tooltipText += ""; - tooltipText += QString("").arg(Tr::tr("Cursors:")); - tooltipText += QString("").arg(multiCursor.cursorCount()); + tooltipText += QString("").arg(header); + for (const QTextCursor &c : cursors) + tooltipText += QString("").arg(cellText(c)); + if (multiCursor.cursorCount() > cursors.count()) + tooltipText += QString(""); tooltipText += "\n"; + }; - auto addRow = [&](const QString header, auto cellText) { - tooltipText += ""; - tooltipText += QString("").arg(header); - for (const QTextCursor &c : cursors) - tooltipText += QString("").arg(cellText(c)); - if (multiCursor.cursorCount() > cursors.count()) - tooltipText += QString(""); - tooltipText += "\n"; - }; + addRow(Tr::tr("Line:"), [](const QTextCursor &c) { return c.blockNumber() + 1; }); - addRow(Tr::tr("Line:"), [](const QTextCursor &c) { return c.blockNumber() + 1; }); + const TabSettings &tabSettings = m_d->m_editor->textDocument()->tabSettings(); + addRow(Tr::tr("Column:"), [&](const QTextCursor &c) { + return tabSettings.columnAt(c.block().text(), c.positionInBlock()) + 1; + }); - const TabSettings &tabSettings = m_editor->textDocument()->tabSettings(); - addRow(Tr::tr("Column:"), [&](const QTextCursor &c) { - return tabSettings.columnAt(c.block().text(), c.positionInBlock()) + 1; - }); + addRow(Tr::tr("Selection length:"), + [](const QTextCursor &c) { return c.selectionEnd() - c.selectionStart(); }); - addRow(Tr::tr("Selection length:"), - [](const QTextCursor &c) { return c.selectionEnd() - c.selectionStart(); }); + addRow(Tr::tr("Position in document:"), [](const QTextCursor &c) { return c.position(); }); - addRow(Tr::tr("Position in document:"), [](const QTextCursor &c) { return c.position(); }); + addRow(Tr::tr("Anchor:"), [](const QTextCursor &c) { return c.anchor(); }); - addRow(Tr::tr("Anchor:"), [](const QTextCursor &c) { return c.anchor(); }); + tooltipText += "
%1%1
%1%1%1%1...
%1%1...
\n"; - tooltipText += "\n"; + ToolTip::show(static_cast(event)->globalPos(), tooltipText, Qt::RichText); + event->accept(); + return true; +} - ToolTip::show(static_cast(event)->globalPos(), - tooltipText, - Qt::RichText); - event->accept(); - return true; - } +QSize LineColumnButton::sizeHint() const +{ + const QSize size = QToolButton::sizeHint(); + auto wider = [](const QSize &left, const QSize &right) { return left.width() < right.width(); }; + if (m_d->m_editor->multiTextCursor().hasSelection()) + return std::max(m_d->m_maxSize, size, wider); // do not save the size if we have a selection + m_d->m_maxSize = std::max(m_d->m_maxSize, size, wider); + return m_d->m_maxSize; +} - QSize sizeHint() const override - { - const QSize size = QToolButton::sizeHint(); - auto wider = [](const QSize &left, const QSize &right) { - return left.width() < right.width(); - }; - if (m_editor->multiTextCursor().hasSelection()) - return std::max(m_maxSize, size, wider); // do not save the size if we have a selection - m_maxSize = std::max(m_maxSize, size, wider); - return m_maxSize; - } - - mutable QSize m_maxSize; - TextEditorWidget *m_editor; -}; +namespace Internal { class TextEditorAnimator : public QObject { diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 36de773977d..4807d4cdfbf 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -56,6 +57,7 @@ using TextMarks = QList; namespace Internal { class BaseTextEditorPrivate; +class LineColumnButtonPrivate; class TextEditorFactoryPrivate; class TextEditorWidgetPrivate; class TextEditorOverlay; @@ -699,6 +701,21 @@ private: Internal::TextEditorFactoryPrivate *d; }; +class TEXTEDITOR_EXPORT LineColumnButton : public QToolButton +{ +public: + LineColumnButton(TextEditorWidget *parent); + ~LineColumnButton(); + +private: + void update(); + bool event(QEvent *event) override; + QSize sizeHint() const override; + +private: + std::unique_ptr m_d; +}; + } // namespace TextEditor QT_BEGIN_NAMESPACE