Classes | Public Member Functions | Protected Member Functions

QwtArrowButton Class Reference

Arrow Button. More...

#include <qwt_arrow_button.h>

Collaboration diagram for QwtArrowButton:
Collaboration graph
[legend]

List of all members.

Classes

class  PrivateData

Public Member Functions

 QwtArrowButton (int num, Qt::ArrowType, QWidget *parent=NULL)
virtual ~QwtArrowButton ()
 Destructor.
Qt::ArrowType arrowType () const
 The direction of the arrows.
int num () const
 The number of arrows.
virtual QSize sizeHint () const
virtual QSize minimumSizeHint () const
 Return a minimum size hint.

Protected Member Functions

virtual void drawButtonLabel (QPainter *p)
 Draw the button label.
virtual void drawArrow (QPainter *, const QRect &, Qt::ArrowType) const
virtual QRect labelRect () const
virtual QSize arrowSize (Qt::ArrowType, const QSize &boundingSize) const
virtual void keyPressEvent (QKeyEvent *)
 autoRepeat for the space keys

Detailed Description

Arrow Button.

A push button with one or more filled triangles on its front. An Arrow button can have 1 to 3 arrows in a row, pointing up, down, left or right.

Definition at line 23 of file qwt_arrow_button.h.


Constructor & Destructor Documentation

QwtArrowButton::QwtArrowButton ( int  num,
Qt::ArrowType  arrowType,
QWidget *  parent = NULL 
) [explicit]
Parameters:
numNumber of arrows
arrowTypesee Qt::ArowType in the Qt docs.
parentParent widget

Definition at line 58 of file qwt_arrow_button.cpp.

References arrowType(), QwtArrowButton::PrivateData::arrowType, MaxNum, QwtArrowButton::PrivateData::num, and qwtLim().

                                               : 
    QPushButton(parent)
{
    d_data = new PrivateData;
    d_data->num = qwtLim(num, 1, MaxNum);
    d_data->arrowType = arrowType;

    setAutoRepeat(true);
    setAutoDefault(false);

    switch(d_data->arrowType)
    {
        case Qt::LeftArrow:
        case Qt::RightArrow:
            setSizePolicy(QSizePolicy::Expanding, 
                QSizePolicy::Fixed);
            break;
        default:
            setSizePolicy(QSizePolicy::Fixed, 
                QSizePolicy::Expanding);
    }
}
QwtArrowButton::~QwtArrowButton (  ) [virtual]

Destructor.

Definition at line 83 of file qwt_arrow_button.cpp.

{
    delete d_data;
    d_data = NULL;
}

Member Function Documentation

QSize QwtArrowButton::arrowSize ( Qt::ArrowType  arrowType,
const QSize &  boundingSize 
) const [protected, virtual]

Calculate the size for a arrow that fits into a rect of a given size

Parameters:
arrowTypeArrow type
boundingSizeBounding size
Returns:
Size of the arrow

Definition at line 331 of file qwt_arrow_button.cpp.

Referenced by drawButtonLabel(), and minimumSizeHint().

{
    QSize bs = boundingSize;
    if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow )
        bs.transpose();
        
    const int MinLen = 2;
    const QSize sz = bs.expandedTo(
        QSize(MinLen, 2 * MinLen - 1)); // minimum

    int w = sz.width();
    int h = 2 * w - 1;

    if ( h > sz.height() )
    {
        h = sz.height();
        w = (h + 1) / 2;
    }

    QSize arrSize(w, h);
    if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow )
        arrSize.transpose();

    return arrSize;
}
Qt::ArrowType QwtArrowButton::arrowType (  ) const

The direction of the arrows.

Definition at line 92 of file qwt_arrow_button.cpp.

References QwtArrowButton::PrivateData::arrowType.

Referenced by QwtArrowButton().

{ 
    return d_data->arrowType; 
}
void QwtArrowButton::drawArrow ( QPainter *  painter,
const QRect &  r,
Qt::ArrowType  arrowType 
) const [protected, virtual]

Draw an arrow int a bounding rect

Parameters:
painterPainter
rRectangle where to paint the arrow
arrowTypeArrow type

Definition at line 240 of file qwt_arrow_button.cpp.

Referenced by drawButtonLabel().

{
    QwtPolygon pa(3);

    switch(arrowType)
    {
        case Qt::UpArrow:
            pa.setPoint(0, r.bottomLeft());
            pa.setPoint(1, r.bottomRight());
            pa.setPoint(2, r.center().x(), r.top());
            break;
        case Qt::DownArrow:
            pa.setPoint(0, r.topLeft());
            pa.setPoint(1, r.topRight());
            pa.setPoint(2, r.center().x(), r.bottom());
            break;
        case Qt::RightArrow:
            pa.setPoint(0, r.topLeft());
            pa.setPoint(1, r.bottomLeft());
            pa.setPoint(2, r.right(), r.center().y());
            break;
        case Qt::LeftArrow:
            pa.setPoint(0, r.topRight());
            pa.setPoint(1, r.bottomRight());
            pa.setPoint(2, r.left(), r.center().y());
            break;
        default:
            break;
    }

    painter->save();
#if QT_VERSION < 0x040000
    painter->setPen(colorGroup().buttonText());
    painter->setBrush(colorGroup().brush(QColorGroup::ButtonText));
#else
    painter->setPen(palette().color(QPalette::ButtonText));
    painter->setBrush(palette().brush(QPalette::ButtonText));
#endif
    painter->drawPolygon(pa);
    painter->restore();
}
void QwtArrowButton::drawButtonLabel ( QPainter *  painter ) [protected, virtual]

Draw the button label.

Parameters:
painterPainter
See also:
The Qt Manual on QPushButton

Definition at line 157 of file qwt_arrow_button.cpp.

References arrowSize(), QwtArrowButton::PrivateData::arrowType, drawArrow(), labelRect(), MaxNum, QwtArrowButton::PrivateData::num, and Spacing.

{
    const bool isVertical = d_data->arrowType == Qt::UpArrow ||
        d_data->arrowType == Qt::DownArrow;

    const QRect r = labelRect();
    QSize boundingSize = labelRect().size();
    if ( isVertical )
        boundingSize.transpose();
        
    const int w = 
        (boundingSize.width() - (MaxNum - 1) * Spacing) / MaxNum;

    QSize arrow = arrowSize(Qt::RightArrow, 
        QSize(w, boundingSize.height()));

    if ( isVertical )
        arrow.transpose();

    QRect contentsSize; // aligned rect where to paint all arrows
    if ( d_data->arrowType == Qt::LeftArrow || d_data->arrowType == Qt::RightArrow )
    {
        contentsSize.setWidth(d_data->num * arrow.width() 
            + (d_data->num - 1) * Spacing);
        contentsSize.setHeight(arrow.height());
    }
    else
    {
        contentsSize.setWidth(arrow.width());
        contentsSize.setHeight(d_data->num * arrow.height() 
            + (d_data->num - 1) * Spacing);
    }

    QRect arrowRect(contentsSize);
    arrowRect.moveCenter(r.center());
    arrowRect.setSize(arrow);

    painter->save();
    for (int i = 0; i < d_data->num; i++)
    {
        drawArrow(painter, arrowRect, d_data->arrowType);

        int dx = 0;
        int dy = 0;

        if ( isVertical )
            dy = arrow.height() + Spacing;
        else
            dx = arrow.width() + Spacing;

#if QT_VERSION >= 0x040000
        arrowRect.translate(dx, dy);
#else
        arrowRect.moveBy(dx, dy);
#endif
    }
    painter->restore();

    if ( hasFocus() )
    {
#if QT_VERSION >= 0x040000
        QStyleOptionFocusRect option;
        option.init(this);
        option.backgroundColor = palette().color(QPalette::Background);

        style()->drawPrimitive(QStyle::PE_FrameFocusRect, 
            &option, painter, this);
#else
        const QRect focusRect =  
            style().subRect(QStyle::SR_PushButtonFocusRect, this);
        style().drawPrimitive(QStyle::PE_FocusRect, painter,
            focusRect, colorGroup());
#endif
    }
}
void QwtArrowButton::keyPressEvent ( QKeyEvent *  e ) [protected, virtual]

autoRepeat for the space keys

Definition at line 361 of file qwt_arrow_button.cpp.

References mitk::Key_Space.

{
    if ( e->isAutoRepeat() && e->key() == Qt::Key_Space )
        emit clicked();

    QPushButton::keyPressEvent(e);
}
QRect QwtArrowButton::labelRect (  ) const [protected, virtual]
Returns:
the bounding rect for the label

Definition at line 108 of file qwt_arrow_button.cpp.

References Margin.

Referenced by drawButtonLabel().

{
    const int m = Margin;

    QRect r = rect();
    r.setRect(r.x() + m, r.y() + m, 
        r.width() - 2 * m, r.height() - 2 * m);

    if ( isDown() )
    {
        int ph, pv;
#if QT_VERSION < 0x040000
        ph = style().pixelMetric(
            QStyle::PM_ButtonShiftHorizontal, this);
        pv = style().pixelMetric(
            QStyle::PM_ButtonShiftVertical, this);
        r.moveBy(ph, pv);
#else
        QStyleOptionButton option = styleOpt(this);
        ph = style()->pixelMetric(
            QStyle::PM_ButtonShiftHorizontal, &option, this);
        pv = style()->pixelMetric(
            QStyle::PM_ButtonShiftVertical, &option, this);
        r.translate(ph, pv);
#endif
    }

    return r;
}
QSize QwtArrowButton::minimumSizeHint (  ) const [virtual]

Return a minimum size hint.

Definition at line 294 of file qwt_arrow_button.cpp.

References arrowSize(), QwtArrowButton::PrivateData::arrowType, Margin, MaxNum, and Spacing.

Referenced by sizeHint().

{
    const QSize asz = arrowSize(Qt::RightArrow, QSize()); 

    QSize sz(
        2 * Margin + (MaxNum - 1) * Spacing + MaxNum * asz.width(),
        2 * Margin + asz.height()
    );

    if ( d_data->arrowType == Qt::UpArrow || d_data->arrowType == Qt::DownArrow )
        sz.transpose();

#if QT_VERSION >= 0x040000
    QStyleOption styleOption;
    styleOption.init(this);

    const QSize hsz = style()->sizeFromContents(QStyle::CT_PushButton, 
        &styleOption, sz, this);
#if QT_VERSION < 0x040300
    if ( hsz.width() != 80 ) // avoid a bug in the Cleanlooks style
#endif
        sz = hsz;

#else
    sz = style().sizeFromContents(QStyle::CT_PushButton, this, sz);
#endif

    return sz;
}
int QwtArrowButton::num (  ) const

The number of arrows.

Definition at line 100 of file qwt_arrow_button.cpp.

References QwtArrowButton::PrivateData::num.

{ 
    return d_data->num; 
}
QSize QwtArrowButton::sizeHint (  ) const [virtual]
Returns:
a size hint

Definition at line 286 of file qwt_arrow_button.cpp.

References minimumSizeHint().

{
    return minimumSizeHint();
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines