]> sigrok.org Git - pulseview.git/blobdiff - pv/widgets/popup.cpp
Trace: Use scroll bars for popups with too much content
[pulseview.git] / pv / widgets / popup.cpp
index f60e643a794e3b0f5493ca1802c046afe2b8dea9..ec6d29c981c235b86451353ca620d9c5cf147868 100644 (file)
 #include <algorithm>
 #include <cassert>
 
-#include <QtGui>
 #include <QApplication>
 #include <QDesktopWidget>
 #include <QLineEdit>
+#include <QScrollBar>
+#include <QStyle>
+#include <QtGui>
 
 #include "popup.hpp"
 
@@ -37,6 +39,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_(),
@@ -119,7 +148,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()))
@@ -140,7 +169,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:
@@ -168,7 +197,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;