17 #include "FloatingFlickable.h" 19 #include <private/qquickflickable_p.h> 20 #include "DirectionalDragArea.h" 24 FloatingFlickable::FloatingFlickable(QQuickItem *parent)
26 , m_mousePressed(false)
28 m_dragArea =
new DirectionalDragArea(
this);
29 m_dragArea->setWidth(width());
30 m_dragArea->setHeight(height());
31 m_dragArea->setDirection(Direction::Horizontal);
32 connect(m_dragArea, &DirectionalDragArea::touchXChanged,
33 this, &FloatingFlickable::onDragAreaTouchPosChanged);
34 connect(m_dragArea, &DirectionalDragArea::touchYChanged,
35 this, &FloatingFlickable::onDragAreaTouchPosChanged);
36 connect(m_dragArea, &DirectionalDragArea::draggingChanged,
37 this, &FloatingFlickable::onDragAreaDraggingChanged);
38 connect(m_dragArea, &DirectionalDragArea::directionChanged,
this, &FloatingFlickable::directionChanged);
40 m_flickable =
new QQuickFlickable(
this);
41 m_flickable->setEnabled(
false);
42 m_flickable->setWidth(width());
43 m_flickable->setHeight(height());
44 connect(m_flickable, &QQuickFlickable::contentWidthChanged,
this, &FloatingFlickable::contentWidthChanged);
45 connect(m_flickable, &QQuickFlickable::contentHeightChanged,
this, &FloatingFlickable::contentHeightChanged);
46 connect(m_flickable, &QQuickFlickable::contentXChanged,
this, &FloatingFlickable::contentXChanged);
47 connect(m_flickable, &QQuickFlickable::contentYChanged,
this, &FloatingFlickable::contentYChanged);
49 connect(
this, &QQuickItem::widthChanged,
this, &FloatingFlickable::updateChildrenWidth);
50 connect(
this, &QQuickItem::heightChanged,
this, &FloatingFlickable::updateChildrenHeight);
53 qreal FloatingFlickable::contentWidth()
const 55 return m_flickable->contentWidth();
58 void FloatingFlickable::setContentWidth(qreal contentWidth)
60 m_flickable->setContentWidth(contentWidth);
63 qreal FloatingFlickable::contentHeight()
const 65 return m_flickable->contentHeight();
68 void FloatingFlickable::setContentHeight(qreal contentHeight)
70 m_flickable->setContentHeight(contentHeight);
73 qreal FloatingFlickable::contentX()
const 75 return m_flickable->contentX();
78 void FloatingFlickable::setContentX(qreal contentX)
80 m_flickable->setContentX(contentX);
83 qreal FloatingFlickable::contentY()
const 85 return m_flickable->contentY();
88 void FloatingFlickable::setContentY(qreal contentY)
90 m_flickable->setContentY(contentY);
93 Direction::Type FloatingFlickable::direction()
const 95 return m_dragArea->direction();
98 void FloatingFlickable::setDirection(Direction::Type direction)
100 m_dragArea->setDirection(direction);
101 if (Direction::isHorizontal(direction)) {
102 m_flickable->setFlickableDirection(QQuickFlickable::HorizontalFlick);
104 m_flickable->setFlickableDirection(QQuickFlickable::VerticalFlick);
108 void FloatingFlickable::updateChildrenWidth()
110 m_dragArea->setWidth(width());
111 m_flickable->setWidth(width());
114 void FloatingFlickable::updateChildrenHeight()
116 m_dragArea->setHeight(height());
117 m_flickable->setHeight(height());
120 void FloatingFlickable::onDragAreaTouchPosChanged(qreal)
122 if (m_mousePressed) {
123 QMouseEvent mouseEvent(QEvent::MouseMove,
124 QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
125 Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
127 QCoreApplication::sendEvent(m_flickable, &mouseEvent);
132 void FloatingFlickable::onDragAreaDraggingChanged(
bool dragging)
134 if (dragging && !m_mousePressed) {
135 QMouseEvent mouseEvent(QEvent::MouseButtonPress,
136 QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
137 Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
139 QCoreApplication::sendEvent(m_flickable, &mouseEvent);
140 m_mousePressed =
true;
142 }
else if (!dragging && m_mousePressed) {
143 QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
144 QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
145 Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
147 QCoreApplication::sendEvent(m_flickable, &mouseEvent);
148 m_mousePressed =
false;