homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsanalogclockwidget.cpp
changeset 46 23b5d6a29cce
parent 39 4e8ebe173323
child 51 4785f57bf3d4
equal deleted inserted replaced
39:4e8ebe173323 46:23b5d6a29cce
     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 }