Skip to content
qwt_picker_machine.cpp 13 KiB
Newer Older
pixhawk's avatar
pixhawk committed
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#include "qwt_picker_machine.h"
Bryant's avatar
Bryant committed
#include "qwt_event_pattern.h"
#include <qevent.h>
pixhawk's avatar
pixhawk committed

//! Constructor
Bryant's avatar
Bryant committed
QwtPickerMachine::QwtPickerMachine( SelectionType type ):
    d_selectionType( type ),
    d_state( 0 )
pixhawk's avatar
pixhawk committed
{
}

//! Destructor
QwtPickerMachine::~QwtPickerMachine()
{
}

Bryant's avatar
Bryant committed
//! Return the selection type
QwtPickerMachine::SelectionType QwtPickerMachine::selectionType() const
{
    return d_selectionType;
}

pixhawk's avatar
pixhawk committed
//! Return the current state
int QwtPickerMachine::state() const
{
    return d_state;
}

//! Change the current state
Bryant's avatar
Bryant committed
void QwtPickerMachine::setState( int state )
pixhawk's avatar
pixhawk committed
{
    d_state = state;
}

//! Set the current state to 0.
void QwtPickerMachine::reset()
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    setState( 0 );
}

//! Constructor
QwtPickerTrackerMachine::QwtPickerTrackerMachine():
    QwtPickerMachine( NoSelection )
{
pixhawk's avatar
pixhawk committed
}

//! Transition
Bryant's avatar
Bryant committed
QList<QwtPickerMachine::Command> QwtPickerTrackerMachine::transition(
    const QwtEventPattern &, const QEvent *e )
Bryant's avatar
Bryant committed
    QList<QwtPickerMachine::Command> cmdList;

    switch ( e->type() )
    {
        case QEvent::Enter:
        case QEvent::MouseMove:
        {
            if ( state() == 0 )
            {
                cmdList += Begin;
                cmdList += Append;
                setState( 1 );
            }
            else
            {
                cmdList += Move;
            }
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::Leave:
        {
            cmdList += Remove;
            cmdList += End;
Bryant's avatar
Bryant committed
            setState( 0 );
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        default:
            break;
pixhawk's avatar
pixhawk committed
    }

    return cmdList;
}

Bryant's avatar
Bryant committed
//! Constructor
QwtPickerClickPointMachine::QwtPickerClickPointMachine():
    QwtPickerMachine( PointSelection )
{
}

pixhawk's avatar
pixhawk committed
//! Transition
Bryant's avatar
Bryant committed
QList<QwtPickerMachine::Command> QwtPickerClickPointMachine::transition(
    const QwtEventPattern &eventPattern, const QEvent *event )
Bryant's avatar
Bryant committed
    QList<QwtPickerMachine::Command> cmdList;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    switch ( event->type() )
    {
        case QEvent::MouseButtonPress:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                cmdList += Begin;
                cmdList += Append;
Bryant's avatar
Bryant committed
                cmdList += End;
pixhawk's avatar
pixhawk committed
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::KeyPress:
        {
            if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, 
                static_cast<const QKeyEvent *> ( event ) ) )
            {
                cmdList += Begin;
                cmdList += Append;
pixhawk's avatar
pixhawk committed
                cmdList += End;
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        default:
            break;
pixhawk's avatar
pixhawk committed
    }

    return cmdList;
}

Bryant's avatar
Bryant committed
//! Constructor
QwtPickerDragPointMachine::QwtPickerDragPointMachine():
    QwtPickerMachine( PointSelection )
{
}

pixhawk's avatar
pixhawk committed
//! Transition
Bryant's avatar
Bryant committed
QList<QwtPickerMachine::Command> QwtPickerDragPointMachine::transition(
    const QwtEventPattern &eventPattern, const QEvent *event )
Bryant's avatar
Bryant committed
    QList<QwtPickerMachine::Command> cmdList;

    switch ( event->type() )
    {
        case QEvent::MouseButtonPress:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    setState( 1 );
                }
Bryant's avatar
Bryant committed
            break;
        }
        case QEvent::MouseMove:
        case QEvent::Wheel:
        {
            if ( state() != 0 )
                cmdList += Move;
            break;
        }
        case QEvent::MouseButtonRelease:
        {
            if ( state() != 0 )
            {
                cmdList += End;
Bryant's avatar
Bryant committed
                setState( 0 );
Bryant's avatar
Bryant committed
            break;
        }
        case QEvent::KeyPress:
        {
            if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, 
                static_cast<const QKeyEvent *>( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    setState( 1 );
                }
                else
                {
                    cmdList += End;
                    setState( 0 );
                }
pixhawk's avatar
pixhawk committed
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        default:
            break;
Bryant's avatar
Bryant committed

    return cmdList;
}

//! Constructor
QwtPickerClickRectMachine::QwtPickerClickRectMachine():
    QwtPickerMachine( RectSelection )
{
}

//! Transition
QList<QwtPickerMachine::Command> QwtPickerClickRectMachine::transition(
    const QwtEventPattern &eventPattern, const QEvent *event )
{
    QList<QwtPickerMachine::Command> cmdList;

    switch ( event->type() )
    {
        case QEvent::MouseButtonPress:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                switch ( state() )
                {
                    case 0:
                    {
                        cmdList += Begin;
                        cmdList += Append;
                        setState( 1 );
                        break;
                    }
                    case 1:
                    {
                        // Uh, strange we missed the MouseButtonRelease
                        break;
                    }
                    default:
                    {
                        cmdList += End;
                        setState( 0 );
                    }
                }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::MouseMove:
        case QEvent::Wheel:
        {
            if ( state() != 0 )
                cmdList += Move;
            break;
        }
        case QEvent::MouseButtonRelease:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                if ( state() == 1 )
                {
pixhawk's avatar
pixhawk committed
                    cmdList += Append;
Bryant's avatar
Bryant committed
                    setState( 2 );
pixhawk's avatar
pixhawk committed
                }
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::KeyPress:
        {
            if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, 
                static_cast<const QKeyEvent *> ( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    setState( 1 );
                }
                else
                {
                    if ( state() == 1 )
                    {
                        cmdList += Append;
                        setState( 2 );
                    }
                    else if ( state() == 2 )
                    {
                        cmdList += End;
                        setState( 0 );
                    }
                }
            }
            break;
        }
        default:
            break;
pixhawk's avatar
pixhawk committed
    }

    return cmdList;
}

Bryant's avatar
Bryant committed
//! Constructor
QwtPickerDragRectMachine::QwtPickerDragRectMachine():
    QwtPickerMachine( RectSelection )
{
}

pixhawk's avatar
pixhawk committed
//! Transition
Bryant's avatar
Bryant committed
QList<QwtPickerMachine::Command> QwtPickerDragRectMachine::transition(
    const QwtEventPattern &eventPattern, const QEvent *event )
Bryant's avatar
Bryant committed
    QList<QwtPickerMachine::Command> cmdList;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    switch ( event->type() )
    {
        case QEvent::MouseButtonPress:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    cmdList += Append;
                    setState( 2 );
                }
pixhawk's avatar
pixhawk committed
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::MouseMove:
        case QEvent::Wheel:
        {
            if ( state() != 0 )
                cmdList += Move;
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::MouseButtonRelease:
        {
            if ( state() == 2 )
            {
pixhawk's avatar
pixhawk committed
                cmdList += End;
Bryant's avatar
Bryant committed
                setState( 0 );
pixhawk's avatar
pixhawk committed
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::KeyPress:
        {
            if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, 
                static_cast<const QKeyEvent *> ( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    cmdList += Append;
                    setState( 2 );
                }
                else
                {
                    cmdList += End;
                    setState( 0 );
                }
            }
            break;
        }
        default:
            break;
pixhawk's avatar
pixhawk committed
    }

    return cmdList;
}

Bryant's avatar
Bryant committed
//! Constructor
QwtPickerPolygonMachine::QwtPickerPolygonMachine():
    QwtPickerMachine( PolygonSelection )
{
}

pixhawk's avatar
pixhawk committed
//! Transition
Bryant's avatar
Bryant committed
QList<QwtPickerMachine::Command> QwtPickerPolygonMachine::transition(
    const QwtEventPattern &eventPattern, const QEvent *event )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    QList<QwtPickerMachine::Command> cmdList;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    switch ( event->type() )
    {
        case QEvent::MouseButtonPress:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    cmdList += Append;
                    setState( 1 );
                }
                else
                {
                    cmdList += Append;
                }
            }
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect2, 
                static_cast<const QMouseEvent *>( event ) ) )
            {
                if ( state() == 1 )
                {
                    cmdList += End;
                    setState( 0 );
                }
pixhawk's avatar
pixhawk committed
            }
Bryant's avatar
Bryant committed
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::MouseMove:
        case QEvent::Wheel:
        {
            if ( state() != 0 )
                cmdList += Move;
            break;
pixhawk's avatar
pixhawk committed
        }
Bryant's avatar
Bryant committed
        case QEvent::KeyPress:
        {
            if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, 
                static_cast<const QKeyEvent *> ( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    cmdList += Append;
                    setState( 1 );
                }
                else
                {
                    cmdList += Append;
                }
            }
            else if ( eventPattern.keyMatch( QwtEventPattern::KeySelect2, 
                static_cast<const QKeyEvent *> ( event ) ) )
            {
                if ( state() == 1 )
                {
                    cmdList += End;
                    setState( 0 );
                }
            }
            break;
        }
        default:
            break;
Bryant's avatar
Bryant committed

    return cmdList;
}

//! Constructor
QwtPickerDragLineMachine::QwtPickerDragLineMachine():
    QwtPickerMachine( PolygonSelection )
{
}

//! Transition
QList<QwtPickerMachine::Command> QwtPickerDragLineMachine::transition(
    const QwtEventPattern &eventPattern, const QEvent *event )
{
    QList<QwtPickerMachine::Command> cmdList;

    switch( event->type() )
    {
        case QEvent::MouseButtonPress:
        {
            if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1,
                static_cast<const QMouseEvent *>( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    cmdList += Append;
                    setState( 1 );
                }
            }
            break;
        }
        case QEvent::KeyPress:
        {
            if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1,
                static_cast<const QKeyEvent *> ( event ) ) )
            {
                if ( state() == 0 )
                {
                    cmdList += Begin;
                    cmdList += Append;
                    cmdList += Append;
                    setState( 1 );
                }
                else
                {
                    cmdList += End;
                    setState( 0 );
                }
            }
            break;
        }
        case QEvent::MouseMove:
        case QEvent::Wheel:
        {
            if ( state() != 0 )
                cmdList += Move;

            break;
        }
        case QEvent::MouseButtonRelease:
        {
            if ( state() != 0 )
            {
                cmdList += End;
Bryant's avatar
Bryant committed
                setState( 0 );
pixhawk's avatar
pixhawk committed
            }
        }
Bryant's avatar
Bryant committed
        default:
            break;
pixhawk's avatar
pixhawk committed
    }

    return cmdList;
}