Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

# qwt_arrbtn.cpp

    00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
    00002  * Qwt Widget Library
    00003  * Copyright (C) 1997   Josef Wilgen
    00004  * Copyright (C) 2002   Uwe Rathmann
    00005  *
    00006  * This library is free software; you can redistribute it and/or
    00007  * modify it under the terms of the Qwt License, Version 1.0
    00008  *****************************************************************************/
    00009
    00010 #include <qpainter.h>
    00011 #include <qstyle.h>
    00012 #include <qevent.h>
    00013 #include "qwt_math.h"
    00014 #include "qwt_arrbtn.h"
    00015
    00016 #if 1
    00017 static const int MaxNum = 3;
    00018 static const int Margin = 2;
    00019 static const int Spacing = 1;
    00020 #endif
    00021
    00028 QwtArrowButton::QwtArrowButton(int num, Qt::ArrowType arrowType,
    00029         QWidget *parent, const char *name):
    00030     QPushButton (parent, name),
    00031     d_num(qwtLim(num,1,MaxNum)),
    00032     d_arrowType(arrowType)
    00033 {
    00034     // We don't need a pixmap, but setting one toggles
    00035     // QPushButton in pixmap mode what removes text
    00036     // related properties from thy style engines.
    00037
    00038     setPixmap(QPixmap());
    00039     setAutoRepeat(TRUE);
    00040     setAutoDefault(FALSE);
    00041 }
    00042
    00046 Qt::ArrowType QwtArrowButton::arrowType() const
    00047 {
    00048     return d_arrowType;
    00049 }
    00050
    00054 int QwtArrowButton::num() const
    00055 {
    00056     return d_num;
    00057 }
    00058
    00062 QRect QwtArrowButton::labelRect() const
    00063 {
    00064     QRect r =
    00065 #if QT_VERSION < 300
    00066         style().buttonRect(rect().x(), rect().y(),
    00067         rect().width(), rect().height());
    00068 #else
    00069         style().subRect(QStyle::SR_PushButtonContents, this);
    00070 #endif
    00071
    00072     r.setRect(r.x() + Margin, r.y() + Margin,
    00073         r.width() - 2 * Margin, r.height() - 2 * Margin);
    00074
    00075     if ( isDown() )
    00076     {
    00077         int ph, pv;
    00078 #if QT_VERSION < 300
    00079         style().getButtonShift(ph, pv);
    00080 #else
    00081         ph = style().pixelMetric(
    00082             QStyle::PM_ButtonShiftHorizontal, this);
    00083         pv = style().pixelMetric(
    00084             QStyle::PM_ButtonShiftVertical, this);
    00085 #endif
    00086         r.moveBy(ph, pv);
    00087     }
    00088
    00089     return r;
    00090 }
    00091
    00096 void QwtArrowButton::drawButtonLabel(QPainter *p)
    00097 {
    00098     const QRect r = labelRect();
    00099
    00100     QSize boundingSize = labelRect().size();
    00101     if ( d_arrowType == Qt::UpArrow || d_arrowType == Qt::DownArrow )
    00102         boundingSize.transpose();
    00103
    00104     const int w = (boundingSize.width() - (MaxNum - 1) * Spacing) / MaxNum;
    00105
    00106     QSize arrow = arrowSize(Qt::RightArrow,
    00107         QSize(w, boundingSize.height()));
    00108
    00109     if ( d_arrowType == Qt::UpArrow || d_arrowType == Qt::DownArrow )
    00110         arrow.transpose();
    00111
    00112     QRect contentsSize; // aligned rect where to paint all arrows
    00113     if ( d_arrowType == Qt::LeftArrow || d_arrowType == Qt::RightArrow )
    00114     {
    00115         contentsSize.setWidth(d_num * arrow.width()
    00116             + (d_num - 1) * Spacing);
    00117         contentsSize.setHeight(arrow.height());
    00118     }
    00119     else
    00120     {
    00121         contentsSize.setWidth(arrow.width());
    00122         contentsSize.setHeight(d_num * arrow.height()
    00123             + (d_num - 1) * Spacing);
    00124     }
    00125
    00126     QRect arrowRect(contentsSize);
    00127     arrowRect.moveCenter(r.center());
    00128     arrowRect.setSize(arrow);
    00129
    00130     p->save();
    00131     for (int i = 0; i < d_num; i++)
    00132     {
    00133         drawArrow(p, arrowRect, d_arrowType);
    00134
    00135         if ( d_arrowType == Qt::LeftArrow || d_arrowType == Qt::RightArrow )
    00136             arrowRect.moveBy(arrow.width() + Spacing, 0);
    00137         else
    00138             arrowRect.moveBy(0, arrow.height() + Spacing);
    00139     }
    00140     p->restore();
    00141
    00142 #if QT_VERSION >= 300
    00143     if ( hasFocus() )
    00144     {
    00145         const QRect focusRect =
    00146             style().subRect(QStyle::SR_PushButtonFocusRect, this);
    00147         style().drawPrimitive(QStyle::PE_FocusRect, p,
    00148             focusRect, colorGroup());
    00149     }
    00150 #endif
    00151 }
    00152
    00160 void QwtArrowButton::drawArrow(QPainter *p,
    00161     const QRect &r, Qt::ArrowType arrowType) const
    00162 {
    00163     QPointArray pa(3);
    00164
    00165     switch(arrowType)
    00166     {
    00167         case Qt::UpArrow:
    00168             pa.setPoint(0, r.bottomLeft());
    00169             pa.setPoint(1, r.bottomRight());
    00170             pa.setPoint(2, r.center().x(), r.top());
    00171             break;
    00172         case Qt::DownArrow:
    00173             pa.setPoint(0, r.topLeft());
    00174             pa.setPoint(1, r.topRight());
    00175             pa.setPoint(2, r.center().x(), r.bottom());
    00176             break;
    00177         case Qt::RightArrow:
    00178             pa.setPoint(0, r.topLeft());
    00179             pa.setPoint(1, r.bottomLeft());
    00180             pa.setPoint(2, r.right(), r.center().y());
    00181             break;
    00182         case Qt::LeftArrow:
    00183             pa.setPoint(0, r.topRight());
    00184             pa.setPoint(1, r.bottomRight());
    00185             pa.setPoint(2, r.left(), r.center().y());
    00186             break;
    00187     }
    00188
    00189     p->setPen(colorGroup().buttonText());
    00190     p->setBrush(colorGroup().brush(QColorGroup::ButtonText));
    00191     p->drawPolygon(pa);
    00192 }
    00193
    00194
    00198 QSizePolicy QwtArrowButton::sizePolicy() const
    00199 {
    00200     QSizePolicy policy;
    00201     if ( d_arrowType == Qt::LeftArrow || d_arrowType == Qt::RightArrow )
    00202         policy = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    00203     else
    00204         policy = QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
    00205
    00206     return policy;
    00207 }
    00208
    00212 QSize QwtArrowButton::sizeHint() const
    00213 {
    00214     return minimumSizeHint();
    00215 }
    00216
    00220 QSize QwtArrowButton::minimumSizeHint() const
    00221 {
    00222     const QSize asz = arrowSize(Qt::RightArrow, QSize());
    00223
    00224     QSize sz(
    00225         2 * Margin + (MaxNum - 1) * Spacing + MaxNum * asz.width(),
    00226         2 * Margin + asz.height()
    00227     );
    00228
    00229     if ( d_arrowType == Qt::UpArrow || d_arrowType == Qt::DownArrow )
    00230         sz.transpose();
    00231
    00232 #if QT_VERSION < 300
    00233     int bm = style().buttonMargin() - 1;
    00234     sz += QSize(2 * bm, 2 * bm);
    00235 #else
    00236     sz = style().sizeFromContents(QStyle::CT_PushButton, this, sz);
    00237 #endif
    00238     return sz;
    00239 }
    00240
    00248 QSize QwtArrowButton::arrowSize(Qt::ArrowType arrowType,
    00249     const QSize &boundingSize) const
    00250 {
    00251     QSize bs = boundingSize;
    00252     if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow )
    00253         bs.transpose();
    00254
    00255     const int MinLen = 2;
    00256     const QSize sz = bs.expandedTo(
    00257         QSize(MinLen, 2 * MinLen - 1)); // minimum
    00258
    00259     int w = sz.width();
    00260     int h = 2 * w - 1;
    00261
    00262     if ( h > sz.height() )
    00263     {
    00264         h = sz.height();
    00265         w = (h + 1) / 2;
    00266     }
    00267
    00268     QSize arrSize(w, h);
    00269     if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow )
    00270         arrSize.transpose();
    00271
    00272     return arrSize;
    00273 }
    00274
    00278 void QwtArrowButton::keyPressEvent(QKeyEvent *e)
    00279 {
    00280     if ( e->isAutoRepeat() && e->key() == Qt::Key_Space )
    00281         emit clicked();
    00282
    00283     QPushButton::keyPressEvent(e);
    00284 }