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