homescreenapp/examples/batterywidgetplugin/src/batterywidget.cpp
author hgs
Fri, 25 Jun 2010 19:19:22 +0300
changeset 62 341166945d65
child 81 7dd137878ff8
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Example of home screen widget
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//#define OWN_TESTING
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <QGraphicsLinearLayout>
hgs
parents:
diff changeset
    23
#include <QPainter>
hgs
parents:
diff changeset
    24
#include <QTimer>
hgs
parents:
diff changeset
    25
#include "BatteryWidget.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*!
hgs
parents:
diff changeset
    29
    \ingroup group_helloworld_widget
hgs
parents:
diff changeset
    30
    \class BatteryWidget
hgs
parents:
diff changeset
    31
    \brief Example implementation for home screen widget. 
hgs
parents:
diff changeset
    32
    
hgs
parents:
diff changeset
    33
    BatteryWidget is derived from the HbWidget. It implements
hgs
parents:
diff changeset
    34
    needed functions for the home screen widget.
hgs
parents:
diff changeset
    35
    BatteryWidget uses <a href="http://doc.qt.nokia.com/qtmobility-1.0/qsystemdeviceinfo.html">QSystemDeviceInfo</a> 
hgs
parents:
diff changeset
    36
    to get device's battery status. 
hgs
parents:
diff changeset
    37
    
hgs
parents:
diff changeset
    38
    Battery widget demonstrates the following home screen widget features:
hgs
parents:
diff changeset
    39
    <ol>
hgs
parents:
diff changeset
    40
    <li> widget shape, see \ref ssection_shape </li>
hgs
parents:
diff changeset
    41
    <li> root path property, see \ref sssection_rootPath and
hgs
parents:
diff changeset
    42
         widget resources, see \ref section_widget_resources </li>
hgs
parents:
diff changeset
    43
    <li> error signal, see \ref sssection_error </li>
hgs
parents:
diff changeset
    44
    <li> onInitialize slot, see \ref sssection_oninitialize </li>
hgs
parents:
diff changeset
    45
    <li> onShow slot, see \ref sssection_onshow </li>
hgs
parents:
diff changeset
    46
    <li> onHide slot, see \ref sssection_onhide </li>
hgs
parents:
diff changeset
    47
    </ol>
hgs
parents:
diff changeset
    48
    
hgs
parents:
diff changeset
    49
*/
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
/*!
hgs
parents:
diff changeset
    53
    \fn BatteryWidget::error()
hgs
parents:
diff changeset
    54
    Signal emitted if onInitialize fails to load batterywidget image.
hgs
parents:
diff changeset
    55
*/
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
/*!
hgs
parents:
diff changeset
    59
    Constructs a widget which is a child of \a parent, with widget flags set to \a flags.
hgs
parents:
diff changeset
    60
*/
hgs
parents:
diff changeset
    61
BatteryWidget::BatteryWidget(QGraphicsItem* parent, Qt::WindowFlags flags)
hgs
parents:
diff changeset
    62
    : HbWidget(parent, flags)
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
    mDeviceInfo = new QSystemDeviceInfo(this);
hgs
parents:
diff changeset
    65
    mChargingTimer = new QTimer(this);
hgs
parents:
diff changeset
    66
    mBatteryValue = mDeviceInfo->batteryLevel();
hgs
parents:
diff changeset
    67
}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
/*!
hgs
parents:
diff changeset
    70
    Destructor
hgs
parents:
diff changeset
    71
*/
hgs
parents:
diff changeset
    72
BatteryWidget::~BatteryWidget()
hgs
parents:
diff changeset
    73
{
hgs
parents:
diff changeset
    74
}
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
/*!
hgs
parents:
diff changeset
    77
    Returns rootPath property.
hgs
parents:
diff changeset
    78
*/
hgs
parents:
diff changeset
    79
// Start of snippet 1
hgs
parents:
diff changeset
    80
QString BatteryWidget::rootPath() const
hgs
parents:
diff changeset
    81
{
hgs
parents:
diff changeset
    82
    return mRootPath;
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
// End of snippet 1
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
/*!
hgs
parents:
diff changeset
    87
    Sets rootPath property as \a rootPath.
hgs
parents:
diff changeset
    88
*/
hgs
parents:
diff changeset
    89
// Start of snippet 2
hgs
parents:
diff changeset
    90
void BatteryWidget::setRootPath(QString &rootPath)
hgs
parents:
diff changeset
    91
{
hgs
parents:
diff changeset
    92
    mRootPath = rootPath;
hgs
parents:
diff changeset
    93
}
hgs
parents:
diff changeset
    94
// End of snippet 2
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
/*!
hgs
parents:
diff changeset
    98
    Return bounding rect. 
hgs
parents:
diff changeset
    99
*/
hgs
parents:
diff changeset
   100
QRectF BatteryWidget::boundingRect() const
hgs
parents:
diff changeset
   101
{   
hgs
parents:
diff changeset
   102
    QRectF currRect = rect();
hgs
parents:
diff changeset
   103
    currRect.setHeight(mBatteryBackgroundBitmap.height());
hgs
parents:
diff changeset
   104
    currRect.setWidth(mBatteryBackgroundBitmap.width());
hgs
parents:
diff changeset
   105
    return currRect;
hgs
parents:
diff changeset
   106
}
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
/*!
hgs
parents:
diff changeset
   109
    Return shape.
hgs
parents:
diff changeset
   110
*/
hgs
parents:
diff changeset
   111
// Start of snippet 3
hgs
parents:
diff changeset
   112
QPainterPath BatteryWidget::shape() const
hgs
parents:
diff changeset
   113
{   
hgs
parents:
diff changeset
   114
    QPainterPath path;
hgs
parents:
diff changeset
   115
    QRectF ownRect = boundingRect();
hgs
parents:
diff changeset
   116
    path.moveTo(ownRect.bottomRight());
hgs
parents:
diff changeset
   117
    QRectF ownRect2 = ownRect.adjusted(-2,-1,1, ownRect.height());
hgs
parents:
diff changeset
   118
    path.arcTo(ownRect2, 0, 180);
hgs
parents:
diff changeset
   119
    path.lineTo(ownRect2.right(), ownRect2.center().y());
hgs
parents:
diff changeset
   120
    return path;
hgs
parents:
diff changeset
   121
}
hgs
parents:
diff changeset
   122
// End of snippet 3
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
/*!
hgs
parents:
diff changeset
   125
    Paint battery image.
hgs
parents:
diff changeset
   126
*/
hgs
parents:
diff changeset
   127
void BatteryWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    Q_UNUSED(option);
hgs
parents:
diff changeset
   130
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   131
    if (!mUnifiedBatteryBitmap.isNull()) {
hgs
parents:
diff changeset
   132
        painter->drawPixmap(QPoint(0,0),mUnifiedBatteryBitmap);
hgs
parents:
diff changeset
   133
        }
hgs
parents:
diff changeset
   134
}
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
/*!
hgs
parents:
diff changeset
   137
    Called when widget is shown in the home screen.
hgs
parents:
diff changeset
   138
*/
hgs
parents:
diff changeset
   139
// Start of snippet 4
hgs
parents:
diff changeset
   140
void BatteryWidget::onShow()
hgs
parents:
diff changeset
   141
{
hgs
parents:
diff changeset
   142
    stateChanged();
hgs
parents:
diff changeset
   143
    prepareGeometryChange();    
hgs
parents:
diff changeset
   144
    resize(mBatteryBackgroundBitmap.size());
hgs
parents:
diff changeset
   145
}
hgs
parents:
diff changeset
   146
// End of snippet 4
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
/*!
hgs
parents:
diff changeset
   149
    Called when widget is hidden from the home screen.
hgs
parents:
diff changeset
   150
*/
hgs
parents:
diff changeset
   151
// Start of snippet 5
hgs
parents:
diff changeset
   152
void BatteryWidget::onHide()
hgs
parents:
diff changeset
   153
{
hgs
parents:
diff changeset
   154
    mDeviceInfo->disconnect(this);
hgs
parents:
diff changeset
   155
    mChargingTimer->stop();
hgs
parents:
diff changeset
   156
    mChargingTimer->disconnect(this);
hgs
parents:
diff changeset
   157
}
hgs
parents:
diff changeset
   158
// End of snippet 5
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
/*!
hgs
parents:
diff changeset
   161
    Called when widget is initalized. Widget can start using its resources,
hgs
parents:
diff changeset
   162
    for example rootPath is set by system before it calls this.
hgs
parents:
diff changeset
   163
*/
hgs
parents:
diff changeset
   164
// Start of snippet 6
hgs
parents:
diff changeset
   165
void BatteryWidget::onInitialize()
hgs
parents:
diff changeset
   166
{
hgs
parents:
diff changeset
   167
    mBatteryBackgroundBitmap.load(mRootPath + "/batterywidget_bg.png");
hgs
parents:
diff changeset
   168
    if (mBatteryBackgroundBitmap.isNull()) {
hgs
parents:
diff changeset
   169
        // emit error if loading of the image failed. This will remove widget from the home screen.
hgs
parents:
diff changeset
   170
        emit error();
hgs
parents:
diff changeset
   171
    }
hgs
parents:
diff changeset
   172
}
hgs
parents:
diff changeset
   173
// End of snippet 6
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
/*!
hgs
parents:
diff changeset
   176
    Called when widget is unintialized, nothing to do here
hgs
parents:
diff changeset
   177
*/
hgs
parents:
diff changeset
   178
void BatteryWidget::onUninitialize()
hgs
parents:
diff changeset
   179
{
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
/*!
hgs
parents:
diff changeset
   183
    Called when phone's battery level is changed.
hgs
parents:
diff changeset
   184
*/
hgs
parents:
diff changeset
   185
void BatteryWidget::batteryLevelChanged ( int level )
hgs
parents:
diff changeset
   186
{
hgs
parents:
diff changeset
   187
    mBatteryValue=level;
hgs
parents:
diff changeset
   188
    drawBatteryImage();
hgs
parents:
diff changeset
   189
    update();
hgs
parents:
diff changeset
   190
}
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
/*!
hgs
parents:
diff changeset
   193
    Called when phone's power state is changed.
hgs
parents:
diff changeset
   194
*/
hgs
parents:
diff changeset
   195
void BatteryWidget::powerStateChanged(QSystemDeviceInfo::PowerState powerState)
hgs
parents:
diff changeset
   196
{
hgs
parents:
diff changeset
   197
    Q_UNUSED(powerState);
hgs
parents:
diff changeset
   198
    stateChanged();    
hgs
parents:
diff changeset
   199
}
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
/*!
hgs
parents:
diff changeset
   202
    Animates pointer when phone is charging. (TODO: animation fw?)
hgs
parents:
diff changeset
   203
*/
hgs
parents:
diff changeset
   204
void BatteryWidget::updateChargingBatteryValue()
hgs
parents:
diff changeset
   205
{
hgs
parents:
diff changeset
   206
    mBatteryValue+=4;
hgs
parents:
diff changeset
   207
    if (mBatteryValue>100) mBatteryValue = 1;
hgs
parents:
diff changeset
   208
    drawBatteryImage();
hgs
parents:
diff changeset
   209
    update();
hgs
parents:
diff changeset
   210
}
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
/*!
hgs
parents:
diff changeset
   213
    Draws pointer on top of battery image
hgs
parents:
diff changeset
   214
*/
hgs
parents:
diff changeset
   215
void BatteryWidget::drawBatteryImage()
hgs
parents:
diff changeset
   216
{
hgs
parents:
diff changeset
   217
    QRectF rect = mBatteryBackgroundBitmap.rect();
hgs
parents:
diff changeset
   218
    
hgs
parents:
diff changeset
   219
    mUnifiedBatteryBitmap = QPixmap(rect.size().toSize());
hgs
parents:
diff changeset
   220
    mUnifiedBatteryBitmap.fill(QColor(Qt::transparent));
hgs
parents:
diff changeset
   221
    
hgs
parents:
diff changeset
   222
    QPainter painter(&mUnifiedBatteryBitmap);
hgs
parents:
diff changeset
   223
    
hgs
parents:
diff changeset
   224
    painter.drawPixmap(rect.toRect(), mBatteryBackgroundBitmap);
hgs
parents:
diff changeset
   225
    
hgs
parents:
diff changeset
   226
    static const QPoint pointerHand[3] = {
hgs
parents:
diff changeset
   227
        QPoint(3, 3),
hgs
parents:
diff changeset
   228
        QPoint(-3, 3),
hgs
parents:
diff changeset
   229
        QPoint(0, -80)
hgs
parents:
diff changeset
   230
    };
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    painter.translate(QPointF(rect.width()/2,rect.height()-10));
hgs
parents:
diff changeset
   233
    painter.rotate(180.0 * (mBatteryValue)/100 + 270);
hgs
parents:
diff changeset
   234
    
hgs
parents:
diff changeset
   235
    painter.setPen(Qt::NoPen);
hgs
parents:
diff changeset
   236
    painter.setBrush(Qt::red);
hgs
parents:
diff changeset
   237
    painter.drawConvexPolygon(pointerHand, 3);
hgs
parents:
diff changeset
   238
}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
/*!
hgs
parents:
diff changeset
   241
    Handles battery widget states.
hgs
parents:
diff changeset
   242
*/
hgs
parents:
diff changeset
   243
void BatteryWidget::stateChanged()
hgs
parents:
diff changeset
   244
{
hgs
parents:
diff changeset
   245
    mDeviceInfo->disconnect(this);
hgs
parents:
diff changeset
   246
    mChargingTimer->stop();
hgs
parents:
diff changeset
   247
    mChargingTimer->disconnect(this);
hgs
parents:
diff changeset
   248
    connect(mDeviceInfo, SIGNAL(powerStateChanged(QSystemDeviceInfo::PowerState)), SLOT(powerStateChanged(QSystemDeviceInfo::PowerState)));
hgs
parents:
diff changeset
   249
#ifdef OWN_TESTING
hgs
parents:
diff changeset
   250
    connect(mChargingTimer, SIGNAL(timeout()), this, SLOT(updateChargingBatteryValue()));
hgs
parents:
diff changeset
   251
    mChargingTimer->start(1000);
hgs
parents:
diff changeset
   252
#else
hgs
parents:
diff changeset
   253
    if (mDeviceInfo->currentPowerState() == QSystemDeviceInfo::WallPowerChargingBattery) {
hgs
parents:
diff changeset
   254
        connect(mChargingTimer, SIGNAL(timeout()), this, SLOT(updateChargingBatteryValue()));
hgs
parents:
diff changeset
   255
        mChargingTimer->start(500);
hgs
parents:
diff changeset
   256
    } else {
hgs
parents:
diff changeset
   257
        connect(mDeviceInfo, SIGNAL(batteryStatusChanged(QSystemDeviceInfo::BatteryStatus)), SLOT(batteryStatusChanged(QSystemDeviceInfo::BatteryStatus)));
hgs
parents:
diff changeset
   258
        connect(mDeviceInfo, SIGNAL(batteryLevelChanged(int)), SLOT(batteryLevelChanged(int)));
hgs
parents:
diff changeset
   259
        mBatteryValue = mDeviceInfo->batteryLevel();
hgs
parents:
diff changeset
   260
    }
hgs
parents:
diff changeset
   261
#endif    
hgs
parents:
diff changeset
   262
    drawBatteryImage();
hgs
parents:
diff changeset
   263
    update();
hgs
parents:
diff changeset
   264
}
hgs
parents:
diff changeset
   265