Make LineColumnButton re-usable

Change-Id: I34e755018eef41e7e7cf254ccba72a1ec5a1c5ff
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2023-11-14 11:15:21 +01:00
parent a252ea0205
commit 0269626a17
2 changed files with 106 additions and 85 deletions

View File

@@ -148,30 +148,40 @@ using ListTransformationMethod = void(QStringList &);
static constexpr char dropProperty[] = "dropProp"; static constexpr char dropProperty[] = "dropProp";
class LineColumnButton : public QToolButton class LineColumnButtonPrivate
{ {
Q_OBJECT
public: public:
LineColumnButton(TextEditorWidget *parent) QSize m_maxSize;
TextEditorWidget *m_editor;
};
} // namespace Internal
LineColumnButton::LineColumnButton(TextEditorWidget *parent)
: QToolButton(parent) : QToolButton(parent)
, m_editor(parent) , m_d(new LineColumnButtonPrivate)
{ {
connect(m_editor, &QPlainTextEdit::cursorPositionChanged, this, &LineColumnButton::update); m_d->m_editor = parent;
connect(this, &QToolButton::pressed, ActionManager::instance(), [this] { connect(m_d->m_editor, &QPlainTextEdit::cursorPositionChanged, this, &LineColumnButton::update);
emit m_editor->activateEditor(EditorManager::IgnoreNavigationHistory); connect(this, &QToolButton::clicked, ActionManager::instance(), [this] {
QMetaObject::invokeMethod(ActionManager::instance(), [] { emit m_d->m_editor->activateEditor(EditorManager::IgnoreNavigationHistory);
QMetaObject::invokeMethod(
ActionManager::instance(),
[] {
if (Command *cmd = ActionManager::command(Core::Constants::GOTO)) { if (Command *cmd = ActionManager::command(Core::Constants::GOTO)) {
if (QAction *act = cmd->action()) if (QAction *act = cmd->action())
act->trigger(); act->trigger();
} }
}, Qt::QueuedConnection); },
Qt::QueuedConnection);
}); });
} }
private: LineColumnButton::~LineColumnButton() = default;
void update()
{ void LineColumnButton::update()
const Utils::MultiTextCursor &cursors = m_editor->multiTextCursor(); {
const Utils::MultiTextCursor &cursors = m_d->m_editor->multiTextCursor();
QString text; QString text;
if (cursors.hasMultipleCursors()) { if (cursors.hasMultipleCursors()) {
text = Tr::tr("Cursors: %2").arg(cursors.cursorCount()); text = Tr::tr("Cursors: %2").arg(cursors.cursorCount());
@@ -179,7 +189,7 @@ private:
const QTextCursor cursor = cursors.mainCursor(); const QTextCursor cursor = cursors.mainCursor();
const QTextBlock block = cursor.block(); const QTextBlock block = cursor.block();
const int line = block.blockNumber() + 1; const int line = block.blockNumber() + 1;
const TabSettings &tabSettings = m_editor->textDocument()->tabSettings(); const TabSettings &tabSettings = m_d->m_editor->textDocument()->tabSettings();
const int column = tabSettings.columnAt(block.text(), cursor.positionInBlock()) + 1; const int column = tabSettings.columnAt(block.text(), cursor.positionInBlock()) + 1;
text = Tr::tr("Line: %1, Col: %2").arg(line).arg(column); text = Tr::tr("Line: %1, Col: %2").arg(line).arg(column);
const QString toolTipText = Tr::tr("Cursor position: %1"); const QString toolTipText = Tr::tr("Cursor position: %1");
@@ -191,16 +201,16 @@ private:
if (selection > 0) if (selection > 0)
text += " " + Tr::tr("(Sel: %1)").arg(selection); text += " " + Tr::tr("(Sel: %1)").arg(selection);
setText(text); setText(text);
} }
bool event(QEvent *event) override bool LineColumnButton::event(QEvent *event)
{ {
if (event->type() != QEvent::ToolTip) if (event->type() != QEvent::ToolTip)
return QToolButton::event(event); return QToolButton::event(event);
QString tooltipText = "<table cellpadding='2'>\n"; QString tooltipText = "<table cellpadding='2'>\n";
const MultiTextCursor multiCursor = m_editor->multiTextCursor(); const MultiTextCursor multiCursor = m_d->m_editor->multiTextCursor();
const QList<QTextCursor> cursors = multiCursor.cursors().mid(0, 15); const QList<QTextCursor> cursors = multiCursor.cursors().mid(0, 15);
tooltipText += "<tr>"; tooltipText += "<tr>";
@@ -220,7 +230,7 @@ private:
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_editor->textDocument()->tabSettings(); const TabSettings &tabSettings = m_d->m_editor->textDocument()->tabSettings();
addRow(Tr::tr("Column:"), [&](const QTextCursor &c) { addRow(Tr::tr("Column:"), [&](const QTextCursor &c) {
return tabSettings.columnAt(c.block().text(), c.positionInBlock()) + 1; return tabSettings.columnAt(c.block().text(), c.positionInBlock()) + 1;
}); });
@@ -234,28 +244,22 @@ private:
tooltipText += "</table>\n"; tooltipText += "</table>\n";
ToolTip::show(static_cast<const QHelpEvent *>(event)->globalPos(), ToolTip::show(static_cast<const QHelpEvent *>(event)->globalPos(), tooltipText, Qt::RichText);
tooltipText,
Qt::RichText);
event->accept(); event->accept();
return true; return true;
} }
QSize sizeHint() const override QSize LineColumnButton::sizeHint() const
{ {
const QSize size = QToolButton::sizeHint(); const QSize size = QToolButton::sizeHint();
auto wider = [](const QSize &left, const QSize &right) { auto wider = [](const QSize &left, const QSize &right) { return left.width() < right.width(); };
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
if (m_editor->multiTextCursor().hasSelection()) m_d->m_maxSize = std::max(m_d->m_maxSize, size, wider);
return std::max(m_maxSize, size, wider); // do not save the size if we have a selection return m_d->m_maxSize;
m_maxSize = std::max(m_maxSize, size, wider); }
return m_maxSize;
}
mutable QSize m_maxSize; namespace Internal {
TextEditorWidget *m_editor;
};
class TextEditorAnimator : public QObject class TextEditorAnimator : public QObject
{ {

View File

@@ -22,6 +22,7 @@
#include <QPlainTextEdit> #include <QPlainTextEdit>
#include <QSharedPointer> #include <QSharedPointer>
#include <QToolButton>
#include <functional> #include <functional>
#include <memory> #include <memory>
@@ -56,6 +57,7 @@ using TextMarks = QList<TextMark *>;
namespace Internal { namespace Internal {
class BaseTextEditorPrivate; class BaseTextEditorPrivate;
class LineColumnButtonPrivate;
class TextEditorFactoryPrivate; class TextEditorFactoryPrivate;
class TextEditorWidgetPrivate; class TextEditorWidgetPrivate;
class TextEditorOverlay; class TextEditorOverlay;
@@ -699,6 +701,21 @@ private:
Internal::TextEditorFactoryPrivate *d; 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<Internal::LineColumnButtonPrivate> m_d;
};
} // namespace TextEditor } // namespace TextEditor
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE