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 }

Generated on Sun Nov 21 11:12:42 2004 for Qwt User's Guide by doxygen 1.3.5