From f0bb7e8bfa9f9880a09872160c7765be1e44a594 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 5 Jul 2023 14:40:41 +0200 Subject: [PATCH] Editor: modernize line column label MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change contains various adjustments to the line column label: - Display the number of selected characters - Show the number of cursors instead of the position when multiple text cursors are present in the current editor - show detailed information for each cursor in the line column tooltip Fixes: QTCREATORBUG-29381 Change-Id: Ib4f36b290797f1d84f268deeb9556e78ae921c37 Reviewed-by: Christian Stenger Reviewed-by: Reviewed-by: André Hartmann --- src/plugins/texteditor/texteditor.cpp | 79 +++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ac0d3ebee42..8d16d57922e 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -157,7 +157,6 @@ public: : FixedSizeClickLabel(parent) , m_editor(parent) { - setMaxText(Tr::tr("Line: 9999, Col: 999")); connect(m_editor, &QPlainTextEdit::cursorPositionChanged, this, &LineColumnLabel::update); connect(this, &FixedSizeClickLabel::clicked, ActionManager::instance(), [this] { emit m_editor->activateEditor(EditorManager::IgnoreNavigationHistory); @@ -173,18 +172,74 @@ public: private: void update() { - const QTextCursor cursor = m_editor->textCursor(); - const QTextBlock block = cursor.block(); - const int line = block.blockNumber() + 1; + 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 event(QEvent *event) override + { + if (event->type() != QEvent::ToolTip) + return FixedSizeClickLabel::event(event); + + QString tooltipText = "\n"; + + 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(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; }); + const TabSettings &tabSettings = m_editor->textDocument()->tabSettings(); - const int column = tabSettings.columnAt(block.text(), cursor.positionInBlock()) + 1; - const QString text = Tr::tr("Line: %1, Col: %2"); - setText(text.arg(line).arg(column)); - const QString toolTipText = Tr::tr("Cursor position: %1"); - setToolTip(toolTipText.arg(QString::number(cursor.position()))); - QFont f = font(); - f.setItalic(m_editor->multiTextCursor().hasMultipleCursors()); - setFont(f); + 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("Position in document:"), [](const QTextCursor &c) { return c.position(); }); + + addRow(Tr::tr("Anchor:"), [](const QTextCursor &c) { return c.anchor(); }); + + tooltipText += "
%1%1
%1%1...
\n"; + + ToolTip::show(static_cast(event)->globalPos(), + tooltipText, + Qt::RichText); + event->accept(); + return true; } TextEditorWidget *m_editor;