bool MInverseMouseArea::eventFilter(QObject *obj, QEvent *ev) { Q_UNUSED(obj); if (!m_enabled || !isVisible()) return false; switch (ev->type()) { case QEvent::GraphicsSceneMousePress: { QGraphicsSceneMouseEvent *me = static_cast<QGraphicsSceneMouseEvent *>(ev); QPointF mappedPos = mapToRootItem(me->scenePos()); m_pressed = !contains(mapFromScene(me->scenePos())) && !isClickedOnSoftwareInputPanel(me); if (m_pressed) emit pressedOutside(mappedPos.x(), mappedPos.y()); break; } case QEvent::GraphicsSceneMouseMove: { if (m_pressed) { QGraphicsSceneMouseEvent *me = static_cast<QGraphicsSceneMouseEvent *>(ev); const QPointF &dist = me->scenePos() - me->buttonDownScenePos(Qt::LeftButton); if (dist.x() * dist.x() + dist.y() * dist.y() > FlickThresholdSquare) m_pressed = false; } break; } case QEvent::GraphicsSceneMouseRelease: { QGraphicsSceneMouseEvent *me = static_cast<QGraphicsSceneMouseEvent *>(ev); QPointF mappedPos = mapToRootItem(me->scenePos()); if (m_pressed) { m_pressed = false; emit clickedOutside(mappedPos.x(), mappedPos.y()); } break; } default: break; } return false; }
dmz::V8Value dmz::JsModuleUiV8QtBasic::_gscene_mouse_event_button_down_scene_pos (const v8::Arguments &Args) { v8::HandleScope scope; V8Value result = v8::Undefined (); JsModuleUiV8QtBasic *self = _to_self (Args); if (self) { QGraphicsSceneMouseEvent *event = (QGraphicsSceneMouseEvent *)self->_to_qevent (Args.This ()); if (event) { if (Args.Length ()) { Qt::MouseButton button = (Qt::MouseButton) v8_to_uint32 (Args[0]); result = qpointf_to_v8 (event->buttonDownScenePos (button)); } } } return scope.Close (result); }
bool CMindMapEventHandler::onEvent(CDiagramPrivateData *p, QEvent *evt) { bool r = false; CDiagram *d = NULL; CDiagramItem *item = NULL; CMindMapNode *node = NULL; QList<CDiagramItem*> items; if ( !p || !p->m_d || p->m_d->mode() == CDiagram::EditTextMode ) return r; d = p->m_d; m_pdata = p; switch(evt->type()) { case QEvent::GraphicsSceneDragEnter: r = dragEnterEvent(static_cast<QGraphicsSceneDragDropEvent*>(evt)); break; case QEvent::GraphicsSceneDragMove: r = dragMoveEvent(static_cast<QGraphicsSceneDragDropEvent*>(evt)); break; case QEvent::GraphicsSceneDrop: r = dropEvent(static_cast<QGraphicsSceneDragDropEvent*>(evt)); break; case QEvent::GraphicsSceneMousePress: if (m_draggedImage->scene() == d) d->removeItem(m_draggedImage); m_pdata->m_customPressedItem = NULL; m_target = NULL; break; case QEvent::GraphicsSceneMouseMove: { QGraphicsSceneMouseEvent *event = NULL; QPointF endPos; QPointF startPos; QDrag *drag = NULL; QMimeData *mime = NULL; QByteArray mimeData; QDataStream dataStream(&mimeData, QIODevice::WriteOnly); event = static_cast<QGraphicsSceneMouseEvent*>(evt); if (event && d->mode() == CDiagram::CursorMode) { if (event->buttons() & Qt::LeftButton ) { endPos = event->scenePos(); startPos = event->buttonDownScenePos(Qt::LeftButton); if (!m_pdata->m_customPressedItem) { items = d->selectedTopLevelItems(); if (items.length() == 1) { node = dynamic_cast<CMindMapNode*>(items.first()); if (node && node->isMovable() && node->mapToScene( node->boundingRect() ).containsPoint(event->scenePos(), Qt::WindingFill ) ) { m_pdata->m_customPressedItem = node; } else if (node && node->isRoot()) { r = true; } } else { foreach (item, items) { node = dynamic_cast<CMindMapNode*>(item); if (node && node->isRoot()) { r = true; break; } } } } // check whether we should start the moving action // using manhattanLength. if (m_pdata->m_customPressedItem && m_draggedImage->scene() != d && ((startPos, endPos).manhattanLength() > QApplication::startDragDistance() ) ) { ((CMindMapDragImage*)m_draggedImage)->updateDraggedItemsRect(d, m_pdata->m_customPressedItem); m_pdata->m_d->addItem(m_draggedImage); m_draggedImage->setVisible(true); m_draggedImageInitPos = m_draggedImage->pos(); dataStream << event->buttonDownScenePos(Qt::LeftButton); mime = new QMimeData(); mime->setData(DND_DRAGMINDMAPNODE, mimeData); drag = new QDrag( d->getMainView() ); drag->setMimeData(mime); if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::MoveAction) == Qt::MoveAction) { // Should do something here. } event->accept(); r = true; } } }