qstmgesturelib/qstmuievent.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
parent 3 0954f5dd2cd0
permissions -rw-r--r--
201041

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 2.1 of the License.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, 
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
*
* Description:
*
*/
#include <QtCore>
#include "qstmfilelogger.h"
#include "qstmstatemachine.h" // for qstmUiEventEngine::Distance(dx,dy)
#include "qstmuievent.h"
#include "qstmutils.h"

using namespace qstmUiEventEngine ;

static const char* const eventNames[] = {  // for debugging purposes define the names of the UI events
        "noEvent",
        "ETouch",
        "EHold",
        "EMove",
        "ERelease",
        "ENull"
} ;

const char* qstmUiEventEngine::event_name(qstmUiEventEngine::QStm_UiEventCode code)
{
    return eventNames[code];
}

QStm_UiEvent::QStm_UiEvent(
    QStm_UiEventCode code,
    const QPoint& start, const QPoint& xy, const QPoint& previousXY,
    bool timerExpired, void* target, long interval,
    int index, QTime timestamp, unsigned int modifiers) :
    m_code(code), m_start(start), m_XY(xy), m_previousXY(previousXY),
    m_statetransition(interval), m_target(target), m_timerExpired(timerExpired),
    m_index(index), m_previousEvent(NULL), m_timestamp(timestamp), m_modifiers(modifiers)
{
}



QStm_UiEvent::~QStm_UiEvent()
{
    delete m_previousEvent ;
    m_previousEvent = NULL ;
}

const QPoint& QStm_UiEvent::startPos() const
{
    return m_start ;
}

const QPoint& QStm_UiEvent::currentXY() const
{
    return m_XY ;
}

QStm_UiEventCode QStm_UiEvent::code()const
{
    return m_code ;
}

const QPoint& QStm_UiEvent::previousXY() const
{
    return m_previousXY ;
}

long QStm_UiEvent::stateTransition() const
{
    return m_statetransition ;
}

bool QStm_UiEvent::timerExpired() const
{
    return m_timerExpired ;
}

void* QStm_UiEvent::target() const
{
    return m_target ;
}

int QStm_UiEvent::index() const
{
    return m_index ;
}

void QStm_UiEvent::setPrevious(QStm_UiEvent* event)
{
    m_previousEvent = event ;
}

QStm_UiEventIf* QStm_UiEvent::previousEvent() const
{
    return m_previousEvent ;
}

int QStm_UiEvent::countOfEvents() const
{
    int count = 1 ;
    for(QStm_UiEvent* prev = m_previousEvent; prev; prev = prev->m_previousEvent)
        {
        ++count;
        }
    return count ;
}

QTime QStm_UiEvent::timestamp() const
{
    return m_timestamp ;
}

float QStm_UiEvent::speed() const /*__SOFTFP */
{
    int dist = QStm_Utils::distance(m_previousXY, m_XY);
    // now calculate speed
    int elapsed = m_statetransition ; // use ms as time unit
    float speed = float(dist)/(elapsed ? elapsed : 1) ;
    return speed ;
}

QPointF QStm_UiEvent::speedVec() const
{
    QPointF diff(m_XY - m_previousXY);
    
    diff = diff / (m_statetransition ? m_statetransition : 1) ;
    
    return diff;
}


void QStm_UiEvent::logSpeed() const
{
    int dist = QStm_Utils::distance(m_previousXY, m_XY);
    // now calculate speed
    int elapsed = m_statetransition ; // use ms as time unit
    double speed = double(dist)/(elapsed ? elapsed : 1) ;

    LOGARG("event: %s: (%d,%d), prev: (%d,%d), time %d dist %d speed %f", event_name(code()), m_XY.x(), m_XY.y(),
            m_previousXY.x(), m_previousXY.y(), elapsed, dist, speed);
}



QEvent::Type  QStm_UiEvent::mapToMouseEventType()
{
    QEvent::Type type = QEvent::None;
    switch (m_code) {
        case ETouch:
        //case EHold:
        {
            type = QEvent::MouseButtonPress;
            break;
        }
        case EMove:
        {
            type = QEvent::MouseMove;
            break;
        }
        case ERelease:
        {
            type = QEvent::MouseButtonRelease;
            break;
        }
    }
    return type;
}

QEvent::Type  QStm_UiEvent::mapToTouchEventType()
{
    QEvent::Type type = QEvent::None;
    switch (m_code) {
        case ETouch:
        case EHold:    
        {
            type = QEvent::TouchBegin;
            break;
        }
        case EMove:
        {
            type = QEvent::TouchUpdate;
            break;
        }
        case ERelease:
        {
            type = QEvent::TouchEnd;
            break;
        }
    }
    return type;
}