X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fwidgets%2Fpopup.cpp;h=ec6d29c981c235b86451353ca620d9c5cf147868;hp=f1486e0089ac7f8a392baf58ce438d493338cbe9;hb=HEAD;hpb=aca9aa834c742ba70f49d1ac3eb2d1e02e759416 diff --git a/pv/widgets/popup.cpp b/pv/widgets/popup.cpp index f1486e00..bcfd8753 100644 --- a/pv/widgets/popup.cpp +++ b/pv/widgets/popup.cpp @@ -21,8 +21,14 @@ #include #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +#else #include +#endif #include +#include +#include #include #include "popup.hpp" @@ -37,6 +43,33 @@ const unsigned int Popup::ArrowLength = 10; const unsigned int Popup::ArrowOverlap = 3; const unsigned int Popup::MarginWidth = 6; + +QWidthAdjustingScrollArea::QWidthAdjustingScrollArea(QWidget* parent) : + QScrollArea(parent) +{ +} + +void QWidthAdjustingScrollArea::setWidget(QWidget* w) +{ + QScrollArea::setWidget(w); + // It happens that QScrollArea already filters widget events, + // but that's an implementation detail that we shouldn't rely on. + w->installEventFilter(this); +} + +bool QWidthAdjustingScrollArea::eventFilter(QObject* obj, QEvent* ev) +{ + if (obj == widget() && ev->type() == QEvent::Resize) { + if (widget()->height() > height()) + setMinimumWidth(widget()->width() + qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent)); + else + setMinimumWidth(widget()->width()); + } + + return QScrollArea::eventFilter(obj, ev); +} + + Popup::Popup(QWidget *parent) : QWidget(parent, Qt::Popup | Qt::FramelessWindowHint), point_(), @@ -140,7 +173,7 @@ QPolygon Popup::arrow_polygon() const QPolygon poly; const QPoint p = mapFromGlobal(point_); - const int l = ArrowLength + ArrowOverlap; + const int l = ArrowLength + ArrowOverlap; switch (pos_) { case Right: @@ -223,8 +256,12 @@ void Popup::reposition_widget() { QPoint o; +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + const QRect screen_rect = QApplication::screenAt(point_)->availableGeometry(); +#else const QRect screen_rect = QApplication::desktop()->availableGeometry( QApplication::desktop()->screenNumber(point_)); +#endif if (pos_ == Right || pos_ == Left) o.ry() = -height() / 2;