#include <cassert>
#include <QApplication>
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+#include <QScreen>
+#else
#include <QDesktopWidget>
+#endif
#include <QLineEdit>
+#include <QScrollBar>
+#include <QStyle>
#include <QtGui>
#include "popup.hpp"
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_(),
QPolygon poly;
const QPoint p = mapFromGlobal(point_);
- const int l = ArrowLength + ArrowOverlap;
+ const int l = ArrowLength + ArrowOverlap;
switch (pos_) {
case Right:
{
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;