--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/clock/clockui/clockwidget/src/skinnableclock.cpp Fri Apr 16 14:57:40 2010 +0300
@@ -0,0 +1,242 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+// skinnableclock.cpp
+
+#include <QTimer>
+#include <QTime>
+#include <QGraphicsLinearLayout>
+#include <hbaction.h>
+
+#include "skinnableclock.h"
+#include "analogclock.h"
+#include "digitalclock.h"
+#include "timezoneclient.h"
+#include "settingsutility.h"
+
+SkinnableClock::SkinnableClock(QGraphicsItem *parent)
+:HbWidget(parent),
+ mAnalogClock(0),
+ mDigitalClock(0),
+ mAnalog(true),
+ mClockFormat24(true),
+ mUpdateNeeded(true)
+{
+ // Enable the gestures for the widget and subscribe for "PAN" gestures.
+/* QApplication::setAttribute(Qt::AA_EnableGestures);
+ grabGesture(Qt::PanGesture);*/
+
+ qDebug("clock: SkinnableClock::SkinnableClock() -->");
+
+ // Construct the settings utility.
+ mSettingsUtility = new SettingsUtility(this);
+
+ qDebug("clock: SkinnableClock::SkinnableClock() - constructed settingsutility.");
+
+ // Construct the layout and the widgets.
+ mLayout = new QGraphicsLinearLayout(Qt::Vertical, this);
+ mAnalogClock = new AnalogClock(this);
+ mDigitalClock = new DigitalClock(this);
+
+ // Set the clock type according to the seetings.
+ // And construct the corresponding widget.
+ QStringList clockTypeList;
+ int typeIndex = mSettingsUtility->clockType(clockTypeList);
+ if (0 == typeIndex) {
+ setClockTypeAnalog(true);
+ } else {
+ setClockTypeAnalog(false);
+ }
+
+ setLayout(mLayout);
+
+ // Add the required effects.
+ HbEffect::add(mAnalogClock,
+ QString(":/clock/disappear.fxml"),
+ "disappear");
+ HbEffect::add(mDigitalClock,
+ QString(":/clock/disappear.fxml"),
+ "disappear");
+ HbEffect::add(mAnalogClock,
+ QString(":/clock/appear.fxml"),
+ "appear");
+ HbEffect::add(mDigitalClock,
+ QString(":/clock/appear.fxml"),
+ "appear");
+
+ mClient = new TimezoneClient(this);
+ qDebug("clock: SkinnableClock::SkinnableClock() - constructed tzclient");
+
+ connect(mClient, SIGNAL(timechanged()),
+ this, SLOT(updateDisplay()));
+ connect(mClient, SIGNAL(timechanged()),
+ this, SLOT(updateClockType()));
+
+ // Start a timer.
+ mTickTimer = new QTimer(this);
+ QObject::connect(mTickTimer, SIGNAL(timeout()),
+ this, SLOT(updateDisplay()));
+ // TODO: mTickTimer->start(60000 - 1000 * QTime::currentTime().second());
+ mTickTimer->start(1000);
+
+ qDebug("clock: SkinnableClock::SkinnableClock() <--");
+}
+
+SkinnableClock::~SkinnableClock()
+{
+ // No implementation yet.
+}
+
+
+bool SkinnableClock::clockTypeAnalog()
+{
+ return mAnalog;
+}
+
+bool SkinnableClock::clockFormat24()
+{
+ return mClockFormat24;
+}
+
+void SkinnableClock::updateDisplay(bool newTimer)
+{
+ if (newTimer) {
+ // Start the timer again for 1 minute.
+ // TODO: mTickTimer->start(60000 - 1000 * QTime::currentTime().second());
+ mTickTimer->start(1000);
+ }
+
+ if (mAnalog) {
+ mAnalogClock->updateDisplay();
+ } else {
+ mDigitalClock->updateDisplay();
+ }
+}
+
+void SkinnableClock::updateClockType()
+{
+ // Update the clock type according to the seetings.
+ QStringList clockTypeList;
+ int typeIndex = mSettingsUtility->clockType(clockTypeList);
+
+ if ((mAnalog && 1 == typeIndex) || (!mAnalog && 0 == typeIndex)) {
+ mUpdateNeeded = true;
+ mAnalog = !mAnalog;
+ mDigitalClock->hide();
+ mAnalogClock->hide();
+ } else {
+ mUpdateNeeded = false;
+ }
+}
+
+/*bool SkinnableClock::sceneEvent(QEvent *event)
+{
+ if (event->type() == QEvent::GraphicsSceneGesture) {
+ QGraphicsSceneGestureEvent *gestureEvent =
+ static_cast<QGraphicsSceneGestureEvent*>(event);
+ if (const QGesture *gesture = gestureEvent->gesture(Qt::PanGesture)) {
+ const QPanningGesture *panningGesture =
+ static_cast<const QPanningGesture*>(gesture);
+
+ if (Qt::GestureFinished == gesture->state()) {
+ if (Qt::LeftDirection == panningGesture->direction()) {
+ if (mAnalog) {
+ mAnalogClock->showPrev();
+ }
+ } else if (Qt::RightDirection == panningGesture->direction()) {
+ if (mAnalog) {
+ mAnalogClock->showNext();
+ }
+ } else if (Qt::UpDirection == panningGesture->direction() ||
+ Qt::DownDirection == panningGesture->direction()) {
+ startChangeType();
+ }
+ event->accept();
+ return true;
+ }
+ event->accept();
+ return true;
+ }
+ }
+ return HbWidget::sceneEvent(event);
+}*/
+
+void SkinnableClock::paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget)
+{
+ Q_UNUSED(painter)
+ Q_UNUSED(option)
+ Q_UNUSED(widget)
+
+ if (mUpdateNeeded) {
+ setClockTypeAnalog(mAnalog);
+ mUpdateNeeded = !mUpdateNeeded;
+ }
+}
+
+void SkinnableClock::setClockTypeAnalog(bool analog)
+{
+ if (analog) {
+ mDigitalClock->hide();
+ mLayout->removeItem(mDigitalClock);
+ mAnalogClock->show();
+ mLayout->addItem(mAnalogClock);
+ } else {
+ mAnalogClock->hide();
+ mLayout->removeItem(mAnalogClock);
+ mDigitalClock->show();
+ mLayout->addItem(mDigitalClock);
+ }
+
+ mAnalog = analog;
+
+ // Update the display.
+ updateDisplay(false);
+}
+
+void SkinnableClock::startChangeType()
+{
+ if (mAnalog) {
+ HbEffect::start(mAnalogClock,
+ "disappear",
+ this,
+ "finishChangeType");
+ } else {
+ HbEffect::start(mDigitalClock,
+ "disappear",
+ this,
+ "finishChangeType");
+ }
+}
+
+void SkinnableClock::finishChangeType(const HbEffect::EffectStatus &status)
+{
+ Q_UNUSED(status)
+
+ setClockTypeAnalog(!mAnalog);
+
+ if (mAnalog) {
+ HbEffect::start(mAnalogClock,
+ "appear");
+ } else {
+ HbEffect::start(mDigitalClock,
+ "appear");
+ }
+}
+
+// End of file