diff --git a/src/ui/TextLabel.cpp b/src/ui/TextLabel.cpp index 85267674..8ea2bb54 100644 --- a/src/ui/TextLabel.cpp +++ b/src/ui/TextLabel.cpp @@ -7,6 +7,17 @@ #include "Utils.h" +bool +ContextMenuFilter::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::MouseButtonPress) { + emit contextMenuIsOpening(); + return true; + } + + return QObject::eventFilter(obj, event); +} + TextLabel::TextLabel(QWidget *parent) : TextLabel(QString(), parent) {} @@ -39,6 +50,12 @@ TextLabel::TextLabel(const QString &text, QWidget *parent) setFixedHeight(0); connect(this, &TextLabel::linkActivated, this, &TextLabel::handleLinkActivation); + + auto filter = new ContextMenuFilter(this); + installEventFilter(filter); + connect(filter, &ContextMenuFilter::contextMenuIsOpening, this, [this]() { + contextMenuRequested_ = true; + }); } void @@ -46,6 +63,12 @@ TextLabel::focusOutEvent(QFocusEvent *e) { QTextBrowser::focusOutEvent(e); + // We keep the selection available for the context menu. + if (contextMenuRequested_) { + contextMenuRequested_ = false; + return; + } + QTextCursor cursor = textCursor(); cursor.clearSelection(); setTextCursor(cursor); diff --git a/src/ui/TextLabel.h b/src/ui/TextLabel.h index da6e9c4b..1470d64e 100644 --- a/src/ui/TextLabel.h +++ b/src/ui/TextLabel.h @@ -9,6 +9,22 @@ class QMouseEvent; class QFocusEvent; class QWheelEvent; +class ContextMenuFilter : public QObject +{ + Q_OBJECT + +public: + explicit ContextMenuFilter(QWidget *parent) + : QObject(parent) + {} + +signals: + void contextMenuIsOpening(); + +protected: + bool eventFilter(QObject *obj, QEvent *event); +}; + class TextLabel : public QTextBrowser { Q_OBJECT @@ -35,4 +51,5 @@ signals: private: QString link_; + bool contextMenuRequested_ = false; };