diff -r 2e2dc3d30ca8 -r 341166945d65 homescreenapp/examples/batterywidgetplugin/src/batterywidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/batterywidgetplugin/src/batterywidget.cpp Fri Jun 25 19:19:22 2010 +0300 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2010 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: Example of home screen widget +* +*/ + + +//#define OWN_TESTING + + +#include +#include +#include +#include "BatteryWidget.h" + + +/*! + \ingroup group_helloworld_widget + \class BatteryWidget + \brief Example implementation for home screen widget. + + BatteryWidget is derived from the HbWidget. It implements + needed functions for the home screen widget. + BatteryWidget uses QSystemDeviceInfo + to get device's battery status. + + Battery widget demonstrates the following home screen widget features: +
    +
  1. widget shape, see \ref ssection_shape
  2. +
  3. root path property, see \ref sssection_rootPath and + widget resources, see \ref section_widget_resources
  4. +
  5. error signal, see \ref sssection_error
  6. +
  7. onInitialize slot, see \ref sssection_oninitialize
  8. +
  9. onShow slot, see \ref sssection_onshow
  10. +
  11. onHide slot, see \ref sssection_onhide
  12. +
+ +*/ + + +/*! + \fn BatteryWidget::error() + Signal emitted if onInitialize fails to load batterywidget image. +*/ + + +/*! + Constructs a widget which is a child of \a parent, with widget flags set to \a flags. +*/ +BatteryWidget::BatteryWidget(QGraphicsItem* parent, Qt::WindowFlags flags) + : HbWidget(parent, flags) +{ + mDeviceInfo = new QSystemDeviceInfo(this); + mChargingTimer = new QTimer(this); + mBatteryValue = mDeviceInfo->batteryLevel(); +} + +/*! + Destructor +*/ +BatteryWidget::~BatteryWidget() +{ +} + +/*! + Returns rootPath property. +*/ +// Start of snippet 1 +QString BatteryWidget::rootPath() const +{ + return mRootPath; +} +// End of snippet 1 + +/*! + Sets rootPath property as \a rootPath. +*/ +// Start of snippet 2 +void BatteryWidget::setRootPath(QString &rootPath) +{ + mRootPath = rootPath; +} +// End of snippet 2 + + +/*! + Return bounding rect. +*/ +QRectF BatteryWidget::boundingRect() const +{ + QRectF currRect = rect(); + currRect.setHeight(mBatteryBackgroundBitmap.height()); + currRect.setWidth(mBatteryBackgroundBitmap.width()); + return currRect; +} + +/*! + Return shape. +*/ +// Start of snippet 3 +QPainterPath BatteryWidget::shape() const +{ + QPainterPath path; + QRectF ownRect = boundingRect(); + path.moveTo(ownRect.bottomRight()); + QRectF ownRect2 = ownRect.adjusted(-2,-1,1, ownRect.height()); + path.arcTo(ownRect2, 0, 180); + path.lineTo(ownRect2.right(), ownRect2.center().y()); + return path; +} +// End of snippet 3 + +/*! + Paint battery image. +*/ +void BatteryWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + if (!mUnifiedBatteryBitmap.isNull()) { + painter->drawPixmap(QPoint(0,0),mUnifiedBatteryBitmap); + } +} + +/*! + Called when widget is shown in the home screen. +*/ +// Start of snippet 4 +void BatteryWidget::onShow() +{ + stateChanged(); + prepareGeometryChange(); + resize(mBatteryBackgroundBitmap.size()); +} +// End of snippet 4 + +/*! + Called when widget is hidden from the home screen. +*/ +// Start of snippet 5 +void BatteryWidget::onHide() +{ + mDeviceInfo->disconnect(this); + mChargingTimer->stop(); + mChargingTimer->disconnect(this); +} +// End of snippet 5 + +/*! + Called when widget is initalized. Widget can start using its resources, + for example rootPath is set by system before it calls this. +*/ +// Start of snippet 6 +void BatteryWidget::onInitialize() +{ + mBatteryBackgroundBitmap.load(mRootPath + "/batterywidget_bg.png"); + if (mBatteryBackgroundBitmap.isNull()) { + // emit error if loading of the image failed. This will remove widget from the home screen. + emit error(); + } +} +// End of snippet 6 + +/*! + Called when widget is unintialized, nothing to do here +*/ +void BatteryWidget::onUninitialize() +{ +} + +/*! + Called when phone's battery level is changed. +*/ +void BatteryWidget::batteryLevelChanged ( int level ) +{ + mBatteryValue=level; + drawBatteryImage(); + update(); +} + +/*! + Called when phone's power state is changed. +*/ +void BatteryWidget::powerStateChanged(QSystemDeviceInfo::PowerState powerState) +{ + Q_UNUSED(powerState); + stateChanged(); +} + +/*! + Animates pointer when phone is charging. (TODO: animation fw?) +*/ +void BatteryWidget::updateChargingBatteryValue() +{ + mBatteryValue+=4; + if (mBatteryValue>100) mBatteryValue = 1; + drawBatteryImage(); + update(); +} + +/*! + Draws pointer on top of battery image +*/ +void BatteryWidget::drawBatteryImage() +{ + QRectF rect = mBatteryBackgroundBitmap.rect(); + + mUnifiedBatteryBitmap = QPixmap(rect.size().toSize()); + mUnifiedBatteryBitmap.fill(QColor(Qt::transparent)); + + QPainter painter(&mUnifiedBatteryBitmap); + + painter.drawPixmap(rect.toRect(), mBatteryBackgroundBitmap); + + static const QPoint pointerHand[3] = { + QPoint(3, 3), + QPoint(-3, 3), + QPoint(0, -80) + }; + + painter.translate(QPointF(rect.width()/2,rect.height()-10)); + painter.rotate(180.0 * (mBatteryValue)/100 + 270); + + painter.setPen(Qt::NoPen); + painter.setBrush(Qt::red); + painter.drawConvexPolygon(pointerHand, 3); +} + +/*! + Handles battery widget states. +*/ +void BatteryWidget::stateChanged() +{ + mDeviceInfo->disconnect(this); + mChargingTimer->stop(); + mChargingTimer->disconnect(this); + connect(mDeviceInfo, SIGNAL(powerStateChanged(QSystemDeviceInfo::PowerState)), SLOT(powerStateChanged(QSystemDeviceInfo::PowerState))); +#ifdef OWN_TESTING + connect(mChargingTimer, SIGNAL(timeout()), this, SLOT(updateChargingBatteryValue())); + mChargingTimer->start(1000); +#else + if (mDeviceInfo->currentPowerState() == QSystemDeviceInfo::WallPowerChargingBattery) { + connect(mChargingTimer, SIGNAL(timeout()), this, SLOT(updateChargingBatteryValue())); + mChargingTimer->start(500); + } else { + connect(mDeviceInfo, SIGNAL(batteryStatusChanged(QSystemDeviceInfo::BatteryStatus)), SLOT(batteryStatusChanged(QSystemDeviceInfo::BatteryStatus))); + connect(mDeviceInfo, SIGNAL(batteryLevelChanged(int)), SLOT(batteryLevelChanged(int))); + mBatteryValue = mDeviceInfo->batteryLevel(); + } +#endif + drawBatteryImage(); + update(); +} +