X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fwidgets%2Fpopup.cpp;h=ec6d29c981c235b86451353ca620d9c5cf147868;hp=68f79f0f6fbeafe6066bc0a3bc96e4ad11d037d8;hb=HEAD;hpb=360ab9be5d6060d05cd7d40f5a50f7eafb787290 diff --git a/pv/widgets/popup.cpp b/pv/widgets/popup.cpp index 68f79f0f..bcfd8753 100644 --- a/pv/widgets/popup.cpp +++ b/pv/widgets/popup.cpp @@ -14,18 +14,22 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ #include +#include -#include - -#include #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +#else #include +#endif #include +#include +#include +#include #include "popup.hpp" @@ -39,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_(), @@ -65,17 +96,16 @@ void Popup::set_position(const QPoint point, Position pos) MarginWidth + ((pos == Bottom) ? ArrowLength : 0), MarginWidth + ((pos == Left) ? ArrowLength : 0), MarginWidth + ((pos == Top) ? ArrowLength : 0)); - } -bool Popup::eventFilter(QObject *obj, QEvent *evt) +bool Popup::eventFilter(QObject *obj, QEvent *event) { QKeyEvent *keyEvent; (void)obj; - if (evt->type() == QEvent::KeyPress) { - keyEvent = static_cast(evt); + if (event->type() == QEvent::KeyPress) { + keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { close(); @@ -122,7 +152,7 @@ bool Popup::space_for_arrow() const case Bottom: if (point_.y() > y()) return false; - return true; + return true; case Left: if (point_.x() < (x() + width())) @@ -143,10 +173,9 @@ QPolygon Popup::arrow_polygon() const QPolygon poly; const QPoint p = mapFromGlobal(point_); - const int l = ArrowLength + ArrowOverlap; + const int l = ArrowLength + ArrowOverlap; - switch (pos_) - { + switch (pos_) { case Right: poly << QPoint(p.x() + l, p.y() - l); break; @@ -163,8 +192,7 @@ QPolygon Popup::arrow_polygon() const poly << p; - switch (pos_) - { + switch (pos_) { case Right: case Bottom: poly << QPoint(p.x() + l, p.y() + l); @@ -173,7 +201,7 @@ QPolygon Popup::arrow_polygon() const case Left: poly << QPoint(p.x() - l, p.y() + l); break; - + case Top: poly << QPoint(p.x() + l, p.y() - l); break; @@ -228,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; @@ -238,7 +270,7 @@ void Popup::reposition_widget() if (pos_ == Left) o.rx() = -width(); - else if(pos_ == Top) + else if (pos_ == Top) o.ry() = -height(); o += point_; @@ -294,13 +326,13 @@ void Popup::resizeEvent(QResizeEvent*) setMask(popup_region()); } -void Popup::mouseReleaseEvent(QMouseEvent *e) +void Popup::mouseReleaseEvent(QMouseEvent *event) { - assert(e); + assert(event); // We need our own out-of-bounds click handler because QWidget counts // the drop-shadow region as inside the widget - if(!bubble_rect().contains(e->pos())) + if (!bubble_rect().contains(event->pos())) close(); }