diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp index e4bfe0c05..7ed5a6052 100644 --- a/src/core/utilities.cpp +++ b/src/core/utilities.cpp @@ -21,14 +21,16 @@ #include "sha2.h" -#include +#include #include #include #include #include +#include #include #include #include +#include #include #include @@ -348,6 +350,18 @@ QString PrettySize(const QSize& size) { QString::number(size.height()); } +void ForwardMouseEvent(const QMouseEvent* e, QWidget* target) { + QMouseEvent c(e->type(), target->mapFromGlobal(e->globalPos()), + e->globalPos(), e->button(), e->buttons(), e->modifiers()); + + target->setAttribute(Qt::WA_UnderMouse, true); + QApplication::sendEvent(target, &c); +} + +bool IsMouseEventInWidget(const QMouseEvent* e, const QWidget* widget) { + return widget->rect().contains(widget->mapFromGlobal(e->globalPos())); +} + } // namespace Utilities diff --git a/src/core/utilities.h b/src/core/utilities.h index 4f0dcb621..6400c8113 100644 --- a/src/core/utilities.h +++ b/src/core/utilities.h @@ -27,6 +27,7 @@ #include class QIODevice; +class QMouseEvent; namespace Utilities { QString PrettyTime(int seconds); @@ -60,6 +61,14 @@ namespace Utilities { QByteArray Sha256(const QByteArray& data); + // Forwards a mouse event to a different widget, remapping the event's widget + // coordinates relative to those of the target widget. + void ForwardMouseEvent(const QMouseEvent* e, QWidget* target); + + // Checks if the mouse event was inside the widget's rectangle. + bool IsMouseEventInWidget(const QMouseEvent* e, const QWidget* widget); + + enum ConfigPath { Path_Root, Path_AlbumCovers, diff --git a/src/globalsearch/globalsearchtooltip.cpp b/src/globalsearch/globalsearchtooltip.cpp index c2d57af0b..b02ff0510 100644 --- a/src/globalsearch/globalsearchtooltip.cpp +++ b/src/globalsearch/globalsearchtooltip.cpp @@ -19,6 +19,7 @@ #include "tooltipactionwidget.h" #include "tooltipresultwidget.h" #include "core/logging.h" +#include "core/utilities.h" #include #include @@ -154,17 +155,11 @@ bool GlobalSearchTooltip::event(QEvent* e) { case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: if (!underMouse()) { - QMouseEvent* me = static_cast(e); - QMouseEvent c(me->type(), event_target_->mapFromGlobal(me->globalPos()), - me->globalPos(), me->button(), - me->buttons(), me->modifiers()); + const QMouseEvent* me = static_cast(e); + QWidget* child = event_target_->childAt( + event_target_->mapFromGlobal(me->globalPos())); - QWidget* child = event_target_->childAt(c.pos()); - - if (child) - child->setAttribute(Qt::WA_UnderMouse, true); - - QApplication::sendEvent(child ? child : event_target_, &c); + Utilities::ForwardMouseEvent(me, child ? child : event_target_); return true; } break; diff --git a/src/globalsearch/globalsearchwidget.cpp b/src/globalsearch/globalsearchwidget.cpp index 2d733e3b5..f0b0829a2 100644 --- a/src/globalsearch/globalsearchwidget.cpp +++ b/src/globalsearch/globalsearchwidget.cpp @@ -354,11 +354,6 @@ bool GlobalSearchWidget::EventFilterSearchWidget(QObject* o, QEvent* e) { break; } - case QEvent::MouseButtonPress: - if (!ui_->search->text().isEmpty()) - RepositionPopup(); - break; - default: break; }