00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_analog_clock.h"
00011
00016 QwtAnalogClock::QwtAnalogClock(QWidget *parent):
00017 QwtDial(parent)
00018 {
00019 initClock();
00020 }
00021
00022 #if QT_VERSION < 0x040000
00023
00028 QwtAnalogClock::QwtAnalogClock(QWidget* parent, const char *name):
00029 QwtDial(parent, name)
00030 {
00031 initClock();
00032 }
00033 #endif
00034
00035 void QwtAnalogClock::initClock()
00036 {
00037 setWrapping(true);
00038 setReadOnly(true);
00039
00040 setOrigin(270.0);
00041 setRange(0.0, 60.0 * 60.0 * 12.0);
00042 setScale(-1, 5, 60.0 * 60.0);
00043
00044 setScaleOptions(ScaleTicks | ScaleLabel);
00045 setScaleTicks(1, 0, 8);
00046 scaleDraw()->setSpacing(8);
00047
00048 QColor knobColor =
00049 #if QT_VERSION < 0x040000
00050 palette().color(QPalette::Active, QColorGroup::Text);
00051 #else
00052 palette().color(QPalette::Active, QPalette::Text);
00053 #endif
00054 knobColor = knobColor.dark(120);
00055
00056 QColor handColor;
00057 int width;
00058
00059 for ( int i = 0; i < NHands; i++ )
00060 {
00061 if ( i == SecondHand )
00062 {
00063 width = 2;
00064 handColor = knobColor.dark(120);
00065 }
00066 else
00067 {
00068 width = 8;
00069 handColor = knobColor;
00070 }
00071
00072 QwtDialSimpleNeedle *hand = new QwtDialSimpleNeedle(
00073 QwtDialSimpleNeedle::Arrow, true, handColor, knobColor);
00074 hand->setWidth(width);
00075
00076 d_hand[i] = NULL;
00077 setHand((Hand)i, hand);
00078 }
00079 }
00080
00082 QwtAnalogClock::~QwtAnalogClock()
00083 {
00084 for ( int i = 0; i < NHands; i++ )
00085 delete d_hand[i];
00086 }
00087
00092 void QwtAnalogClock::setNeedle(QwtDialNeedle *)
00093 {
00094
00095 return;
00096 }
00097
00104 void QwtAnalogClock::setHand(Hand hand, QwtDialNeedle *needle)
00105 {
00106 if ( hand >= 0 || hand < NHands )
00107 {
00108 delete d_hand[hand];
00109 d_hand[hand] = needle;
00110 }
00111 }
00112
00118 QwtDialNeedle *QwtAnalogClock::hand(Hand hd)
00119 {
00120 if ( hd < 0 || hd >= NHands )
00121 return NULL;
00122
00123 return d_hand[hd];
00124 }
00125
00131 const QwtDialNeedle *QwtAnalogClock::hand(Hand hd) const
00132 {
00133 return ((QwtAnalogClock *)this)->hand(hd);
00134 }
00135
00142 void QwtAnalogClock::setCurrentTime()
00143 {
00144 setTime(QTime::currentTime());
00145 }
00146
00151 void QwtAnalogClock::setTime(const QTime &time)
00152 {
00153 if ( time.isValid() )
00154 {
00155 setValue((time.hour() % 12) * 60.0 * 60.0
00156 + time.minute() * 60.0 + time.second());
00157 }
00158 else
00159 setValid(false);
00160 }
00161
00168 QwtText QwtAnalogClock::scaleLabel(double value) const
00169 {
00170 if ( value == 0.0 )
00171 value = 60.0 * 60.0 * 12.0;
00172
00173 return QString::number(int(value / (60.0 * 60.0)));
00174 }
00175
00191 void QwtAnalogClock::drawNeedle(QPainter *painter, const QPoint ¢er,
00192 int radius, double, QPalette::ColorGroup cg) const
00193 {
00194 if ( isValid() )
00195 {
00196 const double hours = value() / (60.0 * 60.0);
00197 const double minutes = (value() - (int)hours * 60.0 * 60.0) / 60.0;
00198 const double seconds = value() - (int)hours * 60.0 * 60.0
00199 - (int)minutes * 60.0;
00200
00201 drawHand(painter, HourHand, center, radius,
00202 360.0 - (origin() + 360.0 * hours / 12.0), cg);
00203 drawHand(painter, MinuteHand, center, radius,
00204 360.0 - (origin() + 360.0 * minutes / 60.0), cg);
00205 drawHand(painter, SecondHand, center, radius,
00206 360.0 - (origin() + 360.0 * seconds / 60.0), cg);
00207 }
00208 }
00209
00220 void QwtAnalogClock::drawHand(QPainter *painter, Hand hd,
00221 const QPoint ¢er, int radius, double direction,
00222 QPalette::ColorGroup cg) const
00223 {
00224 const QwtDialNeedle *needle = hand(hd);
00225 if ( needle )
00226 {
00227 if ( hd == HourHand )
00228 radius = qRound(0.8 * radius);
00229
00230 needle->draw(painter, center, radius, direction, cg);
00231 }
00232 }