Skip to content
qwt_picker.cpp 38.3 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
 *****************************************************************************/

Bryant's avatar
Bryant committed
#include "qwt_picker.h"
#include "qwt_picker_machine.h"
#include "qwt_painter.h"
#include "qwt_math.h"
#include "qwt_widget_overlay.h"
pixhawk's avatar
pixhawk committed
#include <qapplication.h>
#include <qevent.h>
#include <qpainter.h>
#include <qframe.h>
#include <qcursor.h>
#include <qbitmap.h>
#include <qpointer.h>
#include <qpaintengine.h>
Bryant's avatar
Bryant committed
#include <qmath.h>
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
static inline QRegion qwtMaskRegion( const QRect &r, int penWidth )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    const int pw = qMax( penWidth, 1 );
    const int pw2 = penWidth / 2;

    int x1 = r.left() - pw2;
    int x2 = r.right() + 1 + pw2 + ( pw % 2 );

    int y1 = r.top() - pw2;
    int y2 = r.bottom() + 1 + pw2 + ( pw % 2 );

    QRegion region;

    region += QRect( x1, y1, x2 - x1, pw );
    region += QRect( x1, y1, pw, y2 - y1 );
    region += QRect( x1, y2 - pw, x2 - x1, pw );
    region += QRect( x2 - pw, y1, pw, y2 - y1 );

    return region;
}

static inline QRegion qwtMaskRegion( const QLine &l, int penWidth )
{
    const int pw = qMax( penWidth, 1 );
    const int pw2 = penWidth / 2;

    QRegion region;

    if ( l.x1() == l.x2() )
    {
        region += QRect( l.x1() - pw2, l.y1(), 
            pw, l.y2() ).normalized();
    }
    else if ( l.y1() == l.y2() )
    {
        region += QRect( l.x1(), l.y1() - pw2, 
            l.x2(), pw ).normalized();
    }
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    return region;
}
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
class QwtPickerRubberband: public QwtWidgetOverlay
{
public:
    QwtPickerRubberband( QwtPicker *, QWidget * );
pixhawk's avatar
pixhawk committed

protected:
Bryant's avatar
Bryant committed
    virtual void drawOverlay( QPainter * ) const;
    virtual QRegion maskHint() const;
pixhawk's avatar
pixhawk committed

    QwtPicker *d_picker;
};

Bryant's avatar
Bryant committed
class QwtPickerTracker: public QwtWidgetOverlay
{                                  
public:
    QwtPickerTracker( QwtPicker *, QWidget * );
    
protected:
    virtual void drawOverlay( QPainter * ) const;
    virtual QRegion maskHint() const;
    
    QwtPicker *d_picker;
};  


pixhawk's avatar
pixhawk committed
class QwtPicker::PrivateData
{
public:
Bryant's avatar
Bryant committed
    PrivateData():
        enabled( false ),
        stateMachine( NULL ),
        resizeMode( QwtPicker::Stretch ),
        rubberBand( QwtPicker::NoRubberBand ),
        trackerMode( QwtPicker::AlwaysOff ),
        isActive( false ),
        trackerPosition( -1, -1 ),
        mouseTracking( false ),
        openGL( false )
    {
    }
        
pixhawk's avatar
pixhawk committed
    bool enabled;

    QwtPickerMachine *stateMachine;

    QwtPicker::ResizeMode resizeMode;

    QwtPicker::RubberBand rubberBand;
    QPen rubberBandPen;

    QwtPicker::DisplayMode trackerMode;
    QPen trackerPen;
    QFont trackerFont;

Bryant's avatar
Bryant committed
    QPolygon pickedPoints;
pixhawk's avatar
pixhawk committed
    bool isActive;
    QPoint trackerPosition;

    bool mouseTracking; // used to save previous value

Bryant's avatar
Bryant committed
    QPointer< QwtPickerRubberband > rubberBandOverlay;
    QPointer< QwtPickerTracker> trackerOverlay;

    bool openGL;
pixhawk's avatar
pixhawk committed
};

Bryant's avatar
Bryant committed
QwtPickerRubberband::QwtPickerRubberband(
        QwtPicker *picker, QWidget *parent ):
    QwtWidgetOverlay( parent ),
    d_picker( picker )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    setMaskMode( QwtWidgetOverlay::MaskHint );
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
QRegion QwtPickerRubberband::maskHint() const
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    return d_picker->rubberBandMask();
}
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
void QwtPickerRubberband::drawOverlay( QPainter *painter ) const
{
    painter->setPen( d_picker->rubberBandPen() );
    d_picker->drawRubberBand( painter );
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
QwtPickerTracker::QwtPickerTracker(
        QwtPicker *picker, QWidget *parent ):
    QwtWidgetOverlay( parent ),
    d_picker( picker )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    setMaskMode( QwtWidgetOverlay::MaskHint );
}
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
QRegion QwtPickerTracker::maskHint() const
{
    return d_picker->trackerRect( font() );
}
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
void QwtPickerTracker::drawOverlay( QPainter *painter ) const
{
    painter->setPen( d_picker->trackerPen() );
    d_picker->drawTracker( painter );
pixhawk's avatar
pixhawk committed
}

/*!
  Constructor

Bryant's avatar
Bryant committed
  Creates an picker that is enabled, but without a state machine.
  rubber band and tracker are disabled.
pixhawk's avatar
pixhawk committed
  \param parent Parent widget, that will be observed
 */

Bryant's avatar
Bryant committed
QwtPicker::QwtPicker( QWidget *parent ):
    QObject( parent )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    init( parent, NoRubberBand, AlwaysOff );
pixhawk's avatar
pixhawk committed
}

/*!
  Constructor

Bryant's avatar
Bryant committed
  \param rubberBand Rubber band style
pixhawk's avatar
pixhawk committed
  \param trackerMode Tracker mode
  \param parent Parent widget, that will be observed
 */
Bryant's avatar
Bryant committed
QwtPicker::QwtPicker( RubberBand rubberBand,
        DisplayMode trackerMode, QWidget *parent ):
    QObject( parent )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    init( parent, rubberBand, trackerMode );
pixhawk's avatar
pixhawk committed
}

//! Destructor
Loading
Loading full blame...