homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsclockwidget.cpp
changeset 35 f9ce957a272c
child 36 cdae8c6c3876
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsclockwidget.cpp	Fri Mar 19 09:27:44 2010 +0200
@@ -0,0 +1,278 @@
+/*
+* Copyright (c) 2008 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:  Clock widget
+*
+*/
+
+#include <QtGui>
+#include <QGraphicsWidget>
+#include <QSizePolicy>
+#include <QGraphicsLinearLayout>
+#include <hblabel.h>
+#include <hbextendedlocale.h>
+
+#include "hsclockwidget.h"
+#include "hsanalogclockwidget.h"
+#include "hsdigitalclockwidget.h"
+#include "hsclockwidgetdocumentloader.h"
+
+#ifdef Q_OS_SYMBIAN    
+#include "hsclockwidgettype_symbian.h"
+#endif
+
+namespace
+{
+    const char ANALOG[] = "analog";
+    const char DIGITAL[] = "digital";
+
+    const char DIGITAL_CLOCK_DOCML[] = ":/xml/hsdigitalclockwidget.docml";
+    const char ANALOG_CLOCK_DOCML[] = ":/xml/hsanalogclockwidget.docml";
+
+    const char DIGITAL_CLOCK_WIDGET[] = "timeLabel";
+    const char ANALOG_CLOCK_WIDGET[] = "analogClockWidget";
+
+    const int clockUpdateInterval = 1000; // msec
+}
+
+/*!
+    \class HsClockWidget
+    \ingroup group_hsclockwidgetplugin
+    \brief Implementation for the homescreen clock widget.
+
+*/
+
+
+/*!
+    \fn HsClockWidget::HsClockWidget(QGraphicsItem *parent, Qt::WindowFlags flags)
+
+    Constructs widget.
+*/
+HsClockWidget::HsClockWidget(QGraphicsItem *parent, Qt::WindowFlags flags)
+    : HbWidget(parent, flags),
+      mTimer(0),
+      mClockType(ANALOG),
+      mWidget(0),
+      mLayout(0),
+      mWidgetShown(false)
+{
+#if 0
+#ifdef Q_OS_SYMBIAN    
+    HsClockWidgetType *clockType = new HsClockWidgetType(this);
+    mClockType=clockType->type();
+    connect(clockType, SIGNAL(typeChanged(QString)), this, SLOT(onTypeChanged(QString)));
+#endif    
+#endif
+}
+
+/*!
+    \fn HsClockWidget::~HsClockWidget()
+
+    Destructor.
+*/
+HsClockWidget::~HsClockWidget()
+{
+}
+
+/*!
+    Returns the clock type.
+*/
+QString HsClockWidget::clockType() const
+{
+    return mClockType;
+}
+  
+/*!
+    Sets the clock type;
+*/
+void HsClockWidget::setClockType(const QString &type)
+{
+    if (type == DIGITAL) {
+        mClockType = DIGITAL;
+    } else {
+        mClockType = ANALOG;
+    }
+}
+
+/*!
+    \fn void HsClockWidget::onInitialize()
+
+    Initializes clock widget
+*/
+void HsClockWidget::onInitialize()
+{
+    mLayout = new QGraphicsLinearLayout(Qt::Vertical);
+    mLayout->setContentsMargins(0,0,0,0);
+
+    hide();
+
+    mWidget = loadClockWidget();
+    mLayout->addItem(mWidget);
+    setPreferredSize(mWidget->preferredSize());
+    parentWidget()->resize(preferredSize()); // workaround for layouting
+    
+    mTimer = new QTimer(this);
+    connect(mTimer, SIGNAL(timeout()), SLOT(updateTime()));
+    setLayout(mLayout);
+
+}
+
+/*!
+    \fn void HsClockWidget::show()
+
+    Shows the widget
+*/
+void HsClockWidget::onShow()
+{
+    mWidgetShown = true;
+    mTimer->start(clockUpdateInterval);
+    show();
+}
+
+
+/*!
+    \fn void HsClockWidget::show()
+
+    Hides the widget
+*/
+void HsClockWidget::onHide()
+{
+    mWidgetShown = false;
+    mTimer->stop();
+    hide();
+}
+
+/*!
+    Uninitializes the widget.
+*/
+void HsClockWidget::onUninitialize()
+{
+    mTimer->stop();
+    hide();
+}
+
+/*!
+    \fn void HsClockWidget::updateTime()
+
+    Draws the clock with every second
+*/
+void HsClockWidget::updateTime()
+{
+    if (mClockType == DIGITAL) {
+        hide(); // workaround for clock not updating
+        static_cast<HbLabel*>(mWidget)->setPlainText(
+            HbExtendedLocale().format(QTime::currentTime(), r_qtn_time_usual_with_zero));
+        show(); // workaround for clock not updating 
+    } else {
+        static_cast<HsAnalogClockWidget*>(mWidget)->tick();
+    }
+}
+
+/*!
+    Toggles the clock type.
+*/
+void HsClockWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_UNUSED(event);    
+#ifndef Q_OS_SYMBIAN    
+    mTimer->stop();
+    toggleClockType();
+    emit setPreferences(QStringList() << "clockType");
+
+    hide();
+
+    mLayout->removeItem(mWidget);
+    delete mWidget;
+    mWidget = 0;
+    mWidget = loadClockWidget();
+    mLayout->addItem(mWidget);
+    setPreferredSize(mWidget->preferredSize());
+    parentWidget()->resize(preferredSize());
+    
+    show();
+    updateTime();
+    update();
+
+
+    mTimer->start(clockUpdateInterval);
+#endif    
+}
+
+/*!
+    Toggles the clock type.
+*/
+void HsClockWidget::toggleClockType()
+{
+    if (mClockType == ANALOG) {
+        mClockType = DIGITAL;
+    } else {
+        mClockType = ANALOG;
+    }
+}
+
+/*!
+    Loads the digital or analog clock widget.
+*/
+HbWidget *HsClockWidget::loadClockWidget()
+{
+    HbWidget *clockWidget = 0;
+
+    QString docmlFile;
+    if (mClockType == DIGITAL) {
+        docmlFile = DIGITAL_CLOCK_DOCML;
+    } else {
+        docmlFile = ANALOG_CLOCK_DOCML;
+    }
+
+    HsClockWidgetDocumentLoader loader;
+    bool loaded = false;
+    loader.load(docmlFile, &loaded);
+
+    if (loaded) {
+        if (mClockType == DIGITAL) {
+            clockWidget = qobject_cast<HsDigitalClockWidget *>(loader.findWidget(DIGITAL_CLOCK_WIDGET));
+            clockWidget->setBackgroundItem(HbStyle::P_Fade_background);
+        } else {
+            clockWidget = qobject_cast<HsAnalogClockWidget *>(loader.findWidget(ANALOG_CLOCK_WIDGET));
+        }
+
+    } else {
+        qWarning() << "Unable to load clock widget from docml: " << docmlFile;
+        // TODO: We must handle this error situation once error handling strategy is clear!
+    }
+
+    return clockWidget;
+}
+
+void HsClockWidget::onTypeChanged(QString type)
+{
+#if 0
+    if (mClockType != type) {
+        mTimer->stop();
+        mClockType = type;
+        emit setPreferences(QStringList() << "clockType");
+        hide();
+        mLayout->removeItem(mWidget);
+        delete mWidget;
+        mWidget = 0;
+        mWidget = loadClockWidget();
+        mLayout->addItem(mWidget);
+        setPreferredSize(mWidget->preferredSize());
+        parentWidget()->resize(preferredSize());
+        if ( mWidgetShown ) {
+            mTimer->start(clockUpdateInterval);
+            show();
+            }
+    }    
+#endif    
+}