aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickdrawer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates2/qquickdrawer.cpp')
-rw-r--r--src/quicktemplates2/qquickdrawer.cpp73
1 files changed, 72 insertions, 1 deletions
diff --git a/src/quicktemplates2/qquickdrawer.cpp b/src/quicktemplates2/qquickdrawer.cpp
index 4c850473..80cd95c9 100644
--- a/src/quicktemplates2/qquickdrawer.cpp
+++ b/src/quicktemplates2/qquickdrawer.cpp
@@ -91,6 +91,32 @@ QT_BEGIN_NAMESPACE
\l {Popup::}{parent} to something else to make the drawer operate in a specific
coordinate space.
+ Drawer can be configured to cover only part of its window edge. The following example
+ illustrates how Drawer can be positioned to appear below a window header:
+
+ \code
+ import QtQuick 2.7
+ import QtQuick.Controls 2.0
+
+ ApplicationWindow {
+ id: window
+ visible: true
+
+ header: ToolBar { }
+
+ Drawer {
+ y: header.height
+ width: window.width * 0.6
+ height: window.height - header.height
+ }
+ }
+ \endcode
+
+ The \l position property determines how much of the drawer is visible, as
+ a value between \c 0.0 and \c 1.0. It is not possible to set the x-coordinate
+ (or horizontal margins) of a drawer at the left or right window edge, or the
+ y-coordinate (or vertical margins) of a drawer at the top or bottom window edge.
+
In the image above, the application's contents are \e "pushed" across the
screen. This is achieved by applying a translation to the contents:
@@ -139,6 +165,7 @@ QQuickDrawerPrivate::QQuickDrawerPrivate()
: edge(Qt::LeftEdge), offset(0), position(0),
dragMargin(QGuiApplication::styleHints()->startDragDistance())
{
+ setEdge(Qt::LeftEdge);
}
qreal QQuickDrawerPrivate::positionAt(const QPointF &point) const
@@ -183,6 +210,27 @@ void QQuickDrawerPrivate::reposition()
popupItem->setY(window->height() - position * popupItem->height());
break;
}
+
+ QQuickPopupPrivate::reposition();
+}
+
+void QQuickDrawerPrivate::resizeOverlay()
+{
+ if (!dimmer || !window)
+ return;
+
+ QRectF geometry(0, 0, window->width(), window->height());
+
+ if (edge == Qt::LeftEdge || edge == Qt::RightEdge) {
+ geometry.setY(popupItem->y());
+ geometry.setHeight(popupItem->height());
+ } else {
+ geometry.setX(popupItem->x());
+ geometry.setWidth(popupItem->width());
+ }
+
+ dimmer->setPosition(geometry.topLeft());
+ dimmer->setSize(geometry.size());
}
static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event, int threshold = -1)
@@ -402,6 +450,22 @@ bool QQuickDrawerPrivate::prepareExitTransition()
return QQuickPopupPrivate::prepareExitTransition();
}
+void QQuickDrawerPrivate::setEdge(Qt::Edge e)
+{
+ edge = e;
+ if (edge == Qt::LeftEdge || edge == Qt::RightEdge) {
+ allowVerticalMove = true;
+ allowVerticalResize = true;
+ allowHorizontalMove = false;
+ allowHorizontalResize = false;
+ } else {
+ allowVerticalMove = false;
+ allowVerticalResize = false;
+ allowHorizontalMove = true;
+ allowHorizontalResize = true;
+ }
+}
+
QQuickDrawer::QQuickDrawer(QObject *parent) :
QQuickPopup(*(new QQuickDrawerPrivate), parent)
{
@@ -434,7 +498,7 @@ void QQuickDrawer::setEdge(Qt::Edge edge)
if (d->edge == edge)
return;
- d->edge = edge;
+ d->setEdge(edge);
if (isComponentComplete())
d->reposition();
emit edgeChanged();
@@ -559,4 +623,11 @@ bool QQuickDrawer::overlayEvent(QQuickItem *item, QEvent *event)
}
}
+void QQuickDrawer::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickDrawer);
+ QQuickPopup::geometryChanged(newGeometry, oldGeometry);
+ d->resizeOverlay();
+}
+
QT_END_NAMESPACE