Merge branch 'mouse_events'
REVIEW: 114589
This commit is contained in:
commit
e57f76c0c0
@ -138,7 +138,9 @@ void MouseEventListener::mousePressEvent(QMouseEvent *me)
|
|||||||
m_buttonDownPos[me->button()] = me->pos();
|
m_buttonDownPos[me->button()] = me->pos();
|
||||||
|
|
||||||
KDeclarativeMouseEvent dme(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
KDeclarativeMouseEvent dme(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
||||||
m_pressAndHoldEvent = new KDeclarativeMouseEvent(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
if (!m_pressAndHoldEvent) {
|
||||||
|
m_pressAndHoldEvent = new KDeclarativeMouseEvent(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
||||||
|
}
|
||||||
emit pressed(&dme);
|
emit pressed(&dme);
|
||||||
m_pressed = true;
|
m_pressed = true;
|
||||||
|
|
||||||
@ -187,7 +189,9 @@ void MouseEventListener::handlePressAndHold()
|
|||||||
{
|
{
|
||||||
if (m_pressed) {
|
if (m_pressed) {
|
||||||
emit pressAndHold(m_pressAndHoldEvent);
|
emit pressAndHold(m_pressAndHoldEvent);
|
||||||
//delete m_pressAndHoldEvent;
|
|
||||||
|
delete m_pressAndHoldEvent;
|
||||||
|
m_pressAndHoldEvent = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +222,9 @@ bool MouseEventListener::childMouseEventFilter(QQuickItem *item, QEvent *event)
|
|||||||
//the parent will receive events in its own coordinates
|
//the parent will receive events in its own coordinates
|
||||||
const QPointF myPos = item->mapToItem(this, me->pos());
|
const QPointF myPos = item->mapToItem(this, me->pos());
|
||||||
KDeclarativeMouseEvent dme(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
KDeclarativeMouseEvent dme(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
||||||
m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
if (!m_pressAndHoldEvent) {
|
||||||
|
m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
||||||
|
}
|
||||||
//qDebug() << "pressed in sceneEventFilter";
|
//qDebug() << "pressed in sceneEventFilter";
|
||||||
m_buttonDownPos[me->button()] = me->pos();
|
m_buttonDownPos[me->button()] = me->pos();
|
||||||
emit pressed(&dme);
|
emit pressed(&dme);
|
||||||
@ -243,7 +249,6 @@ bool MouseEventListener::childMouseEventFilter(QQuickItem *item, QEvent *event)
|
|||||||
|
|
||||||
KDeclarativeMouseEvent dme(myPos.x(), myPos.y(), screenPos.x(), screenPos.y(), Qt::NoButton, Qt::NoButton, he->modifiers(), 0);
|
KDeclarativeMouseEvent dme(myPos.x(), myPos.y(), screenPos.x(), screenPos.y(), Qt::NoButton, Qt::NoButton, he->modifiers(), 0);
|
||||||
//qDebug() << "positionChanged..." << dme.x() << dme.y();
|
//qDebug() << "positionChanged..." << dme.x() << dme.y();
|
||||||
m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(), myPos.y(), screenPos.x(), screenPos.y(), Qt::NoButton, Qt::NoButton, he->modifiers(),0);
|
|
||||||
emit positionChanged(&dme);
|
emit positionChanged(&dme);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -257,7 +262,13 @@ bool MouseEventListener::childMouseEventFilter(QQuickItem *item, QEvent *event)
|
|||||||
const QPointF myPos = item->mapToItem(this, me->pos());
|
const QPointF myPos = item->mapToItem(this, me->pos());
|
||||||
KDeclarativeMouseEvent dme(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
KDeclarativeMouseEvent dme(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
||||||
//qDebug() << "positionChanged..." << dme.x() << dme.y();
|
//qDebug() << "positionChanged..." << dme.x() << dme.y();
|
||||||
m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
|
||||||
|
//if the mouse moves and we are waiting to emit a press and hold event, update the co-ordinates
|
||||||
|
//as there is no update function, delete the old event and create a new one
|
||||||
|
if (m_pressAndHoldEvent) {
|
||||||
|
delete m_pressAndHoldEvent;
|
||||||
|
m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(), myPos.y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos()));
|
||||||
|
}
|
||||||
emit positionChanged(&dme);
|
emit positionChanged(&dme);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,15 @@
|
|||||||
|
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This item spies on mouse events from all child objects including child MouseAreas regardless
|
||||||
|
* of whether the child MouseArea propegates events. It does not accept the event.
|
||||||
|
*
|
||||||
|
* In addition unlike MouseArea events include the mouse position in global co-ordinates and provides
|
||||||
|
* the sceen the mouse is in.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
class KDeclarativeMouseEvent : public QObject
|
class KDeclarativeMouseEvent : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
import org.kde.qtextracomponents 2.0
|
||||||
|
import QtQuick 2.1
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
|
|
||||||
|
Item
|
||||||
|
{
|
||||||
|
width: 800
|
||||||
|
height: 400
|
||||||
|
Row {
|
||||||
|
anchors.fill: parent
|
||||||
|
MouseEventListener {
|
||||||
|
width: 400
|
||||||
|
height: 400
|
||||||
|
id: mouseListener
|
||||||
|
acceptedButtons: Qt.LeftButton
|
||||||
|
hoverEnabled: true
|
||||||
|
onPressed: {
|
||||||
|
updateDebug("Pressed", mouse);
|
||||||
|
}
|
||||||
|
onPressAndHold: {
|
||||||
|
updateDebug("Held", mouse);
|
||||||
|
}
|
||||||
|
onReleased: {
|
||||||
|
mouseState.text = "";
|
||||||
|
mousePos.text = "";
|
||||||
|
screenPos.text = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateDebug(state, mouse) {
|
||||||
|
mouseState.text = state
|
||||||
|
mousePos.text = mouse.x + "," + mouse.y
|
||||||
|
screenPos.text = mouse.screenX + "," + mouse.screenY
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
color: "red"
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
//MouseEventListener should still get events, even though this has a mousearea
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GridLayout {
|
||||||
|
width: 400
|
||||||
|
columns: 2
|
||||||
|
Text {
|
||||||
|
text: "Mouse status:"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: mouseState
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Contains Mouse: "
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: mouseListener.containsMouse
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Mouse Position: "
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: mousePos
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Screen Position: "
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: screenPos
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user