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";
class LineColumnButton : public QToolButton
class LineColumnButtonPrivate
{
Q_OBJECT
public:
LineColumnButton(TextEditorWidget *parent)
QSize m_maxSize;
TextEditorWidget *m_editor;
};
} // namespace Internal
LineColumnButton::LineColumnButton(TextEditorWidget *parent)
: QToolButton(parent)
, m_editor(parent)
, m_d(new LineColumnButtonPrivate)
{
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(), [] {
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);
});
}
private:
void update()
LineColumnButton::~LineColumnButton() = default;
void LineColumnButton::update()
{
const Utils::MultiTextCursor &cursors = m_editor->multiTextCursor();
const Utils::MultiTextCursor &cursors = m_d->m_editor->multiTextCursor();
QString text;
if (cursors.hasMultipleCursors()) {
text = Tr::tr("Cursors: %2").arg(cursors.cursorCount());
@@ -179,7 +189,7 @@ private:
const QTextCursor cursor = cursors.mainCursor();
const QTextBlock block = cursor.block();
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;
text = Tr::tr("Line: %1, Col: %2").arg(line).arg(column);
const QString toolTipText = Tr::tr("Cursor position: %1");
@@ -193,14 +203,14 @@ private:
setText(text);
}
bool event(QEvent *event) override
bool LineColumnButton::event(QEvent *event)
{
if (event->type() != QEvent::ToolTip)
return QToolButton::event(event);
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);
tooltipText += "<tr>";
@@ -220,7 +230,7 @@ private:
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) {
return tabSettings.columnAt(c.block().text(), c.positionInBlock()) + 1;
});
@@ -234,28 +244,22 @@ private:
tooltipText += "</table>\n";
ToolTip::show(static_cast<const QHelpEvent *>(event)->globalPos(),
tooltipText,
Qt::RichText);
ToolTip::show(static_cast<const QHelpEvent *>(event)->globalPos(), tooltipText, Qt::RichText);
event->accept();
return true;
}
QSize sizeHint() const override
QSize LineColumnButton::sizeHint() const
{
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;
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;
}
mutable QSize m_maxSize;
TextEditorWidget *m_editor;
};
namespace Internal {
class TextEditorAnimator : public QObject
{

View File

@@ -22,6 +22,7 @@
#include <QPlainTextEdit>
#include <QSharedPointer>
#include <QToolButton>
#include <functional>
#include <memory>
@@ -56,6 +57,7 @@ using TextMarks = QList<TextMark *>;
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<Internal::LineColumnButtonPrivate> m_d;
};
} // namespace TextEditor
QT_BEGIN_NAMESPACE