9 * Initial Contributors: |
9 * Initial Contributors: |
10 * Nokia Corporation - initial contribution. |
10 * Nokia Corporation - initial contribution. |
11 * |
11 * |
12 * Contributors: |
12 * Contributors: |
13 * |
13 * |
14 * Description: Clock widget |
14 * Description: Analog clock widget |
15 * |
15 * |
16 */ |
16 */ |
17 |
17 |
|
18 #include <QGraphicsSceneMouseEvent> |
|
19 #include <QTime> |
|
20 |
|
21 #include <HbStyleLoader> |
|
22 #include <HbIconItem> |
|
23 #include <HbTouchArea> |
|
24 |
18 #include "hsanalogclockwidget.h" |
25 #include "hsanalogclockwidget.h" |
19 #include <QGraphicsGridLayout> |
|
20 #include <QTime> |
|
21 #include <QDir> |
|
22 #include <HbIconItem> |
|
23 #include <HbStyleLoader> |
|
24 |
26 |
25 /*! |
27 /*! |
26 \class HsAnalogClockWidget |
28 \class HsAnalogClockWidget |
27 \ingroup group_hsclockwidgetplugin |
29 \ingroup group_hsclockwidgetplugin |
28 \brief Homescreen themable analog clock widget. |
30 \brief Homescreen themable analog clock widget. |
29 |
|
30 */ |
31 */ |
31 |
32 |
32 /*! |
33 /*! |
33 \fn HsAnalogClockWidget::HsAnalogClockWidget(QGraphicsItem *parent, Qt::WindowFlags flags) |
|
34 |
|
35 Constructs widget. |
34 Constructs widget. |
36 */ |
35 */ |
37 HsAnalogClockWidget::HsAnalogClockWidget(QGraphicsItem *parent) |
36 HsAnalogClockWidget::HsAnalogClockWidget(QGraphicsItem *parent) |
38 : HbWidget(parent), |
37 : HbWidget(parent), |
39 mClockBackground(0), |
38 mBackground(0), mHourHand(0), mMinuteHand(0), |
40 mClockHourHand(0), |
39 mSecondHand(0), mTouchArea(0) |
41 mClockMinuteHand(0) |
|
42 { |
40 { |
43 HbStyleLoader::registerFilePath(":/hsanalogclockwidget.widgetml"); |
41 HbStyleLoader::registerFilePath(":/hsanalogclockwidget.widgetml"); |
44 HbStyleLoader::registerFilePath(":/hsanalogclockwidget.css"); |
42 HbStyleLoader::registerFilePath(":/hsanalogclockwidget.css"); |
45 |
43 |
46 updatePrimitives(); |
44 createPrimitives(); |
47 } |
45 } |
48 |
46 |
49 /*! |
47 /*! |
50 \fn HsAnalogClockWidget::~HsAnalogClockWidget() |
|
51 |
|
52 Destructor. |
48 Destructor. |
53 */ |
49 */ |
54 HsAnalogClockWidget::~HsAnalogClockWidget() |
50 HsAnalogClockWidget::~HsAnalogClockWidget() |
55 { |
51 { |
56 delete mClockBackground; |
52 HbStyleLoader::unregisterFilePath(":/hsanalogclockwidget.widgetml"); |
57 delete mClockHourHand; |
53 HbStyleLoader::unregisterFilePath(":/hsanalogclockwidget.css"); |
58 delete mClockMinuteHand; |
54 mTouchArea->removeEventFilter(this); |
59 |
|
60 HbStyleLoader::registerFilePath(":/hsanalogclockwidget.widgetml"); |
|
61 HbStyleLoader::registerFilePath(":/hsanalogclockwidget.css"); |
|
62 } |
55 } |
63 |
56 |
64 /*! |
57 /*! |
65 @copydoc HbWidget::resizeEvent() |
58 Filters touch area events. |
66 */ |
59 */ |
67 void HsAnalogClockWidget::resizeEvent(QGraphicsSceneResizeEvent *event) |
60 bool HsAnalogClockWidget::eventFilter(QObject *watched, QEvent *event) |
68 { |
61 { |
69 QGraphicsWidget::resizeEvent(event); |
62 Q_UNUSED(watched) |
70 updatePrimitives(); |
|
71 } |
|
72 |
63 |
73 /*! |
64 switch (event->type()) { |
74 @copydoc HbWidget::updatePrimitives() |
65 case QEvent::GraphicsSceneMousePress: |
75 */ |
66 return true; |
76 void HsAnalogClockWidget::updatePrimitives() |
67 case QEvent::GraphicsSceneMouseRelease: |
77 { |
68 handleMouseReleaseEvent(static_cast<QGraphicsSceneMouseEvent *>(event)); |
78 if (!mClockBackground) { |
69 return true; |
79 mClockBackground = new HbIconItem(QLatin1String("qtg_graf_clock_day_bg"), this); |
70 default: |
80 HbStyle::setItemName(mClockBackground, QLatin1String("clock_background")); |
71 break; |
81 } |
72 } |
82 |
73 |
83 // Calculate angles for clock hands. |
74 return false; |
84 QTime time = QTime::currentTime(); |
|
85 qreal s = 6 * time.second(); |
|
86 qreal m = 6 * (time.minute() + s/360); |
|
87 qreal h = 30 * ((time.hour() % 12) + m/360); |
|
88 |
|
89 if (!mClockHourHand) { |
|
90 mClockHourHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_hour"), this); |
|
91 HbStyle::setItemName(mClockHourHand, QLatin1String("clock_hour_hand")); |
|
92 } |
|
93 |
|
94 // these should work but don't |
|
95 //int x = mClockHourHand->iconItemSize().width()/2; |
|
96 //int y = mClockHourHand->iconItemSize().height()/2; |
|
97 // workaround |
|
98 int x = mClockHourHand->preferredSize().width()/2; |
|
99 int y = mClockHourHand->preferredSize().height()/2; |
|
100 mClockHourHand->setTransform(QTransform().translate(x, y).rotate(h).translate(-x, -y)); |
|
101 |
|
102 if (!mClockMinuteHand) { |
|
103 mClockMinuteHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_min"), this); |
|
104 HbStyle::setItemName(mClockMinuteHand, QLatin1String("clock_minute_hand")); |
|
105 } |
|
106 |
|
107 // these should work but don't |
|
108 //int x = mClockMinuteHand->iconItemSize().width()/2; |
|
109 //int y = mClockMinuteHand->iconItemSize().height()/2; |
|
110 // workaround |
|
111 x = mClockMinuteHand->preferredSize().width()/2; |
|
112 y = mClockMinuteHand->preferredSize().height()/2; |
|
113 mClockMinuteHand->setTransform(QTransform().translate(x, y).rotate(m).translate(-x, -y)); |
|
114 |
|
115 } |
75 } |
116 |
76 |
117 /*! |
77 /*! |
118 Updates clock visualization according to current time |
78 Updates clock visualization according to current time |
119 */ |
79 */ |
120 void HsAnalogClockWidget::tick() |
80 void HsAnalogClockWidget::tick() |
121 { |
81 { |
122 updatePrimitives(); |
82 updatePrimitives(); |
123 update(); |
|
124 } |
83 } |
125 |
84 |
126 /*! |
85 /*! |
127 Update primitives also here because a problem in Hb - to be removed later on |
86 @copydoc HbWidget::resizeEvent() |
128 */ |
87 */ |
129 void HsAnalogClockWidget::polish( HbStyleParameters& params ) |
88 void HsAnalogClockWidget::resizeEvent(QGraphicsSceneResizeEvent *event) |
130 { |
89 { |
131 HbWidget::polish(params); |
90 HbWidget::resizeEvent(event); |
132 updatePrimitives(); |
91 updatePrimitives(); |
133 } |
92 } |
|
93 |
|
94 /*! |
|
95 Creates all widget primitives. |
|
96 */ |
|
97 void HsAnalogClockWidget::createPrimitives() |
|
98 { |
|
99 mBackground = new HbIconItem(QLatin1String("qtg_graf_clock_day_bg"), this); |
|
100 HbStyle::setItemName(mBackground, QLatin1String("background")); |
|
101 |
|
102 mHourHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_hour"), this); |
|
103 HbStyle::setItemName(mHourHand, QLatin1String("hour_hand")); |
|
104 |
|
105 mMinuteHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_min"), this); |
|
106 HbStyle::setItemName(mMinuteHand, QLatin1String("minute_hand")); |
|
107 |
|
108 mSecondHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_sec"), this); |
|
109 HbStyle::setItemName(mSecondHand, QLatin1String("second_hand")); |
|
110 |
|
111 mTouchArea = new HbTouchArea(this); |
|
112 mTouchArea->installEventFilter(this); |
|
113 HbStyle::setItemName(mTouchArea, QLatin1String("toucharea")); |
|
114 } |
|
115 |
|
116 /*! |
|
117 @copydoc HbWidget::updatePrimitives() |
|
118 */ |
|
119 void HsAnalogClockWidget::updatePrimitives() |
|
120 { |
|
121 // Calculate angles for clock hands. |
|
122 QTime time = QTime::currentTime(); |
|
123 qreal s = 6 * time.second(); |
|
124 qreal m = 6 * (time.minute() + s/360); |
|
125 qreal h = 30 * ((time.hour() % 12) + m/360); |
|
126 |
|
127 int x = mBackground->iconItemSize().width()/2; |
|
128 int y = mBackground->iconItemSize().height()/2; |
|
129 QPointF originPoint = QPointF(x, y); |
|
130 |
|
131 mHourHand->setTransformOriginPoint(originPoint); |
|
132 mHourHand->setRotation(h); |
|
133 |
|
134 mMinuteHand->setTransformOriginPoint(originPoint); |
|
135 mMinuteHand->setRotation(m); |
|
136 |
|
137 mSecondHand->setTransformOriginPoint(originPoint); |
|
138 mSecondHand->setRotation(s); |
|
139 } |
|
140 |
|
141 /*! |
|
142 \internal |
|
143 */ |
|
144 void HsAnalogClockWidget::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event) |
|
145 { |
|
146 if (!contains(event->pos())) { |
|
147 return; |
|
148 } |
|
149 |
|
150 emit clockTapped(); |
|
151 } |