homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsdigitalclockwidget.cpp
changeset 46 23b5d6a29cce
parent 35 f9ce957a272c
child 51 4785f57bf3d4
--- a/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsdigitalclockwidget.cpp	Mon May 03 12:24:59 2010 +0300
+++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsdigitalclockwidget.cpp	Fri May 14 15:43:04 2010 +0300
@@ -11,47 +11,241 @@
 *
 * Contributors:
 * 
-* Description:  Homescreen themable clock label.
+* Description:  Digital clock widget
 *
 */
 
-#include "hsdigitalclockwidget.h"
+#include <QGraphicsSceneMouseEvent>
+#include <QTime>
 
-#include <hbevent.h>
-#include <hbcolorscheme.h>
+#include <HbStyleLoader>
+#include <HbIconItem>
+#include <HbFrameItem>
+#include <HbFrameDrawer>
+#include <HbTouchArea>
+
+#include "hsdigitalclockwidget.h"
 
 /*!
     \class HsDigitalClockWidget
-    \ingroup group_snsrbigclockscreensaverprovider
-    \brief Screensaver label.
- */
+    \ingroup group_hsclockwidgetplugin
+    \brief Homescreen themable digital clock widget.
+*/
+
+/*!
+    Constructs widget.
+*/
+HsDigitalClockWidget::HsDigitalClockWidget(bool useAmPm, QGraphicsItem *parent)
+  : HbWidget(parent),
+    mBackground(0),
+    mDigit1(0), mDigit2(0), mDigit3(0),
+    mDigit4(0), mDigit5(0), mDigit6(0),
+    mAmPm(0), mTouchArea(0), mUseAmPm(useAmPm)
+{
+    HbStyleLoader::registerFilePath(":/hsdigitalclockwidget.widgetml");
+    HbStyleLoader::registerFilePath(":/hsdigitalclockwidget.css");
+/*
+    mDigitMap.insert(QChar('0'), QString("clock_widget_zero"));
+    mDigitMap.insert(QChar('1'), QString("clock_widget_one"));
+    mDigitMap.insert(QChar('2'), QString("clock_widget_two"));
+    mDigitMap.insert(QChar('3'), QString("clock_widget_three"));
+    mDigitMap.insert(QChar('4'), QString("clock_widget_four"));
+    mDigitMap.insert(QChar('5'), QString("clock_widget_five"));
+    mDigitMap.insert(QChar('6'), QString("clock_widget_six"));
+    mDigitMap.insert(QChar('7'), QString("clock_widget_seven"));
+    mDigitMap.insert(QChar('8'), QString("clock_widget_eight"));
+    mDigitMap.insert(QChar('9'), QString("clock_widget_nine"));
+*/
+    mDigitMap.insert(QChar('0'), QString(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"));
+    mDigitMap.insert(QChar('1'), QString(":/themes/icons/hbdefault/scalable/clock_widget_one.svg"));
+    mDigitMap.insert(QChar('2'), QString(":/themes/icons/hbdefault/scalable/clock_widget_two.svg"));
+    mDigitMap.insert(QChar('3'), QString(":/themes/icons/hbdefault/scalable/clock_widget_three.svg"));
+    mDigitMap.insert(QChar('4'), QString(":/themes/icons/hbdefault/scalable/clock_widget_four.svg"));
+    mDigitMap.insert(QChar('5'), QString(":/themes/icons/hbdefault/scalable/clock_widget_five.svg"));
+    mDigitMap.insert(QChar('6'), QString(":/themes/icons/hbdefault/scalable/clock_widget_six.svg"));
+    mDigitMap.insert(QChar('7'), QString(":/themes/icons/hbdefault/scalable/clock_widget_seven.svg"));
+    mDigitMap.insert(QChar('8'), QString(":/themes/icons/hbdefault/scalable/clock_widget_eight.svg"));
+    mDigitMap.insert(QChar('9'), QString(":/themes/icons/hbdefault/scalable/clock_widget_nine.svg"));
+
+    createPrimitives();
+}
 
 /*!
-    Constructs a new HsDigitalClockWidget.
+    Destructor.
+*/
+HsDigitalClockWidget::~HsDigitalClockWidget()
+{
+    HbStyleLoader::unregisterFilePath(":/hsdigitalclockwidget.widgetml");
+    HbStyleLoader::unregisterFilePath(":/hsdigitalclockwidget.css");
+    mTouchArea->removeEventFilter(this);
+}
+
+/*!
+    Filters touch area events.
+*/
+bool HsDigitalClockWidget::eventFilter(QObject *watched, QEvent *event)
+{
+    Q_UNUSED(watched)
+
+    switch (event->type()) {
+        case QEvent::GraphicsSceneMousePress:
+            return true;
+        case QEvent::GraphicsSceneMouseRelease:
+            handleMouseReleaseEvent(static_cast<QGraphicsSceneMouseEvent *>(event));
+            return true;
+        default:
+            break;
+    }
+
+    return false;
+}
+
+/*!
+    Updates clock visualization according to current time
  */
-HsDigitalClockWidget::HsDigitalClockWidget(QGraphicsItem *parent)
-    : HbLabel(parent) 
+void HsDigitalClockWidget::tick()
+{
+    updatePrimitives();
+}
+
+/*!
+    Toggles time format
+ */
+void HsDigitalClockWidget::setAmPm(bool useAmPm)
 {
+    bool old = mUseAmPm;
+    mUseAmPm = useAmPm;
+    
+    if (mUseAmPm != old) {
+        updatePrimitives();
+    }
+}
+
+/*!
+    @copydoc HbWidget::resizeEvent()
+ */
+void HsDigitalClockWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+    HbWidget::resizeEvent(event);
+    updatePrimitives();   
 }
 
 /*!
-    Destructs the class.
+    Creates all widget primitives.
  */
-HsDigitalClockWidget::~HsDigitalClockWidget()
+void HsDigitalClockWidget::createPrimitives()
 {
+/*
+    HbFrameDrawer *drawer = new HbFrameDrawer(
+        QLatin1String("clock_widget"), HbFrameDrawer::NinePieces);
+    mBackground = new HbFrameItem(drawer, this);
+    HbStyle::setItemName(mBackground, QLatin1String("background"));
+
+    mDigit1 = new HbIconItem(QLatin1String("clock_widget_zero"), this);
+    HbStyle::setItemName(mDigit1, QLatin1String("digit1"));
+
+    mDigit2 = new HbIconItem(QLatin1String("clock_widget_zero"), this);
+    HbStyle::setItemName(mDigit2, QLatin1String("digit2"));
+
+    mDigit3 = new HbIconItem(QLatin1String("clock_widget_zero"), this);
+    HbStyle::setItemName(mDigit3, QLatin1String("digit3"));
+
+    mDigit4 = new HbIconItem(QLatin1String("clock_widget_zero"), this);
+    HbStyle::setItemName(mDigit4, QLatin1String("digit4"));
+
+    mDigit5 = new HbIconItem(QLatin1String("clock_widget_zero"), this);
+    HbStyle::setItemName(mDigit5, QLatin1String("digit5"));
+
+    mDigit6 = new HbIconItem(QLatin1String("clock_widget_zero"), this);
+    HbStyle::setItemName(mDigit6, QLatin1String("digit6"));
+
+    if (mUseAmPm) {
+        mAmPm = new HbIconItem(QLatin1String("clock_widget_am"), this);
+        HbStyle::setItemName(mAmPm, QLatin1String("ampm"));
+    }
+*/
+    HbFrameDrawer *drawer = new HbFrameDrawer(
+        QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget.svg"), HbFrameDrawer::NinePieces);
+    mBackground = new HbFrameItem(drawer, this);
+    HbStyle::setItemName(mBackground, QLatin1String("background"));
+
+    mDigit1 = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"), this);
+    HbStyle::setItemName(mDigit1, QLatin1String("digit1"));
+
+    mDigit2 = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"), this);
+    HbStyle::setItemName(mDigit2, QLatin1String("digit2"));
+
+    mDigit3 = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"), this);
+    HbStyle::setItemName(mDigit3, QLatin1String("digit3"));
+
+    mDigit4 = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"), this);
+    HbStyle::setItemName(mDigit4, QLatin1String("digit4"));
+
+    mDigit5 = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"), this);
+    HbStyle::setItemName(mDigit5, QLatin1String("digit5"));
+
+    mDigit6 = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_zero.svg"), this);
+    HbStyle::setItemName(mDigit6, QLatin1String("digit6"));
+
+    if (mUseAmPm) {
+        mAmPm = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_am.svg"), this);
+        HbStyle::setItemName(mAmPm, QLatin1String("ampm"));
+    }
+
+    mTouchArea = new HbTouchArea(this);
+    mTouchArea->installEventFilter(this);
+    HbStyle::setItemName(mTouchArea, QLatin1String("toucharea"));
 }
 
 /*!
-    \reimp
+    @copydoc HbWidget::updatePrimitives()
  */
-void HsDigitalClockWidget::changeEvent(QEvent * event)
+void HsDigitalClockWidget::updatePrimitives()
 {
-    if (event->type() == HbEvent::ThemeChanged) {
-        const QString textColorAttribute("text");
-        QColor textColor(HbColorScheme::color(textColorAttribute));
-        if (textColor.isValid()) {
-            setTextColor(textColor);
+    QTime time = QTime::currentTime();
+    QString timeString;
+
+    if (mUseAmPm) {
+        if (!mAmPm) {
+            //mAmPm = new HbIconItem(QLatin1String("clock_widget_am"), this);
+            mAmPm = new HbIconItem(QLatin1String(":/themes/icons/hbdefault/scalable/clock_widget_am.svg"), this);
+            HbStyle::setItemName(mAmPm, QLatin1String("ampm"));
+        }
+        timeString = time.toString("hh:mm:ss ap");
+    } else {
+        if (mAmPm) {
+            delete mAmPm;
+            mAmPm = 0;
+        }
+        timeString = time.toString("hh:mm:ss");
+    }
+
+    mDigit1->setIconName(mDigitMap[timeString[0]]);
+    mDigit2->setIconName(mDigitMap[timeString[1]]);
+    mDigit3->setIconName(mDigitMap[timeString[3]]);
+    mDigit4->setIconName(mDigitMap[timeString[4]]);
+    mDigit5->setIconName(mDigitMap[timeString[6]]);
+    mDigit6->setIconName(mDigitMap[timeString[7]]);
+
+    if (mUseAmPm) {
+        if (timeString[9] == QChar('a')) {
+            //mAmPm->setIconName("clock_widget_am");
+            mAmPm->setIconName(":/themes/icons/hbdefault/scalable/clock_widget_am.svg");
+        } else {
+            //mAmPm->setIconName("clock_widget_pm");
+            mAmPm->setIconName(":/themes/icons/hbdefault/scalable/clock_widget_pm.svg");
         }
     }
-    return HbLabel::changeEvent(event);
 }
+
+/*!
+    \internal
+*/
+void HsDigitalClockWidget::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    if (!contains(event->pos())) {
+        return;
+    }
+
+    emit clockTapped();
+}