Example #1
0
bool OffscreenSurface::eventFilter(QObject* originalDestination, QEvent* event) {
    if (!filterEnabled(originalDestination, event)) {
        return false;
    }
#ifdef DEBUG
    // Don't intercept our own events, or we enter an infinite recursion
    {
        auto rootItem = _sharedObject->getRootItem();
        auto quickWindow = _sharedObject->getWindow();
        QObject* recurseTest = originalDestination;
        while (recurseTest) {
            Q_ASSERT(recurseTest != rootItem && recurseTest != quickWindow);
            recurseTest = recurseTest->parent();
        }
    }
#endif

    switch (event->type()) {
        case QEvent::KeyPress:
        case QEvent::KeyRelease: {
            event->ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), event)) {
                return event->isAccepted();
            }
            break;
        }

        case QEvent::Wheel: {
            QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event);
            QPointF transformedPos = mapToVirtualScreen(wheelEvent->pos());
            QWheelEvent mappedEvent(transformedPos, wheelEvent->delta(), wheelEvent->buttons(), wheelEvent->modifiers(),
                                    wheelEvent->orientation());
            mappedEvent.ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &mappedEvent)) {
                return mappedEvent.isAccepted();
            }
            break;
        }
        case QEvent::MouseMove: {
            QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
            QPointF transformedPos = mapToVirtualScreen(mouseEvent->localPos());
            QMouseEvent mappedEvent(mouseEvent->type(), transformedPos, mouseEvent->screenPos(), mouseEvent->button(),
                                    mouseEvent->buttons(), mouseEvent->modifiers());
            if (event->type() == QEvent::MouseMove) {
                // TODO - this line necessary for the QML Tooltop to work (which is not currently being used), but it causes interface to crash on launch on a fresh install
                // need to investigate into why this crash is happening.
                //_qmlContext->setContextProperty("lastMousePosition", transformedPos);
            }
            mappedEvent.ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &mappedEvent)) {
                return mappedEvent.isAccepted();
            }
            break;
        }
        default:
            break;
    }

    return false;
}
Example #2
0
bool DataWindow::eventFilter(QObject *object, QEvent *event)
{    
    //Detect double mouse clicks and move data marker to current mouse position
    if (object == ui->m_tableView_rawTableView->viewport() && event->type() == QEvent::MouseButtonDblClick) {
        QMouseEvent* mouseEventCast = static_cast<QMouseEvent*>(event);
        if(mouseEventCast->button() == Qt::LeftButton) {
            m_pDataMarker->move(mouseEventCast->localPos().x() + ui->m_tableView_rawTableView->verticalHeader()->width() + ui->m_tableView_rawTableView->x(), m_pDataMarker->y());

            //Deselect channel which was selected through the double click -> dirty hack
            //ui->m_tableView_rawTableView->selectionModel()->select(ui->m_tableView_rawTableView->selectionModel()->currentIndex(), QItemSelectionModel::Deselect);
        }
    }

    //Deactivate grabbing gesture when scrollbars or vertical header are selected
    if ((object == ui->m_tableView_rawTableView->horizontalScrollBar() ||
         object == ui->m_tableView_rawTableView->verticalScrollBar() ||
         object == ui->m_tableView_rawTableView->verticalHeader())
        && event->type() == QEvent::Enter) {
        QScroller::ungrabGesture(ui->m_tableView_rawTableView);
        return true;
    }

    //Activate grabbing gesture when scrollbars or vertical header are deselected
    if ((object == ui->m_tableView_rawTableView->horizontalScrollBar() ||
         object == ui->m_tableView_rawTableView->verticalScrollBar() ||
         object == ui->m_tableView_rawTableView->verticalHeader())
        && event->type() == QEvent::Leave) {
        QScroller::grabGesture(ui->m_tableView_rawTableView, QScroller::LeftMouseButtonGesture);
        return true;
    }

    //Look for swipe gesture in order to scale the channels
    if (object == ui->m_tableView_rawTableView && event->type() == QEvent::Gesture) {
        QGestureEvent* gestureEventCast = static_cast<QGestureEvent*>(event);
        return gestureEvent(static_cast<QGestureEvent*>(gestureEventCast));
    }

    return false;
}
Example #3
0
bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
{
    if (obj != m_window)
        return false;

    QWaylandInputDevice *input = defaultInputDevice();

    switch (event->type()) {
    case QEvent::Expose:
        m_renderScheduler.start(0);
        if (m_window->isExposed()) {
            // Alt-tabbing away normally results in the alt remaining in
            // pressed state in the clients xkb state. Prevent this by sending
            // a release. This is not an issue in a "real" compositor but
            // is very annoying when running in a regular window on xcb.
            Qt::KeyboardModifiers mods = QGuiApplication::queryKeyboardModifiers();
            if (m_modifiers != mods && input->keyboardFocus()) {
                Qt::KeyboardModifiers stuckMods = m_modifiers ^ mods;
                if (stuckMods & Qt::AltModifier)
                    input->sendKeyReleaseEvent(64); // native scancode for left alt
                m_modifiers = mods;
            }
        }
        break;
    case QEvent::MouseButtonPress: {
        QPointF local;
        QMouseEvent *me = static_cast<QMouseEvent *>(event);
        QWaylandSurface *targetSurface = surfaceAt(me->localPos(), &local);
        if (m_dragKeyIsPressed && targetSurface) {
            m_draggingWindow = targetSurface;
            m_drag_diff = local;
        } else {
            if (targetSurface && input->keyboardFocus() != targetSurface) {
                input->setKeyboardFocus(targetSurface);
                m_surfaces.removeOne(targetSurface);
                m_surfaces.append(targetSurface);
                m_renderScheduler.start(0);
            }
            input->sendMousePressEvent(me->button(), local, me->localPos());
        }
        return true;
    }
    case QEvent::MouseButtonRelease: {
        QWaylandSurface *targetSurface = input->mouseFocus();
        if (m_draggingWindow) {
            m_draggingWindow = 0;
            m_drag_diff = QPointF();
        } else {
            QMouseEvent *me = static_cast<QMouseEvent *>(event);
            QPointF localPos;
            if (targetSurface)
                localPos = toSurface(targetSurface, me->localPos());
            input->sendMouseReleaseEvent(me->button(), localPos, me->localPos());
        }
        return true;
    }
    case QEvent::MouseMove: {
        QMouseEvent *me = static_cast<QMouseEvent *>(event);
        if (m_draggingWindow) {
            m_draggingWindow->setPos(me->localPos() - m_drag_diff);
            m_renderScheduler.start(0);
        } else {
            QPointF local;
            QWaylandSurface *targetSurface = surfaceAt(me->localPos(), &local);
            input->sendMouseMoveEvent(targetSurface, local, me->localPos());
        }
        break;
    }
    case QEvent::Wheel: {
        QWheelEvent *we = static_cast<QWheelEvent *>(event);
        input->sendMouseWheelEvent(we->orientation(), we->delta());
        break;
    }
    case QEvent::KeyPress: {
        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
        if (ke->key() == Qt::Key_Meta || ke->key() == Qt::Key_Super_L) {
            m_dragKeyIsPressed = true;
        }
        m_modifiers = ke->modifiers();
        QWaylandSurface *targetSurface = input->keyboardFocus();
        if (targetSurface)
            input->sendKeyPressEvent(ke->nativeScanCode());
        break;
    }
    case QEvent::KeyRelease: {
        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
        if (ke->key() == Qt::Key_Meta || ke->key() == Qt::Key_Super_L) {
            m_dragKeyIsPressed = false;
        }
        m_modifiers = ke->modifiers();
        QWaylandSurface *targetSurface = input->keyboardFocus();
        if (targetSurface)
            input->sendKeyReleaseEvent(ke->nativeScanCode());
        break;
    }
    case QEvent::TouchBegin:
    case QEvent::TouchUpdate:
    case QEvent::TouchEnd:
    {
        QWaylandSurface *targetSurface = 0;
        QTouchEvent *te = static_cast<QTouchEvent *>(event);
        QList<QTouchEvent::TouchPoint> points = te->touchPoints();
        QPoint pointPos;
        if (!points.isEmpty()) {
            pointPos = points.at(0).pos().toPoint();
            targetSurface = surfaceAt(pointPos);
        }
        if (targetSurface && targetSurface != input->mouseFocus())
            input->setMouseFocus(targetSurface, pointPos, pointPos);
        if (input->mouseFocus())
            input->sendFullTouchEvent(te);
        break;
    }
    default:
        break;
    }
    return false;
}
Example #4
0
void QQuickMultiPointTouchArea::updateTouchData(QEvent *event)
{
    bool ended = false;
    bool moved = false;
    bool started = false;
    bool isMouseEvent = false;

    clearTouchLists();
    QList<QTouchEvent::TouchPoint> touchPoints;

    switch (event->type()) {
    case QEvent::TouchBegin:
    case QEvent::TouchUpdate:
    case QEvent::TouchEnd:
        touchPoints = static_cast<QTouchEvent*>(event)->touchPoints();
        break;
    case QEvent::MouseButtonPress:
    case QEvent::MouseMove:
    case QEvent::MouseButtonRelease: {
        QMouseEvent *me = static_cast<QMouseEvent*>(event);
        _mouseQpaTouchPoint.setPos(me->localPos());
        _mouseQpaTouchPoint.setScenePos(me->windowPos());
        _mouseQpaTouchPoint.setScreenPos(me->screenPos());
        if (event->type() == QEvent::MouseMove)
            _mouseQpaTouchPoint.setState(Qt::TouchPointMoved);
        else if (event->type() == QEvent::MouseButtonRelease)
            _mouseQpaTouchPoint.setState(Qt::TouchPointReleased);
        else { // QEvent::MouseButtonPress
            addTouchPoint(me);
            started = true;
            _mouseQpaTouchPoint.setState(Qt::TouchPointPressed);
        }
        touchPoints << _mouseQpaTouchPoint;
        isMouseEvent = true;
        break;
    }
    default:
        qWarning("updateTouchData: unhandled event type %d", event->type());
        break;
    }

    if (!isMouseEvent && _mouseTouchPoint) {
        QQuickWindow *c = window();
        if (c && c->mouseGrabberItem() == this)
            touchPoints << _mouseQpaTouchPoint;
    }
    int numTouchPoints = touchPoints.count();
    //always remove released touches, and make sure we handle all releases before adds.
    for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) {
        Qt::TouchPointState touchPointState = p.state();
        int id = p.id();
        if (touchPointState & Qt::TouchPointReleased) {
            QQuickTouchPoint* dtp = static_cast<QQuickTouchPoint*>(_touchPoints.value(id));
            if (!dtp)
                continue;
            updateTouchPoint(dtp, &p);
            dtp->setPressed(false);
            _releasedTouchPoints.append(dtp);
            _touchPoints.remove(id);
            ended = true;
        }
    }
    if (numTouchPoints >= _minimumTouchPoints && numTouchPoints <= _maximumTouchPoints) {
        for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) {
            Qt::TouchPointState touchPointState = p.state();
            int id = p.id();
            if (touchPointState & Qt::TouchPointReleased) {
                //handled above
            } else if (!_touchPoints.contains(id)) { //could be pressed, moved, or stationary
                // (we may have just obtained enough points to start tracking them -- in that case moved or stationary count as newly pressed)
                addTouchPoint(&p);
                started = true;
            } else if (touchPointState & Qt::TouchPointMoved) {
                QQuickTouchPoint* dtp = static_cast<QQuickTouchPoint*>(_touchPoints.value(id));
                Q_ASSERT(dtp);
                _movedTouchPoints.append(dtp);
                updateTouchPoint(dtp,&p);
                moved = true;
            } else {
                QQuickTouchPoint* dtp = static_cast<QQuickTouchPoint*>(_touchPoints.value(id));
                Q_ASSERT(dtp);
                updateTouchPoint(dtp,&p);
            }
        }

        //see if we should be grabbing the gesture
        if (!_stealMouse /* !ignoring gesture*/) {
            bool offerGrab = false;
            const int dragThreshold = QGuiApplication::styleHints()->startDragDistance();
            for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) {
                if (p.state() == Qt::TouchPointReleased)
                    continue;
                const QPointF &currentPos = p.scenePos();
                const QPointF &startPos = p.startScenePos();
                if (qAbs(currentPos.x() - startPos.x()) > dragThreshold)
                    offerGrab = true;
                else if (qAbs(currentPos.y() - startPos.y()) > dragThreshold)
                    offerGrab = true;
                if (offerGrab)
                    break;
            }

            if (offerGrab) {
                QQuickGrabGestureEvent event;
                event._touchPoints = _touchPoints.values();
                emit gestureStarted(&event);
                if (event.wantsGrab())
                    grabGesture();
            }
        }

        if (ended)
            emit released(_releasedTouchPoints);
        if (moved)
            emit updated(_movedTouchPoints);
        if (started)
            emit pressed(_pressedTouchPoints);
        if (ended || moved || started) emit touchUpdated(_touchPoints.values());
    }
}
Example #5
0
bool OffscreenSurface::eventFilter(QObject* originalDestination, QEvent* event) {
    if (!filterEnabled(originalDestination, event)) {
        return false;
    }
#ifdef DEBUG
    // Don't intercept our own events, or we enter an infinite recursion
    {
        auto rootItem = _sharedObject->getRootItem();
        auto quickWindow = _sharedObject->getWindow();
        QObject* recurseTest = originalDestination;
        while (recurseTest) {
            Q_ASSERT(recurseTest != rootItem && recurseTest != quickWindow);
            recurseTest = recurseTest->parent();
        }
    }
#endif

    switch (event->type()) {
        case QEvent::KeyPress:
        case QEvent::KeyRelease: {
            event->ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), event)) {
                return event->isAccepted();
            }
            break;
        }

        case QEvent::Wheel: {
            QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event);
            QPointF transformedPos = mapToVirtualScreen(wheelEvent->pos());
            QWheelEvent mappedEvent(transformedPos, wheelEvent->delta(), wheelEvent->buttons(), wheelEvent->modifiers(),
                                    wheelEvent->orientation());
            mappedEvent.ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &mappedEvent)) {
                return mappedEvent.isAccepted();
            }
            break;
        }
        case QEvent::MouseMove: {
            QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
            QPointF transformedPos = mapToVirtualScreen(mouseEvent->localPos());
            QMouseEvent mappedEvent(mouseEvent->type(), transformedPos, mouseEvent->screenPos(), mouseEvent->button(),
                                    mouseEvent->buttons(), mouseEvent->modifiers());
            mappedEvent.ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &mappedEvent)) {
                return mappedEvent.isAccepted();
            }
            break;
        }

#if defined(Q_OS_ANDROID)
        case QEvent::TouchBegin:
        case QEvent::TouchUpdate:
        case QEvent::TouchEnd: {
            QTouchEvent *originalEvent = static_cast<QTouchEvent *>(event);
            QEvent::Type fakeMouseEventType = QEvent::None;
            Qt::MouseButton fakeMouseButton = Qt::LeftButton;
            Qt::MouseButtons fakeMouseButtons = Qt::NoButton;
            switch (event->type()) {
                case QEvent::TouchBegin:
                    fakeMouseEventType = QEvent::MouseButtonPress;
                    fakeMouseButtons = Qt::LeftButton;
                    break;
                case QEvent::TouchUpdate:
                    fakeMouseEventType = QEvent::MouseMove;
                    fakeMouseButtons = Qt::LeftButton;
                    break;
                case QEvent::TouchEnd:
                    fakeMouseEventType = QEvent::MouseButtonRelease;
                    fakeMouseButtons = Qt::NoButton;
                    break;
            }
            // Same case as OffscreenUi.cpp::eventFilter: touch events are always being accepted so we now use mouse events and consider one touch, touchPoints()[0].
            QMouseEvent fakeMouseEvent(fakeMouseEventType, originalEvent->touchPoints()[0].pos(), fakeMouseButton, fakeMouseButtons, Qt::NoModifier);
            fakeMouseEvent.ignore();
            if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &fakeMouseEvent)) {
                /*qInfo() << __FUNCTION__ << "sent fake touch event:" << fakeMouseEvent.type()
                        << "_quickWindow handled it... accepted:" << fakeMouseEvent.isAccepted();*/
                return fakeMouseEvent.isAccepted();
            }
            break;
        }
        case QEvent::InputMethod:
        case QEvent::InputMethodQuery: {
            auto window = getWindow();
            if (window && window->activeFocusItem()) {
                event->ignore();
                if (QCoreApplication::sendEvent(window->activeFocusItem(), event)) {
                    bool eventAccepted = event->isAccepted();
                    if (event->type() == QEvent::InputMethodQuery) {
                        QInputMethodQueryEvent *imqEvent = static_cast<QInputMethodQueryEvent *>(event);
                        // this block disables the selection cursor in android which appears in
                        // the top-left corner of the screen
                        if (imqEvent->queries() & Qt::ImEnabled) {
                            imqEvent->setValue(Qt::ImEnabled, QVariant(false));
                        }
                    }
                    return eventAccepted;
                }
                return false;
            }
            break;
        }
#endif
        default:
            break;
    }

    return false;
}
QGestureRecognizer::Result SingleClickGestureRecognizer::recognize (QGesture* gesture, QObject* watched, QEvent* event)
{
    //g_message("%s", __PRETTY_FUNCTION__);
    QGestureRecognizer::Result result = QGestureRecognizer::Ignore;

    SingleClickGesture* singleClickGesture = static_cast<SingleClickGesture*>(gesture);

    static int s_tapRadius = -1;
    if (G_UNLIKELY(s_tapRadius < 0))
		s_tapRadius = Settings::LunaSettings()->tapRadius;

	static uint32_t s_lastDblClickTime = 0;

    if (watched == singleClickGesture && event->type() == QEvent::Timer) {
	singleClickGesture->stopSingleClickTimer();
	if (singleClickGesture->state() != Qt::GestureCanceled
		&& singleClickGesture->state() != Qt::GestureFinished)
	{
	    if (!singleClickGesture->m_mouseDown) {
		result = QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint;
	    }
	    else  {
		result |= QGestureRecognizer::ConsumeEventHint;
		singleClickGesture->m_triggerSingleClickOnRelease = true;
	    }
	    // if finger down at the same location for longer than the timer, 
	    // the single tap has to be triggered after the release
	}
	return result;
    }

    switch (event->type()) {
	case QEvent::TouchBegin:
	case QEvent::TouchUpdate:
	case QEvent::TouchEnd:
	    {
		if (singleClickGesture->state() == Qt::GestureStarted
			|| singleClickGesture->state() == Qt::GestureUpdated)
		{
		    QTouchEvent* touchEvent = static_cast<const QTouchEvent *>(event);
		    // this starts the gesture, so dont check existing state
		    if (touchEvent->touchPoints().size() > 1) {
			singleClickGesture->m_triggerSingleClickOnRelease = false;
			singleClickGesture->stopSingleClickTimer();
			result = QGestureRecognizer::CancelGesture;
		    }
		}
		break;
	    }

	case QEvent::MouseButtonPress:
	    {
		QMouseEvent* mouseEvent = static_cast<const QMouseEvent *>(event);
		singleClickGesture->stopSingleClickTimer();
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
        singleClickGesture->m_penDownPos = mouseEvent->posF();
#else
        singleClickGesture->m_penDownPos = mouseEvent->localPos();
#endif
        singleClickGesture->setHotSpot (mouseEvent->globalPos());
		singleClickGesture->m_mouseDown = true;
		singleClickGesture->m_triggerSingleClickOnRelease = false;
		singleClickGesture->m_modifiers = mouseEvent->modifiers();
		result = QGestureRecognizer::TriggerGesture;
		singleClickGesture->startSingleClickTimer();
		break;
	    }

	case QEvent::MouseMove:
	    if (singleClickGesture->state() == Qt::GestureStarted
		    || singleClickGesture->state() == Qt::GestureUpdated)
	    {
		QMouseEvent* mouseEvent = static_cast<const QMouseEvent *>(event);
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
		int moveDistance = (int) qAbs(QLineF (mouseEvent->posF(), singleClickGesture->m_penDownPos).length());
#else
        int moveDistance = (int) qAbs(QLineF (mouseEvent->localPos(), singleClickGesture->m_penDownPos).length());
#endif
		if (moveDistance > s_tapRadius)
		{
		    // move is outside tap radius or multiple fingers are down, so this is not a tap
		    singleClickGesture->stopSingleClickTimer();
		    singleClickGesture->m_triggerSingleClickOnRelease = false;
		    result = QGestureRecognizer::CancelGesture;
		}
	    }
	    break;

	case QEvent::MouseButtonRelease:
	    if (singleClickGesture->state() == Qt::GestureStarted
		    || singleClickGesture->state() == Qt::GestureUpdated) {
		    singleClickGesture->m_mouseDown = false;
		    if (singleClickGesture->m_triggerSingleClickOnRelease)  {
			result = QGestureRecognizer::FinishGesture;
			singleClickGesture->m_triggerSingleClickOnRelease = false;
		    }
	    }

            if(G_UNLIKELY(g_logSingleClick)){
                g_message("SYSMGR PERF: Single Click Occurred time:%d", Time::curTimeMs());
            }

	    break;

	case QEvent::MouseButtonDblClick:
	    if (singleClickGesture->state() == Qt::GestureStarted
		    || singleClickGesture->state() == Qt::GestureUpdated)
	    {
		singleClickGesture->stopSingleClickTimer();
		singleClickGesture->m_triggerSingleClickOnRelease = false;
		result = QGestureRecognizer::CancelGesture;
	    }
	    break;

	default:
	    break;
    }
    return result;
}
Example #7
0
bool MainWindow::eventFilter(QObject *, QEvent *event)
{
    //char presentBirdType = myBirdManager->presentBird->getBirdType();

    if(event->type() == QEvent::MouseButtonPress && startPress == 1)
    {
        char presentBirdType = myBirdManager->presentBird->getBirdType();
        if (mousePress == 0  && presentBirdType == 'r'){
            // active the bird
            myBirdManager->bird_1->getBody()->SetActive(true);
            // ignore gravity
            myBirdManager->bird_1->getBody()->SetGravityScale(0);
            mousePress = 1;
            checkRelease = 0;
        }
        if (mousePress == 0  && presentBirdType == 'b'){
            myBirdManager->bird_2->getBody()->SetActive(true);
            myBirdManager->bird_2->getBody()->SetGravityScale(0);
            mousePress = 1;
            checkRelease = 0;
        }
        if (mousePress == 0  && presentBirdType == 'k'){
            myBirdManager->bird_3->getBody()->SetActive(true);
            myBirdManager->bird_3->getBody()->SetGravityScale(0);
            mousePress = 1;
            checkRelease = 0;
        }
        if (mousePress == 0  && presentBirdType == 'y'){
            myBirdManager->bird_4->getBody()->SetActive(true);
            myBirdManager->bird_4->getBody()->SetGravityScale(0);
            mousePress = 1;
            checkRelease = 0;
        }
    }
    if(event->type() == QEvent::MouseMove && startPress == 1)
    {
        char presentBirdType = myBirdManager->presentBird->getBirdType();
        // Move bird according to bird position
        if (mousePress == 1 && presentBirdType == 'r'){
            QMouseEvent *mouse =  (QMouseEvent*)event;
            // transform global QT cordinate to local b2 cordinate
            float32 moveX = mouse->localPos().x()/15;
            float32 moveY = (mouse->localPos().y()*(-1)+540)/15;
            myBirdManager->bird_1->getBody()->SetTransform(b2Vec2(moveX,moveY),0);
        }
        if (mousePress == 1 && presentBirdType == 'b'){
            QMouseEvent *mouse =  (QMouseEvent*)event;
            float32 moveX = mouse->localPos().x()/15;
            float32 moveY = (mouse->localPos().y()*(-1)+540)/15;
            myBirdManager->bird_2->getBody()->SetTransform(b2Vec2(moveX,moveY),0);
        }
        if (mousePress == 1 && presentBirdType == 'k'){
            QMouseEvent *mouse =  (QMouseEvent*)event;
            float32 moveX = mouse->localPos().x()/15;
            float32 moveY = (mouse->localPos().y()*(-1)+540)/15;
            myBirdManager->bird_3->getBody()->SetTransform(b2Vec2(moveX,moveY),0);
        }
        if (mousePress == 1 && presentBirdType == 'y'){
            QMouseEvent *mouse =  (QMouseEvent*)event;
            float32 moveX = mouse->localPos().x()/15;
            float32 moveY = (mouse->localPos().y()*(-1)+540)/15;
            myBirdManager->bird_4->getBody()->SetTransform(b2Vec2(moveX,moveY),0);
        }
    }
    if(event->type() == QEvent::MouseButtonRelease && startPress == 1)
    {
        char presentBirdType = myBirdManager->presentBird->getBirdType();
        if (checkRelease == 0 && presentBirdType == 'r'){
            // restore the gravity
            myBirdManager->bird_1->getBody()->SetGravityScale(1);
            // get bird pos
            int32 birdPosX = myBirdManager->bird_1->getBody()->GetPosition().x;
            int32 birdPosY = myBirdManager->bird_1->getBody()->GetPosition().y;
            // volicity = k * (slingshot center-pos)
            myBirdManager->bird_1->setLinearVelocity(b2Vec2( (11.76-birdPosX)*3, (12.5-birdPosY)*3) );
            mousePress = 0;
            checkRelease = 1;
            // load next bird
            // 2nd : run bird manager process
            myBirdManager->load(myBirdManager->bird_2);
            birdLeft -= 1;


        }
        if (checkRelease == 0 && presentBirdType == 'b'){
            myBirdManager->bird_2->getBody()->SetGravityScale(1);
            int32 birdPosX = myBirdManager->bird_2->getBody()->GetPosition().x;
            int32 birdPosY = myBirdManager->bird_2->getBody()->GetPosition().y;
            myBirdManager->bird_2->setLinearVelocity(b2Vec2( (11.76-birdPosX)*3, (12.5-birdPosY)*3) );
            mousePress = 0;
            checkRelease = 1;
            // load next bird
            // 3nd : run bird manager process
            myBirdManager->load(myBirdManager->bird_3);
            birdLeft -= 1;

        }
        if (checkRelease == 0 && presentBirdType == 'k'){
            myBirdManager->bird_3->getBody()->SetGravityScale(1);
            int32 birdPosX = myBirdManager->bird_3->getBody()->GetPosition().x;
            int32 birdPosY = myBirdManager->bird_3->getBody()->GetPosition().y;
            myBirdManager->bird_3->setLinearVelocity(b2Vec2( (11.76-birdPosX)*3, (12.5-birdPosY)*3) );
            mousePress = 0;
            checkRelease = 1;
            // load next bird
            // 4nd : run bird manager process
            myBirdManager->load(myBirdManager->bird_4);
            birdLeft -= 1;
        }
        if (checkRelease == 0 && presentBirdType == 'y'){
            myBirdManager->bird_4->getBody()->SetGravityScale(1);
            int32 birdPosX = myBirdManager->bird_4->getBody()->GetPosition().x;
            int32 birdPosY = myBirdManager->bird_4->getBody()->GetPosition().y;
            myBirdManager->bird_4->setLinearVelocity(b2Vec2( (11.76-birdPosX)*3, (12.5-birdPosY)*3) );
            mousePress = 0;
            checkRelease = 1;
            // to execute last bird function sucessfully
            // set the bird type to virtual type 'v'
            myBirdManager->presentBird->setBirdType('v');
            birdLeft -= 1;
            if(pigLeft > 0){
                mySceneManager->buildLossScene();
                this->buildEndButton();
            }
        }
    }
    if(event->type() == QEvent::KeyPress){
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if(keyEvent->key() == Qt::Key_Space) {

            char presentBirdType = myBirdManager->presentBird->getBirdType();
            if(presentBirdType == 'r'){
                // execute bird functionality depend on present bird type
                myBirdManager->bird_1->executeFunc();
            }
            if(presentBirdType == 'b'){
                myBirdManager->bird_1->executeFunc();
            }
            if(presentBirdType == 'k' && spacePress == 0){
                myBirdManager->bird_2->executeFunc();
                spacePress = 1;
            }
            if(presentBirdType == 'y' && spacePress2 == 0){
                myBirdManager->bird_3->executeFunc();
                spacePress2 = 1;
            }
            if(presentBirdType == 'v'){
                myBirdManager->bird_4->executeFunc();
            }

        }
    }
    return false;
}