QMenu/QComboBox: Extract helper for determining the pop up geometry

Move the code returning whether a popup should use the full
screen to QStylePrivate and use for QMenu and QComboBox.

Task-number: QTBUG-73231
Change-Id: I1901ecedfa90edf16329ce3b13ef4abea5ab44e8
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This commit is contained in:
Friedemann Kleint 2019-03-21 09:11:27 +01:00
parent 8045ccc382
commit 3a34ef636a
5 changed files with 30 additions and 24 deletions

View File

@ -46,6 +46,7 @@
#include "qstyleoption.h"
#include "private/qstyle_p.h"
#include "private/qguiapplication_p.h"
#include <qpa/qplatformtheme.h>
#ifndef QT_NO_DEBUG
#include "qdebug.h"
#endif
@ -2447,6 +2448,13 @@ void QStyle::setProxy(QStyle *style)
d->proxyStyle = style;
}
//Windows and KDE allow menus to cover the taskbar, while GNOME and macOS don't
bool QStylePrivate::useFullScreenForPopup()
{
auto theme = QGuiApplicationPrivate::platformTheme();
return theme && theme->themeHint(QPlatformTheme::UseFullScreenForPopupMenu).toBool();
}
QT_END_NAMESPACE
#include "moc_qstyle.cpp"

View File

@ -67,6 +67,9 @@ class QStylePrivate: public QObjectPrivate
public:
inline QStylePrivate()
: layoutSpacingIndex(-1), proxyStyle(0) {}
static bool useFullScreenForPopup();
mutable int layoutSpacingIndex;
QStyle *proxyStyle;
};

View File

@ -80,6 +80,7 @@
#if QT_CONFIG(effects)
# include <private/qeffects_p.h>
#endif
#include <private/qstyle_p.h>
#ifndef QT_NO_ACCESSIBILITY
#include "qaccessible.h"
#endif
@ -261,16 +262,11 @@ void QComboBoxPrivate::_q_modelDestroyed()
model = QAbstractItemModelPrivate::staticEmptyModel();
}
//Windows and KDE allows menus to cover the taskbar, while GNOME and Mac don't
QRect QComboBoxPrivate::popupGeometry(int screen) const
{
bool useFullScreenForPopupMenu = false;
if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
useFullScreenForPopupMenu = theme->themeHint(QPlatformTheme::UseFullScreenForPopupMenu).toBool();
return useFullScreenForPopupMenu ?
QDesktopWidgetPrivate::screenGeometry(screen) :
QDesktopWidgetPrivate::availableGeometry(screen);
return QStylePrivate::useFullScreenForPopup()
? QDesktopWidgetPrivate::screenGeometry(screen)
: QDesktopWidgetPrivate::availableGeometry(screen);
}
bool QComboBoxPrivate::updateHoverControl(const QPoint &pos)

View File

@ -78,6 +78,7 @@
#include <private/qguiapplication_p.h>
#include <qpa/qplatformtheme.h>
#include <private/qdesktopwidget_p.h>
#include <private/qstyle_p.h>
QT_BEGIN_NAMESPACE
@ -307,29 +308,26 @@ int QMenuPrivate::scrollerHeight() const
return qMax(QApplication::globalStrut().height(), q->style()->pixelMetric(QStyle::PM_MenuScrollerHeight, 0, q));
}
//Windows and KDE allow menus to cover the taskbar, while GNOME and Mac don't
// Windows and KDE allow menus to cover the taskbar, while GNOME and macOS
// don't. Torn-off menus are again different
inline bool QMenuPrivate::useFullScreenForPopup() const
{
return !tornoff && QStylePrivate::useFullScreenForPopup();
}
QRect QMenuPrivate::popupGeometry() const
{
Q_Q(const QMenu);
if (!tornoff && // Torn-off menus are different
QGuiApplicationPrivate::platformTheme() &&
QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::UseFullScreenForPopupMenu).toBool()) {
return QDesktopWidgetPrivate::screenGeometry(q);
} else {
return QDesktopWidgetPrivate::availableGeometry(q);
}
return useFullScreenForPopup()
? QDesktopWidgetPrivate::screenGeometry(q)
: QDesktopWidgetPrivate::availableGeometry(q);
}
//Windows and KDE allow menus to cover the taskbar, while GNOME and Mac don't
QRect QMenuPrivate::popupGeometry(int screen) const
{
if (!tornoff && // Torn-off menus are different
QGuiApplicationPrivate::platformTheme() &&
QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::UseFullScreenForPopupMenu).toBool()) {
return QDesktopWidgetPrivate::screenGeometry(screen);
} else {
return QDesktopWidgetPrivate::availableGeometry(screen);
}
return useFullScreenForPopup()
? QDesktopWidgetPrivate::screenGeometry(screen)
: QDesktopWidgetPrivate::availableGeometry(screen);
}
QVector<QPointer<QWidget> > QMenuPrivate::calcCausedStack() const

View File

@ -343,6 +343,7 @@ public:
void updateActionRects(const QRect &screen) const;
QRect popupGeometry() const;
QRect popupGeometry(int screen) const;
bool useFullScreenForPopup() const;
int getLastVisibleAction() const;
//selection