Public Types | Signals | Public Member Functions

PlotMoveableMarker Class Reference

#include <PlotMoveableMarker.h>

Inheritance diagram for PlotMoveableMarker:
Inheritance graph
[legend]
Collaboration diagram for PlotMoveableMarker:
Collaboration graph
[legend]

List of all members.

Public Types

enum  MovementDirection { Horizontal, Vertical, HorizontalAndVertical }

Signals

void moved ()
void released ()

Public Member Functions

 PlotMoveableMarker (MovementDirection movementDirection, QObject *parent=NULL)
virtual ~PlotMoveableMarker ()
MovementDirection movementDirection () const
virtual bool eventFilter (QObject *object, QEvent *event)
void attach (Plot *plot)
virtual int rtti () const

Member Enumeration Documentation

Enumerator:
Horizontal 
Vertical 
HorizontalAndVertical 

{ Horizontal, Vertical, HorizontalAndVertical };


Constructor & Destructor Documentation

PlotMoveableMarker::PlotMoveableMarker ( MovementDirection  movementDirection,
QObject parent = NULL 
)

  : QObject( parent ),
    m_movementDirection( movementDirection )
{
  //qDebug( "PlotMoveableMarker::PlotMoveableMarker" );

  m_mousePressed = false;
  m_onTarget = false;
  m_plot = NULL;
}

PlotMoveableMarker::~PlotMoveableMarker (  )  [virtual]

{
  //qDebug( "PlotMoveableMarker::~PlotMoveableMarker" );
}


Member Function Documentation

void PlotMoveableMarker::attach ( Plot plot  ) 

{
  //qDebug( "PlotMoveableMarker::attach" );

  if ( plot != NULL )
  {
    m_plot = plot;
    plot->canvas()->installEventFilter( this );
  }
  QwtPlotMarker::attach( plot );
}

bool PlotMoveableMarker::eventFilter ( QObject object,
QEvent event 
) [virtual]

{
  //qDebug( "PlotMoveableMarker::eventFilter" );

  if ( object != ( QObject* )plot()->canvas() ) return false;

  switch ( event->type() )
  {
    case QEvent::MouseButtonPress:
    {
      m_mousePressed = true;
      if ( m_onTarget == true )
      {
        // Prevent that the event is processed by another widget (e.g. zoomer, selector)
        return true;
      }
      break;
    }
    case QEvent::MouseButtonRelease:
    {
      if ( m_mousePressed == true && m_onTarget == true )
      {
        m_mousePressed = false;
        m_onTarget = false;
        emit released();
        plot()->canvas()->setCursor( m_storedCursor );
        // Prevent that the event is processed by another widget (e.g. zoomer, selector)
        return true;
      }
      m_mousePressed = false;
      m_onTarget = false;
    }
    case QEvent::MouseMove:
    {
      QMouseEvent* mouseEvent = ( QMouseEvent* )event;

      // Don't do anything when we are dragging a zoomer or selector
      if ( m_mousePressed == true && m_onTarget == false ) break;

      if ( m_mousePressed == true && m_onTarget == true )
      {
        if ( m_movementDirection == Horizontal )
        {
          setXValue( plot()->invTransform( xAxis(), mouseEvent->pos().x() ) );
        }
        else if ( m_movementDirection == Vertical )
        {
          setYValue( plot()->invTransform( yAxis(), mouseEvent->pos().y() ) );
        }
        else
        {
          setXValue( plot()->invTransform( xAxis(), mouseEvent->pos().x() ) );
          setYValue( plot()->invTransform( yAxis(), mouseEvent->pos().y() ) );
        }
        emit moved();
        QTimer::singleShot(0, plot(), SLOT(replot()));
        if ( m_plot->tracker() != NULL )
        {
          // Only call the eventFilter on the tracker (if it exists)
          return m_plot->tracker()->eventFilter( object, event );
        }
        else
        {
          // Prevent that the event is processed by another widget (e.g. zoomer, selector)
          return true;
        }
      }

      const QwtPlotItemList& itemList = plot()->itemList();
      for ( QwtPlotItemIterator it = itemList.begin(); it != itemList.end(); ++it )
      {
        if ( *it == this )
        {
          if ( m_movementDirection == Horizontal )
          {
            double markerXValue = xValue();
            double leftBound = plot()->invTransform( xAxis(), mouseEvent->pos().x() - 3 );
            double rightBound = plot()->invTransform( xAxis(), mouseEvent->pos().x() + 3 );
            if ( m_onTarget == false )
            {
              m_storedCursor = plot()->canvas()->cursor();
            }
            if ( markerXValue > leftBound && markerXValue < rightBound )
            {
              m_onTarget = true;
              // Make sure this object is called first in the eventFilter queue
              plot()->canvas()->installEventFilter( this );
              plot()->canvas()->setCursor( Qt::SizeHorCursor );
            }
            else
            {
              m_onTarget = false;
              plot()->canvas()->setCursor( m_storedCursor );
            }
          }
          else if ( m_movementDirection == Vertical )
          {
            double markerYValue = yValue();
            double upperBound = plot()->invTransform( yAxis(), mouseEvent->pos().y() - 3 );
            double lowerBound = plot()->invTransform( yAxis(), mouseEvent->pos().y() + 3 );
            if ( m_onTarget == false )
            {
              m_storedCursor = plot()->canvas()->cursor();
            }
            if ( markerYValue > lowerBound && markerYValue < upperBound )
            {
              m_onTarget = true;
              // Make sure this object is called first in the eventFilter queue
              plot()->canvas()->installEventFilter( this );
              plot()->canvas()->setCursor( Qt::SizeVerCursor );
            }
            else
            {
              m_onTarget = false;
              plot()->canvas()->setCursor( m_storedCursor );
            }
          }
          else
          {
            double markerXValue = xValue();
            double leftBound = plot()->invTransform( xAxis(), mouseEvent->pos().x() - 3 );
            double rightBound = plot()->invTransform( xAxis(), mouseEvent->pos().x() + 3 );
            double markerYValue = yValue();
            double upperBound = plot()->invTransform( yAxis(), mouseEvent->pos().y() - 3 );
            double lowerBound = plot()->invTransform( yAxis(), mouseEvent->pos().y() + 3 );
            if ( m_onTarget == false )
            {
              m_storedCursor = plot()->canvas()->cursor();
            }
            if ( markerXValue > leftBound && markerXValue < rightBound
                 && markerYValue > lowerBound && markerYValue < upperBound )
            {
              m_onTarget = true;
              // Make sure this object is called first in the eventFilter queue
              plot()->canvas()->installEventFilter( this );
              plot()->canvas()->setCursor( Qt::SizeAllCursor );
            }
            else
            {
              m_onTarget = false;
              plot()->canvas()->setCursor( m_storedCursor );
            }
          }
        }
      }
      break;
    }
    default:
      break;
  }

  return QObject::eventFilter( object, event );
}

void PlotMoveableMarker::moved (  )  [signal]

Referenced by eventFilter().

MovementDirection PlotMoveableMarker::movementDirection (  )  const [inline]

{ return m_movementDirection; }

void PlotMoveableMarker::released (  )  [signal]

Referenced by eventFilter().

int PlotMoveableMarker::rtti (  )  const [virtual]

Reimplemented from QwtPlotMarker.

{
  //qDebug( "PlotMoveableMarker::rtti" );

  // Would have been better to append a type to the RttiValues enum
  return QwtPlotItem::Rtti_PlotUserItem + 2;
}


The documentation for this class was generated from the following files: