# HG changeset patch # User Pat Downey # Date 1277309106 -3600 # Node ID 29d7e0a3b7b2ae70733ee09a8ab55dc3dbd48960 # Parent 03646e8da489d883fdcb5d0acc8b159663ba3ba5# Parent 11a8fa9275d5ae6bc8a342981ed232c586ed7a77 Merge heads. diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/common.pri --- a/homescreenapp/common.pri Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/common.pri Wed Jun 23 17:05:06 2010 +0100 @@ -138,7 +138,7 @@ } } -!exists($${EPOCROOT}epoc32/include/mw/XQSettingsManager) { +!exists($${EPOCROOT}epoc32/include/platform/mw/XQSettingsManager) { DEFINES += NO_QT_EXTENSIONS } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/inc/localisedhellowidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/inc/localisedhellowidget.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,55 @@ +/* +* 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 +* +*/ + +#ifndef HELLOWORLDWIDGET_H +#define HELLOWORLDWIDGET_H + +#include + + +class HbPushButton; +class QGraphicsPixmapItem; +class HbIconItem; + +class LocalisedHelloWidget : public HbWidget +{ + Q_OBJECT + Q_PROPERTY(QString rootPath READ rootPath WRITE setRootPath) +public: + LocalisedHelloWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0); + ~LocalisedHelloWidget(); + +public: + QString rootPath()const; + void setRootPath(const QString &rootPath); +public slots: + void onInitialize(); + void onShow(); + void onHide(); +private slots: + void onButtonPressed(); + +private: + Q_DISABLE_COPY(LocalisedHelloWidget) + + HbPushButton *mButton; + QString mText; + QString mRootPath; + HbIconItem *mIcon; +}; + +#endif // HELLOWORLDWIDGET_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/inc/localisedhellowidgetplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/inc/localisedhellowidgetplugin.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,36 @@ +/* +* 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 localised home screen widget +* +*/ + +#ifndef LOCALISEDHELLOWIDGETPLUGIN_H +#define LOCALISEDHELLOWIDGETPLUGIN_H + +#include +#include + +QTM_USE_NAMESPACE +class LocalisedHelloWidgetPlugin : public QObject, public QServicePluginInterface +{ + Q_OBJECT + Q_INTERFACES(QtMobility::QServicePluginInterface) + +public: + QObject *createInstance(const QServiceInterfaceDescriptor &descriptor, + QServiceContext *context, + QAbstractSecuritySession *session); +}; + +#endif // LOCALISEDHELLOWIDGETPLUGIN_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.ts Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,46 @@ + + + + + + Text in widget's button when widget pressed + Hello world text + Hello world text + + localisedhellowidgetplugin + button + lo + False + + + Hello World description in application library + Home screen example widget + Home screen example widget + + localisedhellowidgetplugin + dblist_1_val + lo + False + + + Hello World title in application library + Hello world + Hello world + + localisedhellowidgetplugin + dblist_1 + lo + False + + + Text in widget's button + Hello world + Hello world + + localisedhellowidgetplugin + button + lo + False + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.ts Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,46 @@ + + + + + + Text in widget's button when widget pressed + Hello world text + Hello world text + + localisedhellowidgetplugin + button + lo + False + + + Hello World description in application library + Home screen example widget + Home screen example widget + + localisedhellowidgetplugin + dblist_1_val + lo + False + + + Hello World title in application library + Hello world + Hello world + + localisedhellowidgetplugin + dblist_1 + lo + False + + + Text in widget's button + Hello world + Hello world + + localisedhellowidgetplugin + button + lo + False + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.ts Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,46 @@ + + + + + + Text in widget's button when widget pressed + Hello world text + Hi dude text + + localisedhellowidgetplugin + button + lo + False + + + Hello World description in application library + Home screen example widget + Home screen example widget + + localisedhellowidgetplugin + dblist_1_val + lo + False + + + Hello World title in application library + Hello world + Hi dude + + localisedhellowidgetplugin + dblist_1 + lo + False + + + Text in widget's button + Hello world + Hi dude + + localisedhellowidgetplugin + button + lo + False + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.ts Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,46 @@ + + + + + + Text in widget's button when widget pressed + Hello world text + Moi kaikki! + + localisedhellowidgetplugin + button + lo + False + + + Hello World description in application library + Home screen example widget + Kotiruudun esimerkki vimpain + + localisedhellowidgetplugin + dblist_1_val + lo + False + + + Hello World title in application library + Hello world + Hei maailma + + localisedhellowidgetplugin + dblist_1 + lo + False + + + Text in widget's button + Hello world + Hei maailma + + localisedhellowidgetplugin + button + lo + False + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin.pro --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin.pro Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -14,6 +14,58 @@ # Description: Example of home screen widget # -TEMPLATE = subdirs -SUBDIRS = localisedhellowidgetplugin \ - localisedhellowidgetplugininstaller +TEMPLATE = lib +CONFIG += plugin mobility hb +MOBILITY = serviceframework + +HEADERS += ./inc/*.h +SOURCES += ./src/*.cpp + +INCLUDEPATH += ./inc + +symbian: { + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + TARGET.UID3 = 0x20022F80 + TARGET.EPOCALLOWDLLDATA=1 + TARGET.CAPABILITY = ALL -TCB + + DESTDIR = /private/20022F35/import/widgetregistry/20022F80 + + plugins.path = $${DESTDIR} + plugins.sources = $${TARGET}.dll + + widgetResources.path = $${DESTDIR} + widgetResources.sources += resource/$${TARGET}.xml + widgetResources.sources += resource/$${TARGET}.manifest + widgetResources.sources += resource/$${TARGET}.png + + localisedFiles.path = /resource/qt/translations + localisedFiles.sources += ./locales/*.qm + + DEPLOYMENT += plugins \ + widgetResources \ + localisedFiles +} + +win32: { + + CONFIG(debug, debug|release) { + SUBDIRPART = debug + } else { + SUBDIRPART = release + } + + PLUGIN_SUBDIR = /private/20022F35/import/widgetregistry/20022F80 + + DESTDIR = $$PWD/../../../../bin/$${SUBDIRPART}/$${PLUGIN_SUBDIR} + + manifest.path = $${DESTDIR} + manifest.files = ./resource/*.manifest ./resource/*.xml ./resource/*.png + + widgetLocalisation.path = $$PWD/../../../../bin/$${SUBDIRPART}/resource/qt/translations + widgetLocalisation.files += ./locales/*.qm + + INSTALLS += manifest widgetLocalisation +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/inc/localisedhellowidget.h --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/inc/localisedhellowidget.h Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/* -* 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 -* -*/ - -#ifndef HELLOWORLDWIDGET_H -#define HELLOWORLDWIDGET_H - -#include - - -class HbPushButton; -class QGraphicsPixmapItem; -class HbIconItem; - -class LocalisedHelloWidget : public HbWidget -{ - Q_OBJECT - Q_PROPERTY(QString rootPath READ rootPath WRITE setRootPath) -public: - LocalisedHelloWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0); - ~LocalisedHelloWidget(); - -public: - QRectF boundingRect() const; - QPainterPath shape() const; - - QString rootPath()const; - void setRootPath(const QString &rootPath); -public slots: - void onInitialize(); - void onShow(); - void onHide(); -private slots: - void onButtonPressed(); - -private: - Q_DISABLE_COPY(LocalisedHelloWidget) - - HbPushButton *mButton; - QString mText; - QString mRootPath; - HbIconItem *mIcon; -}; - -#endif // HELLOWORLDWIDGET_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/inc/localisedhellowidgetplugin.h --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/inc/localisedhellowidgetplugin.h Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* -* 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 localised home screen widget -* -*/ - -#ifndef LOCALISEDHELLOWIDGETPLUGIN_H -#define LOCALISEDHELLOWIDGETPLUGIN_H - -#include -#include - -QTM_USE_NAMESPACE -class LocalisedHelloWidgetPlugin : public QObject, public QServicePluginInterface -{ - Q_OBJECT - Q_INTERFACES(QtMobility::QServicePluginInterface) - -public: - QObject *createInstance(const QServiceInterfaceDescriptor &descriptor, - QServiceContext *context, - QAbstractSecuritySession *session); -}; - -#endif // LOCALISEDHELLOWIDGETPLUGIN_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.ts --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin.ts Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - - - - - - Hello World title - Hello World - Hello World - - helloview - title - he - False - - - Hello text - Hello! - Hello! - - helloview - info - he - False - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.ts --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_gb.ts Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - - - - - - Hello World title - Hello World - Hello World - - helloview - title - he - False - - - Hello text - Hello! - How do you do! - - helloview - info - he - False - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.ts --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_en_us.ts Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - - - - - - Hello World title - Hello World - Hi World - - helloview - title - he - False - - - Hello text - Hello! - Hi dude! - - helloview - info - he - False - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.qm Binary file homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.qm has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.ts --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/locales/localisedhellowidgetplugin_fi.ts Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - - - - - - Hello World title - Hello World - Hei maa! - - helloview - title - he - False - - - Hello text - Hello! - No moro! - - helloview - info - he - False - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/localisedhellowidgetplugin.pro --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/localisedhellowidgetplugin.pro Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -# -# 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 -# - -TEMPLATE = lib -CONFIG += plugin mobility hb -MOBILITY = serviceframework - -HEADERS += ./inc/*.h -SOURCES += ./src/*.cpp - -INCLUDEPATH += ./inc - -symbian: { - - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - - TARGET.UID3 = 0x20022F80 - TARGET.EPOCALLOWDLLDATA=1 - TARGET.CAPABILITY = ALL -TCB - - DESTDIR = /private/20022F35/import/widgetregistry/20022F80 - - plugins.path = $${DESTDIR} - plugins.sources = $${TARGET}.dll - - widgetResources.path = $${DESTDIR} - widgetResources.sources += resource/$${TARGET}.xml - widgetResources.sources += resource/$${TARGET}.manifest - widgetResources.sources += resource/$${TARGET}.png - - localisedFiles.path = /resource/qt/translations - localisedFiles.sources += ./locales/*.qm - - DEPLOYMENT += plugins \ - widgetResources \ - localisedFiles -} - -win32: { - - CONFIG(debug, debug|release) { - SUBDIRPART = debug - } else { - SUBDIRPART = release - } - - PLUGIN_SUBDIR = /private/20022F35/import/widgetregistry/20022F80 - - DESTDIR = $$PWD/../../../../../bin/$${SUBDIRPART}/$${PLUGIN_SUBDIR} - - manifest.path = $${DESTDIR} - manifest.files = ./resource/*.manifest ./resource/*.xml ./resource/*.png - - widgetLocalisation.path = $$PWD/../../../../../bin/$${SUBDIRPART}/resource/qt/translations - widgetLocalisation.files += ./locales/*.qm - - INSTALLS += manifest widgetLocalisation -} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.manifest --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.manifest Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.png Binary file homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - localisedhellowidgetplugin - localisedhellowidgetplugin - Example widget - - com.nokia.symbian.IHomeScreenWidget - 1.0 - Example of localised widget - - localisedhellowidgetplugin.png - Hello - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml_for_sisx --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml_for_sisx Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - localisedhellowidgetplugin - c:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin - Localisation example widget - - com.nokia.symbian.IHomeScreenWidget - 1.0 - Example of localised widget - - localisedhellowidgetplugin.png - Hello - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/src/localisedhellowidget.cpp --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/src/localisedhellowidget.cpp Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* -* 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 -* -*/ - -#include -#include -#include -#include -#include -#include -#include "localisedhellowidget.h" - -/*! - \ingroup group_helloworld_widget - \class LocalisedHelloWidget - \brief Example implementation for home screen widget. - - LocalisedHelloWidget derived from the HbWidget and implements - needed functions for the home screen widget. -*/ - -/*! - Constructs a widget which is a child of \a parent, with widget flags set to \a flags. -*/ -LocalisedHelloWidget::LocalisedHelloWidget(QGraphicsItem* parent, Qt::WindowFlags flags) - : HbWidget(parent, flags),mIcon(0) -{ - QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); - setPreferredSize(200,100); - setLayout(layout); - mButton = new HbPushButton(); - layout->addItem(mButton); - - connect(mButton,SIGNAL(pressed()),SLOT(onButtonPressed())); - - - -} - -/*! - Destructor -*/ -LocalisedHelloWidget::~LocalisedHelloWidget() -{ - -} - -/*! - Return bounding rect -*/ -QRectF LocalisedHelloWidget::boundingRect() const -{ - return childrenBoundingRect(); -} - -/*! - Return shape -*/ -QPainterPath LocalisedHelloWidget::shape() const -{ - QPainterPath path; - path.addRect(boundingRect()); - return path; -} -QString LocalisedHelloWidget::rootPath()const -{ - return mRootPath; -} - -void LocalisedHelloWidget::setRootPath(const QString &rootPath) -{ - mRootPath = rootPath; -} - -void LocalisedHelloWidget::onInitialize() -{ - // localisation can be used now - mText = hbTrId("localisedhellowidgetplugin_txt_helloview_info_hello"); - mButton->setText(hbTrId("localisedhellowidgetplugin_txt_helloview_title_hello_world")); - // roothPath is set thus we can use it - QString iconPath = QDir::toNativeSeparators(mRootPath + "/localisedhellowidgetplugin.png"); - mIcon = new HbIconItem(iconPath); - static_cast(layout())->addItem(mIcon); - - -} - -/*! - Called when widget is shown in the home screen -*/ -void LocalisedHelloWidget::onShow() -{ -} - -/*! - Called when widget is hidden from the home screen -*/ -void LocalisedHelloWidget::onHide() -{ -} - -void LocalisedHelloWidget::onButtonPressed() -{ - QString tmp = mButton->text(); - mButton->setText(mText); - mText = tmp; -} - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/src/localisedhellowidgettplugin.cpp --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugin/src/localisedhellowidgettplugin.cpp Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -/* -* 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 localised home screen widget -* -*/ - -#include -#include -#include - -#include "localisedhellowidgetplugin.h" -#include "localisedhellowidget.h" - -/** - @page page_creating_widget_plugin Creating Home Screen Widget Plugin - - Widgets are exposed to the home screen through QT Service Framework. - Widget plugins are implemented according to - Qt service framework plugin model. - - See @ref page_nativewidgetmodel for the instructions how to create widget for the home screen. - - The steps to create a widget plugin are: -
    -
  1. Declare a plugin class that inherits from QObject and from the \c QServicePluginInterface interface. - -
  2. Use the Q_INTERFACES() macro to tell Qt's meta-object system about the \c QServicePluginInterface interface. - -
  3. Export the plugin using the Q_EXPORT_PLUGIN2() macro. - -
  4. Build the plugin using an suitable .pro file. See @ref page_deploying_widget_plugin -
- - An example (full example source code can be found from section @ref page_nativewidgetmodel): - - Each widget plugin has a XML file that allows searching widgets through QT service framework without first loading it. - The XML file contains information on widgets inside the plugin: - - \li \c name The name of the plugin binary. - \li \c filepath The absolute path and name of plugin without suffix - \li \c interface name Uniquely identifies the widget. - \li \c title Widget's human-readable name. - \li \c iconuri URI of the widget's icon image file. - - Example: XML for a widget plugin. - - @code - - - helloworldwidgetplugin - helloworldwidgetplugin - Example widget - - com.nokia.symbian.IHomeScreenWidget - 1.0 - Example of home screen widget - - helloworldwidgetplugin.png - HelloWorld - - - @endcode -*/ - -/** - @page page_deploying_widget_plugin Deploying Home Screen Widget Plugin - - Widget's binaries and xml file(s) must be deployed to correct folders on emulator and in target. - Below are the needed .pro file for the \c helloworldwidgetplugin. - - For example: - - @code - # helloworldwidgetplugin.pro - - TEMPLATE = lib - CONFIG += plugin mobility hb - MOBILITY = serviceframework - - HEADERS += ./inc/ .h - SOURCES += ./src/ .cpp - - DESTDIR = $${EPOCROOT}epoc32/data/c/private/20022F35/import/widgetregistry/20022F7E - - INCLUDEPATH += ./inc - - symbian: { - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - - TARGET.UID3 = 0x20022F7E - TARGET.EPOCALLOWDLLDATA=1 - TARGET.CAPABILITY = ALL -TCB - - plugins.path = $${DESTDIR} - plugins.sources = $${TARGET}.dll - - widgetResources.path = $${DESTDIR} - widgetResources.sources += resource/$${TARGET}.xml - widgetResources.sources += resource/$${TARGET}.manifest - widgetResources.sources += resource/$${TARGET}.png - - DEPLOYMENT += plugins \ - widgetResources - } - - @endcode - - For detailed information on DEPLOYMENT macro, see here. -*/ - -/*! - \ingroup group_helloworld_widget - \class HelloWorldWidgetPlugin - \brief Example implementation for home screen widget plugin. -*/ - -/*! - Initialize plugin for hello world widget. Contains necessary information about - the hello world widget that it can be loaded through QT Service Framework. -*/ -QObject *LocalisedHelloWidgetPlugin::createInstance(const QServiceInterfaceDescriptor &descriptor, - QServiceContext *context, - QAbstractSecuritySession *session) -{ - Q_UNUSED(context); - Q_UNUSED(session); - - if (descriptor.interfaceName() == QLatin1String("com.nokia.symbian.IHomeScreenWidget")) { - return new LocalisedHelloWidget(); - } else { - return 0; - } -} - -Q_EXPORT_PLUGIN2(localisedhellowidgetplugin, LocalisedHelloWidgetPlugin) diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugininstaller/localisedhellowidgetplugininstaller.cpp --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugininstaller/localisedhellowidgetplugininstaller.cpp Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* -* 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 -* -*/ - -#include -#include -#include - -QTM_USE_NAMESPACE - -const char xml[] = "C:/data/widgets/servicefw/localisedhellowidgetplugin.xml"; - -int main(int argc, char *argv[]) -{ - QCoreApplication app(argc, argv); - - QServiceManager s; - - if (QFile::exists(xml)) { - s.addService(xml); - } else { - s.removeService("localisedhellowidgetplugin"); - } -} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugininstaller/localisedhellowidgetplugininstaller.pro --- a/homescreenapp/examples/localisedhellowidgetplugin/localisedhellowidgetplugininstaller/localisedhellowidgetplugininstaller.pro Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -# -# 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 -# - -TEMPLATE = app - -QT = core -CONFIG += no_icon - -CONFIG += mobility -MOBILITY = serviceframework - -SOURCES += localisedhellowidgetplugininstaller.cpp - -symbian { - TARGET.CAPABILITY = ALL -TCB -} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.manifest --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.manifest Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,10 @@ + + + localisedhellowidgetplugin + txt_localisedhellowidgetplugin_dblist_hello_world_title + txt_localisedhellowidgetplugin_dblist_hello_world_desc + localisedhellowidgetplugin.png + false + localisedhellowidgetplugin.xml + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.png Binary file homescreenapp/examples/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,10 @@ + + + localisedhellowidgetplugin + localisedhellowidgetplugin + + com.nokia.symbian.IHomeScreenWidget + 1.0 + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/sis/localisedhellowidgetplugin.pkg --- a/homescreenapp/examples/localisedhellowidgetplugin/sis/localisedhellowidgetplugin.pkg Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/examples/localisedhellowidgetplugin/sis/localisedhellowidgetplugin.pkg Wed Jun 23 17:05:06 2010 +0100 @@ -33,15 +33,16 @@ [0x102752AE],0,0,0,{"S60ProductID"} [0x1028315F],0,0,0,{"S60ProductID"} -"/epoc32/release/armv5/urel/localisedhellowidgetplugin.dll" - "!:/sys/bin/localisedhellowidgetplugin.dll" -"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin" -"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest" -"../localisedhellowidgetplugin/resource/localisedhellowidgetplugin.xml_for_sisx" - "C:/data/widgets/servicefw/localisedhellowidgetplugin.xml" -"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.png" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.png" +"../resource/localisedhellowidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest",FM,"application/hs-widget-uninstall+xml",RR,RW -"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin.qm" -"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_fi.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_fi.qm" -"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_en_us.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_en_us.qm" -"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_en_gb.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_en_gb.qm" +"/epoc32/release/armv5/urel/localisedhellowidgetplugin.dll" - "!:/sys/bin/localisedhellowidgetplugin.dll" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest" +"../resource/localisedhellowidgetplugin.xml" - "!:/data/widgets/servicefw/localisedhellowidgetplugin.xml" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.png" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.png" -"/epoc32/release/armv5/urel/localisedhellowidgetplugininstaller.exe" - "!:/sys/bin/localisedhellowidgetplugininstaller.exe", FR, RB, RW +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin.qm" +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_fi.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_fi.qm" +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_en_us.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_en_us.qm" +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_en_gb.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_en_gb.qm" + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/sis/localisedhellowidgetplugin_winscw.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/sis/localisedhellowidgetplugin_winscw.pkg Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,48 @@ +; +; 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: +; + +; Language +&EN + +; SIS header: name, uid, version +#{"localisedhellowidgetplugin"},(0x20022F80),1,0,0 + +; Localised Vendor name +%{"Vendor"} + +; Unique Vendor name +:"Vendor" + +; Manual PKG pre-rules from PRO files +; Default HW/platform dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} + +"../resource/localisedhellowidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest",FM,"application/hs-widget-uninstall+xml",RR,RW + +"/epoc32/release/winscw/udeb/localisedhellowidgetplugin.dll" - "!:/sys/bin/localisedhellowidgetplugin.dll" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.qtplugin" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.manifest" +"../resource/localisedhellowidgetplugin.xml" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.xml" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.png" - "!:/private/20022F35/import/widgetregistry/20022F80/localisedhellowidgetplugin.png" + +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin.qm" +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_fi.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_fi.qm" +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_en_us.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_en_us.qm" +"/epoc32/data/z/resource/qt/translations/localisedhellowidgetplugin_en_gb.qm" - "!:/resource/qt/translations/localisedhellowidgetplugin_en_gb.qm" + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/src/localisedhellowidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/src/localisedhellowidget.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,115 @@ +/* +* 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 +* +*/ + +#include +#include +#include +#include +#include +#include +#include "localisedhellowidget.h" + +/*! + \ingroup group_helloworld_widget + \class LocalisedHelloWidget + \brief Example implementation for home screen widget. + + LocalisedHelloWidget derived from the HbWidget and implements + needed functions for the home screen widget to demonstrate widget localisation. +*/ + +/*! + Constructs a widget which is a child of \a parent, with widget flags set to \a flags. +*/ +LocalisedHelloWidget::LocalisedHelloWidget(QGraphicsItem* parent, Qt::WindowFlags flags) + : HbWidget(parent, flags),mIcon(0) +{ + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); + setPreferredSize(200,100); + setLayout(layout); + mButton = new HbPushButton(); + layout->addItem(mButton); + + connect(mButton,SIGNAL(pressed()),SLOT(onButtonPressed())); +} + +/*! + Destructor +*/ +LocalisedHelloWidget::~LocalisedHelloWidget() +{ + +} + +/*! + Root path for widget's resources +*/ +QString LocalisedHelloWidget::rootPath()const +{ + return mRootPath; +} + +/*! + Set's widget root path as \a rootPath +*/ +void LocalisedHelloWidget::setRootPath(const QString &rootPath) +{ + mRootPath = rootPath; +} + +/*! + Called when widget is initialized +*/ +void LocalisedHelloWidget::onInitialize() +{ + // localisation can be used now + mText = hbTrId("txt_localisedhellowidgetplugin_button_hello_world2"); + QString testing = hbTrId("txt_localisedhellowidgetplugin_button_hello_world2"); + testing = hbTrId("txt_localisedhellowidgetplugin_button_hello_world1"); + testing = hbTrId("txt_localisedhellowidgetplugin_dblist_hello_world_title"); + testing = hbTrId("txt_localisedhellowidgetplugin_dblist_hello_world_desc"); + mButton->setText(hbTrId("txt_localisedhellowidgetplugin_button_hello_world1")); + // roothPath is set thus we can use it + QString iconPath = QDir::toNativeSeparators(mRootPath + "/localisedhellowidgetplugin.png"); + mIcon = new HbIconItem(iconPath); + static_cast(layout())->addItem(mIcon); +} + +/*! + Called when widget is shown in the home screen +*/ +void LocalisedHelloWidget::onShow() +{ +} + +/*! + Called when widget is hidden from the home screen +*/ +void LocalisedHelloWidget::onHide() +{ +} + +/*! + Called when button is pressed, toggles between two localised strings. +*/ +void LocalisedHelloWidget::onButtonPressed() +{ + QString tmp = mButton->text(); + mButton->setText(mText); + mText = tmp; +} + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/localisedhellowidgetplugin/src/localisedhellowidgettplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/localisedhellowidgetplugin/src/localisedhellowidgettplugin.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,146 @@ +/* +* 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 localised home screen widget +* +*/ + +#include +#include +#include + +#include "localisedhellowidgetplugin.h" +#include "localisedhellowidget.h" + +/** + @page page_creating_widget_plugin Creating Home Screen Widget Plugin + + Widgets are exposed to the home screen through QT Service Framework. + Widget plugins are implemented according to + Qt service framework plugin model. + + See @ref page_nativewidgetmodel for the instructions how to create widget for the home screen. + + The steps to create a widget plugin are: +
    +
  1. Declare a plugin class that inherits from QObject and from the \c QServicePluginInterface interface. + +
  2. Use the Q_INTERFACES() macro to tell Qt's meta-object system about the \c QServicePluginInterface interface. + +
  3. Export the plugin using the Q_EXPORT_PLUGIN2() macro. + +
  4. Build the plugin using an suitable .pro file. See @ref page_deploying_widget_plugin +
+ + An example (full example source code can be found from section @ref page_nativewidgetmodel): + + Each widget plugin has a XML file that allows searching widgets through QT service framework without first loading it. + The XML file contains information on widgets inside the plugin: + + \li \c name The name of the plugin binary. + \li \c filepath The absolute path and name of plugin without suffix + \li \c interface name Uniquely identifies the widget. + \li \c title Widget's human-readable name. + \li \c iconuri URI of the widget's icon image file. + + Example: XML for a widget plugin. + + @code + + + helloworldwidgetplugin + helloworldwidgetplugin + Example widget + + com.nokia.symbian.IHomeScreenWidget + 1.0 + Example of home screen widget + + helloworldwidgetplugin.png + HelloWorld + + + @endcode +*/ + +/** + @page page_deploying_widget_plugin Deploying Home Screen Widget Plugin + + Widget's binaries and xml file(s) must be deployed to correct folders on emulator and in target. + Below are the needed .pro file for the \c helloworldwidgetplugin. + + For example: + + @code + # helloworldwidgetplugin.pro + + TEMPLATE = lib + CONFIG += plugin mobility hb + MOBILITY = serviceframework + + HEADERS += ./inc/ .h + SOURCES += ./src/ .cpp + + DESTDIR = $${EPOCROOT}epoc32/data/c/private/20022F35/import/widgetregistry/20022F7E + + INCLUDEPATH += ./inc + + symbian: { + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + TARGET.UID3 = 0x20022F7E + TARGET.EPOCALLOWDLLDATA=1 + TARGET.CAPABILITY = ALL -TCB + + plugins.path = $${DESTDIR} + plugins.sources = $${TARGET}.dll + + widgetResources.path = $${DESTDIR} + widgetResources.sources += resource/$${TARGET}.xml + widgetResources.sources += resource/$${TARGET}.manifest + widgetResources.sources += resource/$${TARGET}.png + + DEPLOYMENT += plugins \ + widgetResources + } + + @endcode + + For detailed information on DEPLOYMENT macro, see here. +*/ + +/*! + \ingroup group_helloworld_widget + \class HelloWorldWidgetPlugin + \brief Example implementation for home screen widget plugin. +*/ + +/*! + Initialize plugin for hello world widget. Contains necessary information about + the hello world widget that it can be loaded through QT Service Framework. +*/ +QObject *LocalisedHelloWidgetPlugin::createInstance(const QServiceInterfaceDescriptor &descriptor, + QServiceContext *context, + QAbstractSecuritySession *session) +{ + Q_UNUSED(context); + Q_UNUSED(session); + + if (descriptor.interfaceName() == QLatin1String("com.nokia.symbian.IHomeScreenWidget")) { + return new LocalisedHelloWidget(); + } else { + return 0; + } +} + +Q_EXPORT_PLUGIN2(localisedhellowidgetplugin, LocalisedHelloWidgetPlugin) diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/inc/pannablewidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/inc/pannablewidget.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,41 @@ +/* +* 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 +* +*/ + +#ifndef PANNABLEWIDGET_H +#define PANNABLEWIDGET_H + +#include + +class PannableWidget : public HbWidget +{ + Q_OBJECT + +public: + PannableWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0); + ~PannableWidget(); + + Q_INVOKABLE bool isPannable(QGraphicsSceneMouseEvent *event); +public slots: + void onShow(); + void onHide(); +private: + QGraphicsItem *findChildItemByName(QGraphicsItem *item, const QString &name); +private: + Q_DISABLE_COPY(PannableWidget) +}; + +#endif // PANNABLEWIDGET_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/inc/pannablewidgetplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/inc/pannablewidgetplugin.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,36 @@ +/* +* 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 +* +*/ + +#ifndef PANNABLEWIDGETPLUGIN_H +#define PANNABLEWIDGETPLUGIN_H + +#include +#include + +QTM_USE_NAMESPACE +class PannableWidgetPlugin : public QObject, public QServicePluginInterface +{ + Q_OBJECT + Q_INTERFACES(QtMobility::QServicePluginInterface) + +public: + QObject *createInstance(const QServiceInterfaceDescriptor &descriptor, + QServiceContext *context, + QAbstractSecuritySession *session); +}; + +#endif // PANNABLEWIDGETPLUGIN_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/pannablewidgetplugin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/pannablewidgetplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,64 @@ +# +# 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 +# + +TEMPLATE = lib +CONFIG += plugin mobility hb +MOBILITY = serviceframework + +HEADERS += ./inc/*.h +SOURCES += ./src/*.cpp + +INCLUDEPATH += ./inc + +symbian: { + + DESTDIR = /private/20022F35/import/widgetregistry/20022F7C + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + TARGET.UID3 = 0x20022F7C + TARGET.EPOCALLOWDLLDATA=1 + TARGET.CAPABILITY = ALL -TCB + + plugins.path = $${DESTDIR} + plugins.sources = $${TARGET}.dll + + widgetResources.path = $${DESTDIR} + widgetResources.sources += resource/$${TARGET}.xml + widgetResources.sources += resource/$${TARGET}.manifest + widgetResources.sources += resource/$${TARGET}.png + + DEPLOYMENT += plugins \ + widgetResources +} + +win32: { + + CONFIG(debug, debug|release) { + SUBDIRPART = debug + } else { + SUBDIRPART = release + } + + PLUGIN_SUBDIR = /private/20022F35/import/widgetregistry/20022F7C + + DESTDIR = $$PWD/../../../../bin/$${SUBDIRPART}/$${PLUGIN_SUBDIR} + + manifest.path = $${DESTDIR} + manifest.files = ./resource/*.manifest ./resource/*.xml ./resource/*.png + + INSTALLS += manifest + +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/resource/pannablewidgetplugin.manifest --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/resource/pannablewidgetplugin.manifest Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,9 @@ + + + pannablewidgetplugin + Pannable widget + Home screen example widget + pannablewidgetplugin.png + false + pannablewidgetplugin.xml + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/resource/pannablewidgetplugin.png Binary file homescreenapp/examples/pannablewidgetplugin/resource/pannablewidgetplugin.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/resource/pannablewidgetplugin.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/resource/pannablewidgetplugin.xml Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,12 @@ + + + pannablewidgetplugin + pannablewidgetplugin + Example widget + + com.nokia.symbian.IHomeScreenWidget + 1.0 + Example of home screen widget + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/sis/pannablewidgetplugin.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/sis/pannablewidgetplugin.bat Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,30 @@ +@rem +@rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +@rem All rights reserved. +@rem This component and the accompanying materials are made available +@rem under the terms of "Eclipse Public License v1.0" +@rem which accompanies this distribution, and is available +@rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +@rem +@rem Initial Contributors: +@rem Nokia Corporation - initial contribution. +@rem +@rem Contributors: +@rem +@rem Description: +@rem +@echo off + +if exist pannablewidgetplugin.sisx del pannablewidgetplugin.sisx + +makesis pannablewidgetplugin.pkg +signsis pannablewidgetplugin.sis pannablewidgetplugin.sisx ../../../sis/rd.cer ../../../sis/rd-key.pem + +if exist pannablewidgetplugin.sisx ( +echo pannablewidgetplugin.sisx creation SUCCEEDED +del pannablewidgetplugin.sis +) + +if not exist pannablewidgetplugin.sisx ( +echo pannablewidgetplugin.sisx creation FAILED +) \ No newline at end of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/sis/pannablewidgetplugin.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/sis/pannablewidgetplugin.pkg Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,44 @@ +; +; 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: +; + +; Language +&EN + +; SIS header: name, uid, version +#{"pannablewidgetplugin"},(0x20022F7C),1,0,0 + +; Localised Vendor name +%{"Vendor"} + +; Unique Vendor name +:"Vendor" + +; Manual PKG pre-rules from PRO files +; Default HW/platform dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} + + +"../resource/pannablewidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.manifest",FM,"application/hs-widget-uninstall+xml",RR,RW + +"/epoc32/release/armv5/urel/pannablewidgetplugin.dll" - "!:/sys/bin/pannablewidgetplugin.dll" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.qtplugin" +"../resource/pannablewidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.manifest" +"../resource/pannablewidgetplugin.xml" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.xml" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.png" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.png" + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/sis/pannablewidgetplugin_winscw.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/sis/pannablewidgetplugin_winscw.pkg Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,43 @@ +; +; 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: +; + +; Language +&EN + +; SIS header: name, uid, version +#{"pannablewidgetplugin"},(0x20022F7C),1,0,0 + +; Localised Vendor name +%{"Vendor"} + +; Unique Vendor name +:"Vendor" + +; Manual PKG pre-rules from PRO files +; Default HW/platform dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} + + +"../resource/pannablewidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.manifest",FM,"application/hs-widget-uninstall+xml",RR,RW + +"/epoc32/release/winscw/udeb/pannablewidgetplugin.dll" - "!:/sys/bin/pannablewidgetplugin.dll" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.qtplugin" +"../resource/pannablewidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.manifest" +"../resource/pannablewidgetplugin.xml" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.xml" +"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.png" - "!:/private/20022F35/import/widgetregistry/20022F7C/pannablewidgetplugin.png" diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/src/pannablewidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/src/pannablewidget.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,132 @@ +/* +* 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 +* +*/ +#include + +#include +#include +#include +#include +#include +#include "pannablewidget.h" + + + +/*! + \ingroup group_pannablewidget + \class PannableWidget + \brief Example implementation for pannable home screen widget. + + Pannable widget demostrates usage of horizontal pan gesture instead of Home Screen using it for + page change. + + To enable horizontal pan gesture widget need to implement isPannable() function. Widget should return true if pannable item's + pan region contains event position. +*/ + + +const int ItemName = 0xfffe; + +/*! + Constructs a widget which is a child of \a parent, with widget flags set to \a flags. +*/ +PannableWidget::PannableWidget(QGraphicsItem* parent, Qt::WindowFlags flags) + : HbWidget(parent, flags) +{ + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); + layout->setContentsMargins(0.0, 0.0, 0.0, 0.0); + setLayout(layout); + + HbPushButton *button = new HbPushButton("Jenson Button"); + button->setPreferredSize(QSizeF(200.0,20.0)); + layout->addItem(button); + + HbSlider *slider = new HbSlider(Qt::Horizontal); + slider->setData(ItemName,QLatin1String("slider")); + slider->setRange(0,10); + slider->setValue(5); + layout->addItem(slider); + + + QGraphicsRectItem *background = new QGraphicsRectItem(); + background->setBrush(QBrush(QColor(0x9acd32))); + setBackgroundItem(background); + + resize(200.0, 100.0); + background->setRect(rect()); + +} + +/*! + Destructor +*/ +PannableWidget::~PannableWidget() +{ +} +/*! + Called by Home Screen when pan event is recognized. Given \a event + can be used to check whether pannable item contains event position. +*/ +bool PannableWidget::isPannable(QGraphicsSceneMouseEvent *event) +{ + bool ret(false); + // Take position in scene coordinates + QPointF position = event->buttonDownScenePos(Qt::LeftButton); + // find pannable item + QGraphicsItem* item = findChildItemByName(this,"slider"); + // check whether it is event is inside it + if (item && item->sceneBoundingRect().contains(position)) { + ret = true; + } + return ret; +} +/*! + Find \a item childs by given \a name. Uses recursion. +*/ +QGraphicsItem *PannableWidget::findChildItemByName(QGraphicsItem *item, const QString &name) +{ + if (!item) return NULL; + + QList children = item->childItems(); + foreach (QGraphicsItem *child, children) { + if(name == child->data(ItemName).toString()) { + return child; + } + } + // do recursive search + foreach (QGraphicsItem *child, children) { + QGraphicsItem* itemFromChild = findChildItemByName(child,name); + if (itemFromChild) { + return itemFromChild; + } + } + return NULL; +} + + +/*! + Called when widget is shown in the home screen +*/ +void PannableWidget::onShow() +{ +} + +/*! + Called when widget is hidden from the home screen +*/ +void PannableWidget::onHide() +{ +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/examples/pannablewidgetplugin/src/pannablewidgetplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/examples/pannablewidgetplugin/src/pannablewidgetplugin.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,60 @@ +/* +* 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 +* +*/ + +#include +#include +#include + +#include "pannablewidgetplugin.h" +#include "pannablewidget.h" + +/** + @page page_creating_pannable_widget Creating pannable Home Screen Widget Plugin + + When widget need to use horizontal pan gesture itself, e.g when slider is used + it must implement bool isPannable(QGraphicsMouseEvent *) function. + + Home Screen will call this when it recognize a pan gesture on a widget. + By default, horizontal pan gesture is used to switch pages, but if isPannable() + returns true, event is not filtered by Home Screen. +*/ + +/*! + \ingroup group_pannablewidget + \class PannableWidgetPlugin + \brief Example implementation for home screen widget plugin. +*/ + +/*! + Initialize plugin for pannable widget. Contains necessary information about + the pannable widget that it can be loaded through QT Service Framework. +*/ +QObject *PannableWidgetPlugin::createInstance(const QServiceInterfaceDescriptor &descriptor, + QServiceContext *context, + QAbstractSecuritySession *session) +{ + Q_UNUSED(context); + Q_UNUSED(session); + + if (descriptor.interfaceName() == QLatin1String("com.nokia.symbian.IHomeScreenWidget")) { + return new PannableWidget(); + } else { + return 0; + } +} + +Q_EXPORT_PLUGIN2(pannablewidgetplugin, PannableWidgetPlugin) diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/conf/base/confml/homescreendb.confml --- a/homescreenapp/hsapplication/conf/base/confml/homescreendb.confml Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsapplication/conf/base/confml/homescreendb.confml Wed Jun 23 17:05:06 2010 +0100 @@ -3,14 +3,6 @@ - - - - - - - - @@ -38,17 +30,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 8 - 39 - 48 - 8.75 - 8.75 - 1hsclockwidgetplugin 2hsdialerwidgetplugin 3ftuhswidget @@ -92,6 +124,50 @@ 10 21 32 + + 1 + 1 + 30.0 + 6.0 + 0.0 + 500 + + + Sensitive + ItemPick + ItemDrop + BounceEffect + ItemMoveOver + ItemDrop + BasicItem + Basic + BasicItem + ItemMoveOver + + + 20 + 16 + 500 + 500 + 60 + 8 + 200 + 800 + 200 + 200 + 700 + 200 + 200 + 3 + 8 + 39 + 48 + 8.75 + 8.75 + + 1 + 17.91 + \ No newline at end of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/conf/base/implml/homescreendb_templates/create.sql --- a/homescreenapp/hsapplication/conf/base/implml/homescreendb_templates/create.sql Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsapplication/conf/base/implml/homescreendb_templates/create.sql Wed Jun 23 17:05:06 2010 +0100 @@ -2,13 +2,7 @@ CREATE TABLE Scene ( id INTEGER PRIMARY KEY, portraitWallpaper TEXT, - landscapeWallpaper TEXT, - defaultPageId INTEGER, - maximumPageCount INTEGER, - maximumWidgetHeight REAL, - maximumWidgetWidth REAL, - minimumWidgetHeight REAL, - minimumWidgetWidth REAL); + landscapeWallpaper TEXT); DROP TABLE IF EXISTS Pages; CREATE TABLE Pages ( @@ -38,3 +32,51 @@ widgetId INTEGER, UNIQUE(widgetId, key) ON CONFLICT REPLACE, FOREIGN KEY(widgetId) REFERENCES Widgets(id) ON DELETE CASCADE); + +DROP TABLE IF EXISTS SnapConfiguration; +CREATE TABLE SnapConfiguration ( + snappingEnabled INTEGER, + showEffects INTEGER, + snapForce REAL, + snapGap REAL, + borderGap REAL, + timeout INTEGER); + +DROP TABLE IF EXISTS FeedbackConfiguration; +CREATE TABLE FeedbackConfiguration ( + pageChangeFeedbackType TEXT, + widgetPickFeedbackType TEXT, + widgetDropFeedbackType TEXT, + widgetRepositionFeedbackType TEXT, + widgetOverTrashbinFeedbackType TEXT, + widgetDropToTrashbinFeedbackType TEXT, + shortcutWidgetTapFeedbackType TEXT, + widgetMoveBlockedFeedbackType TEXT, + clockWidgetTapFeedbackType TEXT, + widgetSnappingFeedbackType TEXT); + +DROP TABLE IF EXISTS GeneralConfiguration; +CREATE TABLE GeneralConfiguration ( + bounceEffect INTEGER, + tapAndHoldDistance REAL, + widgetTapAndHoldTimeout INTEGER, + sceneTapAndHoldTimeout INTEGER, + pageChangeZoneWidth REAL, + pageIndicatorSpacing REAL, + pageChangeAnimationDuration INTEGER, + pageChangeZoneAnimationDuration INTEGER, + pageChangeZoneReverseAnimationDuration INTEGER, + pageRemovedAnimationDuration INTEGER, + newPageAddedAnimationDuration INTEGER, + widgetDragEffectDuration INTEGER, + widgetDropEffectDuration INTEGER, + boundaryFeedbackEffectDistance INTEGER, + defaultPageId INTEGER, + maximumPageCount INTEGER, + maximumWidgetHeight REAL, + maximumWidgetWidth REAL, + minimumWidgetHeight REAL, + minimumWidgetWidth REAL, + shortcutLabelsVisible INTEGER, + pageChangePanDistance REAL); + \ No newline at end of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/conf/base/implml/homescreendb_templates/fill.sql --- a/homescreenapp/hsapplication/conf/base/implml/homescreendb_templates/fill.sql Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsapplication/conf/base/implml/homescreendb_templates/fill.sql Wed Jun 23 17:05:06 2010 +0100 @@ -1,12 +1,6 @@ {%- set portraitWallpaper = feat_tree.HomeScreenDbSettings.portraitWallpaper._value or '' -%} {%- set landscapeWallpaper = feat_tree.HomeScreenDbSettings.landscapeWallpaper._value or '' -%} -{%- set defaultPageId = feat_tree.HomeScreenDbSettings.defaultPageId._value -%} -{%- set maximumPageCount = feat_tree.HomeScreenDbSettings.maximumPageCount._value -%} -{%- set maximumWidgetHeight = feat_tree.HomeScreenDbSettings.maximumWidgetHeight._value -%} -{%- set maximumWidgetWidth = feat_tree.HomeScreenDbSettings.maximumWidgetWidth._value -%} -{%- set minimumWidgetHeight = feat_tree.HomeScreenDbSettings.minimumWidgetHeight._value -%} -{%- set minimumWidgetWidth = feat_tree.HomeScreenDbSettings.minimumWidgetWidth._value -%} -INSERT INTO Scene (portraitWallpaper, landscapeWallpaper, defaultPageId, maximumPageCount, maximumWidgetHeight, maximumWidgetWidth, minimumWidgetHeight, minimumWidgetWidth) VALUES ('{{portraitWallpaper}}', '{{landscapeWallpaper}}', {{defaultPageId}}, {{maximumPageCount}}, {{maximumWidgetHeight}}, {{maximumWidgetWidth}}, {{minimumWidgetHeight}}, {{minimumWidgetWidth}}); +INSERT INTO Scene (portraitWallpaper, landscapeWallpaper) VALUES ('{{portraitWallpaper}}', '{{landscapeWallpaper}}'); {% for index in range(feat_tree.HomeScreenDbSettings.Pages._value|length) -%} {%- set id = feat_tree.HomeScreenDbSettings.Pages.id._value[index] -%} @@ -39,3 +33,48 @@ INSERT INTO WidgetPreferences (key, value, widgetId) VALUES ('{{key}}', '{{value}}', {{widgetId}}); {% endfor %} + +{%- set snappingEnabled = feat_tree.HomeScreenDbSettings.SnapConfiguration.snappingEnabled._value -%} +{%- set showEffects = feat_tree.HomeScreenDbSettings.SnapConfiguration.showEffects._value -%} +{%- set snapForce = feat_tree.HomeScreenDbSettings.SnapConfiguration.snapForce._value -%} +{%- set snapGap = feat_tree.HomeScreenDbSettings.SnapConfiguration.snapGap._value -%} +{%- set borderGap = feat_tree.HomeScreenDbSettings.SnapConfiguration.borderGap._value -%} +{%- set timeout = feat_tree.HomeScreenDbSettings.SnapConfiguration.timeout._value -%} +INSERT INTO SnapConfiguration (snappingEnabled, showEffects, snapForce, snapGap, borderGap, timeout) VALUES ({{snappingEnabled}}, {{showEffects}}, {{snapForce}}, {{snapGap}}, {{borderGap}}, {{timeout}}); + +{%- set bounceEffect = feat_tree.HomeScreenDbSettings.GeneralConfiguration.bounceEffect._value -%} +{%- set tapAndHoldDistance = feat_tree.HomeScreenDbSettings.GeneralConfiguration.tapAndHoldDistance._value -%} +{%- set widgetTapAndHoldTimeout = feat_tree.HomeScreenDbSettings.GeneralConfiguration.widgetTapAndHoldTimeout._value -%} +{%- set sceneTapAndHoldTimeout = feat_tree.HomeScreenDbSettings.GeneralConfiguration.sceneTapAndHoldTimeout._value -%} +{%- set pageChangeZoneWidth = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageChangeZoneWidth._value -%} +{%- set pageIndicatorSpacing = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageIndicatorSpacing._value -%} +{%- set pageChangeAnimationDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageChangeAnimationDuration._value -%} +{%- set pageChangeZoneAnimationDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageChangeZoneAnimationDuration._value -%} +{%- set pageChangeZoneReverseAnimationDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageChangeZoneReverseAnimationDuration._value -%} +{%- set pageRemovedAnimationDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageRemovedAnimationDuration._value -%} +{%- set newPageAddedAnimationDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.newPageAddedAnimationDuration._value -%} +{%- set widgetDragEffectDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.widgetDragEffectDuration._value -%} +{%- set widgetDropEffectDuration = feat_tree.HomeScreenDbSettings.GeneralConfiguration.widgetDropEffectDuration._value -%} +{%- set boundaryFeedbackEffectDistance = feat_tree.HomeScreenDbSettings.GeneralConfiguration.boundaryFeedbackEffectDistance._value -%} +{%- set defaultPageId = feat_tree.HomeScreenDbSettings.GeneralConfiguration.defaultPageId._value -%} +{%- set maximumPageCount = feat_tree.HomeScreenDbSettings.GeneralConfiguration.maximumPageCount._value -%} +{%- set maximumWidgetHeight = feat_tree.HomeScreenDbSettings.GeneralConfiguration.maximumWidgetHeight._value -%} +{%- set maximumWidgetWidth = feat_tree.HomeScreenDbSettings.GeneralConfiguration.maximumWidgetWidth._value -%} +{%- set minimumWidgetHeight = feat_tree.HomeScreenDbSettings.GeneralConfiguration.minimumWidgetHeight._value -%} +{%- set minimumWidgetWidth = feat_tree.HomeScreenDbSettings.GeneralConfiguration.minimumWidgetWidth._value -%} +{%- set shortcutLabelsVisible = feat_tree.HomeScreenDbSettings.GeneralConfiguration.shortcutLabelsVisible._value -%} +{%- set pageChangePanDistance = feat_tree.HomeScreenDbSettings.GeneralConfiguration.pageChangePanDistance._value -%} +INSERT INTO GeneralConfiguration (bounceEffect, tapAndHoldDistance, widgetTapAndHoldTimeout, sceneTapAndHoldTimeout, pageChangeZoneWidth, pageIndicatorSpacing, pageChangeAnimationDuration, pageChangeZoneAnimationDuration, pageChangeZoneReverseAnimationDuration, pageRemovedAnimationDuration, newPageAddedAnimationDuration, widgetDragEffectDuration, widgetDropEffectDuration, boundaryFeedbackEffectDistance, defaultPageId, maximumPageCount, maximumWidgetHeight, maximumWidgetWidth, minimumWidgetHeight, minimumWidgetWidth, shortcutLabelsVisible, pageChangePanDistance) VALUES ({{bounceEffect}}, {{tapAndHoldDistance}}, {{widgetTapAndHoldTimeout}}, {{widgetTapAndHoldTimeout}}, {{pageChangeZoneWidth}}, {{pageIndicatorSpacing}}, {{pageChangeAnimationDuration}}, {{pageChangeZoneAnimationDuration}}, {{pageChangeZoneReverseAnimationDuration}}, {{pageRemovedAnimationDuration}}, {{newPageAddedAnimationDuration}}, {{widgetDragEffectDuration}}, {{widgetDropEffectDuration}}, {{boundaryFeedbackEffectDistance}}, {{defaultPageId}}, {{maximumPageCount}}, {{maximumWidgetHeight}}, {{maximumWidgetWidth}}, {{minimumWidgetHeight}}, {{minimumWidgetWidth}}, {{shortcutLabelsVisible}}, {{pageChangePanDistance}}); + +{%- set pageChangeFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.pageChangeFeedbackType._value -%} +{%- set widgetPickFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetPickFeedbackType._value -%} +{%- set widgetDropFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetDropFeedbackType._value -%} +{%- set widgetRepositionFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetRepositionFeedbackType._value -%} +{%- set widgetOverTrashbinFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetOverTrashbinFeedbackType._value -%} +{%- set widgetDropToTrashbinFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetDropToTrashbinFeedbackType._value -%} +{%- set shortcutWidgetTapFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.shortcutWidgetTapFeedbackType._value -%} +{%- set widgetMoveBlockedFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetMoveBlockedFeedbackType._value -%} +{%- set clockWidgetTapFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.clockWidgetTapFeedbackType._value -%} +{%- set widgetSnappingFeedbackType = feat_tree.HomeScreenDbSettings.FeedbackConfiguration.widgetSnappingFeedbackType._value -%} +INSERT INTO FeedbackConfiguration (pageChangeFeedbackType, widgetPickFeedbackType, widgetDropFeedbackType, widgetRepositionFeedbackType, widgetOverTrashbinFeedbackType, widgetDropToTrashbinFeedbackType, shortcutWidgetTapFeedbackType, widgetMoveBlockedFeedbackType, clockWidgetTapFeedbackType, widgetSnappingFeedbackType) VALUES ('{{pageChangeFeedbackType}}', '{{widgetPickFeedbackType}}', '{{widgetDropFeedbackType}}', '{{widgetRepositionFeedbackType}}', '{{widgetOverTrashbinFeedbackType}}', '{{widgetDropToTrashbinFeedbackType}}', '{{shortcutWidgetTapFeedbackType}}', '{{widgetMoveBlockedFeedbackType}}', '{{clockWidgetTapFeedbackType}}', '{{widgetSnappingFeedbackType}}'); + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/hsapplication_fallbacktheme.qrc --- a/homescreenapp/hsapplication/hsapplication_fallbacktheme.qrc Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsapplication/hsapplication_fallbacktheme.qrc Wed Jun 23 17:05:06 2010 +0100 @@ -1,13 +1,5 @@ - themes/icons/hbdefault/scalable/qtg_mono_applications_all.svg - themes/icons/hbdefault/scalable/qtg_mono_applications_collections.svg - themes/icons/hbdefault/scalable/qtg_mono_search.svg - themes/icons/hbdefault/scalable/qtg_mono_ovistore.svg - themes/icons/hbdefault/scalable/qtg_large_applications_download.svg - themes/icons/hbdefault/scalable/qtg_large_applications_user.svg - themes/icons/hbdefault/scalable/qtg_large_super_new.svg - themes/icons/hbdefault/scalable/qtg_graf_hspage_normal.svg themes/icons/hbdefault/scalable/qtg_graf_hspage_highlight.svg themes/icons/hbdefault/scalable/hs_shortcut_bg.svg @@ -62,16 +54,5 @@ themes/icons/hbdefault/scalable/qtg_fr_hsitems_pressed_t.svg themes/icons/hbdefault/scalable/qtg_fr_hsitems_pressed_tl.svg themes/icons/hbdefault/scalable/qtg_fr_hsitems_pressed_tr.svg - - themes/icons/hbdefault/scalable/qtg_anim_longtap_0.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_1.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_2.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_3.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_4.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_5.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_6.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_7.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_8.svg - themes/icons/hbdefault/scalable/qtg_anim_longtap_9.svg diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/resource_s60/d_landscape.png Binary file homescreenapp/hsapplication/resource_s60/d_landscape.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/resource_s60/d_portrait.png Binary file homescreenapp/hsapplication/resource_s60/d_portrait.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/resource_s60/homescreen.db Binary file homescreenapp/hsapplication/resource_s60/homescreen.db has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/resource_win/d_landscape.png Binary file homescreenapp/hsapplication/resource_win/d_landscape.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/resource_win/d_portrait.png Binary file homescreenapp/hsapplication/resource_win/d_portrait.png has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/resource_win/homescreen.db Binary file homescreenapp/hsapplication/resource_win/homescreen.db has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/src/hshomescreenclientserviceprovider.cpp --- a/homescreenapp/hsapplication/src/hshomescreenclientserviceprovider.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsapplication/src/hshomescreenclientserviceprovider.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -28,8 +28,7 @@ #include "hsdatabase.h" #include "hswallpaperhelper.h" #include "hswidgetcomponentregistry.h" - -#define HSBOUNDARYEFFECT 20 // amount of extra pixels in wallpaper width reserved for boundary effect +#include "hsconfiguration.h" namespace { @@ -100,8 +99,10 @@ QString landscapePath = HsWallpaper::wallpaperPath( Qt::Horizontal, QString(), fileExtension); - QRect portraitRect = QRect(0, 0, (2 * 360) + HSBOUNDARYEFFECT, 640); - QRect landscapeRect = QRect(0, 0, (2 * 640) + HSBOUNDARYEFFECT, 360); + int bounceEffect = HsConfiguration::bounceEffect(); + + QRect portraitRect = QRect(0, 0, (2 * 360) + bounceEffect, 640); + QRect landscapeRect = QRect(0, 0, (2 * 640) + bounceEffect, 360); QRect sourceRect; // left empty to signal we want to use full size image as source QImage portraitImage = HsWallpaperHelper::processImage(fileName, diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_0.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_0.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1316 +0,0 @@ - - - - - - - - - - -]> - - - - - - - - - - - - eJzsvWuPHElyIPidAP9D3QcBMx+6FP4I94jBYoF86uaupWnMY3cO2kWDmubMcLdJNtjd0ul+/dnb -zSMis7JYNVKPVOXNZtEy0sMf5ub2tr/5P776zRe7bz7+09sv0v1w9/rV3/zN4dPbNz98/PSLOwLf -/fLbb3/8/odPCPrZr39+F+AxfGr3y+lrefK/vf30/buPH35Bn/GnZ/z+z3779tPHD28/3P3fb959 -/+Y+3P2Pn51+/9svfvvu7Q8f//ZXP3774//4+c/vfvZzfP6373749i1843cffsDfvvki/NyGAl0f -3/wAn6a/TeFv4xCGu/yLkO6++nt8ZP/xxw/fvPvwp/3H//cXd1+kQn/CMOEf/Pz/fPfrt98/9NDx -4x9+fP/2ww9fffr4h7fff3/4+O3HT9//Aj7Z/XL8+vzu27cwn/dvfribaXa7X4b49f7Hd99+8w8/ -vv+ntzDTPBSCp6/pq7/7/s2fYLz0O8Hr1798D6DfvP3hBxjF97+4o0X69d/t/QsBSu1n//jrt396 -R0sOU/+fP9eeP3387v2bT//7e36uRvhPPvrt2/fffQtLRNODmel/+jFMQGZeYYfi3Rcxz/d5Gsa7 -nMf7IczjXYoBIPKFthxv//nd23/5xd0/wDbKauw+/fCbd/8fzC7kPAz8f/no1z9++/bT7z68+wGG -yO+eeT3+/uM3b7+Fb7Quzt+++dP3OuHQ/i9P/PbNpz+9/QE27uO3P/5AqDXZW2DNv3zzr4By2uH8 -9a++e/vhtx//Gw31i5rvQynjXQjhfryDbU5pupsD7PVE78nwryJvDPRWHRd2g51o9xU36SvYt199 -evendx9+8UVOw30ahnT3xQi/xXmaZHf/7tO7b9rmwtZM/D+a0/3k/sz6R4YOC/HDD28/6FwAsQ5/ -79BkuP/73+AoTh++OXx8j3vyPSE9IMgHwJ1vP/5JPm3/oM+gix+/k2kR4GvYwq8+vfuAHb9+9Q/8 -2fT1V9/+CB/+3aePP373yw9//Pj61c/40H/15oc/3+2/ffvhm+/hiDKM/3nHXwHol+/+WYH3b959 -9/MHuvzNv77/p4/fvvv+vXXoIfb7LV399tObP8A87n71T//r7R9+gG8LoP32mx/f/fD2lq6+wuX/ -9OFXH3jGn378/s93v/348VsbpDwgH9nkAYf5Oz+Zl9jDWy+AD3+6nR/efPvtuz99evPdn9/9Yav/ -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 -uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLdf/7nNSnnd/vji3v7i3v7i3v7i3v7i3v7i -3v7i3v7i3v7i3v7i3v7i3v7i3v7i3v7i3v7i3v7i3v7i3n5jH81I9+LefjP7/OLe/uLe/uLe/uLe -/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/uLe/lN1bw9p28Ed4IvSWaKeUYLSGwD1Ypvc -xVY2jMNJnK0pjb04XTeXUKkN2ZmIUYKr5lbJMl4Ud8yBuUx1yRanEXYo0WqarWQx66VUw2Ma45Mv -e/BAtV24ONnx4pJxCq5MkNx71qy52/YMWbsk2wXpjdPqmlCoaiteiaGZpugaZIZLrz8pa2BGIjUQ -qYmokMQUaU5Hcjrh2WR2A6GZsJmI5kFzCGJg8+Y1nUdkAxvNYy8GtkqGI5mJc7PAmWj1PjSyBdSX -ot5aLvaZdKpiSkLNjLCOe9LY0DVu+qVirsUNE9Q532GDOQDvxFV/7uqrmumV3KGWWsuHTMtXdX2P -cwLTeZF2yHTrptdtWqKmJ2qaItIVmaao0xVZCIDqi9gpVDVGe9MYHU1jNJjGSHRGvWsonJWmKzIt -0UI/xK6hIF+bo+4tOv7mavmgdYWcY5al0bwz79KyctmuIjp9qg1ZukJ4vm7ywqLiQkhYR+TtSZcL -h/k5+1nbvIGfOhCz2ObuZ3+pjFhv3/AWDjix3UpcsnHIeqxZusB3Nd6TcPlEupbwOsWbiis4wn1O -XCde/3jBx8Yfxb4myfP0JgVN7rNyXJnKZ8uVqXyZfjfPyHXwdxf1Tz6zh6dft/nCdZsvVKpsSn8l -RGuPlbW/yYY/p/loek/M3uvy4KIjzqJeHaQE9LBw5gdsB1KchAwzOfbxQBb54+J9fNSOizJQydai -cvgVPu5mlP+PUh66UJW0InE3VRgOlmFm13YS6TWbdb+1vfx/L/9ftoNrRznm0MT76WSMkFOp4WYs -fJVbpVFft5AifEKL7mmxPX01uGQGVJ7J2ni9JKytuqiS1D2bURa+60BOSHOy937r5rPeCGlvRJnE -V/1IauVIfupFirIfzEs9iJd6MdOJGk6iRUJYtNsi1s1Hup1R42CRbhrnpiXZ+aJ7TJQbXWN0ifEF -xpdXkGtL4hk2KlCGxVnTqrGtbmyrMGqF1OnMuJqUcFr6SqOtmuzpYkTD5AwS3hhB8Q== - - - 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 -r/z8JC2Uq8vCbHWX21PG+Nh+Lj656LF/fustPsRtC6azXjtL9v/eLi+0WWzor9qa8tfaI9t5cXdH -uAo5h8GR0oZJDY8XO+lLjy89/jv0uIie+iux1j5Pjwsl+Wfbfy9ag5399/rPzTa7qxa6R1nmVM8u -mYuu2eZ669zaQpc71jlZpt3WfIHlLsu72eya1c5b7kSnT9W5mwXPW/GWFmizQps1r1mi1aqXyfE8 -OZu0s+85G5+3Th9tmfdmH3AWP7H5VbEWsL2ALQZZBIxoFsBmtz5LGvijWBHMfv2TtBlv2pAftBk/ -2pJMec8vY+2W78MDNmXJPXbZspwWGLuBrT2mAv70eNrbmK94R3RWZmdnJozc8pC47iPhbVQLezNl -pN/2kuitzlf8JHovCarx4WvWL6rWb9qfvQV6VfPjASv0LTU/+oof0SrQY5oRTTKyTPTIyUU4tYik -wLH0jjtK24FJO2IIf4WW6+32GSoc6PGKXfvBtmHThh4ftnC3ak/Xbdyk4X/96qqlu7d1i7Xb2qa1 -2ywdS5v3Nau32b2taonavc+OU+n5g94Tp7+pNy3gra6U+MA4CuVu0LUdfLegQT31SVIPKF7xy9pL -YNYlahM7SkN05vWrB/Lgq39LsAz4x4V/iwa1jRj8v8pjbvW+M9qJc1/6e1YrMpU/nTCMKvYJzD/n -61Ld54l29pLvh5znZ7Tca48SKIbzGbnOvVYGMhO7lWfVlL/3I1ncL9rtn6O3p1rtt+usJ8wWXPtq -Q5YteyM6vnalL7aLRnblIskYo+kP1zWYfZxzV3+5i3HWCGeKbEYjAoUvLaoum/rDR/n7DOZnKSO7 -nFOfaf0o/gMczx27hJ2Xcq4v49t94s6NmVJJhIku3Z0vjmoz6It77lbJKoPNIsss/BxcGk68kqXS -vcboL/fJJ+JcVpDWMkGurCenIYUZcG4Djk23nfurVUGthHeLc96O7b0Y67wZ6XwiwfizCwVuR/ZK -6ZRVbO9iBjeniN+chZsHXcFdgvhHlMvbnAtlr2rOYTYbm0FLJd/n/7w0i34v+t1IZOTfzpS5zAKq -rMB2cRuX23QRk+/2pncVWGSyW+Q5t1w8octneOhz7rmntrLySQ48X1GtT9K1SCFlXPkyzdT2U8tU -VF0yquV0FxJGX1NwK41hky9iCuvkhUDAWqLNRYpAHeFGOsSHEyKOm71Kv7Jl1bbN0rrbO33lHp9W -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 -v8CX5BfA0r2qWv78P8LvWtk= - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_1.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_1.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_2.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_2.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_3.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_3.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_4.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_4.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_5.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_5.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_6.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_6.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_7.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_7.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_8.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_8.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_9.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_anim_longtap_9.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_large_applications_download.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_large_applications_download.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_large_applications_user.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_large_applications_user.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_large_super_new.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_large_super_new.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_applications_all.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_applications_all.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_applications_collections.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_applications_collections.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_ovistore.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_ovistore.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_search.svg --- a/homescreenapp/hsapplication/themes/icons/hbdefault/scalable/qtg_mono_search.svg Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/hsdomainmodel.pri --- a/homescreenapp/hsdomainmodel/hsdomainmodel.pri Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/hsdomainmodel.pri Wed Jun 23 17:05:06 2010 +0100 @@ -19,25 +19,37 @@ ./inc/hsdatabase.h \ ./inc/hsdomainmodel_global.h \ ./inc/hspage.h \ + ./inc/hsgui.h \ ./inc/hsscene.h \ ./inc/hsshortcutservice.h \ ./inc/hsshortcutservice_p.h \ ./inc/hswallpaper.h \ ./inc/hswidgethost.h \ ./inc/hswidgetcomponentregistry.h \ - ./inc/hswidgetcomponent.h \ - ./inc/hswidgetcomponentdescriptor.h + ./inc/hswidgetcomponent.h \ + ./inc/hswidgetcomponentdescriptor.h \ + ./inc/hsbackuprestoreobserver.h \ + ./inc/hsconfiguration.h SOURCES += ./src/hscontentservice.cpp \ ./src/hsdatabase.cpp \ ./src/hspage.cpp \ + ./src/hsgui.cpp \ ./src/hsscene.cpp \ ./src/hsshortcutservice.cpp \ ./src/hswallpaper.cpp \ ./src/hswidgethost.cpp \ ./src/hswidgetcomponentregistry.cpp \ - ./src/hswidgetcomponent.cpp \ - ./src/hswidgetcomponentdescriptor.cpp + ./src/hswidgetcomponent.cpp \ + ./src/hswidgetcomponentdescriptor.cpp \ + ./src/hsbackuprestoreobserver.cpp \ + ./src/hsconfiguration.cpp + +symbian: { +HEADERS += ./inc/hsbackuprestoreobserver_p.h \ + ./inc/hsbackuprestoreactivecallback.h +SOURCES += ./src/hsbackuprestoreactivecallback.cpp +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/hsdomainmodel.pro --- a/homescreenapp/hsdomainmodel/hsdomainmodel.pro Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/hsdomainmodel.pro Wed Jun 23 17:05:06 2010 +0100 @@ -42,6 +42,7 @@ symbian: { TARGET.UID3 = 0x20022F38 + LIBS += -lxqsettingsmanager -labclient } win32:{ QT += network diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsbackuprestoreactivecallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/inc/hsbackuprestoreactivecallback.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,210 @@ +/* +* 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 the License "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: Home screen active callback in HsBackupRestoreObserver. +* +*/ + + +#ifndef HSBACKUPRESTOREACTIVECALLBACK_H +#define HSBACKUPRESTOREACTIVECALLBACK_H + +#include // CBase +#include + +class HsBackupRestoreObserver; + +/** + * Home screen active callback in backup/restore. + * + * @lib hsdomainmodel + * @since S60 ^4 + */ +NONSHARABLE_CLASS(CHsBURActiveCallback) : public CBase, + public conn::MActiveBackupDataClient + { +public: + + IMPORT_C static CHsBURActiveCallback* NewL(HsBackupRestoreObserver* observer); + + virtual ~CHsBURActiveCallback(); + +// new functions + +// from base class MActiveBackupDataClient + + /** + * This method informs the active backup data client that all + * snapshots have been supplied. If the client has not + * received a snapshot then it should perform a base backup + */ + virtual void AllSnapshotsSuppliedL(); + + /** + * This method receives all or part of a snapshot of data to allow + * calculation of an incremental backup. The snapshot is one that + * was previously supplied by the data owner. The snapshot data + * should be read from the location supplied. The snapshot data may + * be larger than the location supplied in which case the routine + * will be called repeatedly until all data has been supplied. + * + * Snapshot data will also be supplied as part of a restore operation + * + * @param aDrive the drive being backed up + * @param aBuffer a pointer to the base of the location from whence + * data can be copied. + * @param aLastSection ETrue if this is the last section of snapshot + * data, else EFalse. + */ + virtual void ReceiveSnapshotDataL( + TDriveNumber aDrive, TDesC8& aBuffer, TBool aLastSection); + + /** + * This method returns the expected size of backup data that will be + * supplied. If an incremental backup is underway then this method + * then this method will not be called until after + * ReceiveSnapshotDataL(). The size data will be used for the purpose + * of tracking progess during a backup. If it is inaccurate then the + * user may see irregular progress but the actual backup data will + * not be affected so it is acceptable to return an estimated value. + * + * @param aDrive the drive being backed up. + * @return the size of the data that will be returned + */ + virtual TUint GetExpectedDataSize(TDriveNumber aDrive); + + /** + * This method returns a snapshot of data to accompany a backup. The + * snapshot is expected to contain details on files / data being + * backed up. The format of the snapshot is only meaningful to the + * data owner. The snapshot will be supplied if the data owner is + * asked for an incremental backup and for a restore operation. The + * snapshot data should be copied to the location supplied. + * + * The snapshot data may be larger than the location supplied in + * which case the routine will be called repeatedly until all data + * has been retrieved. + * + * @param aDrive the drive being backed up + * @param aBuffer a pointer to the base of the location where data + * can be copied. + * @param aFinished on return ETrue if all data has been returned + * for this drive, else EFalse. + */ + virtual void GetSnapshotDataL( + TDriveNumber aDrive, TPtr8& aBuffer, TBool& aFinished); + + /** + * This method prepares the implementor to return backup data. It + * will be followed by a sequence of calls to request the actual + * data. + * + * @param aDrive the drive being backed up. + */ + virtual void InitialiseGetBackupDataL(TDriveNumber aDrive); + + /** + * This method requests a section of backup data. + * InitialiseGetBackupDataL() will have been called previously to + * specify the drive concerned. The data returned may be base or + * incremental depending on the type of backup and the capability of + * the data owner. + * + * @param aBuffer a pointer to the base of the location where data + * can be copied. + * @param aFinished on return ETrue if all data has been returned + * for this drive, else EFalse. + */ + virtual void GetBackupDataSectionL(TPtr8& aBuffer, TBool& aFinished); + + /** + * This method prepares the implementor to receive base restore data + * for a drive. It will be followed by a sequence of calls to supply + * the actual data. + * + * @param aDrive the drive being restored. + */ + virtual void InitialiseRestoreBaseDataL(TDriveNumber aDrive); + + /** + * This method receives a section of base restore data. + * InitialiseRestoreBaseDataL() will have been called previously to + * specify the drive concerned. + * + * @param aBuffer a pointer to the base of the location whence data + * can be read. + * @param aFinished ETrue if all data has been returned for this + * drive, else EFalse. + */ + virtual void RestoreBaseDataSectionL(TDesC8& aBuffer, TBool aFinished); + + /** + * This method prepares the implementor to receive incremental + * restore data for a drive. It will be followed by a sequence + * of calls to supply the actual data. If multiple increments + * are supplied then this methid will be called before each increment + * + * @param aDrive the drive being restored. + */ + virtual void InitialiseRestoreIncrementDataL(TDriveNumber aDrive); + + /** + * This method receives a section of increment restore data. + * InitialiseRestoreIncrementDataL() will have been called + * previously to specify the drive concerned. + * + * @param aBuffer a pointer to the base of the location whence data + * can be read. + * @param aFinished ETrue if all data has been returned for this + * increment, else EFalse. + */ + virtual void RestoreIncrementDataSectionL(TDesC8& aBuffer, TBool aFinished); + + /** + * This method is called when all data to be restored has been + * supplied. + * + * @param aDrive the drive being restored. + */ + virtual void RestoreComplete(TDriveNumber aDrive); + + /** + * This method is called if copying of data is terminated prematurely + * to allow the implementor to tidy up. The same method applies to + * all types of data and to backup and restore. + */ + virtual void TerminateMultiStageOperation(); + + /** + * Gets a 32-bit checksum for its private data. + * This routine is for test purposes. It must be implemented but an + * invariant checksum value can be provided. Some tests may cause + * checksum values to be compared. + * + * @param aDrive the drive containing data being checksummed + * @return the 32-bit checksum + */ + virtual TUint GetDataChecksum(TDriveNumber aDrive); + +private: + CHsBURActiveCallback(HsBackupRestoreObserver* observer); + + void ConstructL(); + +private: // data + // Bacup/Restore observer. Not own. + HsBackupRestoreObserver *iObserver; + }; + +#endif // HSBACKUPRESTOREACTIVECALLBACK_H + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsbackuprestoreobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/inc/hsbackuprestoreobserver.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,75 @@ +/* +* 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: Backup/Restore observer. +* +*/ + +#ifndef HSBACKUPRESTOREOBSERVER_H +#define HSBACKUPRESTOREOBSERVER_H + +#include +#include "hsdomainmodel_global.h" +#include "hstest_global.h" + +HOMESCREEN_TEST_CLASS(TestRuntimeServices) + +#ifdef Q_OS_SYMBIAN +class HsBackupRestoreObserverPrivate; +#endif //Q_OS_SYMBIAN + +class HSDOMAINMODEL_EXPORT HsBackupRestoreObserver : public QObject +{ + Q_OBJECT + +public: + static HsBackupRestoreObserver *instance(); + ~HsBackupRestoreObserver(); + + void backupRestoreStarted(); + void backupRestoreComplited(); + + void readyForBUR(); + bool checkBUR(); + +signals: + void event_backupRestoreStarted(); + void event_backupRestoreComplited(); + +private: + HsBackupRestoreObserver(QObject *parent = 0); + Q_DISABLE_COPY(HsBackupRestoreObserver) + +private: + +#ifdef Q_OS_SYMBIAN + /** + * mD pointer to HsBackupRestoreObserverPrivate + * Owned by HsBackupRestoreObserver object, instantiated in + * constructor. + */ + HsBackupRestoreObserverPrivate *mD; +#endif //Q_OS_SYMBIAN + + bool mBUROngoing; + + static HsBackupRestoreObserver *mInstance; +#ifdef Q_OS_SYMBIAN + friend class HsBackupRestoreObserverPrivate; +#endif //Q_OS_SYMBIAN + HOMESCREEN_TEST_FRIEND_CLASS(TestRuntimeServices) +}; + +#endif // HSBACKUPRESTOREOBSERVER_H + +// End of File diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsbackuprestoreobserver_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/inc/hsbackuprestoreobserver_p.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2009 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: Active object for Backup/Restore observer. +* +*/ + +#ifndef HSBACKUPRESTOREOBSERVER_P_H +#define HSBACKUPRESTOREOBSERVER_P_H + +#include +#include +#include + +class CHsBURActiveCallback; +class HsBackupRestoreObserver; + +using namespace conn; + +class HsBackupRestoreObserverPrivate : public QObject +{ + Q_OBJECT + +public: + + /** + * Creates an instance of CCPServerBURListener implementation. + * @param aCallBack Pointer to observer interface. + */ + HsBackupRestoreObserverPrivate (HsBackupRestoreObserver* observer, + QObject *parent = 0); + + /** + * Destructor. + */ + virtual ~HsBackupRestoreObserverPrivate(); + + void readyForBUR(); + +public slots: + void handleKeyChange(XQSettingsKey key, const QVariant &value); + +private: + /** + * mQ pointer to HsBackupRestoreObserver + * Owned by HsBackupRestoreObserver object, instantiated in + * constructor. + */ + HsBackupRestoreObserver *mQ; + + /** + * Callback interface for widget's active data owner. + * Own. + */ + CHsBURActiveCallback *mCallBack; + + /** + * Active backup client. + * Own. + */ + conn::CActiveBackupClient *mActiveBackupClient; + + /** + * Last state of BUR: either backup or restore or normal or unset + */ + conn::TBURPartType mLastType; +}; + +#endif //HSBACKUPRESTOREOBSERVER_P_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsconfiguration.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/inc/hsconfiguration.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,166 @@ +/* +* 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: +* +*/ + +#ifndef HSCONFIGURATION_H +#define HSCONFIGURATION_H + +#include + +#include +#include + +#include "hsdomainmodel_global.h" + +class HsGeneralConfiguration; +class HsFeedbackConfiguration; +class HsSnapConfiguration; +class HsDatabase; +class HsConfiguration; + +class HSDOMAINMODEL_EXPORT HsConfiguration +{ + +public: + static void loadConfiguration(); + + static inline int bounceEffect() { return mBounceEffect; }; + static inline qreal tapAndHoldDistance() { return mTapAndHoldDistance; }; + static inline int widgetTapAndHoldTimeout() { return mWidgetTapAndHoldTimeout; }; + static inline int sceneTapAndHoldTimeout() { return mSceneTapAndHoldTimeout; }; + static inline qreal pageChangeZoneWidth() { return mPageChangeZoneWidth; }; + static inline qreal pageIndicatorSpacing() { return mPageIndicatorSpacing; }; + static inline int pageChangeAnimationDuration() { return mPageChangeAnimationDuration; }; + static inline int pageChangeZoneAnimationDuration() { return mPageChangeZoneAnimationDuration; }; + static inline int pageChangeZoneReverseAnimationDuration() { return mPageChangeZoneReverseAnimationDuration; }; + static inline int pageRemovedAnimationDuration() { return mPageRemovedAnimationDuration; }; + static inline int newPageAddedAnimationDuration() { return mNewPageAddedAnimationDuration; }; + static inline int widgetDragEffectDuration() { return mWidgetDragEffectDuration; }; + static inline int widgetDropEffectDuration() { return mWidgetDropEffectDuration; }; + static inline int bounceFeedbackEffectDistance() { return mBounceFeedbackEffectDistance; }; + static inline int defaultPageId() { return mDefaultPageId; }; + static inline int maximumPageCount() { return mMaximumPageCount; }; + static inline qreal maximumWidgetHeight() { return mMaximumWidgetHeight; }; + static inline qreal maximumWidgetWidth() { return mMaximumWidgetWidth; }; + static inline qreal minimumWidgetHeight() { return mMinimumWidgetHeight; }; + static inline qreal minimumWidgetWidth() { return mMinimumWidgetWidth; }; + static inline bool shortcutLabelsVisible() { return mShortcutLabelsVisible; }; + static inline qreal pageChangePanDistance() { return mPageChangePanDistance; }; + static inline int pageChangePanDistanceInPixels() { return mPageChangePanDistanceInPixels; }; + + static inline HbFeedback::InstantEffect pageChangeFeedbackType() { return mPageChangeFeedbackType; }; + static inline HbFeedback::InstantEffect widgetPickFeedbackType() { return mWidgetPickFeedbackType; }; + static inline HbFeedback::InstantEffect widgetDropFeedbackType() { return mWidgetDropFeedbackType; }; + static inline HbFeedback::InstantEffect widgetRepositionFeedbackType() { return mWidgetRepositionFeedbackType; }; + static inline HbFeedback::InstantEffect widgetOverTrashbinFeedbackType() { return mWidgetOverTrashbinFeedbackType; }; + static inline HbFeedback::InstantEffect widgetDropToTrashbinFeedbackType() { return mWidgetDropToTrashbinFeedbackType; }; + static inline HbFeedback::InstantEffect shortcutWidgetTapFeedbackType() { return mShortcutWidgetTapFeedbackType; }; + static inline HbFeedback::InstantEffect widgetMoveBlockedFeedbackType() { return mWidgetMoveBlockedFeedbackType; }; + static inline HbFeedback::InstantEffect clockWidgetTapFeedbackType() { return mClockWidgetTapFeedbackType; }; + static inline HbFeedback::InstantEffect widgetSnappingFeedbackType() { return mWidgetSnappingFeedbackType; }; + + static inline bool snapEnabled() { return mSnapEnabled; }; + static inline qreal snapForce() { return mSnapForce; }; + static inline qreal snapGap() { return mSnapGap; }; + static inline qreal snapBorderGap() { return mSnapBorderGap; }; + static inline int snapTimeout() { return mSnapTimeout; }; + + // setters should be removed before code is released to SF + static void setBounceEffect(int bounceEffect) { mBounceEffect = bounceEffect; }; + static void setTapAndHoldDistance(qreal tapAndHoldDistance) { mTapAndHoldDistance = tapAndHoldDistance; }; + static void setWidgetTapAndHoldTimeout(int tapAndHoldTimeout) { mWidgetTapAndHoldTimeout = tapAndHoldTimeout; }; + static void setSceneTapAndHoldTimeout(int tapAndHoldTimeout) { mSceneTapAndHoldTimeout = tapAndHoldTimeout; }; + static void setPageChangeZoneWidth(qreal pageChangeZoneWidth) { mPageChangeZoneWidth = pageChangeZoneWidth; }; + static void setPageIndicatorSpacing(qreal pageIndicatorSpacing) { mPageIndicatorSpacing = pageIndicatorSpacing; }; + static void setPageChangeAnimationDuration(int pageChangeAnimationDuration) { mPageChangeAnimationDuration = pageChangeAnimationDuration; }; + static void setPageChangeZoneAnimationDuration(int pageChangeZoneAnimationDuration) { mPageChangeZoneAnimationDuration = pageChangeZoneAnimationDuration; }; + static void setPageChangeZoneReverseAnimationDuration(int pageChangeZoneReverseAnimationDuration) { mPageChangeZoneReverseAnimationDuration = pageChangeZoneReverseAnimationDuration; }; + static void setPageRemovedAnimationDuration(int pageRemovedAnimationDuration) { mPageRemovedAnimationDuration = pageRemovedAnimationDuration; }; + static void setNewPageAddedAnimationDuration(int newPageAddedAnimationDuration) { mNewPageAddedAnimationDuration = newPageAddedAnimationDuration; }; + static void setWidgetDragEffectDuration(int widgetDragEffectDuration) { mWidgetDragEffectDuration = widgetDragEffectDuration; }; + static void setWidgetDropEffectDuration(int widgetDropEffectDuration) { mWidgetDropEffectDuration = widgetDropEffectDuration; }; + static void setBounceFeedbackEffectDistance(int bounceFeedbackEffectDistance) { mBounceFeedbackEffectDistance = bounceFeedbackEffectDistance; }; + static void setDefaultPageId(int defaultPageId) { mDefaultPageId = defaultPageId; }; + static void setMaximumPageCount(int maximumPageCount) { mMaximumPageCount = maximumPageCount; }; + static void setMaximumWidgetHeight(qreal maximumWidgetHeight) { mMaximumWidgetHeight = maximumWidgetHeight; }; + static void setMaximumWidgetWidth(qreal maximumWidgetWidth) { mMaximumWidgetWidth = maximumWidgetWidth; }; + static void setMinimumWidgetHeight(qreal minimumWidgetHeight) { mMinimumWidgetHeight = minimumWidgetHeight; }; + static void setMinimumWidgetWidth(qreal minimumWidgetWidth) { mMinimumWidgetWidth = minimumWidgetWidth; }; + static void setShortcutLabelsVisible(bool shortcutLabelsVisible) { mShortcutLabelsVisible = shortcutLabelsVisible; }; + static void setPageChangePanDistance(qreal pageChangePanDistance) { mPageChangePanDistance = pageChangePanDistance; + mPageChangePanDistanceInPixels = pageChangePanDistance * HbDeviceProfile::current().unitValue(); }; + + static void setPageChangeFeedbackType(HbFeedback::InstantEffect pageChangeFeedbackType ) { mPageChangeFeedbackType = pageChangeFeedbackType; }; + static void setWidgetPickFeedbackType(HbFeedback::InstantEffect widgetPickFeedbackType ) { mWidgetPickFeedbackType = widgetPickFeedbackType; }; + static void setWidgetDropFeedbackType(HbFeedback::InstantEffect widgetDropFeedbackType ) { mWidgetDropFeedbackType = widgetDropFeedbackType; }; + static void setWidgetRepositionFeedbackType(HbFeedback::InstantEffect widgetRepositionFeedbackType ) { mWidgetRepositionFeedbackType = widgetRepositionFeedbackType; }; + static void setWidgetOverTrashbinFeedbackType(HbFeedback::InstantEffect widgetOverTrashbinFeedbackType ) { mWidgetOverTrashbinFeedbackType = widgetOverTrashbinFeedbackType; }; + static void setWidgetDropToTrashbinFeedbackType(HbFeedback::InstantEffect widgetDropToTrashbinFeedbackType ) { mWidgetDropToTrashbinFeedbackType = widgetDropToTrashbinFeedbackType; }; + static void setShortcutWidgetTapFeedbackType(HbFeedback::InstantEffect shortcutWidgetTapFeedbackType ) { mShortcutWidgetTapFeedbackType = shortcutWidgetTapFeedbackType; }; + static void setWidgetMoveBlockedFeedbackType(HbFeedback::InstantEffect widgetMoveBlockedFeedbackType ) { mWidgetMoveBlockedFeedbackType = widgetMoveBlockedFeedbackType; }; + static void setClockWidgetTapFeedbackType(HbFeedback::InstantEffect clockWidgetTapFeedbackType ) { mClockWidgetTapFeedbackType = clockWidgetTapFeedbackType; }; + static void setWidgetSnappingFeedbackType(HbFeedback::InstantEffect widgetSnappingFeedbackType ) { mWidgetSnappingFeedbackType = widgetSnappingFeedbackType; }; + + static void setSnapEnabled(bool snapEnabled) { mSnapEnabled = snapEnabled; }; + static void setSnapForce(qreal snapForce) { mSnapForce = snapForce; }; + static void setSnapGap(qreal snapGap) { mSnapGap = snapGap; }; + static void setSnapBorderGap(qreal snapBorderGap) { mSnapBorderGap = snapBorderGap; }; + static void setSnapTimeout(int snapTimeout) { mSnapTimeout = snapTimeout; }; + +private: + static int mBounceEffect; + static qreal mTapAndHoldDistance; + static int mWidgetTapAndHoldTimeout; + static int mSceneTapAndHoldTimeout; + static qreal mPageChangeZoneWidth; + static qreal mPageIndicatorSpacing; + static int mPageChangeAnimationDuration; + static int mPageChangeZoneAnimationDuration; + static int mPageChangeZoneReverseAnimationDuration; + static int mPageRemovedAnimationDuration; + static int mNewPageAddedAnimationDuration; + static int mWidgetDragEffectDuration; + static int mWidgetDropEffectDuration; + static int mBounceFeedbackEffectDistance; + static int mDefaultPageId; + static int mMaximumPageCount; + static qreal mMaximumWidgetHeight; + static qreal mMaximumWidgetWidth; + static qreal mMinimumWidgetHeight; + static qreal mMinimumWidgetWidth; + static bool mShortcutLabelsVisible; + static qreal mPageChangePanDistance; + static int mPageChangePanDistanceInPixels; + + static HbFeedback::InstantEffect mPageChangeFeedbackType; + static HbFeedback::InstantEffect mWidgetPickFeedbackType; + static HbFeedback::InstantEffect mWidgetDropFeedbackType; + static HbFeedback::InstantEffect mWidgetRepositionFeedbackType; + static HbFeedback::InstantEffect mWidgetOverTrashbinFeedbackType; + static HbFeedback::InstantEffect mWidgetDropToTrashbinFeedbackType; + static HbFeedback::InstantEffect mShortcutWidgetTapFeedbackType; + static HbFeedback::InstantEffect mWidgetMoveBlockedFeedbackType; + static HbFeedback::InstantEffect mClockWidgetTapFeedbackType; + static HbFeedback::InstantEffect mWidgetSnappingFeedbackType; + + static bool mSnapEnabled; + static qreal mSnapForce; + static qreal mSnapGap; + static qreal mSnapBorderGap; + static int mSnapTimeout; +}; + +#endif // HSCONFIGURATION_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hscontentservice.h --- a/homescreenapp/hsdomainmodel/inc/hscontentservice.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hscontentservice.h Wed Jun 23 17:05:06 2010 +0100 @@ -42,7 +42,7 @@ static HsContentService *instance(); private: - static QScopedPointer mInstance; + static HsContentService *mInstance; Q_DISABLE_COPY(HsContentService) }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsdatabase.h --- a/homescreenapp/hsdomainmodel/inc/hsdatabase.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hsdatabase.h Wed Jun 23 17:05:06 2010 +0100 @@ -24,10 +24,15 @@ #include "hsdomainmodel_global.h" +#include + class HsSceneData; class HsPageData; class HsWidgetData; class HsWidgetPresentationData; +class HsGeneralConfiguration; +class HsFeedbackConfiguration; +class HsSnapConfiguration; class HSDOMAINMODEL_EXPORT HsDatabase : public QObject { @@ -70,14 +75,16 @@ bool widgetPresentation(HsWidgetPresentationData &data); bool setWidgetPresentation(const HsWidgetPresentationData &data); - bool deleteWidgetPresentation(int widgetId, const QString &key); + bool deleteWidgetPresentation(int widgetId, Qt::Orientation orientation); bool widgetPreferences(int widgetId, QVariantHash &data); bool widgetPreference(int widgetId, const QString &key, QVariant &value); bool setWidgetPreferences(int widgetId, const QVariantHash &data); + + bool generalConfiguration(HsGeneralConfiguration &data); + bool feedbackConfiguration(HsFeedbackConfiguration &data); + bool snapConfiguration(HsSnapConfiguration &data); - void setDataBaseBlocked(bool blocked); - bool getDataBaseBlocked(); public: static void setInstance(HsDatabase *instance); static HsDatabase *instance(); @@ -91,8 +98,7 @@ QString mConnectionName; QString mDatabaseName; - static QScopedPointer mInstance; - bool mBlocked; + static HsDatabase *mInstance; }; #endif // HSDATABASE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsdomainmodeldatastructures.h --- a/homescreenapp/hsdomainmodel/inc/hsdomainmodeldatastructures.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hsdomainmodeldatastructures.h Wed Jun 23 17:05:06 2010 +0100 @@ -20,25 +20,20 @@ #include #include "hsdomainmodel_global.h" +#include +#include class HSDOMAINMODEL_EXPORT HsSceneData { public: HsSceneData() - : id(-1), defaultPageId(-1), maximumPageCount(-1), - maximumWidgetHeight(-1.0), maximumWidgetWidth(-1.0), - minimumWidgetHeight(-1.0), minimumWidgetWidth(-1.0) + : id(-1) {} int id; QString portraitWallpaper; QString landscapeWallpaper; - int defaultPageId; - int maximumPageCount; - qreal maximumWidgetHeight; - qreal maximumWidgetWidth; - qreal minimumWidgetHeight; - qreal minimumWidgetWidth; + }; class HSDOMAINMODEL_EXPORT HsPageData @@ -69,7 +64,7 @@ { public: HsWidgetPresentationData() - : x(0), y(0), zValue(0), + : orientation(Qt::Vertical), x(0), y(0), zValue(0), widgetId(-1) {} @@ -79,11 +74,84 @@ y = pos.y(); } - QString key; + QPointF pos() const + { + return QPointF(x, y); + } + + Qt::Orientation orientation; qreal x; qreal y; qreal zValue; int widgetId; }; +class HSDOMAINMODEL_EXPORT HsGeneralConfiguration +{ +public: + int bounceEffect; // pixels, bounce effect reservation, half in left side and half in right side of wallpaper + qreal tapAndHoldDistance; // pixels + int widgetTapAndHoldTimeout; // ms, duration of long press before action is triggered on widget + int sceneTapAndHoldTimeout; // ms, duration of long press before action is triggered on background + qreal pageChangeZoneWidth; // pixels + qreal pageIndicatorSpacing; // pixels + int pageChangeAnimationDuration; // ms, this is how long page change animation takes + int pageChangeZoneAnimationDuration; // ms, this is how long crawling is done before page is actually changed + int pageChangeZoneReverseAnimationDuration; // ms, animation duration back to starting position when crawling ends before page is changed + int pageRemovedAnimationDuration; // ms + int newPageAddedAnimationDuration; // ms + int widgetDragEffectDuration; // ms + int widgetDropEffectDuration; // ms + int boundaryFeedbackEffectDistance; // pixels, when widget is moved within n pixels from first page right border or + // n pixels from last page's left border, feedback effect is played + int defaultPageId; // id of default page (which cannot be removed) + int maximumPageCount; // maximum number of pages + qreal maximumWidgetHeight; // px + qreal maximumWidgetWidth; // px + qreal minimumWidgetHeight; // px + qreal minimumWidgetWidth; // px + bool shortcutLabelsVisible; // display labels under shortcut widgets + qreal pageChangePanDistance; // un, amount of pan needed to change page +}; + +class HSDOMAINMODEL_EXPORT HsFeedbackConfiguration +{ +public: + HbFeedback::InstantEffect feedbackFromString(const QString &feedback) + { + int index = HbFeedback::staticMetaObject.indexOfEnumerator("InstantEffect"); + QMetaEnum metaEnum = HbFeedback::staticMetaObject.enumerator(index); + + int intFeedback = metaEnum.keysToValue(feedback.toAscii()); + + if (intFeedback < HbFeedback::None || intFeedback > HbFeedback::InstantMaxUser) { + return HbFeedback::None; + } + + return static_cast(intFeedback); + } + +public: + HbFeedback::InstantEffect pageChangeFeedbackType; + HbFeedback::InstantEffect widgetPickFeedbackType; + HbFeedback::InstantEffect widgetDropFeedbackType; + HbFeedback::InstantEffect widgetRepositionFeedbackType; + HbFeedback::InstantEffect widgetOverTrashbinFeedbackType; + HbFeedback::InstantEffect widgetDropToTrashbinFeedbackType; + HbFeedback::InstantEffect shortcutWidgetTapFeedbackType; + HbFeedback::InstantEffect widgetMoveBlockedFeedbackType; + HbFeedback::InstantEffect clockWidgetTapFeedbackType; + HbFeedback::InstantEffect widgetSnappingFeedbackType; +}; + +class HSDOMAINMODEL_EXPORT HsSnapConfiguration +{ +public: + bool snappingEnabled; // variable to tell if snapping is enabled or not + qreal snapForce; // this is the distance at which the widget starts being attracted to the line + qreal snapGap; // the gap at which the objects settle into from each other when they snap + qreal borderGap; // (the gap from the border edges when the widget settles on the edges of the page + int timeout; // time in milliseconds after which the snapping line will be shown +}; + #endif // HSDOMAINMODELDATASTRUCTURES_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsgui.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/inc/hsgui.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,51 @@ +/* +* 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: +* +*/ + +#ifndef HSGUI_H +#define HSGUI_H + +#include + +#include "hsdomainmodel_global.h" +#include "hstest_global.h" + +HOMESCREEN_TEST_CLASS(HomeScreenStatePluginTest) + +class HbView; +class HbMainWindow; + +class HSDOMAINMODEL_EXPORT HsGui +{ +public: + static HbView *idleView(); + static HbView *takeIdleView(); + static void setIdleView(HbView *idleView); + + static HbMainWindow *mainWindow(); + +private: + HsGui() {} + +private: + static QPointer mIdleView; + + HOMESCREEN_TEST_FRIEND_CLASS(HomeScreenStatePluginTest) +}; + +Q_DECLARE_METATYPE(HsGui*) + +#endif // HSGUI_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hspage.h --- a/homescreenapp/hsdomainmodel/inc/hspage.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hspage.h Wed Jun 23 17:05:06 2010 +0100 @@ -30,15 +30,16 @@ class HSDOMAINMODEL_EXPORT HsPage : public HbWidget { - Q_OBJECT + Q_OBJECT + Q_PROPERTY(int pageIndex READ pageIndex) public: HsPage(QGraphicsItem *parent = 0); - ~HsPage(); + ~HsPage(); int databaseId() const; void setDatabaseId(int id); - + bool load(); bool addExistingWidget(HsWidgetHost *widgetHost); @@ -50,9 +51,11 @@ bool deleteFromDatabase(); QList widgets() const; - + bool isRemovable() const; void setRemovable(bool removable); + + bool isActivePage() const; static HsPage *createInstance(const HsPageData &pageData); @@ -63,21 +66,30 @@ void updateZValues(); + int pageIndex(); + private: + Q_DISABLE_COPY(HsPage) void connectWidget(HsWidgetHost *widget); void disconnectWidget(HsWidgetHost *widget); private slots: - void onWidgetFinished(HsWidgetHost *widget); - void onWidgetResized(HsWidgetHost *widget); + void onWidgetFinished(); + void onWidgetFaulted(); + void onWidgetResized(); + void onWidgetAvailable(); + void onWidgetUnavailable(); + + void onOrientationChanged(Qt::Orientation orientation); private: - int mDatabaseId; + int mDatabaseId; bool mRemovable; QList mWidgets; QList mNewWidgets; - + QList mUnavailableWidgets; + HOMESCREEN_TEST_FRIEND_CLASS(TestRuntimeServices) }; - + #endif diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsscene.h --- a/homescreenapp/hsdomainmodel/inc/hsscene.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hsscene.h Wed Jun 23 17:05:06 2010 +0100 @@ -76,7 +76,7 @@ private: HsScene(QObject *parent = 0); - void calculateWidgetSizeLimitations(HsSceneData &sceneData); + void calculateWidgetSizeLimitations(); Q_DISABLE_COPY(HsScene) private: diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hsshortcutservice.h --- a/homescreenapp/hsdomainmodel/inc/hsshortcutservice.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hsshortcutservice.h Wed Jun 23 17:05:06 2010 +0100 @@ -48,7 +48,7 @@ private: QScopedPointer mD; - static QScopedPointer mInstance; + static HsShortcutService *mInstance; HOMESCREEN_TEST_FRIEND_CLASS(TestRuntimeServices) }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hswidgetcomponent.h --- a/homescreenapp/hsdomainmodel/inc/hswidgetcomponent.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hswidgetcomponent.h Wed Jun 23 17:05:06 2010 +0100 @@ -26,11 +26,6 @@ #include "hstest_global.h" HOMESCREEN_TEST_CLASS(TestRuntimeServices) -#include "cadefs.h" - -class CaEntry; -class HsWidgetComponentDescriptor; - class HSDOMAINMODEL_EXPORT HsWidgetComponent : public QObject { Q_OBJECT diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/inc/hswidgethost.h --- a/homescreenapp/hsdomainmodel/inc/hswidgethost.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/inc/hswidgethost.h Wed Jun 23 17:05:06 2010 +0100 @@ -18,125 +18,125 @@ #ifndef HSWIDGETHOST_H #define HSWIDGETHOST_H -#include +#include #include #include -#include - +#include "hsdomainmodel_global.h" #include "hsdomainmodeldatastructures.h" -#include "hsdomainmodel_global.h" -#include "hstest_global.h" +#include "hstest_global.h" +HOMESCREEN_TEST_CLASS(TestRuntimeServices) -class HbIconItem; +class QStateMachine; + +class HsWidgetComponent; class HsPage; - -HOMESCREEN_TEST_CLASS(TestRuntimeServices) - class HSDOMAINMODEL_EXPORT HsWidgetHost : public HbWidget { Q_OBJECT public: - enum State { - Unloaded, - Loaded, - Initialized, - Visible, - Hidden, - Uninitialized, - Finished, - Faulted, - UninstallingOrUpdating - }; + HsWidgetHost(int databaseId, QGraphicsItem *parent = 0); + ~HsWidgetHost(); -public: - static HsWidgetHost *createInstance(HsWidgetData &widgetData, - const QVariantHash &preferences = QVariantHash()); - - HsWidgetHost(int databaseId, QGraphicsItem *parent = 0); - - ~HsWidgetHost(); - - bool load(); - void unload(); - - bool setPage(HsPage *page); - HsPage *page() const; - - bool isValid() const; + static HsWidgetHost *createInstance( + HsWidgetData &widgetData, + const QVariantHash &preferences = QVariantHash()); int databaseId() const; - State state() const { return mState; } + bool setPage(HsPage *page); + HsPage *page() const; - bool deleteFromDatabase(); + bool isPannable(QGraphicsSceneMouseEvent *event); - bool setWidgetPresentation(); - bool setWidgetPresentationData(HsWidgetPresentationData &presentationData); - bool widgetPresentationData(const QString &key, HsWidgetPresentationData &presentationData); - - HsWidgetPresentationData widgetPresentation(Qt::Orientation orientation); - bool loadWidgetPresentation(); - bool deleteWidgetPresentation(Qt::Orientation orientation); + bool loadPresentation(); + bool loadPresentation(Qt::Orientation orientation); + bool savePresentation(); + bool savePresentation(Qt::Orientation orientation); + bool savePresentation(HsWidgetPresentationData &presentation); + bool getPresentation(HsWidgetPresentationData &presentation); + bool removePresentation(Qt::Orientation orientation); signals: - void widgetFinished(HsWidgetHost *widget); - void widgetError(HsWidgetHost *widget); - void widgetResized(HsWidgetHost *widget); + void event_startAndShow(); + void event_startAndHide(); + void event_unload(); + void event_show(); + void event_hide(); + void event_remove(); + void event_close(); + void event_finished(); + void event_faulted(); + + void finished(); + void faulted(); + void resized(); + void available(); + void unavailable(); public slots: - void initializeWidget(); + void startWidget(bool show = true); void showWidget(); void hideWidget(); - void uninitializeWidget(); void setOnline(bool online = true); + + void remove(); + void close(); void startDragEffect(); void startDropEffect(); - - void startTapAndHoldAnimation(); - void stopTapAndHoldAnimation(); + +protected: + bool eventFilter(QObject *watched, QEvent *event); + void mousePressEvent(QGraphicsSceneMouseEvent *) {} -protected: - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event) } - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event) } - void mousePressEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event) } - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event) } - bool eventFilter(QObject *obj, QEvent *event); - private: + Q_DISABLE_COPY(HsWidgetHost) + void setupEffects(); + void setupStates(); + bool setProperty(const char *name, QMetaProperty &property); bool setMethod(const char *signature, QMetaMethod &method); bool hasSignal(const char *signature); + + void setNewSize(const QSizeF &size); + bool setPreferencesToWidget(); - void setNewSize(const QSizeF &newSize); private slots: - void onSetPreferences(const QStringList &names); + void action_connectComponent(); + void action_disconnectComponent(); + void action_load(); + void action_unload(); + void action_initialize(); + void action_uninitialize(); + void action_show(); + void action_hide(); + void action_finished(); + void action_faulted(); + void action_remove(); + void onFinished(); void onError(); - void onAboutToUninstall(); - void onUpdated(); - void onUnavailable(); - void onAvailable(); + void onSetPreferences(const QStringList &names); + private: - Q_DISABLE_COPY(HsWidgetHost) + int mDatabaseId; + QStateMachine *mStateMachine; QGraphicsWidget *mWidget; - HsPage *mPage; + HsPage *mPage; + HsWidgetComponent *mComponent; QMetaMethod mOnInitializeMethod; QMetaMethod mOnShowMethod; QMetaMethod mOnHideMethod; QMetaMethod mOnUninitializeMethod; + QMetaMethod mIsPannableMethod; QMetaProperty mIsOnlineProperty; - QMetaProperty mRootPathProperty; - State mState; - QString mUri; - int mDatabaseId; - - HbIconItem *mTapAndHoldIcon; + QMetaProperty mRootPathProperty; + bool mIsFinishing; HOMESCREEN_TEST_FRIEND_CLASS(TestRuntimeServices) }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsbackuprestoreactivecallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/src/hsbackuprestoreactivecallback.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,204 @@ +/* +* 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 the License "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: Active callback for Backup/Restore observer. +* +*/ + + +// INCLUDE FILES +#include + +#include "hsbackuprestoreactivecallback.h" +#include "hsbackuprestoreobserver.h" + +// CONSTANTS + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHsBURActiveCallback* CHsBURActiveCallback::NewL(HsBackupRestoreObserver* observer) +{ + CHsBURActiveCallback* self = + new( ELeave ) CHsBURActiveCallback(observer); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; +} + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CHsBURActiveCallback::~CHsBURActiveCallback() +{ +} + +// --------------------------------------------------------------------------- +// Inform that all data has been backed up or restored. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::AllSnapshotsSuppliedL() +{ + // No implementation needed. Must not leave +} + +// --------------------------------------------------------------------------- +// Not supported. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::ReceiveSnapshotDataL( + TDriveNumber /*aDrive*/, TDesC8& /*aBuffer*/, TBool /*aLastSection*/) +{ + // No implementation needed + User::Leave( KErrNotSupported ); +} + +// --------------------------------------------------------------------------- +// Make a guess about data size. +// --------------------------------------------------------------------------- +// +TUint CHsBURActiveCallback::GetExpectedDataSize( + TDriveNumber /*aDrive*/) +{ + // No implementation needed + return 0; +} + +// --------------------------------------------------------------------------- +// Not supported. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::GetSnapshotDataL( + TDriveNumber /*aDrive*/, TPtr8& /*aBuffer*/, TBool& /*aFinished*/) +{ + // No implementation needed + User::Leave( KErrNotSupported ); +} + +// --------------------------------------------------------------------------- +// Initialize for backup. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::InitialiseGetBackupDataL( + TDriveNumber /*aDrive*/) +{ + iObserver->backupRestoreStarted(); +} + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::GetBackupDataSectionL( + TPtr8& /*aBuffer*/, TBool& aFinished) +{ + // No data for active backup + aFinished = ETrue; +} + +// --------------------------------------------------------------------------- +// Initialize restore. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::InitialiseRestoreBaseDataL( + TDriveNumber /*aDrive*/ ) +{ + // No implementation needed + User::Leave( KErrNotSupported ); +} + +// --------------------------------------------------------------------------- +// Run state machine for restore. Receive stream from BUR engine and turn it +// to file(s). +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::RestoreBaseDataSectionL( + TDesC8& /*aBuffer*/, TBool /*aFinished*/ ) +{ + // No implementation needed + User::Leave( KErrNotSupported ); +} + +// --------------------------------------------------------------------------- +// Incremental restoration is not supported. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::InitialiseRestoreIncrementDataL( + TDriveNumber /*aDrive*/) +{ + // No implementation needed + User::Leave( KErrNotSupported ); +} + +// --------------------------------------------------------------------------- +// Incremental restoration is not supported. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::RestoreIncrementDataSectionL( + TDesC8& /*aBuffer*/, TBool /*aFinished*/) +{ + // No implementation needed + User::Leave( KErrNotSupported ); +} + +// --------------------------------------------------------------------------- +// Called when restore is complete - sets data back to initial state. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::RestoreComplete(TDriveNumber /*aDrive*/) +{ + // No implementation needed +} + +// --------------------------------------------------------------------------- +// Tidy up when operation is over. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::TerminateMultiStageOperation() +{ + // No implementation needed +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TUint CHsBURActiveCallback::GetDataChecksum(TDriveNumber /*aDrive*/) +{ + // No implementation needed + return 0; +} + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CHsBURActiveCallback::CHsBURActiveCallback(HsBackupRestoreObserver* observer) +{ + iObserver = observer; +} + +// --------------------------------------------------------------------------- +// 2nd phase constructor. +// --------------------------------------------------------------------------- +// +void CHsBURActiveCallback::ConstructL() +{ +} + +// End of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsbackuprestoreobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/src/hsbackuprestoreobserver.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,198 @@ +/* +* 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: Home screen Backup/Restore observer. +* +*/ + + +#include "hsdatabase.h" +#include "hsbackuprestoreobserver.h" +#ifdef Q_OS_SYMBIAN +#include +#include +#include +#include "hsbackuprestoreactivecallback.h" +#include "hsbackuprestoreobserver_p.h" + +/*! + Constructs a new observer with the given \a parent object. +*/ +HsBackupRestoreObserverPrivate::HsBackupRestoreObserverPrivate(HsBackupRestoreObserver *observer, + QObject *parent): + QObject(parent), + mQ(observer), + mCallBack(NULL), + mActiveBackupClient(NULL), + mLastType(conn::EBURNormal) +{ + XQPublishAndSubscribeSettingsKey backupRestoreKey(KUidSystemCategory.iUid, KUidBackupRestoreKey); + XQSettingsManager *sm = new XQSettingsManager(this); + + connect(sm,SIGNAL(valueChanged(XQSettingsKey, const QVariant &)), this, + SLOT(handleKeyChange(XQSettingsKey, const QVariant &))); + sm->startMonitoring(backupRestoreKey); +} + +/*! + Destructor. +*/ +HsBackupRestoreObserverPrivate::~HsBackupRestoreObserverPrivate() +{ + delete mCallBack; + delete mActiveBackupClient; +} + +/*! + Informs active backup client, when Home screen is ready for backup/restore. +*/ +void HsBackupRestoreObserverPrivate::readyForBUR() +{ + mActiveBackupClient->ConfirmReadyForBURL( KErrNone ); +} + +/*! + \fn HsBackupRestoreObserverPrivate::handleKeyChange() + + Handles the key change. Creates active backup client and + informs client about backup/restore state change. +*/ + +void HsBackupRestoreObserverPrivate::handleKeyChange(XQSettingsKey key, const QVariant &value) +{ + conn::TBURPartType type = static_cast< conn::TBURPartType > + ( value.toInt() & conn::KBURPartTypeMask ); + + // Test if the device is going into backup or restore mode, and we are + // required to participate. + if ( key.key() == KUidBackupRestoreKey && + (( type == conn::EBURBackupFull || type == conn::EBURRestoreFull ) || + ( type == conn::EBURBackupPartial || type == conn::EBURRestorePartial )) ) + { + if ( !mCallBack ) + { + mCallBack = CHsBURActiveCallback::NewL(mQ); + } + + if ( !mActiveBackupClient ) + { + mActiveBackupClient = conn::CActiveBackupClient::NewL( mCallBack ); + + if ( ( type == conn::EBURBackupPartial || + type == conn::EBURRestorePartial ) && + !mActiveBackupClient->DoesPartialBURAffectMeL() ) + { + delete mCallBack; + mCallBack = NULL; + delete mActiveBackupClient; + mActiveBackupClient = NULL; + return; + } + mQ->backupRestoreStarted(); + } + } + else + { + if ( key.key() == KUidBackupRestoreKey && type == conn::EBURNormal ) + { + if ( (mLastType == conn::EBURBackupFull || mLastType == conn::EBURBackupPartial) || + (mLastType == conn::EBURRestorePartial || mLastType == conn::EBURRestoreFull) ) + { + mQ->backupRestoreComplited(); + } + // delete once back to normal. + delete mCallBack; + mCallBack = NULL; + delete mActiveBackupClient; + mActiveBackupClient = NULL; + } + } + + mLastType = type; +} +#endif //Q_OS_SYMBIAN + +/*! + Singleton. +*/ +HsBackupRestoreObserver *HsBackupRestoreObserver::instance() +{ + if (!mInstance) { + mInstance = new HsBackupRestoreObserver(); + } + return mInstance; +} + +/*! + Constructs a new observer with the given \a parent object. +*/ +HsBackupRestoreObserver::HsBackupRestoreObserver(QObject *parent) + : QObject(parent), + mBUROngoing(false) +{ +#ifdef Q_OS_SYMBIAN + mD = new HsBackupRestoreObserverPrivate(this); +#endif //Q_OS_SYMBIAN +} + +/*! + Destructor. +*/ +HsBackupRestoreObserver::~HsBackupRestoreObserver() +{ +#ifdef Q_OS_SYMBIAN + delete mD; +#endif //Q_OS_SYMBIAN +} + +/*! + Called when backup/restore is started. +*/ +void HsBackupRestoreObserver::backupRestoreStarted() +{ + mBUROngoing = true; + emit event_backupRestoreStarted(); +} + +/*! + Called when backup/restore is completed. +*/ +void HsBackupRestoreObserver::backupRestoreComplited() +{ + mBUROngoing = false; + emit event_backupRestoreComplited(); +} + +/*! + Called when Home screen is ready for backup/restore. +*/ +void HsBackupRestoreObserver::readyForBUR() +{ +#ifdef Q_OS_SYMBIAN + mD->readyForBUR(); +#endif //Q_OS_SYMBIAN +} + +/*! + Returns true if bacup/restore is ongoing. +*/ +bool HsBackupRestoreObserver::checkBUR() +{ + return mBUROngoing; +} +/*! + Points to the observer instance. +*/ +HsBackupRestoreObserver *HsBackupRestoreObserver::mInstance(0); + +// End of File diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsconfiguration.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/src/hsconfiguration.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,128 @@ +/* +* 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: +* +*/ +#include "hsconfiguration.h" +#include "hsdomainmodeldatastructures.h" +#include "hsdatabase.h" + +#include + +/*! + Loads configuration data from database. +*/ +void HsConfiguration::loadConfiguration() +{ + HsDatabase *db = HsDatabase::instance(); + + HsGeneralConfiguration generalConfiguration; + if (db->generalConfiguration(generalConfiguration)) { + mBounceEffect = generalConfiguration.bounceEffect; + mTapAndHoldDistance = generalConfiguration.tapAndHoldDistance; + mWidgetTapAndHoldTimeout = generalConfiguration.widgetTapAndHoldTimeout; + mSceneTapAndHoldTimeout = generalConfiguration.sceneTapAndHoldTimeout; + mPageChangeZoneWidth = generalConfiguration.pageChangeZoneWidth; + mPageIndicatorSpacing = generalConfiguration.pageIndicatorSpacing; + mPageChangeAnimationDuration = generalConfiguration.pageChangeAnimationDuration; + mPageChangeZoneAnimationDuration = generalConfiguration.pageChangeZoneAnimationDuration; + mPageChangeZoneReverseAnimationDuration = generalConfiguration.pageChangeZoneReverseAnimationDuration; + mPageRemovedAnimationDuration = generalConfiguration.pageRemovedAnimationDuration; + mNewPageAddedAnimationDuration = generalConfiguration.newPageAddedAnimationDuration; + mWidgetDragEffectDuration = generalConfiguration.widgetDragEffectDuration; + mWidgetDropEffectDuration = generalConfiguration.widgetDropEffectDuration; + mBounceFeedbackEffectDistance = generalConfiguration.boundaryFeedbackEffectDistance; + mDefaultPageId = generalConfiguration.defaultPageId; + mMaximumPageCount = generalConfiguration.maximumPageCount; + mMaximumWidgetHeight = generalConfiguration.maximumWidgetHeight; + mMaximumWidgetWidth = generalConfiguration.maximumWidgetWidth; + mMinimumWidgetHeight = generalConfiguration.minimumWidgetHeight; + mMinimumWidgetWidth = generalConfiguration.minimumWidgetWidth; + mShortcutLabelsVisible = generalConfiguration.shortcutLabelsVisible; + mPageChangePanDistance = generalConfiguration.pageChangePanDistance; + mPageChangePanDistanceInPixels = mPageChangePanDistance * HbDeviceProfile::current().unitValue(); + } else { + Q_ASSERT_X(1, "Configuration", "Homescreen configuration could not be loaded from database"); + } + + HsFeedbackConfiguration feedbackConfiguration; + if (db->feedbackConfiguration(feedbackConfiguration)) { + mPageChangeFeedbackType = feedbackConfiguration.pageChangeFeedbackType; + mWidgetPickFeedbackType = feedbackConfiguration.widgetPickFeedbackType; + mWidgetDropFeedbackType = feedbackConfiguration.widgetDropFeedbackType; + mWidgetRepositionFeedbackType = feedbackConfiguration.widgetRepositionFeedbackType; + mWidgetOverTrashbinFeedbackType = feedbackConfiguration.widgetOverTrashbinFeedbackType; + mWidgetDropToTrashbinFeedbackType = feedbackConfiguration.widgetDropToTrashbinFeedbackType; + mShortcutWidgetTapFeedbackType = feedbackConfiguration.shortcutWidgetTapFeedbackType; + mWidgetMoveBlockedFeedbackType = feedbackConfiguration.widgetMoveBlockedFeedbackType; + mClockWidgetTapFeedbackType = feedbackConfiguration.clockWidgetTapFeedbackType; + mWidgetSnappingFeedbackType = feedbackConfiguration.widgetSnappingFeedbackType; + } else { + Q_ASSERT_X(1, "Configuration", "Homescreen feedback cnfiguration could not be loaded from database"); + } + + HsSnapConfiguration snapConfiguration; + if (db->snapConfiguration(snapConfiguration)) { + mSnapEnabled = snapConfiguration.snappingEnabled; + mSnapForce = snapConfiguration.snapForce; + mSnapGap = snapConfiguration.snapGap; + mSnapBorderGap = snapConfiguration.borderGap; + mSnapTimeout = snapConfiguration.timeout; + } else { + Q_ASSERT_X(1, "Configuration", "Homescreen snap configuration could not be loaded from database"); + } +} + +// static member variables initilized here, these values will be used if fetching from database fails +int HsConfiguration::mBounceEffect = 20; +qreal HsConfiguration::mTapAndHoldDistance = 16.0; +int HsConfiguration::mWidgetTapAndHoldTimeout = 500; +int HsConfiguration::mSceneTapAndHoldTimeout = 500; +qreal HsConfiguration::mPageChangeZoneWidth = 60.0; +qreal HsConfiguration::mPageIndicatorSpacing = 8.0; +int HsConfiguration::mPageChangeAnimationDuration = 200; +int HsConfiguration::mPageChangeZoneAnimationDuration = 800; +int HsConfiguration::mPageChangeZoneReverseAnimationDuration = 200; +int HsConfiguration::mPageRemovedAnimationDuration = 200; +int HsConfiguration::mNewPageAddedAnimationDuration = 700; +int HsConfiguration::mWidgetDragEffectDuration = 200; +int HsConfiguration::mWidgetDropEffectDuration = 200; +int HsConfiguration::mBounceFeedbackEffectDistance = 3; +int HsConfiguration::mDefaultPageId = 1; +int HsConfiguration::mMaximumPageCount = 8; +qreal HsConfiguration::mMaximumWidgetHeight = 39; +qreal HsConfiguration::mMaximumWidgetWidth = 48; +qreal HsConfiguration::mMinimumWidgetHeight = 8.75; +qreal HsConfiguration::mMinimumWidgetWidth = 8.75; +bool HsConfiguration::mShortcutLabelsVisible = false; +qreal HsConfiguration::mPageChangePanDistance = 17.91; +int HsConfiguration::mPageChangePanDistanceInPixels = 120; + +HbFeedback::InstantEffect HsConfiguration::mPageChangeFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetPickFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetDropFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetRepositionFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetOverTrashbinFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetDropToTrashbinFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mShortcutWidgetTapFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetMoveBlockedFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mClockWidgetTapFeedbackType = HbFeedback::None; +HbFeedback::InstantEffect HsConfiguration::mWidgetSnappingFeedbackType = HbFeedback::None; + +bool HsConfiguration::mSnapEnabled = false; +qreal HsConfiguration::mSnapForce = 0; +qreal HsConfiguration::mSnapGap = 0; +qreal HsConfiguration::mSnapBorderGap = 0; +int HsConfiguration::mSnapTimeout = 0; + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hscontentservice.cpp --- a/homescreenapp/hsdomainmodel/src/hscontentservice.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hscontentservice.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -39,8 +39,7 @@ HsWidgetHost *widget = createWidgetForPreview(params); if (!widget) { return false; - } - + } return HsScene::instance()->activePage()->addNewWidget(widget); } @@ -49,20 +48,8 @@ HsWidgetData widgetData; widgetData.uri = params.value("uri").toString(); - - HsWidgetHost *widget = HsWidgetHost::createInstance(widgetData, - params.value("preferences").toHash()); - - if (!widget) { - return NULL; - } - if (!widget->load()) { - widget->deleteFromDatabase(); - delete widget; - return NULL; - } - - return widget; + return HsWidgetHost::createInstance( + widgetData, params.value("preferences").toHash()); } /*! @@ -70,24 +57,22 @@ */ bool HsContentService::addWidget(const QString &uri, const QVariantHash &preferences) { - HsWidgetData widgetData; - widgetData.uri = uri; + HsWidgetData data; + data.uri = uri; - QScopedPointer widget(HsWidgetHost::createInstance(widgetData, preferences)); - if (!widget.data()) { + HsWidgetHost *widget = HsWidgetHost::createInstance(data, preferences); + if (!widget) { return false; } - HsPage *activePage = HsScene::instance()->activePage(); - if (!widget->load() || !activePage->addNewWidget(widget.data())) { - widget->deleteFromDatabase(); + HsPage *page = HsScene::instance()->activePage(); + if (!page->addNewWidget(widget)) { + widget->remove(); return false; } - HsWidgetHost *taken = widget.take(); - taken->initializeWidget(); - taken->showWidget(); - activePage->layoutNewWidgets(); + widget->startWidget(); + page->layoutNewWidgets(); return true; } @@ -97,12 +82,12 @@ HsContentService *HsContentService::instance() { if (!mInstance) { - mInstance.reset(new HsContentService); + mInstance = new HsContentService(); } - return mInstance.data(); + return mInstance; } /*! Points to the content service instance. */ -QScopedPointer HsContentService::mInstance(0); +HsContentService *HsContentService::mInstance(0); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsdatabase.cpp --- a/homescreenapp/hsdomainmodel/src/hsdatabase.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hsdatabase.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -23,6 +23,7 @@ #include "hsdatabase.h" #include "hsdomainmodeldatastructures.h" +#include "hsbackuprestoreobserver.h" namespace { @@ -52,8 +53,7 @@ Constructs a new database with the given \a parent object. */ HsDatabase::HsDatabase(QObject *parent) - : QObject(parent), - mBlocked(false) + : QObject(parent) { } @@ -103,7 +103,8 @@ */ bool HsDatabase::open() { - if (mBlocked) { + HsBackupRestoreObserver *brObserver = HsBackupRestoreObserver::instance(); + if (brObserver->checkBUR()) { return false; } @@ -184,21 +185,13 @@ QSqlQuery query(QSqlDatabase::database(mConnectionName)); QString statement = - "SELECT id, portraitWallpaper, landscapeWallpaper, defaultPageId, " - "maximumPageCount, maximumWidgetHeight, maximumWidgetWidth, " - "minimumWidgetHeight, minimumWidgetWidth " + "SELECT id, portraitWallpaper, landscapeWallpaper " "FROM Scene"; if (query.prepare(statement) && query.exec() && query.next()) { data.id = query.value(0).toInt(); data.portraitWallpaper = query.value(1).toString(); data.landscapeWallpaper = query.value(2).toString(); - data.defaultPageId = query.value(3).toInt(); - data.maximumPageCount = query.value(4).toInt(); - data.maximumWidgetHeight = query.value(5).toReal(); - data.maximumWidgetWidth = query.value(6).toReal(); - data.minimumWidgetHeight = query.value(7).toReal(); - data.minimumWidgetWidth = query.value(8).toReal(); return true; } @@ -572,6 +565,9 @@ return false; } + QString key = data.orientation == Qt::Vertical ? + QLatin1String("portrait") : QLatin1String("landscape"); + QSqlQuery query(QSqlDatabase::database(mConnectionName)); QString statement = @@ -580,7 +576,7 @@ "WHERE key = ? AND widgetId = ?"; if (query.prepare(statement)) { - query.addBindValue(data.key); + query.addBindValue(key); query.addBindValue(data.widgetId); if (query.exec() && query.next()) { data.x = query.value(0).toReal(); @@ -602,6 +598,9 @@ return false; } + QString key = data.orientation == Qt::Vertical ? + QLatin1String("portrait") : QLatin1String("landscape"); + QSqlQuery query(QSqlDatabase::database(mConnectionName)); QString statement = @@ -610,7 +609,7 @@ "VALUES (?, ?, ?, ?, ?)"; if (query.prepare(statement)) { - query.addBindValue(data.key); + query.addBindValue(key); query.addBindValue(data.x); query.addBindValue(data.y); query.addBindValue(data.zValue); @@ -624,12 +623,15 @@ /*! */ -bool HsDatabase::deleteWidgetPresentation(int widgetId, const QString &key) +bool HsDatabase::deleteWidgetPresentation(int widgetId, Qt::Orientation orientation) { if (!checkConnection()) { return false; } + QString key = orientation == Qt::Vertical ? + QLatin1String("portrait") : QLatin1String("landscape"); + QSqlQuery query(QSqlDatabase::database(mConnectionName)); QString statement = @@ -759,20 +761,113 @@ } /*! - Sets the database blocked or unblocked. + */ -void HsDatabase::setDataBaseBlocked(bool blocked) +bool HsDatabase::generalConfiguration(HsGeneralConfiguration &data) { - mBlocked = blocked; + if (!checkConnection()) { + return false; + } + + QSqlQuery query(QSqlDatabase::database(mConnectionName)); + + QString statement = + "SELECT bounceEffect, tapAndHoldDistance, widgetTapAndHoldTimeout, sceneTapAndHoldTimeout, " + "pageChangeZoneWidth, " + "pageIndicatorSpacing, pageChangeAnimationDuration, pageChangeZoneAnimationDuration, " + "pageChangeZoneReverseAnimationDuration, " + "pageRemovedAnimationDuration, newPageAddedAnimationDuration, widgetDragEffectDuration, " + "widgetDropEffectDuration, boundaryFeedbackEffectDistance, " + "defaultPageId, maximumPageCount, maximumWidgetHeight, maximumWidgetWidth, " + "minimumWidgetHeight, minimumWidgetWidth, shortcutLabelsVisible, " + "pageChangePanDistance " + "FROM GeneralConfiguration"; + + if (query.prepare(statement) && query.exec() && query.next()) { + data.bounceEffect = query.value(0).toInt(); + data.tapAndHoldDistance = query.value(1).toReal(); + data.widgetTapAndHoldTimeout = query.value(2).toInt(); + data.sceneTapAndHoldTimeout = query.value(3).toInt(); + data.pageChangeZoneWidth = query.value(4).toReal(); + data.pageIndicatorSpacing = query.value(5).toReal(); + data.pageChangeAnimationDuration = query.value(6).toInt(); + data.pageChangeZoneAnimationDuration = query.value(7).toInt(); + data.pageChangeZoneReverseAnimationDuration = query.value(8).toInt(); + data.pageRemovedAnimationDuration = query.value(9).toInt(); + data.newPageAddedAnimationDuration = query.value(10).toInt(); + data.widgetDragEffectDuration = query.value(11).toInt(); + data.widgetDropEffectDuration = query.value(12).toInt(); + data.boundaryFeedbackEffectDistance = query.value(13).toInt(); + data.defaultPageId = query.value(14).toInt(); + data.maximumPageCount = query.value(15).toInt(); + data.maximumWidgetHeight = query.value(16).toReal(); + data.maximumWidgetWidth = query.value(17).toReal(); + data.minimumWidgetHeight = query.value(18).toReal(); + data.minimumWidgetWidth = query.value(19).toReal(); + data.shortcutLabelsVisible = query.value(20).toBool(); + data.pageChangePanDistance = query.value(21).toReal(); + return true; + } + + return false; } /*! - Returns is the database blocked. - Return value true if blocked. + */ -bool HsDatabase::getDataBaseBlocked() +bool HsDatabase::feedbackConfiguration(HsFeedbackConfiguration &data) { - return mBlocked; + if (!checkConnection()) { + return false; + } + + QSqlQuery query(QSqlDatabase::database(mConnectionName)); + + QString statement = + "SELECT pageChangeFeedbackType, widgetPickFeedbackType, widgetDropFeedbackType, " + "widgetRepositionFeedbackType, widgetOverTrashbinFeedbackType, widgetDropToTrashbinFeedbackType, " + "shortcutWidgetTapFeedbackType, widgetMoveBlockedFeedbackType, clockWidgetTapFeedbackType, " + "widgetSnappingFeedbackType " + "FROM FeedbackConfiguration"; + + if (query.prepare(statement) && query.exec() && query.next()) { + data.pageChangeFeedbackType = data.feedbackFromString(query.value(0).toString()); + data.widgetPickFeedbackType = data.feedbackFromString(query.value(1).toString()); + data.widgetDropFeedbackType = data.feedbackFromString(query.value(2).toString()); + data.widgetRepositionFeedbackType = data.feedbackFromString(query.value(3).toString()); + data.widgetOverTrashbinFeedbackType = data.feedbackFromString(query.value(4).toString()); + data.widgetDropToTrashbinFeedbackType = data.feedbackFromString(query.value(5).toString()); + data.shortcutWidgetTapFeedbackType = data.feedbackFromString(query.value(6).toString()); + data.widgetMoveBlockedFeedbackType = data.feedbackFromString(query.value(7).toString()); + data.clockWidgetTapFeedbackType = data.feedbackFromString(query.value(8).toString()); + data.widgetSnappingFeedbackType = data.feedbackFromString(query.value(9).toString()); + return true; + } + + return false; +} + +bool HsDatabase::snapConfiguration(HsSnapConfiguration &data) +{ + if (!checkConnection()) { + return false; + } + + QSqlQuery query(QSqlDatabase::database(mConnectionName)); + + QString statement = + "SELECT snappingEnabled, snapForce, snapGap, borderGap, timeout " + "FROM SnapConfiguration"; + + if (query.prepare(statement) && query.exec() && query.next()) { + data.snappingEnabled = query.value(0).toBool(); + data.snapForce = query.value(1).toReal(); + data.snapGap = query.value(2).toReal(); + data.borderGap = query.value(3).toReal(); + data.timeout = query.value(4).toInt(); + return true; + } + return false; } /*! @@ -781,7 +876,11 @@ */ void HsDatabase::setInstance(HsDatabase *instance) { - mInstance.reset(instance); + if (mInstance != instance) { + HsDatabase *oldInstance = mInstance; + mInstance = instance; + delete oldInstance; + } } /*! @@ -789,7 +888,7 @@ */ HsDatabase *HsDatabase::instance() { - return mInstance.data(); + return mInstance; } /*! @@ -799,7 +898,9 @@ */ HsDatabase *HsDatabase::takeInstance() { - return mInstance.take(); + HsDatabase *instance = mInstance; + mInstance = 0; + return instance; } /*! @@ -814,4 +915,4 @@ /*! Points to the database instance. */ -QScopedPointer HsDatabase::mInstance(0); +HsDatabase *HsDatabase::mInstance(0); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsgui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/src/hsgui.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,73 @@ +/* +* 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: +* +*/ + +#include +#include + +#include "hsgui.h" + +/*! + \class HsGui + \ingroup group_hsutils + \brief Represents a view in the framework. + HsGui includes common UI components for Home screen. +*/ + +/*! + Returns the idle view. +*/ +HbView *HsGui::idleView() +{ + return mIdleView; +} + +/*! + Returns the current idle view instance. Callers of this + function take ownership of the instance. The current + view instance will be reset to null. +*/ +HbView *HsGui::takeIdleView() +{ + HbView *idleView = mIdleView; + mIdleView = 0; + return idleView; +} + +/*! + Sets the idle view instance. The existing instance + will be deleted. +*/ +void HsGui::setIdleView(HbView *idleView) +{ + if (mIdleView != idleView) { + delete mIdleView; + mIdleView = idleView; + } +} + +/*! + Returns the main window. +*/ +HbMainWindow *HsGui::mainWindow() +{ + return hbInstance->allMainWindows().first(); +} + +/*! + Points to the idle view instance. +*/ +QPointer HsGui::mIdleView(0); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hspage.cpp --- a/homescreenapp/hsdomainmodel/src/hspage.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hspage.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -27,6 +27,7 @@ #include "hswidgethost.h" #include "hswallpaper.h" #include "hswidgetpositioningonwidgetadd.h" +#include "hswidgetpositioningonorientationchange.h" /*! @@ -92,19 +93,18 @@ } foreach (HsWidgetData data, datas) { - QScopedPointer widget(new HsWidgetHost(data.id)); - if(!widget->load() || !widget->isValid()) { - continue; - } - connectWidget(widget.data()); + HsWidgetHost *widget = new HsWidgetHost(data.id); + mWidgets.append(widget); + connectWidget(widget); widget->setPage(this); - widget->initializeWidget(); - widget->showWidget(); - mWidgets.append(widget.data()); widget->setParentItem(this); - widget.take(); // now this page owns widget + widget->startWidget(); } + connect(HsScene::mainWindow(), + SIGNAL(orientationChanged(Qt::Orientation)), + SLOT(onOrientationChanged(Qt::Orientation))); + return true; } @@ -160,16 +160,13 @@ return true; } - // Set presentation. - QString key = HsScene::orientation() == Qt::Horizontal ? - "landscape" : "portrait"; - HsWidgetPresentationData presentation; - if (!widgetHost->widgetPresentationData(key, presentation)) { - presentation.key = key; + presentation.orientation = HsScene::orientation(); + if (!widgetHost->getPresentation(presentation)) { + presentation.orientation = HsScene::orientation(); presentation.setPos(QPointF()); presentation.zValue = 0; - widgetHost->setWidgetPresentationData(presentation); + widgetHost->savePresentation(presentation); } widgetHost->hide(); @@ -212,9 +209,10 @@ for (int i = 0; i < mNewWidgets.count(); ++i) { widget = mNewWidgets.at(i); widget->setGeometry(calculatedRects.at(i)); - widget->setWidgetPresentation(); + widget->savePresentation(); widget->setPage(this); widget->setParentItem(this); + widget->showWidget(); widget->show(); } mWidgets << mNewWidgets; @@ -224,19 +222,22 @@ bool HsPage::deleteFromDatabase() { - HsDatabase *db = HsDatabase::instance(); - foreach (HsWidgetHost *widget, mWidgets) { - if (!widget->deleteFromDatabase()) { - return false; - } + widget->remove(); + } + mWidgets.clear(); + + foreach (HsWidgetHost *widget, mNewWidgets) { + widget->remove(); } + mNewWidgets.clear(); - if (!db->deletePage(mDatabaseId)) { - return false; + foreach (HsWidgetHost *widget, mUnavailableWidgets) { + widget->remove(); } + mUnavailableWidgets.clear(); - return true; + return HsDatabase::instance()->deletePage(mDatabaseId); } QList HsPage::widgets() const @@ -261,6 +262,11 @@ mRemovable = removable; } +bool HsPage::isActivePage() const +{ + return this == HsScene::instance()->activePage(); +} + HsPage *HsPage::createInstance(const HsPageData &pageData) { HsDatabase *db = HsDatabase::instance(); @@ -333,24 +339,30 @@ foreach (HsWidgetHost *widget, sortedWidgets) { widget->setZValue(z++); - widget->setWidgetPresentation(); + widget->savePresentation(); } } if (!mNewWidgets.isEmpty()) { foreach (HsWidgetHost *widget, mNewWidgets) { widget->setZValue(z++); - widget->setWidgetPresentation(); + widget->savePresentation(); } } } +int HsPage::pageIndex() +{ + return HsScene::instance()->pages().indexOf(this); +} + void HsPage::connectWidget(HsWidgetHost *widget) { - connect(widget, SIGNAL(widgetFinished(HsWidgetHost*)), - SLOT(onWidgetFinished(HsWidgetHost*))); - connect(widget, SIGNAL(widgetResized(HsWidgetHost*)), - SLOT(onWidgetResized(HsWidgetHost*))); + connect(widget, SIGNAL(finished()), SLOT(onWidgetFinished())); + connect(widget, SIGNAL(faulted()), SLOT(onWidgetFaulted())); + connect(widget, SIGNAL(resized()), SLOT(onWidgetResized())); + connect(widget, SIGNAL(available()), SLOT(onWidgetAvailable())); + connect(widget, SIGNAL(unavailable()), SLOT(onWidgetUnavailable())); } void HsPage::disconnectWidget(HsWidgetHost *widget) @@ -358,9 +370,10 @@ widget->disconnect(this); } -void HsPage::onWidgetFinished(HsWidgetHost *widget) +void HsPage::onWidgetFinished() { - Q_ASSERT(widget); + HsWidgetHost *widget = qobject_cast(sender()); + // It can be in new widget list if we haven't layouted it yet // or layouted new widget and widget list if (!mNewWidgets.removeOne(widget)) { @@ -368,16 +381,21 @@ } disconnectWidget(widget); - widget->uninitializeWidget(); - widget->deleteFromDatabase(); - widget->deleteLater(); + widget->remove(); +} + +void HsPage::onWidgetFaulted() +{ + onWidgetFinished(); } /*! Calculates new widget position on page when widget size changes */ -void HsPage::onWidgetResized(HsWidgetHost *widget) +void HsPage::onWidgetResized() { + HsWidgetHost *widget = qobject_cast(sender()); + QRectF widgetRect = widget->geometry(); QRectF pageRect = HsScene::mainWindow()->layoutRect(); @@ -393,3 +411,59 @@ widget->setPos(widgetX, widgetY); } +void HsPage::onWidgetAvailable() +{ + HsWidgetHost *widget = qobject_cast(sender()); + + mUnavailableWidgets.removeOne(widget); + mWidgets.append(widget); + + widget->setParentItem(this); + widget->startWidget(isActivePage()); + widget->show(); +} + +void HsPage::onWidgetUnavailable() +{ + HsWidgetHost *widget = qobject_cast(sender()); + + if (mWidgets.contains(widget)) { + mWidgets.removeOne(widget); + } else if (mNewWidgets.contains(widget)) { + mNewWidgets.removeOne(widget); + } else { + return; + } + + mUnavailableWidgets.append(widget); + + widget->hide(); + widget->setParentItem(0); +} + +void HsPage::onOrientationChanged(Qt::Orientation orientation) +{ + QRectF rect = HsScene::mainWindow()->layoutRect(); + + HsWidgetPositioningOnOrientationChange *converter = + HsWidgetPositioningOnOrientationChange::instance(); + + qreal chrome = 64; + QRectF from(0, chrome, rect.height(), rect.width() - chrome); + QRectF to(0, chrome, rect.width(), rect.height() - chrome); + + HsWidgetPresentationData presentation; + presentation.orientation = orientation; + + foreach (HsWidgetHost *widget, mWidgets) { + if (!widget->getPresentation(presentation)) { + QList geometries = converter->convert( + from, QList() << widget->geometry(), to); + widget->setGeometry(geometries.first()); + widget->savePresentation(); + } else { + widget->setPos(presentation.pos()); + widget->setZValue(presentation.zValue); + } + } +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsscene.cpp --- a/homescreenapp/hsdomainmodel/src/hsscene.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hsscene.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -27,6 +27,7 @@ #include "hswidgethost.h" #include "hsdatabase.h" #include "hswallpaper.h" +#include "hsconfiguration.h" /*! Destructor. @@ -57,9 +58,9 @@ return false; } - mMaximumPageCount = sceneData.maximumPageCount; + mMaximumPageCount = HsConfiguration::maximumPageCount(); - calculateWidgetSizeLimitations(sceneData); + calculateWidgetSizeLimitations(); if (sceneData.portraitWallpaper.isEmpty()) { mWallpaper->setImagesById(); @@ -83,7 +84,7 @@ delete page; continue; } - if (pageData.id == sceneData.defaultPageId) { + if (pageData.id == HsConfiguration::defaultPageId()) { mActivePage = page; mActivePage->setRemovable(false); } @@ -97,19 +98,17 @@ /*! Calculate maximum and minimum widget sizes */ -void HsScene::calculateWidgetSizeLimitations(HsSceneData &sceneData) +void HsScene::calculateWidgetSizeLimitations() { // 1un = 6.7px = 2mm - mMaximumWidgetSizeInUnits = QSizeF(sceneData.maximumWidgetWidth, - sceneData.maximumWidgetHeight); - mMinimumWidgetSizeInUnits = QSizeF(sceneData.minimumWidgetWidth, - sceneData.minimumWidgetHeight); + mMaximumWidgetSizeInUnits = QSizeF(HsConfiguration::maximumWidgetWidth(), + HsConfiguration::maximumWidgetHeight()); + mMinimumWidgetSizeInUnits = QSizeF(HsConfiguration::minimumWidgetWidth(), + HsConfiguration::minimumWidgetHeight()); HbDeviceProfile profile; qreal unitToPixelFactor = profile.unitValue(); - mMaximumWidgetSizeInPixels = QSizeF(sceneData.maximumWidgetWidth * unitToPixelFactor, - sceneData.maximumWidgetHeight * unitToPixelFactor); - mMinimumWidgetSizeInPixels = QSizeF(sceneData.minimumWidgetWidth * unitToPixelFactor, - sceneData.minimumWidgetHeight * unitToPixelFactor); + mMaximumWidgetSizeInPixels = unitToPixelFactor * mMaximumWidgetSizeInUnits; + mMinimumWidgetSizeInPixels = unitToPixelFactor * mMinimumWidgetSizeInUnits; } /*! @@ -149,6 +148,8 @@ return false; } + int addPosition = data.indexPosition; + db->transaction(); for (int i = data.indexPosition; i < mPages.count(); ++i) { @@ -162,7 +163,7 @@ db->commit(); - mPages.insert(data.indexPosition, page); + mPages.insert(addPosition, page); return true; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hsshortcutservice.cpp --- a/homescreenapp/hsdomainmodel/src/hsshortcutservice.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hsshortcutservice.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -68,9 +68,9 @@ HsShortcutService *HsShortcutService::instance(QStateMachine *stateMachine) { if (!mInstance && stateMachine) { - mInstance.reset(new HsShortcutService(stateMachine)); + mInstance = new HsShortcutService(stateMachine); } - return mInstance.data(); + return mInstance; } HsShortcutService::~HsShortcutService() @@ -94,4 +94,4 @@ mD.reset(new HsShortcutServicePrivate(stateMachine)); } -QScopedPointer HsShortcutService::mInstance(0); +HsShortcutService *HsShortcutService::mInstance(0); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hswallpaper.cpp --- a/homescreenapp/hsdomainmodel/src/hswallpaper.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hswallpaper.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -56,7 +56,7 @@ mLImagePath = landscapeImagePath; mPImagePath = portraitImagePath; mOrientation = HsScene::orientation(); - + if (mOrientation == Qt::Horizontal) { setLandscapeImage(mLImagePath, true); } else { @@ -90,7 +90,7 @@ if (mPImagePath != wallpaperPath(Qt::Vertical)) { QFile::remove(mPImagePath); mPImagePath.clear(); - } + } return true; } @@ -100,7 +100,7 @@ static QString directory = QDir::toNativeSeparators("c:/private/20022f35/wallpapers/"); #else - static QString directory = + static QString directory = QDir::toNativeSeparators(QDir::currentPath() + "/private/20022f35/wallpapers/"); #endif @@ -124,4 +124,4 @@ } else { mIconItem->setIcon(HbIcon(QIcon(mPImagePath))); } -} \ No newline at end of file +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hswidgetcomponent.cpp --- a/homescreenapp/hsdomainmodel/src/hswidgetcomponent.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hswidgetcomponent.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -19,8 +19,6 @@ #include #include "hswidgetcomponent.h" -#include "hswidgetcomponentdescriptor.h" -#include "hswidgetcomponentregistry.h" #include "hsapp_defs.h" #include "caservice.h" #include "caquery.h" @@ -171,9 +169,3 @@ emit available(); } } - - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hswidgetcomponentdescriptor.cpp --- a/homescreenapp/hsdomainmodel/src/hswidgetcomponentdescriptor.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hswidgetcomponentdescriptor.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -23,6 +23,10 @@ \class HsWidgetComponentDescriptor \ingroup group_hsdomainmodel \brief Homescreen widget component descriptor class. + + Homescreen widget component descriptor class hosts meta data of + widget component. Meta data is delivered in manifest file. + \see page_widgetsispackage */ diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hswidgetcomponentregistry.cpp --- a/homescreenapp/hsdomainmodel/src/hswidgetcomponentregistry.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hswidgetcomponentregistry.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -37,6 +37,15 @@ \class HsWidgetComponentRegistry \ingroup group_hsdomainmodel \brief Homescreen widget component registry. + + Homescreen widget component registry keeps track of packages from which is(are) + created widget(s) to homescreen page(s). Registry updates its content + when the installation package is uninstalled/updated or installation location is( or is not) + available (media attached/detached). Registry takes care of package registration/unregistration + to Qt service framework. + + Events for all above cases are get from Content Storage. Component registry listens + changes of Content Storages' entries (CaEntry) via its service class (CaService). */ HsWidgetComponentRegistry *HsWidgetComponentRegistry::mInstance = 0; @@ -64,6 +73,7 @@ /*! Returns component object of the given \a uri. + Uri is defined in widget manifest file. \see page_widgetsispackage */ HsWidgetComponent *HsWidgetComponentRegistry::component(const QString &uri) { @@ -77,15 +87,15 @@ } /*! - Requests widget component to emit 'aboutToInstall' signal to free widget resources when uninstalling the widget. + Requests widget component to emit 'aboutToUninstall' signal to free widget resources when + uninstalling the widget's installation package. */ void HsWidgetComponentRegistry::uninstallComponent(const HsWidgetComponentDescriptor &componentDescriptor) { HsWidgetComponent *component = mRegistry.value(componentDescriptor.uri); if (component) { component->emitAboutToUninstall(); - } - + } } /*! @@ -119,7 +129,6 @@ if (component) { component->emitAvailable(); } - } /*! @@ -139,7 +148,7 @@ mServiceManager.removeService(uri); QCoreApplication::removeLibraryPath(rootPath); if (component) { - // for now support versions without uinstaller + // for now support versions without uninstaller component->emitAboutToUninstall(); component->emitUninstalled(); mRegistry.take(uri)->deleteLater(); @@ -203,4 +212,3 @@ default: break; } } - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsdomainmodel/src/hswidgethost.cpp --- a/homescreenapp/hsdomainmodel/src/hswidgethost.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hswidgethost.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -15,190 +15,90 @@ * */ -#include +#include +#include +#include +#include #include #include #include #include #include +#include +#include #include #include #include -#include #include -#include "hswidgethost.h" #include "hsdatabase.h" #include "hsdomainmodeldatastructures.h" +#include "hsscene.h" #include "hspage.h" -#include "hsapp_defs.h" -#include "hsscene.h" +#include "hswidgethost.h" #include "hswidgetcomponentregistry.h" #include "hswidgetcomponent.h" +#include "hsconfiguration.h" + +// Helper macros for connecting state entry and exit actions. +#define ENTRY_ACTION(state, action) \ + connect(state, SIGNAL(entered()), SLOT(action())); +#define EXIT_ACTION(state, action) \ + connect(state, SIGNAL(exited()), SLOT(action())); QTM_USE_NAMESPACE -/*! - \class HsWidgetHost - \ingroup group_hsutils - \brief Homescreen widget runner. - Is responsible of running a homescreen widget. Each - homescreen widget has its own host. -*/ - -HsWidgetHost* HsWidgetHost::createInstance(HsWidgetData &widgetData, - const QVariantHash &preferences) +HsWidgetHost::HsWidgetHost(int databaseId, QGraphicsItem *parent) + : HbWidget(parent), + mDatabaseId(databaseId), + mStateMachine(0), + mWidget(0), + mPage(0), + mComponent(0), + mIsFinishing(false) { - HsDatabase* db = HsDatabase::instance(); - Q_ASSERT(db); - - if (db->insertWidget(widgetData)) { - db->setWidgetPreferences(widgetData.id, preferences); - return new HsWidgetHost(widgetData.id); - } + setFlag(QGraphicsItem::ItemClipsChildrenToShape); + setFlag(QGraphicsItem::ItemHasNoContents); - return 0; -} -/*! - Construct a widget host for the given \a databaseId. - \a parent becomes the parent item for the host. -*/ -HsWidgetHost::HsWidgetHost(int databaseId, QGraphicsItem *parent) - : HbWidget(parent), - mWidget(0), - mPage(0), - mState(Unloaded), - mDatabaseId(databaseId), - mTapAndHoldIcon(0) -{ - setFlags(QGraphicsItem::ItemClipsChildrenToShape); - - HsDatabase *db = HsDatabase::instance(); + grabGesture(Qt::TapGesture); + grabGesture(Qt::TapAndHoldGesture); + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); + grabGesture(Qt::SwipeGesture); + grabGesture(Qt::CustomGesture); - // Find the widget data. - HsWidgetData data; - data.id = mDatabaseId; - if (!db->widget(data)) { - return; - } - - mUri = data.uri; - - // bind host to component - HsWidgetComponent *component = HsWidgetComponentRegistry::instance()->component(mUri); - connect(component, SIGNAL(uninstalled()), SLOT(onFinished())); - connect(component, SIGNAL(aboutToUninstall()), SLOT(onAboutToUninstall())); - connect(component, SIGNAL(updated()), SLOT(onUpdated())); - connect(component, SIGNAL(unavailable()), SLOT(onUnavailable())); - connect(component, SIGNAL(available()), SLOT(onAvailable())); - - /* TODO: Uncomment after the Qt bug has been fixed. - QGraphicsDropShadowEffect *effect = - new QGraphicsDropShadowEffect(this); - effect->setColor(QColor(0, 0, 0, 150)); - effect->setBlurRadius(5); - effect->setOffset(3); - setGraphicsEffect(effect); - */ + setupEffects(); + setupStates(); } -/*! - Destructor. -*/ HsWidgetHost::~HsWidgetHost() { } -/*! - Load hosted widget from plugin and validate it. - Returns true if widget construction is successfull. -*/ -bool HsWidgetHost::load() +HsWidgetHost *HsWidgetHost::createInstance(HsWidgetData &widgetData, + const QVariantHash &preferences) { - if (mState != Unloaded) { - return false; - } - if (mWidget) { - return false; - } - - - // Create the hosted widget. - QServiceManager manager; - QServiceFilter filter("com.nokia.symbian.IHomeScreenWidget"); - filter.setServiceName(mUri); - QList interfaces = manager.findInterfaces(filter); - if (interfaces.isEmpty()) { - return false; - } - - QObject *widgetObject = manager.loadInterface(interfaces.first()); - mWidget = qobject_cast(widgetObject); - - if (!mWidget || - !setMethod("onShow()", mOnShowMethod) || - !setMethod("onHide()", mOnHideMethod)) { - mWidget = 0; - delete widgetObject; - return false; - } + HsDatabase *db = HsDatabase::instance(); - setProperty("isOnline", mIsOnlineProperty); - setProperty("rootPath", mRootPathProperty); - - setMethod("onInitialize()", mOnInitializeMethod); - setMethod("onUninitialize()", mOnUninitializeMethod); - - if (hasSignal("setPreferences(const QStringList&)")) { - connect(mWidget, SIGNAL(setPreferences(QStringList)), - SLOT(onSetPreferences(QStringList))); - } - if (hasSignal("finished()")) { - connect(mWidget, SIGNAL(finished()), - SLOT(onFinished())); + if (db->insertWidget(widgetData)) { + db->setWidgetPreferences(widgetData.id, preferences); + return new HsWidgetHost(widgetData.id); + } else { + return 0; } - if (hasSignal("error()")) { - connect(mWidget, SIGNAL(error()), - SLOT(onError())); - } - - mWidget->installEventFilter(this); - - loadWidgetPresentation(); - - HsScene *scene = HsScene::instance(); - setMaximumSize(scene->maximumWidgetSizeInPixels()); - setMinimumSize(scene->minimumWidgetSizeInPixels()); - - mWidget->setParentItem(this); - - setNewSize(mWidget->size()); - mState = Loaded; - - return true; } -void HsWidgetHost::unload() +int HsWidgetHost::databaseId() const { - if (mState != Uninitialized) { - return; - } - if (mWidget) { - mWidget->setParentItem(0); - } - delete mWidget; - QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); - mWidget = 0; - mState = Unloaded; + return mDatabaseId; } bool HsWidgetHost::setPage(HsPage *page) { - HsDatabase* db = HsDatabase::instance(); - Q_ASSERT(db); - + HsDatabase *db = HsDatabase::instance(); + HsWidgetData data; data.id = mDatabaseId; if (db->widget(data)) { @@ -217,249 +117,129 @@ mPage = page; return true; } - + HsPage *HsWidgetHost::page() const { return mPage; } -/*! - Returns true if this host has a valid widget set. - Otherwise, return false. -*/ -bool HsWidgetHost::isValid() const -{ - return mWidget; -} - -/*! - Returns database id -*/ -int HsWidgetHost::databaseId() const -{ - return mDatabaseId; -} - -/*! - Returns true if this the database operation succeeds, - false otherwise -*/ -bool HsWidgetHost::deleteFromDatabase() +bool HsWidgetHost::isPannable(QGraphicsSceneMouseEvent *event) { - HsDatabase *db = HsDatabase::instance(); - - if (!db->deleteWidget(mDatabaseId)) { - return false; - } - - mDatabaseId = -1; - return true; -} - -/*! - Set widget presentation by using current values. - Return true if successfull. -*/ -bool HsWidgetHost::setWidgetPresentation() -{ - HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - - QString key = HsScene::orientation() == Qt::Vertical ? - "portrait" : "landscape"; - - HsWidgetPresentationData data; - data.key = key; - data.setPos(pos()); - data.zValue = zValue(); - data.widgetId = databaseId(); - - return db->setWidgetPresentation(data); + bool result = false; + mIsPannableMethod.invoke(mWidget, Q_RETURN_ARG(bool, result), Q_ARG(QGraphicsSceneMouseEvent *,event)); + return result; } -/*! - Set widget presentation data. Return true if successfull. -*/ -bool HsWidgetHost::setWidgetPresentationData(HsWidgetPresentationData &presentationData) +bool HsWidgetHost::loadPresentation() { - HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - - presentationData.widgetId = mDatabaseId; - return db->setWidgetPresentation(presentationData); -} - -/*! - Get widget presentation data matching given \a key. - Data is returned on given empty \a presentationData. Return true if successfull -*/ -bool HsWidgetHost::widgetPresentationData(const QString &key, - HsWidgetPresentationData &presentationData) -{ - HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - - presentationData.key = key; - presentationData.widgetId = mDatabaseId; - return db->widgetPresentation(presentationData); + return loadPresentation(HsScene::orientation()); } -/*! - Return HsWidgetPresentationData for given \a orientation -*/ -HsWidgetPresentationData HsWidgetHost::widgetPresentation(Qt::Orientation orientation) +bool HsWidgetHost::loadPresentation(Qt::Orientation orientation) { HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - - QString key = orientation == Qt::Vertical ? - "portrait" : "landscape"; - + HsWidgetPresentationData data; - data.key = key; - data.widgetId = mDatabaseId; - if (db->widgetPresentation(data)) { - return data; - } else { - return HsWidgetPresentationData(); - } -} - -/*! - Load HsWidgetPresentationData for current orientation -*/ -bool HsWidgetHost::loadWidgetPresentation() -{ - HsDatabase *db = HsDatabase::instance(); - - QString key = HsScene::orientation() == Qt::Vertical ? - "portrait" : "landscape"; - - HsWidgetPresentationData data; - data.key = key; + data.orientation = orientation; data.widgetId = mDatabaseId; if (!db->widgetPresentation(data)) { return false; } - setPos(data.x, data.y); setZValue(data.zValue); - return true; } -/*! - Delete HsWidgetPresentationData for given \a orientation. - Return true if successfull. -*/ -bool HsWidgetHost::deleteWidgetPresentation(Qt::Orientation orientation) +bool HsWidgetHost::savePresentation() { - HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - - QString key = orientation == Qt::Vertical ? - "portrait" : "landscape"; - - return db->deleteWidgetPresentation(mDatabaseId, key); + return savePresentation(HsScene::orientation()); } -/*! - \fn void HsWidgetHost::widgetFinished() - This signal is emitten after the contained widget - reported is completion. -*/ - -/*! - \fn void HsWidgetHost::widgetError() - This signal is emitten after the contained widget - reported an error. -*/ - -/*! - \fn void HsWidgetHost::widgetResized() - This signal is emitten after the contained widget - sends a resize event. -*/ +bool HsWidgetHost::savePresentation(Qt::Orientation orientation) +{ + HsDatabase *db = HsDatabase::instance(); + + HsWidgetPresentationData data; + data.orientation = orientation; + data.setPos(pos()); + data.zValue = zValue(); + data.widgetId = mDatabaseId; + return db->setWidgetPresentation(data); +} -/*! - Calls the widget's onInitialize() slot if the - widget defines it. -*/ -void HsWidgetHost::initializeWidget() +bool HsWidgetHost::savePresentation(HsWidgetPresentationData &presentation) { - if (mState != Loaded) { - return; - } - HsWidgetComponent *component = HsWidgetComponentRegistry::instance()->component(mUri); - Q_ASSERT(component); - mRootPathProperty.write(mWidget, component->rootPath()); - setPreferencesToWidget(); - setOnline(HsScene::instance()->isOnline()); - mOnInitializeMethod.invoke(mWidget); + HsDatabase *db = HsDatabase::instance(); + + presentation.widgetId = mDatabaseId; + return db->setWidgetPresentation(presentation); +} - mState = Initialized; +bool HsWidgetHost::getPresentation(HsWidgetPresentationData &presentation) +{ + HsDatabase *db = HsDatabase::instance(); + + presentation.widgetId = mDatabaseId; + return db->widgetPresentation(presentation); } -/*! - Calls the widget's onShow() slot if the - widget defines it. -*/ +bool HsWidgetHost::removePresentation(Qt::Orientation orientation) +{ + HsDatabase *db = HsDatabase::instance(); + return db->deleteWidgetPresentation(mDatabaseId, orientation); +} + +void HsWidgetHost::startWidget(bool show) +{ + if (!mStateMachine->isRunning()) { + mStateMachine->start(); + // This is needed because QStateMachine::start() starts + // the state machine asynchronously via the eventloop. + // Here we want the machine to start synchronously. + QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + } + + if (show) { + emit event_startAndShow(); + } else { + emit event_startAndHide(); + } +} + void HsWidgetHost::showWidget() { - if (mState != Initialized && - mState != Hidden ) { - return; - } - - mOnShowMethod.invoke(mWidget); - - mState = Visible; + emit event_show(); } - -/*! - Calls the widget's onHide() slot if the - widget defines it. -*/ + void HsWidgetHost::hideWidget() { - if (mState != Initialized && - mState != Visible) { - return; - } - - mOnHideMethod.invoke(mWidget); - - mState = Hidden; + emit event_hide(); } -/*! - Calls the widget's onUninitialize() slot if the - widget defines it. -*/ -void HsWidgetHost::uninitializeWidget() -{ - if (mState != Visible && - mState != Hidden) { - return; - } - - mOnUninitializeMethod.invoke(mWidget); - - mState = Uninitialized; -} - -/*! - Calls the widget's widgetOnlineState property if the - widget defines it. -*/ void HsWidgetHost::setOnline(bool online) { mIsOnlineProperty.write(mWidget, online); } -/*! - Starts the widget drag animation. -*/ +void HsWidgetHost::remove() +{ + if (mStateMachine->isRunning()) { + emit event_remove(); + } else { + action_remove(); + deleteLater(); + } +} + +void HsWidgetHost::close() +{ + if (mStateMachine->isRunning()) { + emit event_close(); + } else { + deleteLater(); + } +} + void HsWidgetHost::startDragEffect() { /* TODO: Uncomment after the Qt bug has been fixed. @@ -473,7 +253,7 @@ QParallelAnimationGroup *animationGroup = new QParallelAnimationGroup(); QPropertyAnimation *animation = new QPropertyAnimation(this, "scale"); - animation->setDuration(200); + animation->setDuration(HsConfiguration::widgetDragEffectDuration()); animation->setEndValue(1.1); animationGroup->addAnimation(animation); @@ -487,9 +267,6 @@ animationGroup->start(QAbstractAnimation::DeleteWhenStopped); } -/*! - Starts the widget drop animation. -*/ void HsWidgetHost::startDropEffect() { /* TODO: Uncomment after the Qt bug has been fixed. @@ -501,7 +278,7 @@ QParallelAnimationGroup *animationGroup = new QParallelAnimationGroup; QPropertyAnimation *animation = new QPropertyAnimation(this, "scale"); - animation->setDuration(200); + animation->setDuration(HsConfiguration::widgetDropEffectDuration()); animation->setEndValue(1); animationGroup->addAnimation(animation); @@ -515,47 +292,121 @@ animationGroup->start(QAbstractAnimation::DeleteWhenStopped); } -/*! - Starts the tap-and-hold animation. -*/ -void HsWidgetHost::startTapAndHoldAnimation() +bool HsWidgetHost::eventFilter(QObject *watched, QEvent *event) { - mTapAndHoldIcon = new HbIconItem("tapandhold_animation"); - mTapAndHoldIcon->setZValue(1e6); - mTapAndHoldIcon->setParentItem(this); + if (event->type() == QEvent::GraphicsSceneResize ) { + QGraphicsSceneResizeEvent *resizeEvent = + static_cast(event); + setNewSize(resizeEvent->newSize()); + emit resized(); + } + return HbWidget::eventFilter(watched, event); } -/*! - Stops the tap-and-hold animation. -*/ -void HsWidgetHost::stopTapAndHoldAnimation() +void HsWidgetHost::setupEffects() { - delete mTapAndHoldIcon; - mTapAndHoldIcon = 0; + /* TODO: Uncomment after the Qt bug has been fixed. + QGraphicsDropShadowEffect *effect = + new QGraphicsDropShadowEffect(this); + effect->setColor(QColor(0, 0, 0, 150)); + effect->setBlurRadius(5); + effect->setOffset(3); + setGraphicsEffect(effect); + */ } -/*! - Filters resize events from widgets and resizes inside max/min size boundaries if needed. -*/ -bool HsWidgetHost::eventFilter(QObject *obj, QEvent *event) +void HsWidgetHost::setupStates() { - if (event->type() == QEvent::GraphicsSceneResize ) { - QGraphicsSceneResizeEvent *resizeEvent = static_cast(event); - setNewSize(resizeEvent->newSize()); - emit widgetResized(this); - return true; - } else { - // standard event processing - return HbWidget::eventFilter(obj, event); - } + // State machine + + mStateMachine = new QStateMachine(this); + mStateMachine->setAnimated(false); + + // States + + QState *state_component = new QState; + QState *state_unloaded = new QState(state_component); + QState *state_running = new QState(state_component); + QState *state_show = new QState(state_running); + QState *state_hide = new QState(state_running); + QState *state_finished = new QState; + QState *state_faulted = new QState; + QState *state_remove = new QState; + QFinalState *state_final = new QFinalState; + + mStateMachine->addState(state_component); + mStateMachine->addState(state_finished); + mStateMachine->addState(state_faulted); + mStateMachine->addState(state_remove); + mStateMachine->addState(state_final); + + mStateMachine->setInitialState(state_component); + state_component->setInitialState(state_unloaded); + state_running->setInitialState(state_hide); + + // Transitions + + state_component->addTransition( + this, SIGNAL(event_close()), state_final); + state_component->addTransition( + this, SIGNAL(event_remove()), state_remove); + state_component->addTransition( + this, SIGNAL(event_finished()), state_finished); + state_component->addTransition( + this, SIGNAL(event_faulted()), state_faulted); + + state_unloaded->addTransition( + this, SIGNAL(event_startAndShow()), state_show); + state_unloaded->addTransition( + this, SIGNAL(event_startAndHide()), state_hide); + + state_running->addTransition( + this, SIGNAL(event_unload()), state_unloaded); + + state_show->addTransition( + this, SIGNAL(event_hide()), state_hide); + + state_hide->addTransition( + this, SIGNAL(event_show()), state_show); + + state_finished->addTransition( + this, SIGNAL(event_remove()), state_remove); + state_finished->addTransition( + this, SIGNAL(event_close()), state_final); + + state_faulted->addTransition( + this, SIGNAL(event_remove()), state_remove); + state_faulted->addTransition( + this, SIGNAL(event_close()), state_final); + + state_remove->addTransition(state_final); + + // Actions + + ENTRY_ACTION(state_component, action_connectComponent) + EXIT_ACTION(state_component, action_disconnectComponent) + + ENTRY_ACTION(state_running, action_load) + ENTRY_ACTION(state_running, action_initialize) + EXIT_ACTION(state_running, action_uninitialize) + EXIT_ACTION(state_running, action_unload) + + ENTRY_ACTION(state_show, action_show) + + ENTRY_ACTION(state_hide, action_hide) + + ENTRY_ACTION(state_finished, action_finished) + + ENTRY_ACTION(state_faulted, action_faulted) + + ENTRY_ACTION(state_remove, action_remove) + + // Delete on finish. + + connect(mStateMachine, SIGNAL(finished()), SLOT(deleteLater()), + Qt::QueuedConnection); } -/*! - Checks if a property with the given \a name - in the contained widget. If the property exists the \a - metaProperty is made to reference to it. Returns true if - the property was found. Otherwise, returns false. -*/ bool HsWidgetHost::setProperty(const char *name, QMetaProperty &property) { const QMetaObject *object = mWidget->metaObject(); @@ -564,12 +415,6 @@ return index >= 0; } -/*! - Checks if a slot with the given \a signature exists - in the contained widget. If the slot exists the \a - method is made to reference to it. Returns true if - the slot was found. Otherwise, returns false. -*/ bool HsWidgetHost::setMethod(const char *signature, QMetaMethod &method) { const QMetaObject *object = mWidget->metaObject(); @@ -579,11 +424,6 @@ return index >= 0; } -/*! - Returns true if a signal with the given \a signature - exists in the contained widget. Otherwise, returns - false. -*/ bool HsWidgetHost::hasSignal(const char *signature) { const QMetaObject *object = mWidget->metaObject(); @@ -591,22 +431,24 @@ QMetaObject::normalizedSignature(signature)); return index >= 0; } -/*! - Returns true if fetching widget preferences from db and setting those - to widget is successfull -*/ + +void HsWidgetHost::setNewSize(const QSizeF &size) +{ + resize(size); + setPreferredSize(size); +} + bool HsWidgetHost::setPreferencesToWidget() { HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - + QVariantHash preferences; if (!db->widgetPreferences(mDatabaseId, preferences)) { return false; } QStringList names = preferences.keys(); - foreach(QString name, names) { + foreach (QString name, names) { mWidget->setProperty(name.toLatin1(), preferences.value(name)); } @@ -614,23 +456,159 @@ return true; } -/*! - Resizes and sets preferred size for widget layouts -*/ -void HsWidgetHost::setNewSize(const QSizeF &newSize) +void HsWidgetHost::action_connectComponent() { - resize(newSize); - setPreferredSize(newSize); + HsDatabase *db = HsDatabase::instance(); + + HsWidgetData data; + data.id = mDatabaseId; + if (!db->widget(data)) { + emit event_faulted(); + return; + } + + mComponent = HsWidgetComponentRegistry::instance()->component(data.uri); + + connect(mComponent, SIGNAL(aboutToUninstall()), SIGNAL(event_unload())); + connect(mComponent, SIGNAL(uninstalled()), SIGNAL(event_finished())); + connect(mComponent, SIGNAL(unavailable()), SIGNAL(event_unload())); + connect(mComponent, SIGNAL(unavailable()), SIGNAL(unavailable())); + connect(mComponent, SIGNAL(available()), SIGNAL(available())); + connect(mComponent, SIGNAL(updated()), SIGNAL(available())); +} + +void HsWidgetHost::action_disconnectComponent() +{ + mComponent->disconnect(this); } -/*! - This slot is connected to the contained widget's - setPreferences() signal, if it was defined for - the widget. The widget emits the signal for persisting - its preferences named with \a names. The given - preferences are read, validated, and written to - the database. -*/ +void HsWidgetHost::action_load() +{ + QServiceManager manager; + QServiceFilter filter("com.nokia.symbian.IHomeScreenWidget"); + filter.setServiceName(mComponent->uri()); + QList interfaces = manager.findInterfaces(filter); + if (interfaces.isEmpty()) { + emit event_faulted(); + return; + } + + QObject *widgetObject = manager.loadInterface(interfaces.first()); + mWidget = qobject_cast(widgetObject); + + if (!mWidget || + !setMethod("onShow()", mOnShowMethod) || + !setMethod("onHide()", mOnHideMethod)) { + mWidget = 0; + delete widgetObject; + emit event_faulted(); + return; + } + + setMethod("onInitialize()", mOnInitializeMethod); + setMethod("onUninitialize()", mOnUninitializeMethod); + setMethod("isPannable(QGraphicsSceneMouseEvent*)", mIsPannableMethod); + + setProperty("isOnline", mIsOnlineProperty); + setProperty("rootPath", mRootPathProperty); + + if (hasSignal("setPreferences(const QStringList&)")) { + connect(mWidget, SIGNAL(setPreferences(QStringList)), + SLOT(onSetPreferences(QStringList))); + } + if (hasSignal("finished()")) { + connect(mWidget, SIGNAL(finished()), + SLOT(onFinished())); + } + if (hasSignal("error()")) { + connect(mWidget, SIGNAL(error()), + SLOT(onError())); + } + + mWidget->installEventFilter(this); + + HsScene *scene = HsScene::instance(); + setMaximumSize(scene->maximumWidgetSizeInPixels()); + setMinimumSize(scene->minimumWidgetSizeInPixels()); + + loadPresentation(); + + mWidget->setParentItem(this); + + setNewSize(mWidget->size()); +} + +void HsWidgetHost::action_unload() +{ + delete mWidget; + mWidget = 0; + + mOnInitializeMethod = QMetaMethod(); + mOnShowMethod = QMetaMethod(); + mOnHideMethod = QMetaMethod(); + mOnUninitializeMethod = QMetaMethod(); + mIsPannableMethod = QMetaMethod(); + mIsOnlineProperty = QMetaProperty(); + mRootPathProperty = QMetaProperty(); +} + +void HsWidgetHost::action_initialize() +{ + mRootPathProperty.write(mWidget, mComponent->rootPath()); + setPreferencesToWidget(); + setOnline(HsScene::instance()->isOnline()); + mOnInitializeMethod.invoke(mWidget); +} + +void HsWidgetHost::action_uninitialize() +{ + mOnUninitializeMethod.invoke(mWidget); +} + +void HsWidgetHost::action_show() +{ + if (!mIsFinishing) { + mOnShowMethod.invoke(mWidget); + } +} + +void HsWidgetHost::action_hide() +{ + if (!mIsFinishing) { + mOnHideMethod.invoke(mWidget); + } +} + +void HsWidgetHost::action_finished() +{ + emit finished(); +} + +void HsWidgetHost::action_faulted() +{ + emit faulted(); +} + +void HsWidgetHost::action_remove() +{ + HsDatabase *db = HsDatabase::instance(); + + db->deleteWidget(mDatabaseId); + mDatabaseId = -1; +} + +void HsWidgetHost::onFinished() +{ + mIsFinishing = true; + emit event_finished(); +} + +void HsWidgetHost::onError() +{ + mIsFinishing = true; + emit event_faulted(); +} + void HsWidgetHost::onSetPreferences(const QStringList &names) { if (names.isEmpty()) { @@ -644,84 +622,8 @@ preferences.insert(name, value); } - HsDatabase *db = HsDatabase::instance(); - Q_ASSERT(db); - + HsDatabase *db = HsDatabase::instance(); if (!db->setWidgetPreferences(mDatabaseId, preferences)) { onError(); } } - -/*! - This slot reacts to the widgets finished() signal, if - it was defined for the widget. The widget emits the signal - when it has finished its execution and is ready for - removal from the homescreen. -*/ -void HsWidgetHost::onFinished() -{ - emit widgetFinished(this); -} - -/*! - This slot reacts to the widgets error() signal, if it was - defined for the widget. The widget emits the signal in - failure cases. -*/ -void HsWidgetHost::onError() -{ - mState = Faulted; - emit widgetError(this); -} -/*! - This slot is called when component is about to uninstall or - update. Widget need to release all handles to resources installing - to succeed. -*/ -void HsWidgetHost::onAboutToUninstall() -{ - uninitializeWidget(); - unload(); -} - -void HsWidgetHost::onUpdated() -{ - if(mState != Unloaded) { - return; - } - load(); - initializeWidget(); - if (HsScene::instance()->activePage() == mPage) { - showWidget(); - } else { - hideWidget(); - } - -} -void HsWidgetHost::onUnavailable() -{ - if (mState != Visible && mState != Hidden) { - return; - } - uninitializeWidget(); - unload(); -} - -void HsWidgetHost::onAvailable() -{ - if (mState != Unloaded) { - return; - } - load(); - initializeWidget(); - if (HsScene::instance()->activePage() == mPage) { - showWidget(); - } else { - hideWidget(); - } -} - - - - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/inc/hsmenuevent.h --- a/homescreenapp/hsutils/inc/hsmenuevent.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/inc/hsmenuevent.h Wed Jun 23 17:05:06 2010 +0100 @@ -40,6 +40,7 @@ CollectionDeleted, AddAppsToCollection, RemoveAppFromCollection, + UninstallApplication, OpenApplicationLibrary, OpenInstalledView, OpenHomeScreen, @@ -47,6 +48,7 @@ CreateCollection, PreviewHSWidget, ShowAppSettings, + ShowAppDetails, Unknown }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/inc/hsmenueventfactory.h --- a/homescreenapp/hsutils/inc/hsmenueventfactory.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/inc/hsmenueventfactory.h Wed Jun 23 17:05:06 2010 +0100 @@ -70,6 +70,8 @@ static QEvent *createRemoveAppFromCollectionEvent(int aItemId, int aCollectionId); + static QEvent *createUninstallApplicationEvent(int aItemId); + static QEvent *createArrangeCollectionEvent(int aTopItemId); static QEvent *createPreviewHSWidgetEvent( @@ -79,7 +81,9 @@ const QString &library = QString() ); - static QEvent *createAppSettingsViewEvent(int entryId); + static QEvent *createAppSettingsViewEvent(int entryId); + + static QEvent *createAppDetailsViewEvent(int entryId); static QEvent *createUnknownEvent(); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/inc/hspageindicator.h --- a/homescreenapp/hsutils/inc/hspageindicator.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/inc/hspageindicator.h Wed Jun 23 17:05:06 2010 +0100 @@ -32,7 +32,7 @@ Q_OBJECT public: - HsPageIndicator(QGraphicsItem *parent = 0); + HsPageIndicator(qreal spacing, QGraphicsItem *parent = 0); ~HsPageIndicator(); void initialize(int itemCount, int activeItemIndex); @@ -47,6 +47,8 @@ bool isAnimationRunning() const; + void setSpacing(qreal spacing); + private: Q_DISABLE_COPY(HsPageIndicator) void layoutItems(); @@ -54,6 +56,7 @@ private: QList mItems; int mActiveItemIndex; + qreal mSpacing; HOMESCREEN_TEST_FRIEND_CLASS(t_hsUtils) }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/inc/hswallpaperimagereader.h --- a/homescreenapp/hsutils/inc/hswallpaperimagereader.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/inc/hswallpaperimagereader.h Wed Jun 23 17:05:06 2010 +0100 @@ -18,12 +18,15 @@ #ifndef HSWALLPAPERIMAGEREADER_H #define HSWALLPAPERIMAGEREADER_H -#include +#include #include #include "hsutils_global.h" -class HSUTILS_EXPORT HsWallpaperImageReader : public QObject +#include "hstest_global.h" +HOMESCREEN_TEST_CLASS(t_hsUtils) + +class HSUTILS_EXPORT HsWallpaperImageReader : public QThread { Q_OBJECT @@ -32,31 +35,33 @@ ~HsWallpaperImageReader(); void setSourcePath(const QString &sourcePath); - QString getSourcePath() const; + QString sourcePath() const; void setSourceRect(const QRect &sourceRect); - QRect getSourceRect() const; + QRect sourceRect() const; void setTargetRect(const QRect &targetRect); - QRect getTargetRect() const; + QRect targetRect() const; void setCenterTarget(bool center); - bool getCenterTarget(); - QImage getProcessedImage() const; + bool centerTarget(); + QImage processedImage() const; + +signals: + void processingFinished(); + +protected: + void run(); private: Q_DISABLE_COPY(HsWallpaperImageReader) -signals: - void processingFinished(); - -public slots: - void processImage(); - private: QString mSourcePath; + QRect mSourceRect; QRect mTargetRect; - QRect mSourceRect; bool mCenterTarget; + QString mKey; + QImage mProcessedImage; - QImage mProcessedImage; + HOMESCREEN_TEST_FRIEND_CLASS(t_hsUtils) }; #endif // HSWALLPAPERIMAGEREADER_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/src/hsimagefetcherclient.cpp --- a/homescreenapp/hsutils/src/hsimagefetcherclient.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/src/hsimagefetcherclient.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -76,6 +76,10 @@ mReq = mAppMgr.create(gFetcherInterface, gFetcherOperation, false); if (mReq) { + QList args; + args << QVariantMap(); + args << QVariant(); + mReq->setArguments(args); // Connect signals once connect(mReq, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); connect(mReq, SIGNAL(requestError(int,const QString&)), this, SLOT(handleError(int,const QString&))); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/src/hsmenueventfactory.cpp --- a/homescreenapp/hsutils/src/hsmenueventfactory.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/src/hsmenueventfactory.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -207,6 +207,20 @@ } /*! + Creates an HsMenuEvent::UninstallApplication event. + + \param aItemId Item id of the application to be removed from a collection. + \param aCollectionId Item id of the collection the application is to be removed from. + \return UninstallApplication event. + */ +QEvent *HsMenuEventFactory::createUninstallApplicationEvent(int aItemId) +{ + QVariantMap params; + params.insert(itemIdKey(), aItemId); + return new HsMenuEvent(HsMenuEvent::UninstallApplication, params); +} + +/*! Creates an HsMenuEvent::ArrangeCollection event. \param aTopItemId Item id to be scrolled. @@ -265,6 +279,19 @@ } /*! + Creates an HsMenuEvent::ShowAppDetails event. + \param entryId Id of an item. + \return Event for view the Application Settings. +*/ +QEvent *HsMenuEventFactory::createAppDetailsViewEvent(int entryId) +{ + QVariantMap params; + params.insert(itemIdKey(), entryId); + + return new HsMenuEvent(HsMenuEvent::ShowAppDetails, params); +} + +/*! Creates an HsMenuEvent::Unknown event. \return Unknown event. diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/src/hspageindicator.cpp --- a/homescreenapp/hsutils/src/hspageindicator.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/src/hspageindicator.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -23,9 +23,10 @@ /*! */ -HsPageIndicator::HsPageIndicator(QGraphicsItem *parent) +HsPageIndicator::HsPageIndicator(qreal spacing, QGraphicsItem *parent) : HbWidget(parent), - mActiveItemIndex(-1) + mActiveItemIndex(-1), + mSpacing(spacing) { } @@ -46,18 +47,18 @@ mItems.clear(); mActiveItemIndex = -1; - if (itemCount < 1 || activeItemIndex < 0 || + if (itemCount < 1 || activeItemIndex < 0 || itemCount <= activeItemIndex) { return; } for (int i = 0; i < itemCount; ++i) { mItems << new HsPageIndicatorItem(i == activeItemIndex); - } + } mActiveItemIndex = activeItemIndex; layoutItems(); } - + /*! */ @@ -80,7 +81,7 @@ mItems[i]->setActive(i == activeItemIndex); } } - + /*! */ @@ -107,7 +108,7 @@ */ void HsPageIndicator::removeItem(int activeItemIndex) -{ +{ if (activeItemIndex < 0 || itemCount() - 1 <= activeItemIndex) { return; } @@ -133,12 +134,23 @@ { QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(8); + layout->setSpacing(mSpacing); layout->addStretch(); foreach (HsPageIndicatorItem *item, mItems) { item->setPreferredSize(preferredHeight(), preferredHeight()); layout->addItem(item); - } + } layout->addStretch(); setLayout(layout); } + +/*! + +*/ +void HsPageIndicator::setSpacing(qreal spacing) +{ + QGraphicsLinearLayout *linearLayout = static_cast(layout()); + if (linearLayout) { + linearLayout->setSpacing(spacing); + } +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hsutils/src/hswallpaperimagereader.cpp --- a/homescreenapp/hsutils/src/hswallpaperimagereader.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hsutils/src/hswallpaperimagereader.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -24,7 +24,7 @@ Constructor. */ HsWallpaperImageReader::HsWallpaperImageReader(QObject *parent): - QObject(parent), + QThread(parent), mCenterTarget(false) { @@ -49,7 +49,7 @@ /*! Returns image source path */ -QString HsWallpaperImageReader::getSourcePath() const +QString HsWallpaperImageReader::sourcePath() const { return mSourcePath; } @@ -65,7 +65,7 @@ /*! Returns source rect */ -QRect HsWallpaperImageReader::getSourceRect() const +QRect HsWallpaperImageReader::sourceRect() const { return mSourceRect; } @@ -81,7 +81,7 @@ /*! Returns target rect */ -QRect HsWallpaperImageReader::getTargetRect() const +QRect HsWallpaperImageReader::targetRect() const { return mTargetRect; } @@ -97,7 +97,7 @@ /*! Returns target centering */ -bool HsWallpaperImageReader::getCenterTarget() +bool HsWallpaperImageReader::centerTarget() { return mCenterTarget; } @@ -105,7 +105,7 @@ /*! Returns processed image */ -QImage HsWallpaperImageReader::getProcessedImage() const +QImage HsWallpaperImageReader::processedImage() const { return mProcessedImage; } @@ -117,10 +117,10 @@ Pass empty set sourceRect to empty to use full size source image as starting point. Returns processed image or null image if operation fails. */ -void HsWallpaperImageReader::processImage() +void HsWallpaperImageReader::run() { QImageReader imageReader(mSourcePath); - + QRect tempTargetRect = mTargetRect; QRect tempSourceRect = mSourceRect; @@ -130,7 +130,7 @@ // If sourceRect not defined, uses full size image as source. tempSourceRect.setRect(0, 0, sourceSize.width(), sourceSize.height()); } - sourceSize.scale(tempTargetRect.width(), tempTargetRect.height(), + sourceSize.scale(tempTargetRect.width(), tempTargetRect.height(), Qt::KeepAspectRatioByExpanding); imageReader.setScaledSize(sourceSize); @@ -142,5 +142,4 @@ } else { mProcessedImage = QImage(); } - emit processingFinished(); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/hswidgetuninstaller/inc/hswidgetcomponentparser.h --- a/homescreenapp/hswidgetuninstaller/inc/hswidgetcomponentparser.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/hswidgetuninstaller/inc/hswidgetcomponentparser.h Wed Jun 23 17:05:06 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -11,9 +11,10 @@ * * Contributors: * -* Description: +* Description: * */ + #ifndef HSWIDGETCOMPONENTPARSER_H #define HSWIDGETCOMPONENTPARSER_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/inc/hsapp_defs.h --- a/homescreenapp/inc/hsapp_defs.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/inc/hsapp_defs.h Wed Jun 23 17:05:06 2010 +0100 @@ -45,6 +45,7 @@ inline const QString packageTypeName(); inline const QString appSettingsPlugin(); inline const QString groupNameAttributeName(); +inline const QString componentIdAttributeName(); // Sort attribute enum HsSortAttribute { @@ -68,7 +69,8 @@ AppSettingContextAction, RenameContextAction, DeleteContextAction, - RemoveFromCollectionContextAction + RemoveFromCollectionContextAction, + AppDetailsContextAction }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/inc/hsapp_defs.inl --- a/homescreenapp/inc/hsapp_defs.inl Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/inc/hsapp_defs.inl Wed Jun 23 17:05:06 2010 +0100 @@ -212,7 +212,7 @@ */ inline const QString newIconId() { - static const QString name("qtg_large_super_new"); + static const QString name("qtg_small_new_event"); return name; } @@ -271,5 +271,22 @@ return key; } +/*! + \return applibrary activate name to open downloaded +*/ +inline const QString groupAppLibRecentView() +{ + static const QString key("AppLibRecentView"); + return key; +} + +/*! + \return application componentID atribute name +*/ +inline const QString componentIdAttributeName() +{ + static const QString key("component_id"); + return key; +} #endif diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pri --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pri Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pri Wed Jun 23 17:05:06 2010 +0100 @@ -18,10 +18,3 @@ ./inc/hsdefaultruntimeplugin.h SOURCES += ./src/hsdefaultruntime.cpp \ ./src/hsdefaultruntimeplugin.cpp - -symbian: { -HEADERS += ./inc/hsbackuprestoreobserver.h \ - ./inc/hsbackuprestoreactivecallback.h -SOURCES += ./src/hsbackuprestoreobserver.cpp \ - ./src/hsbackuprestoreactivecallback.cpp -} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pro --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pro Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -18,8 +18,6 @@ CONFIG += plugin hb mobility MOBILITY = serviceframework publishsubscribe -RESOURCES += hsdefaultruntimeplugin.qrc - PLUGIN_SUBDIR = /private/20022F35/plugins/runtimeplugins include (../../common.pri) @@ -37,7 +35,7 @@ symbian: { TARGET.UID3 = 0x20022F3E - LIBS += -lxqkeycapture -labclient + LIBS += -lxqkeycapture } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.qrc --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.qrc Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - resource/tapandhold.axml - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsbackuprestoreactivecallback.h --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsbackuprestoreactivecallback.h Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,217 +0,0 @@ -/* -* 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 the License "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: Home screen active callback in HsBackupRestoreObserver. -* -*/ - - -#ifndef HSBACKUPRESTOREACTIVECALLBACK_H -#define HSBACKUPRESTOREACTIVECALLBACK_H - -#include // CBase -#include - - -/** - * Home screen active callback in backup/restore. - * - * @lib widgetbackuprestore.exe - * @since S60 ^4 - */ -NONSHARABLE_CLASS(CHsBRActiveCallback) : public CBase, - public conn::MActiveBackupDataClient - { -public: - - IMPORT_C static CHsBRActiveCallback* NewL(); - - virtual ~CHsBRActiveCallback(); - - void FinishBackupRestore(); - - void StartRestore(); - -// new functions - -// from base class MActiveBackupDataClient - - /** - * This method informs the active backup data client that all - * snapshots have been supplied. If the client has not - * received a snapshot then it should perform a base backup - */ - virtual void AllSnapshotsSuppliedL(); - - /** - * This method receives all or part of a snapshot of data to allow - * calculation of an incremental backup. The snapshot is one that - * was previously supplied by the data owner. The snapshot data - * should be read from the location supplied. The snapshot data may - * be larger than the location supplied in which case the routine - * will be called repeatedly until all data has been supplied. - * - * Snapshot data will also be supplied as part of a restore operation - * - * @param aDrive the drive being backed up - * @param aBuffer a pointer to the base of the location from whence - * data can be copied. - * @param aLastSection ETrue if this is the last section of snapshot - * data, else EFalse. - */ - virtual void ReceiveSnapshotDataL( - TDriveNumber aDrive, TDesC8& aBuffer, TBool aLastSection); - - /** - * This method returns the expected size of backup data that will be - * supplied. If an incremental backup is underway then this method - * then this method will not be called until after - * ReceiveSnapshotDataL(). The size data will be used for the purpose - * of tracking progess during a backup. If it is inaccurate then the - * user may see irregular progress but the actual backup data will - * not be affected so it is acceptable to return an estimated value. - * - * @param aDrive the drive being backed up. - * @return the size of the data that will be returned - */ - virtual TUint GetExpectedDataSize(TDriveNumber aDrive); - - /** - * This method returns a snapshot of data to accompany a backup. The - * snapshot is expected to contain details on files / data being - * backed up. The format of the snapshot is only meaningful to the - * data owner. The snapshot will be supplied if the data owner is - * asked for an incremental backup and for a restore operation. The - * snapshot data should be copied to the location supplied. - * - * The snapshot data may be larger than the location supplied in - * which case the routine will be called repeatedly until all data - * has been retrieved. - * - * @param aDrive the drive being backed up - * @param aBuffer a pointer to the base of the location where data - * can be copied. - * @param aFinished on return ETrue if all data has been returned - * for this drive, else EFalse. - */ - virtual void GetSnapshotDataL( - TDriveNumber aDrive, TPtr8& aBuffer, TBool& aFinished); - - /** - * This method prepares the implementor to return backup data. It - * will be followed by a sequence of calls to request the actual - * data. - * - * @param aDrive the drive being backed up. - */ - virtual void InitialiseGetBackupDataL(TDriveNumber aDrive); - - /** - * This method requests a section of backup data. - * InitialiseGetBackupDataL() will have been called previously to - * specify the drive concerned. The data returned may be base or - * incremental depending on the type of backup and the capability of - * the data owner. - * - * @param aBuffer a pointer to the base of the location where data - * can be copied. - * @param aFinished on return ETrue if all data has been returned - * for this drive, else EFalse. - */ - virtual void GetBackupDataSectionL(TPtr8& aBuffer, TBool& aFinished); - - /** - * This method prepares the implementor to receive base restore data - * for a drive. It will be followed by a sequence of calls to supply - * the actual data. - * - * @param aDrive the drive being restored. - */ - virtual void InitialiseRestoreBaseDataL(TDriveNumber aDrive); - - /** - * This method receives a section of base restore data. - * InitialiseRestoreBaseDataL() will have been called previously to - * specify the drive concerned. - * - * @param aBuffer a pointer to the base of the location whence data - * can be read. - * @param aFinished ETrue if all data has been returned for this - * drive, else EFalse. - */ - virtual void RestoreBaseDataSectionL(TDesC8& aBuffer, TBool aFinished); - - /** - * This method prepares the implementor to receive incremental - * restore data for a drive. It will be followed by a sequence - * of calls to supply the actual data. If multiple increments - * are supplied then this methid will be called before each increment - * - * @param aDrive the drive being restored. - */ - virtual void InitialiseRestoreIncrementDataL(TDriveNumber aDrive); - - /** - * This method receives a section of increment restore data. - * InitialiseRestoreIncrementDataL() will have been called - * previously to specify the drive concerned. - * - * @param aBuffer a pointer to the base of the location whence data - * can be read. - * @param aFinished ETrue if all data has been returned for this - * increment, else EFalse. - */ - virtual void RestoreIncrementDataSectionL(TDesC8& aBuffer, TBool aFinished); - - /** - * This method is called when all data to be restored has been - * supplied. - * - * @param aDrive the drive being restored. - */ - virtual void RestoreComplete(TDriveNumber aDrive); - - /** - * This method is called if copying of data is terminated prematurely - * to allow the implementor to tidy up. The same method applies to - * all types of data and to backup and restore. - */ - virtual void TerminateMultiStageOperation(); - - /** - * Gets a 32-bit checksum for its private data. - * This routine is for test purposes. It must be implemented but an - * invariant checksum value can be provided. Some tests may cause - * checksum values to be compared. - * - * @param aDrive the drive containing data being checksummed - * @return the 32-bit checksum - */ - virtual TUint GetDataChecksum(TDriveNumber aDrive); - -private: - - CHsBRActiveCallback(); - - void ConstructL(); - - void CloseDataBaseConnection(); - - void OpenDataBaseConnection(); - -private: // data - - }; - -#endif // HSBACKUPRESTOREACTIVECALLBACK_H - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsbackuprestoreobserver.h --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsbackuprestoreobserver.h Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/* -* Copyright (c) 2009 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: -* -*/ -#ifndef HSBACKUPRESTOREOBSERVER_H -#define HSBACKUPRESTOREOBSERVER_H - -#include -#include -#include - -class CHsBRActiveCallback; - -NONSHARABLE_CLASS(CHsBackupRestoreObserver) : public CActive - { - -public: - - /** - * Creates an instance of CCPServerBURListener implementation. - * @param aCallBack Pointer to observer interface. - */ - static CHsBackupRestoreObserver* NewL(); - - /** - * Destructor. - */ - virtual ~CHsBackupRestoreObserver(); - -private: - /** - * Constructor. - * @param aCallBack Pointer to observer interface. - */ - CHsBackupRestoreObserver(); - - /** - * Symbian 2nd phase constructor. - */ - void ConstructL(); - - /** - * Handles changes in backup state. - */ - void HandleBackupStateL( const TInt aValue ); - - /** - * Subsribes notifications of backup/restore p&s key. - */ - void SubscribePSKey(); - -private: - /** - * From CActive. - */ - void DoCancel(); - - /** - * From CActive. - */ - void RunL(); - - /** - * From CActive. - */ - TInt RunError( TInt aError ); - -private: - /** - * User side interface to Publish & Subscribe. - */ - RProperty iProperty; - - /** - * Callback interface for widget's active data owner. - * Own. - */ - CHsBRActiveCallback* iCallBack; - - /** - * Active backup client. - * Own. - */ - conn::CActiveBackupClient* iActiveBackupClient; - - /** - * Last state of BUR: either backup or restore or normal or unset - */ - TInt iLastType; - - /** - * Interface for notifying changes in Backup and Restore. - * Not own. - */ - //MBURListenerCallback* iCallback; - - }; - -#endif // HSBACKUPRESTOREOBSERVER_H -// End of File \ No newline at end of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsdefaultruntime.h --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsdefaultruntime.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsdefaultruntime.h Wed Jun 23 17:05:06 2010 +0100 @@ -34,9 +34,6 @@ #endif class HsContentService; -#ifdef Q_OS_SYMBIAN -class CHsBackupRestoreObserver; -#endif QTM_BEGIN_NAMESPACE class QValueSpacePublisher; QTM_END_NAMESPACE @@ -62,8 +59,6 @@ private: Q_DISABLE_COPY(HsDefaultRuntime) - void registerAnimations(); - void createStatePublisher(); void createContentServiceParts(); void createStates(); @@ -73,6 +68,8 @@ private slots: void onIdleStateEntered(); void onIdleStateExited(); + void activityRequested(const QString &name); + private: HsContentService *mContentService; @@ -84,7 +81,6 @@ #ifdef Q_OS_SYMBIAN XqKeyCapture keyCapture; - CHsBackupRestoreObserver* mBRObserver; #endif TEST_FRIEND diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/resource/tapandhold.axml --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/resource/tapandhold.axml Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - qtg_anim_longtap_0 - qtg_anim_longtap_1 - qtg_anim_longtap_2 - qtg_anim_longtap_3 - qtg_anim_longtap_4 - qtg_anim_longtap_5 - qtg_anim_longtap_6 - qtg_anim_longtap_7 - qtg_anim_longtap_8 - qtg_anim_longtap_9 - - diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsbackuprestoreactivecallback.cpp --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsbackuprestoreactivecallback.cpp Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Widget's active callback in WidgetBackupRestore. -* -*/ - - -// INCLUDE FILES -#include - -#include "hsbackuprestoreactivecallback.h" -#include "hsdatabase.h" - -// CONSTANTS - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -CHsBRActiveCallback* CHsBRActiveCallback::NewL() -{ - CHsBRActiveCallback* self = - new( ELeave ) CHsBRActiveCallback(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - - return self; -} - -// --------------------------------------------------------------------------- -// Destructor -// --------------------------------------------------------------------------- -// -CHsBRActiveCallback::~CHsBRActiveCallback() -{ -} - -// --------------------------------------------------------------------------- -// Backup or restore has been finished. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::FinishBackupRestore() -{ - // allow database usage - OpenDataBaseConnection(); - // TODO: Load widgets -} - -// --------------------------------------------------------------------------- -// Backup or restore has been started. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::StartRestore() -{ - // allow database usage - CloseDataBaseConnection(); - // TODO: Load widgets -} - -// --------------------------------------------------------------------------- -// Inform that all data has been backed up or restored. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::AllSnapshotsSuppliedL() -{ - // No implementation needed. Must not leave -} - -// --------------------------------------------------------------------------- -// Not supported. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::ReceiveSnapshotDataL( - TDriveNumber /*aDrive*/, TDesC8& /*aBuffer*/, TBool /*aLastSection*/) -{ - // No implementation needed - User::Leave( KErrNotSupported ); -} - -// --------------------------------------------------------------------------- -// Make a guess about data size. -// --------------------------------------------------------------------------- -// -TUint CHsBRActiveCallback::GetExpectedDataSize( - TDriveNumber /*aDrive*/) -{ - // No implementation needed - return 0; -} - -// --------------------------------------------------------------------------- -// Not supported. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::GetSnapshotDataL( - TDriveNumber /*aDrive*/, TPtr8& /*aBuffer*/, TBool& /*aFinished*/) -{ - // No implementation needed - User::Leave( KErrNotSupported ); -} - -// --------------------------------------------------------------------------- -// Initialize for backup. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::InitialiseGetBackupDataL( - TDriveNumber /*aDrive*/) -{ - // Prevent database usage - CloseDataBaseConnection(); - // TODO: Unload widgets -} - -// --------------------------------------------------------------------------- -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::GetBackupDataSectionL( - TPtr8& /*aBuffer*/, TBool& aFinished) -{ - // No data for active backup - aFinished = ETrue; -} - -// --------------------------------------------------------------------------- -// Initialize restore. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::InitialiseRestoreBaseDataL( - TDriveNumber /*aDrive*/ ) -{ - // No implementation needed - //User::Leave( KErrNotSupported ); - CloseDataBaseConnection(); -} - -// --------------------------------------------------------------------------- -// Run state machine for restore. Receive stream from BUR engine and turn it -// to file(s). -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::RestoreBaseDataSectionL( - TDesC8& /*aBuffer*/, TBool /*aFinished*/ ) -{ - // No implementation needed - CloseDataBaseConnection(); -} - -// --------------------------------------------------------------------------- -// Incremental restoration is not supported. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::InitialiseRestoreIncrementDataL( - TDriveNumber /*aDrive*/) -{ - // No implementation needed - User::Leave( KErrNotSupported ); -} - -// --------------------------------------------------------------------------- -// Incremental restoration is not supported. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::RestoreIncrementDataSectionL( - TDesC8& /*aBuffer*/, TBool /*aFinished*/) -{ - // No implementation needed - User::Leave( KErrNotSupported ); -} - -// --------------------------------------------------------------------------- -// Called when restore is complete - sets data back to initial state. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::RestoreComplete(TDriveNumber /*aDrive*/) -{ - // No implementation needed -} - -// --------------------------------------------------------------------------- -// Tidy up when operation is over. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::TerminateMultiStageOperation() -{ - // No implementation needed -} - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TUint CHsBRActiveCallback::GetDataChecksum(TDriveNumber /*aDrive*/) -{ - // No implementation needed - return 0; -} - -// --------------------------------------------------------------------------- -// C++ constructor. -// --------------------------------------------------------------------------- -// -CHsBRActiveCallback::CHsBRActiveCallback() -{ -} - -// --------------------------------------------------------------------------- -// 2nd phase constructor. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::ConstructL() -{ -} - -// --------------------------------------------------------------------------- -// CHsBRActiveCallback::CloseDataBaseConnection() -// -// Close database connection. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::CloseDataBaseConnection() -{ - HsDatabase *db = HsDatabase::instance(); - db->setDataBaseBlocked(true); - db->close(); -} - -// --------------------------------------------------------------------------- -// CHsBRActiveCallback::OpenDataBaseConnection() -// -// Open database connection. -// --------------------------------------------------------------------------- -// -void CHsBRActiveCallback::OpenDataBaseConnection() -{ - HsDatabase *db = HsDatabase::instance(); - db->setDataBaseBlocked(false); - db->open(); -} -// End of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsbackuprestoreobserver.cpp --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsbackuprestoreobserver.cpp Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,185 +0,0 @@ -/* -* 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: Home screen Backup/Restore observer. -* -*/ - -#include -#include "hsdatabase.h" -#include "hsbackuprestoreobserver.h" -#include "hsbackuprestoreactivecallback.h" - -using namespace conn; - -// ----------------------------------------------------------------------------- -// CHsBackupRestoreObserver::CHsBackupRestoreObserver -// C++ default constructor -// ----------------------------------------------------------------------------- -// -CHsBackupRestoreObserver::CHsBackupRestoreObserver() : CActive(EPriorityNormal) -{ - iLastType = conn::EBURUnset; - iProperty.Attach(KUidSystemCategory, KUidBackupRestoreKey); - CActiveScheduler::Add(this); - iStatus = KRequestPending; - iProperty.Subscribe(iStatus); - SetActive(); -} - -// ----------------------------------------------------------------------------- -// CHsBackupRestoreObserver::ConstructL -// S2nd phase constructor. -// ----------------------------------------------------------------------------- -// -void CHsBackupRestoreObserver::ConstructL() -{ - -} - -// --------------------------------------------------------------------------- -// CSpaceDataStorageBURListener::NewL -// --------------------------------------------------------------------------- -// -CHsBackupRestoreObserver* CHsBackupRestoreObserver::NewL() -{ - CHsBackupRestoreObserver* self = new (ELeave) - CHsBackupRestoreObserver(); - CleanupStack::PushL( self ); - self->ConstructL( ); - CleanupStack::Pop( self ); - - return self; -} - -// --------------------------------------------------------------------------- -// CHsBackupRestoreObserver::~CHsBackupRestoreObserver -// --------------------------------------------------------------------------- -// -CHsBackupRestoreObserver::~CHsBackupRestoreObserver() -{ - Cancel(); - iProperty.Close(); - delete iCallBack; - delete iActiveBackupClient; -} - -// --------------------------------------------------------------------------- -// Handles changes in backup state. -// --------------------------------------------------------------------------- -// -void CHsBackupRestoreObserver::HandleBackupStateL( const TInt aValue ) -{ - const TInt type = aValue & conn::KBURPartTypeMask; - - // Test if the device is going into backup or restore mode, and we are - // required to participate. - if ( ( type == conn::EBURBackupFull || type == conn::EBURRestoreFull ) || - ( type == conn::EBURBackupPartial || type == conn::EBURRestorePartial ) ) - { - if ( !iCallBack ) - { - iCallBack = CHsBRActiveCallback::NewL(); - } - - if ( !iActiveBackupClient ) - { - iActiveBackupClient = conn::CActiveBackupClient::NewL( iCallBack ); - - if ( ( type == conn::EBURBackupPartial || - type == conn::EBURRestorePartial ) && - !iActiveBackupClient->DoesPartialBURAffectMeL() ) - { - delete iCallBack; - iCallBack = NULL; - delete iActiveBackupClient; - iActiveBackupClient = NULL; - return; - } - else if(type == conn::EBURRestorePartial || type == conn::EBURRestoreFull) - { - iCallBack->StartRestore(); - } - } - - iActiveBackupClient->ConfirmReadyForBURL( KErrNone ); - } - else - { - if ( type == conn::EBURNormal ) - { - if ( (iLastType == conn::EBURBackupFull || iLastType == conn::EBURBackupPartial) || - (iLastType == conn::EBURRestorePartial || iLastType == conn::EBURRestoreFull) ) - { - iCallBack->FinishBackupRestore(); - } - // delete once back to normal. - delete iCallBack; - iCallBack = NULL; - delete iActiveBackupClient; - iActiveBackupClient = NULL; - } - } - - iLastType = type; -} - -// --------------------------------------------------------------------------- -// Subsribes notifications of backup/restore p&s key. -// --------------------------------------------------------------------------- -// -void CHsBackupRestoreObserver::SubscribePSKey() -{ - Cancel(); - - iProperty.Subscribe( iStatus ); - SetActive(); -} - -// --------------------------------------------------------------------------- -// CHsBackupRestoreObserver::DoCancel -// --------------------------------------------------------------------------- -// -void CHsBackupRestoreObserver::DoCancel() -{ - iProperty.Cancel( ); -} - -// --------------------------------------------------------------------------- -// CHsBackupRestoreObserver::RunL -// --------------------------------------------------------------------------- -// -void CHsBackupRestoreObserver::RunL() -{ - if ( iStatus.Int() == KErrNone ) - { - TInt currentValue = KErrNone; - iProperty.Get( currentValue ); - - HandleBackupStateL( currentValue ); - } - // Re-subscribe notifications. - SubscribePSKey(); -} - -// --------------------------------------------------------------------------- -// CHsBackupRestoreObserver::RunError -// --------------------------------------------------------------------------- -// -TInt CHsBackupRestoreObserver::RunError( TInt /*aError*/) -{ - // No need to do anything - return KErrNone; -} - -// End of File diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntime.cpp --- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntime.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntime.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -26,10 +27,13 @@ #include #include +#include +#include #include #include #include +#include "hsmenueventfactory.h" #include "homescreendomainpskeys.h" #include "hsdefaultruntime.h" #include "hsdatabase.h" @@ -39,12 +43,10 @@ #include "hswidgetpositioningonorientationchange.h" #include "hswidgetpositioningonwidgetadd.h" #include "hstest_global.h" -#ifdef Q_OS_SYMBIAN -#include "hsbackuprestoreobserver.h" -#endif +#include "hsconfiguration.h" QTM_USE_NAMESPACE - +#define hbApp qobject_cast(qApp) #ifdef Q_OS_SYMBIAN const static Qt::Key applicationKey = Qt::Key_Menu; @@ -54,10 +56,12 @@ namespace { + const char KHsRootStateInterface[] = "com.nokia.homescreen.state.HsRootState"; const char KHsLoadSceneStateInterface[] = "com.nokia.homescreen.state.HsLoadSceneState"; const char KHsIdleStateInterface[] = "com.nokia.homescreen.state.HsIdleState"; const char KHsAppLibraryStateInterface[] = "com.nokia.homescreen.state.HsAppLibraryState"; const char KHsMenuWorkerStateInterface[] = "com.nokia.homescreen.state.HsMenuWorkerState"; + const char KHsBacupRestoreStateInterface[] = "com.nokia.homescreen.state.HsBackupRestoreState"; } @@ -83,7 +87,6 @@ mPublisher(NULL) #ifdef Q_OS_SYMBIAN ,keyCapture() - ,mBRObserver(NULL) #endif { HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::HsDefaultRuntime"); @@ -98,16 +101,13 @@ db->open(); HsDatabase::setInstance(db); + HsConfiguration::loadConfiguration(); + HsWidgetPositioningOnOrientationChange::setInstance( new HsAdvancedWidgetPositioningOnOrientationChange); HsWidgetPositioningOnWidgetAdd::setInstance( new HsAnchorPointInBottomRight); - -#ifdef Q_OS_SYMBIAN - mBRObserver = CHsBackupRestoreObserver::NewL(); -#endif - registerAnimations(); createStatePublisher(); createContentServiceParts(); @@ -115,7 +115,12 @@ assignServices(); QCoreApplication::instance()->installEventFilter(this); - HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::HsDefaultRuntime"); + + if (hbApp) { // Qt test framework uses QApplication. + connect(hbApp->activityManager(), SIGNAL(activityRequested(QString)), + this, SLOT(activityRequested(QString))); + } + HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::HsDefaultRuntime"); } /*! @@ -125,9 +130,6 @@ { HsWidgetPositioningOnOrientationChange::setInstance(0); delete mPublisher; -#ifdef Q_OS_SYMBIAN - delete mBRObserver; -#endif } /*! @@ -174,15 +176,6 @@ } /*! - Registers framework animations. -*/ -void HsDefaultRuntime::registerAnimations() -{ - HbIconAnimationManager *manager = HbIconAnimationManager::global(); - manager->addDefinitionFile(QLatin1String(":/resource/tapandhold.axml")); -} - -/*! Creates Home screen state publisher. */ void HsDefaultRuntime::createStatePublisher() @@ -232,19 +225,22 @@ loadSceneState->setParent(guiRootState); loadSceneState->setObjectName(KHsLoadSceneStateInterface); + QObject *rootStateObj = manager.loadInterface(KHsRootStateInterface); + QState *rootState = qobject_cast(rootStateObj); + rootState->setParent(guiRootState); + rootState->setObjectName(KHsRootStateInterface); + QObject *idleStateObj = manager.loadInterface(KHsIdleStateInterface); QState *idleState = qobject_cast(idleStateObj); - idleState->setParent(guiRootState); + idleState->setParent(rootState); idleState->setObjectName(KHsIdleStateInterface); connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered())); connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited())); - loadSceneState->addTransition( - loadSceneState, SIGNAL(event_idle()), idleState); //menu state QState *menuParallelState = new QState( - QState::ParallelStates, guiRootState); + QState::ParallelStates, rootState); QState *menuRootState = new QState(menuParallelState); QObject *appLibraryStateObj = manager.loadInterface(KHsAppLibraryStateInterface); @@ -253,15 +249,31 @@ appLibraryState->setObjectName(KHsAppLibraryStateInterface); menuRootState->setInitialState(appLibraryState); + QHistoryState *historyState = new QHistoryState(rootState); + historyState->setDefaultState(idleState); + + loadSceneState->addTransition( + loadSceneState, SIGNAL(event_history()), historyState); + QObject *menuWorkerStateObj = manager.loadInterface(KHsMenuWorkerStateInterface); QState *menuWorkerState = qobject_cast(menuWorkerStateObj); menuWorkerState->setParent(menuParallelState); menuWorkerState->setObjectName(KHsMenuWorkerStateInterface); + connect(appLibraryState, SIGNAL(collectionEntered()), + menuWorkerState, SIGNAL(reset())); + //Backup/Restore state + QObject *backupRestoreStateObj = manager.loadInterface(KHsBacupRestoreStateInterface); + QState *backupRestoreState = qobject_cast(backupRestoreStateObj); + backupRestoreState->setParent(guiRootState); + backupRestoreState->setObjectName(KHsBacupRestoreStateInterface); + backupRestoreState->addTransition( + backupRestoreState, SIGNAL(event_loadScene()), loadSceneState); // root state transitions idleState->addTransition(idleState, SIGNAL(event_applicationLibrary()), menuRootState); appLibraryState->addTransition( appLibraryState, SIGNAL(toHomescreenState()), idleState); + rootState->addTransition(rootState, SIGNAL(event_backupRestore()), backupRestoreState); // opening shortcut to Application Library HsMenuEventTransition *idleToAppLibTransition = new HsMenuEventTransition(HsMenuEvent::OpenApplicationLibrary, @@ -387,3 +399,14 @@ mIdleStateActive = false; updatePSKeys(); } + +/*! + Activity requested by another client +*/ +void HsDefaultRuntime::activityRequested(const QString &name) +{ + if (name == groupAppLibRecentView()){ + this->postEvent(HsMenuEventFactory::createOpenCollectionEvent(0, + collectionDownloadedTypeName())); + } +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/serviceproviders/hsmenuserviceprovider/inc/hsmenuservice.h --- a/homescreenapp/serviceproviders/hsmenuserviceprovider/inc/hsmenuservice.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/serviceproviders/hsmenuserviceprovider/inc/hsmenuservice.h Wed Jun 23 17:05:06 2010 +0100 @@ -65,6 +65,8 @@ static bool organizeCollection(int groupId, QList &entryIdList); static int allCollectionsId(); + + static int collectionIdByType(const QString& collectionType); static bool touch(int entryId); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuservice.cpp --- a/homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuservice.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuservice.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -126,6 +126,9 @@ } else { query.setFlagsOn(VisibleEntryFlag); } + if(!collectionId) { + collectionId = collectionIdByType(collectionType); + } query.setParentId(collectionId); query.setSort(HsMenuServiceUtils::sortBy(sortAttribute), HsMenuServiceUtils::sortOrder(sortAttribute)); @@ -347,6 +350,33 @@ } /*! + Retrives the first found collection entry id + \param collectionType collection type. + \retval collectionType id + */ +int HsMenuService::collectionIdByType(const QString& collectionType) +{ + HSMENUTEST_FUNC_ENTRY("HsMenuService::collectionsIdByType"); + int collectionId; + CaQuery collectionsQuery; + collectionsQuery.setEntryRoles(GroupEntryRole); + //sorting is set to (default, ascending) to assure that + //proper entry is fetched, somebody can add item with + //"menucollections" typename to the storage, but even if he or she + //do this we fetch entry that we wanted + collectionsQuery.setSort(DefaultSortAttribute, Qt::AscendingOrder); + collectionsQuery.addEntryTypeName(collectionType); + QList ids = CaService::instance()->getEntryIds( + collectionsQuery); + Q_ASSERT(ids.count() > 0); + collectionId = ids.at(0); + qDebug() << "HsMenuService::HsMenuService collectionsIdByType" + << collectionId; + HSMENUTEST_FUNC_EXIT("HsMenuService::collectionsIdByType"); + return collectionId; +} + +/*! Touch action on an entry. \param entryId of this entry. \retval boolean error code. diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/sis/homescreenapp_ut_hs.pkg --- a/homescreenapp/sis/homescreenapp_ut_hs.pkg Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/sis/homescreenapp_ut_hs.pkg Wed Jun 23 17:05:06 2010 +0100 @@ -33,62 +33,59 @@ "/epoc32/release/armv5/urel/t_hsapplicationexe.exe" - "c:/sys/bin/t_hsapplicationexe.exe" "/epoc32/data/z/private/10003a3f/import/apps/t_hsapplicationexe_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsapplicationexe_reg.rsc" "/epoc32/data/z/resource/apps/t_hsapplicationexe.rsc" - "c:/resource/apps/t_hsapplicationexe.rsc" -"/epoc32/release/armv5/urel/mockruntimeplugin.dll" - "c:/sys/bin/mockruntimeplugin.dll" +"/epoc32/release/armv5/urel/mockruntimeplugin.dll" - "c:/sys/bin/mockruntimeplugin.dll" "/epoc32/data/z/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.qtplugin" - "c:/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.qtplugin" -"/epoc32/data/z/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.xml" - "c:/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.xml" +"/epoc32/data/z/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.xml" - "c:/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.xml" ;--------------- hsutils --------------- "/epoc32/release/armv5/urel/t_hsutils.exe" - "c:/sys/bin/t_hsutils.exe" "/epoc32/data/z/private/10003a3f/import/apps/t_hsutils_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsutils_reg.rsc" "/epoc32/data/z/resource/apps/t_hsutils.rsc" - "c:/resource/apps/t_hsutils.rsc" -"../hsutils/tsrc/t_hsutils/nokia.png" - "C:/hsresources/testresources/nokia.png" -"../hsutils/tsrc/t_hsutils/large.jpg" - "C:/hsresources/testresources/large.jpg" +"../hsutils/tsrc/t_hsutils/nokia.png" - "c:/hsresources/testresources/nokia.png" +"../hsutils/tsrc/t_hsutils/large.jpg" - "c:/hsresources/testresources/large.jpg" ;--------------- hsdomainmodel --------------- - "/epoc32/release/armv5/urel/t_hsdomainmodel.exe" - "c:/sys/bin/t_hsdomainmodel.exe" "/epoc32/data/z/private/10003a3f/import/apps/t_hsdomainmodel_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsdomainmodel_reg.rsc" "/epoc32/data/z/resource/apps/t_hsdomainmodel.rsc" - "c:/resource/apps/t_hsdomainmodel.rsc" -"../hsdomainmodel/tsrc/t_hsdomainmodel/hsdomainmodeltest.db" - "c:/private/20022F59/hsdomainmodeltest.db" -"../hsdomainmodel/tsrc/t_hsdomainmodel/d_landscape.png" - "c:/private/20022F59/d_landscape.png" -"../hsdomainmodel/tsrc/t_hsdomainmodel/d_portrait.png" - "c:/private/20022F59/d_portrait.png" +"../hsdomainmodel/tsrc/t_hsdomainmodel/hsdomainmodeltest.db" - "c:/private/20022F59/hsdomainmodeltest.db" +"../hsdomainmodel/tsrc/t_hsdomainmodel/d_landscape.png" - "c:/private/20022F59/d_landscape.png" +"../hsdomainmodel/tsrc/t_hsdomainmodel/d_portrait.png" - "c:/private/20022F59/d_portrait.png" -"/epoc32/release/armv5/urel/mockwidgetplugin.dll" - "c:/sys/bin/mockwidgetplugin.dll" -"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.qtplugin" -"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.xml" -"/epoc32/data/z/resource/qt/translations/mockwidgetplugin.qm" - "c:/resource/qt/translations/mockwidgetplugin.qm" +"/epoc32/release/armv5/urel/mockwidgetplugin.dll" - "c:/sys/bin/mockwidgetplugin.dll" +"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.qtplugin" +"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugin.xml" +"/epoc32/data/z/resource/qt/translations/mockwidgetplugin.qm" - "c:/resource/qt/translations/mockwidgetplugin.qm" -"/epoc32/release/armv5/urel/mockwidgetplugintoosmall.dll" - "c:/sys/bin/mockwidgetplugintoosmall.dll" -"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.qtplugin" -"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.xml" +"/epoc32/release/armv5/urel/mockwidgetplugintoosmall.dll" - "c:/sys/bin/mockwidgetplugintoosmall.dll" +"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.qtplugin" +"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoosmall.xml" -"/epoc32/release/armv5/urel/mockwidgetplugintoobig.dll" - "c:/sys/bin/mockwidgetplugintoobig.dll" +"/epoc32/release/armv5/urel/mockwidgetplugintoobig.dll" - "c:/sys/bin/mockwidgetplugintoobig.dll" "/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.qtplugin" -"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.xml" +"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.xml" ;--------------- runtimeplugins --------------- ;hsdefaultruntimeplugin -"/epoc32/release/armv5/urel/t_hsdefaultruntimeplugin.exe" - "c:/sys/bin/t_hsdefaultruntimeplugin.exe" -"/epoc32/data/z/private/10003a3f/import/apps/t_hsdefaultruntimeplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsdefaultruntimeplugin_reg.rsc" -"/epoc32/data/z/resource/apps/t_hsdefaultruntimeplugin.rsc" - "c:/resource/apps/t_hsdefaultruntimeplugin.rsc" -"/epoc32/release/armv5/urel/mockstateplugins.dll" - "c:/sys/bin/mockstateplugins.dll" -"/epoc32/data/z/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.qtplugin" - "c:/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.qtplugin" -"/epoc32/data/z/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.xml" - "c:/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.xml" +"/epoc32/release/armv5/urel/t_hsdefaultruntimeplugin.exe" - "c:/sys/bin/t_hsdefaultruntimeplugin.exe" +"/epoc32/data/z/private/10003a3f/import/apps/t_hsdefaultruntimeplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsdefaultruntimeplugin_reg.rsc" +"/epoc32/data/z/resource/apps/t_hsdefaultruntimeplugin.rsc" - "c:/resource/apps/t_hsdefaultruntimeplugin.rsc" +"/epoc32/release/armv5/urel/mockstateplugins.dll" - "c:/sys/bin/mockstateplugins.dll" +"/epoc32/data/z/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.qtplugin" - "c:/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.qtplugin" +"/epoc32/data/z/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.xml" - "c:/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.xml" ;--------------- serviceproviders --------------- ;--------------- stateplugins --------------- - ;hshomescreenstateplugin "/epoc32/release/armv5/urel/t_hshomescreenstateplugin.exe" - "c:/sys/bin/t_hshomescreenstateplugin.exe" "/epoc32/data/z/private/10003a3f/import/apps/t_hshomescreenstateplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hshomescreenstateplugin_reg.rsc" "/epoc32/data/z/resource/apps/t_hshomescreenstateplugin.rsc" - "c:/resource/apps/t_hshomescreenstateplugin.rsc" ;--------------- widgetplugins --------------- - ;hsshortcutwidgetlugin ;t_hsshortcutwidget: "/epoc32/release/armv5/urel/t_hsshortcutwidget.exe" - "c:/sys/bin/t_hsshortcutwidget.exe" @@ -100,3 +97,21 @@ "/epoc32/release/armv5/urel/t_hsclockwidgetplugin.exe" - "c:/sys/bin/t_hsclockwidgetplugin.exe" "/epoc32/data/z/private/10003a3f/import/apps/t_hsclockwidgetplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsclockwidgetprovider_reg.rsc" "/epoc32/data/z/resource/apps/t_hsclockwidgetplugin.rsc" - "c:/resource/apps/t_hsclockwidgetprovider.rsc" + +;--------------- hshomescreenclientplugin ----------------------- +;hshomescreenclientplugin +;"/epoc32/release/armv5/urel/t_hshomescreenclientplugin.exe" - "c:/sys/bin/t_hshomescreenclientplugin.exe" +;"/epoc32/data/z/private/10003a3f/import/apps/t_hshomescreenclientplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hshomescreenclientplugin_reg.rsc" +;"/epoc32/data/z/resource/apps/t_hshomescreenclientplugin.rsc" - "c:/resource/apps/t_hshomescreenclientplugin.rsc" + +;--------------- hswidgetuninstaller ----------------------- +;hswidgetuninstaller +"/epoc32/release/armv5/urel/t_hswidgetuninstaller.exe" - "c:/sys/bin/t_hswidgetuninstaller.exe" +"/epoc32/data/z/private/10003a3f/import/apps/t_hswidgetuninstaller_reg.rsc" - "c:/private/10003a3f/import/apps/t_hswidgetuninstaller_reg.rsc" +"/epoc32/data/z/resource/apps/t_hswidgetuninstaller.rsc" - "c:/resource/apps/t_hswidgetuninstaller.rsc" +"../hswidgetuninstaller/tsrc/t_hswidgetuninstaller/empty.manifest" - "c:/private/20022F42/empty.manifest" +"../hswidgetuninstaller/tsrc/t_hswidgetuninstaller/fail_new.manifest" - "c:/private/20022F42/fail_new.manifest" +"../hswidgetuninstaller/tsrc/t_hswidgetuninstaller/ok_new.manifest" - "c:/private/20022F42/ok_new.manifest" +"../hswidgetuninstaller/tsrc/t_hswidgetuninstaller/ok_old.manifest" - "c:/private/20022F42/ok_old.manifest" +"../hswidgetuninstaller/tsrc/t_hswidgetuninstaller/version10.manifest" - "c:/private/20022F42/version10.manifest" +"../hswidgetuninstaller/tsrc/t_hswidgetuninstaller/version12.manifest" - "c:/private/20022F42/version12.manifest" \ No newline at end of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/conf/applibrary_view.confml --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/conf/applibrary_view.confml Tue May 18 12:12:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - - - Applibrary db specific customisation - - - - - AppLibUid Settings - - - - \ No newline at end of file diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/conf/hsapplibrary.confml Binary file homescreenapp/stateplugins/hsapplibrarystateplugin/conf/hsapplibrary.confml has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/conf/hsapplibrary_20022F97.crml Binary file homescreenapp/stateplugins/hsapplibrarystateplugin/conf/hsapplibrary_20022F97.crml has changed diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/hsapplibrarystateplugin.pro --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/hsapplibrarystateplugin.pro Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/hsapplibrarystateplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -32,7 +32,7 @@ TARGET.UID3 = 0x20022F97 nft::LIBS += -lhal include(hsapplibrarystateplugin_exports_to_rom.pri) - exists($${EPOCROOT}epoc32/include/mw/XQSettingsManager):LIBS += -lxqsettingsmanager + exists($${EPOCROOT}epoc32/include/platform/mw/XQSettingsManager):LIBS += -lxqsettingsmanager } exportResources(./*.qm, resource/qt/translations) RESOURCES = hsapplibrarystateplugin.qrc diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/hsapplibrarystateplugin_exports_to_rom.pri --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/hsapplibrarystateplugin_exports_to_rom.pri Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/hsapplibrarystateplugin_exports_to_rom.pri Wed Jun 23 17:05:06 2010 +0100 @@ -17,5 +17,5 @@ BLD_INF_RULES.prj_exports += \ "$${LITERAL_HASH}include " \ "conf/hsapplibrary.confml APP_LAYER_CONFML(hsapplibrary.confml)" \ - "conf/hsapplibrary_20022F97.crml APP_LAYER_CRML(hsapplibrary_20022F97.crml)" \ - "conf/applibrary_view.confml APP_LAYER_CONFML(applibrary_view.confml)" + "conf/hsapplibrary_20022F97.crml APP_LAYER_CRML(hsapplibrary_20022F97.crml)" + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallappsstate.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallappsstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallappsstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -38,6 +38,7 @@ class HsMenuViewBuilder; class HsMenuItemModel; class HsMenuModeWrapper; +class HsMainWindow; class HsAllAppsState: public QState { @@ -46,6 +47,7 @@ public: HsAllAppsState(HsMenuViewBuilder &menuViewBuilder, HsMenuModeWrapper &menuMode, + HsMainWindow &mainWindow, QState *parent = 0); ~HsAllAppsState(); signals: @@ -68,8 +70,8 @@ void stateEntered(); void addModeEntered(); void normalModeEntered(); - void stateExited(); - void contextMenuAction(HbAction *action); + void stateExited(); + void contextMenuAction(HbAction *action); private: void construct(); void setMenuOptions(); @@ -81,8 +83,9 @@ HsMenuView mMenuView; HsMenuModeWrapper &mMenuMode; HsMenuItemModel *mAllAppsModel; - QModelIndex mContextModelIndex; - QPointer mContextMenu; + HsMainWindow &mMainWindow; + QModelIndex mContextModelIndex; + QPointer mContextMenu; }; #endif // HSALLAPPSSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallcollectionsstate.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallcollectionsstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallcollectionsstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -37,6 +37,7 @@ class HbMainWindow; class HsMenuItemModel; class HsMenuView; +class HsMainWindow; class HsAllCollectionsState: public QState { @@ -45,6 +46,7 @@ public: HsAllCollectionsState(HsMenuViewBuilder &menuViewBuilder, HsMenuModeWrapper &menuMode, + HsMainWindow &mainWindow, QState *parent = 0); ~HsAllCollectionsState(); protected: @@ -70,7 +72,7 @@ void normalModeEntered(); void normalModeExited(); void stateExited(); - void contextMenuAction(HbAction *action); + void contextMenuAction(HbAction *action); private: void construct(); void setMenuOptions(); @@ -80,8 +82,9 @@ HsMenuView mMenuView; HsMenuModeWrapper &mMenuMode; HsMenuItemModel *mAllCollectionsModel; - QModelIndex mContextModelIndex; - QPointer mContextMenu; + HsMainWindow &mMainWindow; + QModelIndex mContextModelIndex; + QPointer mContextMenu; }; #endif // HSALLCOLLECTIONSSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsapplibrarystate.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsapplibrarystate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsapplibrarystate.h Wed Jun 23 17:05:06 2010 +0100 @@ -22,6 +22,7 @@ #include #include "hsmenustates_global.h" #include "hsmenuview.h" +#include "hsmainwindow.h" #include "hsmenumodewrapper.h" #include "hsapp_defs.h" @@ -54,6 +55,8 @@ signals: + void collectionEntered(); + void toHomescreenState(); void initialize(); @@ -108,6 +111,8 @@ HsInstalledAppsState *mInstalledAppsState; HsMenuModeWrapper mMenuMode; + + HsMainWindow mMainWindow; }; #endif //HSAPPLIBRARYSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hscollectionstate.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hscollectionstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hscollectionstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -36,6 +36,7 @@ class HsMenuItemModel; class HsMenuModeWrapper; class HsMenuViewBuilder; +class HsMainWindow; class HsCollectionState: public QState { @@ -44,6 +45,7 @@ public: HsCollectionState(HsMenuViewBuilder &menuView, HsMenuModeWrapper &menuMode, + HsMainWindow &mainWindow, QState *parent = 0); ~HsCollectionState(); public slots: @@ -66,7 +68,10 @@ void stateExited(); void latestOnTopMenuAction(); void oldestOnTopMenuAction(); - void contextMenuAction(HbAction *action); + void contextMenuAction(HbAction *action); + void handleEmptyChange(bool empty); + void lockSearchButton(bool lock); + private: void construct(); void constructMenu(bool isDynamic); @@ -84,9 +89,9 @@ HbAction *const mSecondarySoftkeyAction; HsMenuItemModel *mCollectionModel; HbMenu *mOptions; - QModelIndex mContextModelIndex; - QPointer mContextMenu; - + QModelIndex mContextModelIndex; + QPointer mContextMenu; + HsMainWindow &mMainWindow; }; #endif // HSCOLLECTIONSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsinstalledappsstate.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsinstalledappsstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsinstalledappsstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -35,6 +35,7 @@ class QPointF; class HsMenuViewBuilder; class HsMenuItemModel; +class HsMainWindow; class HsInstalledAppsState: public QState { @@ -45,6 +46,7 @@ public: HsInstalledAppsState(HsMenuViewBuilder &menuViewBuilder, + HsMainWindow &mainWindow, QState *parent = 0); ~HsInstalledAppsState(); @@ -64,7 +66,9 @@ void stateExited(); - void contextMenuAction(HbAction *action); + void setEmptyLabelVisibility(bool visibility); + + void contextMenuAction(HbAction *action); private: @@ -91,9 +95,11 @@ * Own. */ HbAction *const mSecondarySoftkeyAction; + + HsMainWindow &mMainWindow; - QModelIndex mContextModelIndex; - QPointer mContextMenu; + QModelIndex mContextModelIndex; + QPointer mContextMenu; }; #endif // HSINSTALLEDAPPSSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmainwindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmainwindow.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2009 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: Menu view. + * + */ + +#ifndef HS_MAIN_WINDOW_H +#define HS_MAIN_WINDOW_H + +class HsMenuView; +class HsMainWindow +{ + +public: + HsMainWindow(); + virtual ~HsMainWindow(); + + virtual void setCurrentView(const HsMenuView &menuView); +}; + +#endif // HS_MAIN_WINDOW_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuview.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuview.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuview.h Wed Jun 23 17:05:06 2010 +0100 @@ -36,6 +36,7 @@ class HbListView; class HbGroupBox; class HbWidget; +class HbStaticVkbHost; class HsMenuItemModel; @@ -50,15 +51,18 @@ ~HsMenuView(); void setSearchPanelVisible(bool visible); + void setContext(HsViewContext viewContext, + HsOperationalContext context); - HbView *view(); + HbView *view() const; - HbListView *listView(); + HbListView *listView() const; + HbPushButton *collectionButton() const; void activate(); void inactivate(); - HbGroupBox *viewLabel(); + HbGroupBox *viewLabel() const; void setModel(HsMenuItemModel *model); @@ -76,6 +80,8 @@ void showSearchPanel(); void hideSearchPanel(); + void disableSearch(bool disable); + private slots: void scrollToRow(int row, @@ -83,11 +89,11 @@ QAbstractItemView::PositionAtTop); void findItem(QString criteriaStr); + void vkbOpened(); + void vkbClosed(); private: - void addViewToMainWindow(HbView *view); - QModelIndex firstVisibleItemIndex(const HbListView *view) const; void connectSearchPanelSignals(); @@ -117,6 +123,9 @@ HbListView *mSearchListView; HbSearchPanel *mSearchPanel; + HbStaticVkbHost* mVkbHost; + + HbPushButton *mCollectionButton; HS_STATES_TEST_FRIEND_CLASS(MenuStatesTest) }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuviewbuilder.h --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuviewbuilder.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuviewbuilder.h Wed Jun 23 17:05:06 2010 +0100 @@ -24,6 +24,7 @@ #include #include #include +#include "hsmenustates_global.h" class QActionGroup; class HbAction; @@ -35,6 +36,7 @@ class HbView; class HbWidget; class HbToolBarExtension; +class HbPushButton; enum HsViewContext { HsAllAppsContext, @@ -45,9 +47,12 @@ enum HsOperationalContext { HsItemViewContext, - HsSearchContext + HsSearchContext, + HsButtonContext, + HsEmptyLabelContext }; +HS_STATES_TEST_CLASS(MenuStatesTest) class HsMenuViewBuilder { @@ -73,6 +78,7 @@ // optional widgets accessors HbGroupBox *currentViewLabel() const; HbSearchPanel *currentSearchPanel() const; + HbPushButton *collectionButton() const; void setViewContext(HsViewContext viewContext); @@ -99,13 +105,13 @@ QSet mLoadedObjects; const QString DOCUMENT_FILE_NAME; - const QString COMMON_SECTION_NAME; const QString ALL_APPS_ACTION_NAME; const QString ALL_COLLECTIONS_ACTION_NAME; const QString SEARCH_ACTION_NAME; const QString OVI_STORE_ACTION_NAME; const QString OPERATOR_ACTION_NAME; const QString SEARCH_PANEL_NAME; + const QString BUTTON_NAME; const QString TOOL_BAR_NAME; QActionGroup *mToolBarActionGroup; @@ -115,6 +121,8 @@ HsViewContext mViewContext; HsOperationalContext mOperationalContext; + + HS_STATES_TEST_FRIEND_CLASS(MenuStatesTest) }; #endif // HSMENUVIEWBUILDER_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/resource/applibrary.docml --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/resource/applibrary.docml Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/resource/applibrary.docml Wed Jun 23 17:05:06 2010 +0100 @@ -1,71 +1,56 @@ - - -
- + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - + - + + +
- - + + - + - @@ -90,8 +75,8 @@ - - + + @@ -113,8 +98,8 @@ - - + + @@ -151,8 +136,8 @@ - - + + @@ -176,13 +161,13 @@ - + - - + + @@ -198,6 +183,11 @@ + + + + + @@ -216,6 +206,7 @@ + @@ -226,8 +217,8 @@ - - + + @@ -235,6 +226,11 @@ + + + + + @@ -246,16 +242,69 @@
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ - - + + @@ -271,6 +320,16 @@ + + + + + + + + + + @@ -287,18 +346,19 @@ + + - - - + + @@ -306,6 +366,15 @@ + + + + + + + + + @@ -317,16 +386,147 @@
- - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + - + + + + + + + + + + + + + + + + + + + + + + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -36,6 +36,7 @@ #include "hsmenumodetransition.h" #include "caentry.h" #include "caservice.h" +#include "hsmainwindow.h" /*! \class HsAllAppsState @@ -75,12 +76,15 @@ */ HsAllAppsState::HsAllAppsState(HsMenuViewBuilder &menuViewBuilder, HsMenuModeWrapper &menuMode, + HsMainWindow &mainWindow, QState *parent) : QState(parent), mSortAttribute(AscendingNameHsSortAttribute), mCollectionsSortAttribute(LatestOnTopHsSortAttribute), mMenuView(menuViewBuilder, HsAllAppsContext), mMenuMode(menuMode), - mAllAppsModel(0), mContextModelIndex(), mContextMenu(0) + mAllAppsModel(0), + mMainWindow(mainWindow), + mContextModelIndex(), mContextMenu(0) { construct(); } @@ -207,6 +211,7 @@ qDebug("AllAppsState::stateEntered()"); HSMENUTEST_FUNC_ENTRY("HsAllAppsState::stateEntered"); + mMainWindow.setCurrentView(mMenuView); mMenuView.activate(); HSMENUTEST_FUNC_EXIT("HsAllAppsState::stateEntered"); @@ -345,18 +350,25 @@ "txt_common_menu_delete")); uninstallAction->setData(UninstallContextAction); HbAction *appSettingsAction(NULL); + HbAction *appDetailsAction(NULL); // check conditions and hide irrelevant menu items QSharedPointer entry = mAllAppsModel->entry(item->modelIndex()); + EntryFlags flags = item->modelIndex().data( + CaItemModel::FlagsRole).value (); if (!(entry->attribute(appSettingsPlugin()).isEmpty())) { appSettingsAction = mContextMenu->addAction(hbTrId( "txt_common_menu_settings")); appSettingsAction->setData(AppSettingContextAction); } - EntryFlags flags = item->modelIndex().data( - CaItemModel::FlagsRole).value (); + if (!(entry->attribute(componentIdAttributeName()).isEmpty()) && + (flags & RemovableEntryFlag) ) { + appDetailsAction = mContextMenu->addAction(hbTrId( + "txt_common_menu_details")); + appDetailsAction->setData(AppDetailsContextAction); + } if (!(flags & RemovableEntryFlag)) { uninstallAction->setVisible(false); @@ -393,12 +405,18 @@ mSortAttribute, mCollectionsSortAttribute, itemId)); break; case UninstallContextAction: - HsMenuService::executeAction(itemId, removeActionIdentifier()); + machine()->postEvent( + HsMenuEventFactory::createUninstallApplicationEvent( + itemId)); break; case AppSettingContextAction: machine()->postEvent( HsMenuEventFactory::createAppSettingsViewEvent(itemId)); break; + case AppDetailsContextAction: + machine()->postEvent( + HsMenuEventFactory::createAppDetailsViewEvent(itemId)); + break; default: break; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallcollectionsstate.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallcollectionsstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallcollectionsstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -33,6 +33,7 @@ #include "hsallcollectionsstate.h" #include "hsaddappstocollectionstate.h" #include "hsmenumodetransition.h" +#include "hsmainwindow.h" /*! \class HsAllCollectionsState @@ -74,12 +75,15 @@ HsAllCollectionsState::HsAllCollectionsState( HsMenuViewBuilder &menuViewBuilder, HsMenuModeWrapper &menuMode, + HsMainWindow &mainWindow, QState *parent): QState(parent), mSortAttribute(CustomHsSortAttribute), mMenuView(menuViewBuilder, HsAllCollectionsContext), mMenuMode(menuMode), - mAllCollectionsModel(0), mContextModelIndex(), mContextMenu(0) + mAllCollectionsModel(0), + mMainWindow(mainWindow), + mContextModelIndex(), mContextMenu(0) { construct(); } @@ -214,6 +218,7 @@ qDebug("AllCollectionsState::stateEntered()"); HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::stateEntered"); + mMainWindow.setCurrentView(mMenuView); mMenuView.activate(); HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::stateExited"); @@ -344,9 +349,6 @@ { HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::listItemLongPressed"); - - const int itemId = item->modelIndex().data(CaItemModel::IdRole).toInt(); - mContextMenu = new HbMenu; // create context menu diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsapplibrarystate.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsapplibrarystate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsapplibrarystate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -119,10 +119,11 @@ HSMENUTEST_FUNC_ENTRY("HsAppLibraryState::construct"); setObjectName("homescreen.nokia.com/state/applibrarystate"); - mAllAppsState = new HsAllAppsState(mMenuViewBuilder, mMenuMode, this); + mAllAppsState = new HsAllAppsState(mMenuViewBuilder, mMenuMode, mMainWindow, this); connect(this, SIGNAL(entered()),mAllAppsState, SLOT(scrollToBeginning())); - mAllCollectionsState = new HsAllCollectionsState(mMenuViewBuilder, mMenuMode, this); + mAllCollectionsState = new HsAllCollectionsState(mMenuViewBuilder, mMenuMode, + mMainWindow, this); connect(this, SIGNAL(entered()), mAllCollectionsState, SLOT(scrollToBeginning())); @@ -138,14 +139,15 @@ mCollectionState = new HsCollectionState(mMenuViewBuilder, mMenuMode, + mMainWindow, this); connect(mCollectionState, SIGNAL(entered()),SLOT(clearToolbarLatch())); HsMenuEventTransition *eventTransition = new HsMenuEventTransition(HsMenuEvent::OpenCollection, - mAllCollectionsState, mCollectionState); - mAllCollectionsState->addTransition(eventTransition); + this, mCollectionState); + this->addTransition(eventTransition); HsMenuEventTransition *collectionDeletedTransition = new HsMenuEventTransition(HsMenuEvent::CollectionDeleted, @@ -159,7 +161,7 @@ mCollectionState->addTransition(collectionToAppLibTransition); mInstalledAppsState = new HsInstalledAppsState( - mMenuViewBuilder, this); + mMenuViewBuilder, mMainWindow, this); HsMenuEventTransition *installedToAppLibTransition = new HsMenuEventTransition(HsMenuEvent::OpenApplicationLibrary, @@ -294,6 +296,7 @@ if (checkedAction != NULL) { checkedAction->setChecked(false); } + emit collectionEntered(); HSMENUTEST_FUNC_EXIT("HsAppLibraryState::clearToolbarLatch"); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -37,7 +38,7 @@ #include "hscollectionstate.h" #include "hsaddappstocollectionstate.h" #include "hsapp_defs.h" - +#include "hsmainwindow.h" /*! \class HsCollectionState @@ -118,6 +119,7 @@ */ HsCollectionState::HsCollectionState(HsMenuViewBuilder &menuViewBuilder, HsMenuModeWrapper &menuMode, + HsMainWindow &mainWindow, QState *parent) : QState(parent), mSortAttribute(LatestOnTopHsSortAttribute), @@ -127,7 +129,8 @@ mMenuMode(menuMode), mSecondarySoftkeyAction(new HbAction(Hb::BackNaviAction, this)), mCollectionModel(0), - mOptions(0), mContextModelIndex(), mContextMenu(0) + mOptions(0), mContextModelIndex(), mContextMenu(0), + mMainWindow(mainWindow) { construct(); } @@ -138,17 +141,16 @@ void HsCollectionState::construct() { HSMENUTEST_FUNC_ENTRY("HsCollectionState::construct"); + const QString parentName = parent() != 0 ? parent()->objectName() : QString(""); setObjectName(parentName + "/collectionstate"); - connect(this, SIGNAL(entered()),SLOT(stateEntered())); connect(this, SIGNAL(exited()),SLOT(stateExited())); makeConnect(); - mMenuView.view()-> - setNavigationAction(mSecondarySoftkeyAction); + mMenuView.view()->setNavigationAction(mSecondarySoftkeyAction); HSMENUTEST_FUNC_EXIT("HsCollectionState::construct"); } @@ -196,22 +198,37 @@ { HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateEntered"); + mMainWindow.setCurrentView(mMenuView); mMenuView.activate(); if (!mCollectionModel) { mCollectionModel = HsMenuService::getCollectionModel( mCollectionId, mSortAttribute, mCollectionType); - } else { - if (mCollectionType == collectionDownloadedTypeName()) { - mCollectionModel->setFlagsOn(RemovableEntryFlag | VisibleEntryFlag); + } + + EntryFlags flags = + mCollectionModel->root().data(CaItemModel::FlagsRole).value< + EntryFlags> (); + + if (mCollectionModel->rowCount() == 0){ + if (flags & RemovableEntryFlag){ + mMenuView.setContext(HsCollectionContext,HsButtonContext); } else { - mCollectionModel->setFlagsOn(VisibleEntryFlag); + mMenuView.setContext(HsCollectionContext,HsEmptyLabelContext); } - mCollectionModel->setParentId(mCollectionId); - mCollectionModel->setSort(LatestOnTopHsSortAttribute); + mMenuView.disableSearch(true); + } else { + mMenuView.setContext(HsCollectionContext,HsItemViewContext); + mMenuView.disableSearch(false); } + connect(mCollectionModel, SIGNAL(modelReset()), SLOT(updateLabel())); + connect(mCollectionModel, SIGNAL(empty(bool)),this, + SLOT(handleEmptyChange(bool))); + connect(mCollectionModel, SIGNAL(empty(bool)),this, + SLOT(lockSearchButton(bool))); + mMenuView.setModel(mCollectionModel); mMenuView.listView()->scrollTo( @@ -226,10 +243,6 @@ this, SLOT(openTaskSwitcher())); - EntryFlags flags = - mCollectionModel->root().data(CaItemModel::FlagsRole).value< - EntryFlags> (); - if (flags & RemovableEntryFlag) { mOptions->addAction(hbTrId("txt_applib_opt_add_content"), this, SLOT(addAppsAction())); @@ -283,8 +296,17 @@ { HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateExited"); + mMenuView.inactivate(); mMenuView.setSearchPanelVisible(false); - mMenuView.inactivate(); + mMenuView.disableSearch(false); + disconnect(mCollectionModel, SIGNAL(empty(bool)),this, + SLOT(handleEmptyChange(bool))); + + disconnect(mCollectionModel, SIGNAL(empty(bool)),this, + SLOT(lockSearchButton(bool))); + + disconnect(mCollectionModel, SIGNAL(modelReset()), + this, SLOT(updateLabel())); delete mCollectionModel; mCollectionModel = NULL; delete mOptions; @@ -292,6 +314,7 @@ if (mContextMenu) mContextMenu->close(); HSMENUTEST_FUNC_EXIT("HsCollectionState::stateExited"); + this->mSortAttribute = NoHsSortAttribute; qDebug("CollectionState::stateExited()"); } @@ -308,7 +331,9 @@ connect(&mMenuView, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)), SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF))); - connect(mCollectionModel, SIGNAL(modelReset()),SLOT(updateLabel())); + connect(mMenuView.collectionButton(), + SIGNAL(released()), this, SLOT(addAppsAction())); + } /*! @@ -316,12 +341,12 @@ */ void HsCollectionState::makeDisconnect() { + disconnect(mMenuView.collectionButton(), + SIGNAL(pressed()), this, SLOT(addAppsAction())); + disconnect(mSecondarySoftkeyAction, SIGNAL(triggered()), this, SLOT(backSteppingAction())); - disconnect(mCollectionModel, SIGNAL(modelReset()), - this, SLOT(updateLabel())); - disconnect(&mMenuView, SIGNAL(activated(QModelIndex)), this, SLOT(listItemActivated(QModelIndex))); @@ -391,6 +416,7 @@ HbAction *removeAction(NULL); HbAction *uninstallAction(NULL); HbAction *appSettingsAction(NULL); + HbAction *appDetailsAction(NULL); // we do not add remove option in locked collection // check conditions and hide irrelevant menu items EntryFlags rootFlags = @@ -417,7 +443,13 @@ "txt_common_menu_settings")); appSettingsAction->setData(AppSettingContextAction); } - + + if (!(entry->attribute(componentIdAttributeName()).isEmpty()) && + (flags & RemovableEntryFlag) ) { + appDetailsAction = mContextMenu->addAction(hbTrId( + "txt_common_menu_details")); + appDetailsAction->setData(AppDetailsContextAction); + } mContextModelIndex = item->modelIndex(); mContextMenu->setPreferredPos(coords); mContextMenu->setAttribute(Qt::WA_DeleteOnClose); @@ -447,7 +479,9 @@ mCollectionId, itemId, mCollectionsSortAttribute)); break; case UninstallContextAction: - HsMenuService::executeAction(itemId, removeActionIdentifier()); + machine()->postEvent( + HsMenuEventFactory::createUninstallApplicationEvent( + itemId)); break; case RemoveFromCollectionContextAction: machine()->postEvent( @@ -458,6 +492,10 @@ machine()->postEvent( HsMenuEventFactory::createAppSettingsViewEvent(itemId)); break; + case AppDetailsContextAction: + machine()->postEvent( + HsMenuEventFactory::createAppDetailsViewEvent(itemId)); + break; default: break; } @@ -466,6 +504,36 @@ } /*! + Handles button visibility + */ +void HsCollectionState::handleEmptyChange(bool empty) +{ + EntryFlags flags = + mCollectionModel->root().data(CaItemModel::FlagsRole).value< + EntryFlags> (); + + if (empty){ + if (flags & RemovableEntryFlag){ + mMenuView.setContext(HsCollectionContext,HsButtonContext); + } else { + mMenuView.setContext(HsCollectionContext,HsEmptyLabelContext); + } + } else { + mMenuView.setContext(HsCollectionContext,HsItemViewContext); + } +} + + +/*! + Handles lock serch button + */ +void HsCollectionState::lockSearchButton(bool lock) +{ + mMenuView.disableSearch(lock); +} + + +/*! Menu add applications action slot */ void HsCollectionState::addAppsAction() diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsinstalledappsstate.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsinstalledappsstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsinstalledappsstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -34,6 +34,7 @@ #include "hsaddappstocollectionstate.h" #include "hsapp_defs.h" #include "hsmenumodetransition.h" +#include "hsmainwindow.h" /*! \class HsInstalledAppsState @@ -75,11 +76,13 @@ \param parent Owner. */ HsInstalledAppsState::HsInstalledAppsState(HsMenuViewBuilder &menuViewBuilder, + HsMainWindow &mainWindow, QState *parent): QState(parent), mMenuView(menuViewBuilder, HsInstalledAppsContext), mInstalledAppsModel(0), mSecondarySoftkeyAction(new HbAction(Hb::BackNaviAction, this)), + mMainWindow(mainWindow), mContextModelIndex(),mContextMenu(0) { construct(); @@ -146,6 +149,7 @@ qDebug("AllAppsState::stateEntered()"); HSMENUTEST_FUNC_ENTRY("HsInstalledAppsState::stateEntered"); + mMainWindow.setCurrentView(mMenuView); mMenuView.activate(); if (!mInstalledAppsModel) { @@ -154,6 +158,10 @@ mMenuView.setModel(mInstalledAppsModel); } + if (mInstalledAppsModel->rowCount() == 0){ + mMenuView.setContext(HsInstalledAppsContext,HsEmptyLabelContext); + } + mMenuView.listView()->scrollTo( mInstalledAppsModel->index(0)); @@ -164,6 +172,9 @@ SIGNAL(longPressed(HbAbstractViewItem *, QPointF)), SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF))); + connect(mInstalledAppsModel, SIGNAL(empty(bool)),this, + SLOT(setEmptyLabelVisibility(bool))); + mMenuView.viewLabel()->setHeading( hbTrId("txt_applib_subtitle_installed")); @@ -177,6 +188,9 @@ { HSMENUTEST_FUNC_ENTRY("HsInstalledAppsState::stateExited"); + disconnect(mInstalledAppsModel, SIGNAL(empty(bool)),this, + SLOT(setEmptyLabelVisibility(bool))); + mMenuView.setSearchPanelVisible(false); mMenuView.inactivate(); @@ -188,6 +202,18 @@ } /*! + Handles button visibility + */ +void HsInstalledAppsState::setEmptyLabelVisibility(bool visibility) +{ + if(visibility){ + mMenuView.setContext(HsInstalledAppsContext,HsEmptyLabelContext); + } else { + mMenuView.setContext(HsInstalledAppsContext,HsItemViewContext); + } +} + +/*! Open task switcher. \retval true if operation is successful. */ @@ -229,7 +255,19 @@ HbAction *uninstallAction = mContextMenu->addAction( hbTrId("txt_common_menu_delete")); + HbAction *appDetailsAction(NULL); uninstallAction->setData(UninstallContextAction); + + QSharedPointer entry = mInstalledAppsModel->entry(item->modelIndex()); + EntryFlags flags = item->modelIndex().data( + CaItemModel::FlagsRole).value (); + + if (!(entry->attribute(componentIdAttributeName()).isEmpty()) && + (flags & RemovableEntryFlag) ) { + appDetailsAction = mContextMenu->addAction(hbTrId( + "txt_common_menu_details")); + appDetailsAction->setData(AppDetailsContextAction); + } mContextModelIndex = item->modelIndex(); mContextMenu->setPreferredPos(coords); @@ -247,13 +285,25 @@ Handles context menu actions */ void HsInstalledAppsState::contextMenuAction(HbAction *action) -{ - HsContextAction command = static_cast(action->data().toInt()); - if (command == UninstallContextAction) { - const int itemId = mContextModelIndex.data( - CaItemModel::IdRole).toInt(); - HsMenuService::executeAction(itemId, removeActionIdentifier()); - } +{ + HsContextAction command = + static_cast(action->data().toInt()); + + const int itemId = mContextModelIndex.data(CaItemModel::IdRole).toInt(); + + switch (command) { + case UninstallContextAction: + machine()->postEvent( + HsMenuEventFactory::createUninstallApplicationEvent( + itemId)); + break; + case AppDetailsContextAction: + machine()->postEvent( + HsMenuEventFactory::createAppDetailsViewEvent(itemId)); + break; + default: + break; + } mMenuView.setSearchPanelVisible(false); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmainwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmainwindow.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009 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: Menu view. + * + */ + +#include +#include +#include +#include "hsmainwindow.h" +#include "hsmenuview.h" + +/*! + Constructor + */ +HsMainWindow::HsMainWindow() +{ +} + +/*! + Destructor + */ +HsMainWindow::~HsMainWindow() +{ +} + +/*! + Add the \menuView to first instance of HbMainWindow registered in HbInstance. + \param view View to be added to HbMainWindow. +*/ +void HsMainWindow::setCurrentView(const HsMenuView &menuView) +{ + HbMainWindow *const hbW( + HbInstance::instance()->allMainWindows().value(0)); + + HbView *const view = menuView.view(); + + if (!hbW->views().contains(view)) { + hbW->addView(view); + } + if (hbW->currentView() && !hbW->currentView()->isContentFullScreen()) { + // quick trick to know if we are not comming from IDLE + hbW->setCurrentView(view, true, Hb::ViewSwitchUseAltEvent); + } else { + hbW->setCurrentView(view); + } +} + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -24,9 +24,11 @@ #include #include #include +#include #include #include #include +#include #include "hsallappsstate.h" #include "hsallcollectionsstate.h" @@ -62,7 +64,8 @@ mListView(NULL), mViewLabel(NULL), mSearchListView(NULL), - mSearchPanel(NULL) + mSearchPanel(NULL), + mVkbHost(NULL) { mBuilder.setOperationalContext(HsItemViewContext); mBuilder.setViewContext(mViewContext); @@ -72,10 +75,16 @@ mListView = mBuilder.currentListView(); mViewLabel= mBuilder.currentViewLabel(); + mCollectionButton = mBuilder.collectionButton(); + mProxyModel->setFilterRole(CaItemModel::TextRole); mProxyModel->setFilterKeyColumn(1); mProxyModel->setSortRole(CaItemModel::TextRole); + mVkbHost = new HbStaticVkbHost(mView); + connect(mVkbHost, SIGNAL(keypadOpened()), this, SLOT(vkbOpened())); + connect(mVkbHost, SIGNAL(keypadClosed()), this, SLOT(vkbClosed())); + connect(mListView, SIGNAL(activated(QModelIndex)), this, SIGNAL(activated(QModelIndex))); @@ -103,18 +112,20 @@ { HSMENUTEST_FUNC_ENTRY("HsMenuView::setModel"); - disconnect(mListView->model(), - SIGNAL(scrollTo(int, QAbstractItemView::ScrollHint)), - this, - SLOT(scrollToRow(int, QAbstractItemView::ScrollHint))); - + if (mListView->model()) { + disconnect(mListView->model(), + SIGNAL(scrollTo(int, QAbstractItemView::ScrollHint)), + this, + SLOT(scrollToRow(int, QAbstractItemView::ScrollHint))); + } mListView->setModel(model); - connect(mListView->model(), - SIGNAL(scrollTo(int, QAbstractItemView::ScrollHint)), - this, - SLOT(scrollToRow(int, QAbstractItemView::ScrollHint))); - + if (mListView->model()) { + connect(mListView->model(), + SIGNAL(scrollTo(int, QAbstractItemView::ScrollHint)), + this, + SLOT(scrollToRow(int, QAbstractItemView::ScrollHint))); + } HSMENUTEST_FUNC_EXIT("HsMenuView::setModel"); } @@ -123,7 +134,7 @@ Returns label appropriate for the view. \return pointer to the label or NULL if the view has no label. */ -HbGroupBox *HsMenuView::viewLabel() +HbGroupBox *HsMenuView::viewLabel() const { return mViewLabel; } @@ -178,9 +189,23 @@ } /*! + Makes the UI to show or hide view add collection button + \param visibility When true button will be shown, + otherwise it will be hidden. + */ +void HsMenuView::setContext(HsViewContext viewContext, + HsOperationalContext context) +{ + mBuilder.setViewContext(viewContext); + mBuilder.setOperationalContext(context); + mBuilder.build(); +} + + +/*! \return View widget of the menu view. */ -HbView *HsMenuView::view() +HbView *HsMenuView::view() const { return mView; } @@ -188,12 +213,20 @@ /*! \return List view widget of the menu view. */ -HbListView *HsMenuView::listView() +HbListView *HsMenuView::listView() const { return mListView; } /*! +\return Collection button + */ +HbPushButton *HsMenuView::collectionButton() const +{ + return mCollectionButton; +} + +/*! Makes search panel visible. Equivalent to \a setSearchPanelVisible(true) */ @@ -224,6 +257,15 @@ #endif //COVERAGE_MEASUREMENT /*! + Disable or enable search action button. + \param disable If true action is disabled. + */ +void HsMenuView::disableSearch(bool disable) +{ + mBuilder.searchAction()->setDisabled(disable); +} + +/*! Scrolls item view to requested row. \param row The row which is to get at the position pointed by \a hint. \param hint Position in the view the row should be scrolled to. @@ -328,6 +370,8 @@ HSMENUTEST_FUNC_ENTRY("hsmenuview::findItem"); if ("" != criteriaStr) { + mProxyModel->invalidate(); + mProxyModel->setSourceModel(mListView->model()); mProxyModel->setFilterRegExp(QRegExp(criteriaStr, Qt::CaseInsensitive, QRegExp::FixedString)); mSearchListView->scrollTo(mProxyModel->index(0,0), @@ -392,6 +436,7 @@ mSearchListView = NULL; mSearchPanel = NULL; + vkbClosed(); HSMENUTEST_FUNC_EXIT("hsmenuview::searchFinished"); } @@ -424,32 +469,13 @@ } /*! - Add the \view to first instance of HbMainWindow registered in HbInstance. - \param view View to be added to HbMainWindow. - */ -void HsMenuView::addViewToMainWindow(HbView *view) -{ - HbMainWindow *const hbW( - HbInstance::instance()->allMainWindows().value(0)); - - if (!hbW->views().contains(view)) { - hbW->addView(view); - } - hbW->setCurrentView(view); -} - - -/*! Add the view to main window and search action with \a showSearchPanel slot of the window. */ void HsMenuView::activate() { - addViewToMainWindow(mView); - connect(mBuilder.searchAction(), SIGNAL(triggered()), this, SLOT(showSearchPanel())); - } /*! @@ -465,4 +491,19 @@ } +/*! + change size of view when VKB is opened + */ +void HsMenuView::vkbOpened() +{ + mView->setMaximumHeight(mVkbHost->applicationArea().height()); +} +/*! + change size of view when VKB is closed + */ +void HsMenuView::vkbClosed() +{ + mView->setMaximumHeight(-1); +} + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuviewbuilder.cpp --- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuviewbuilder.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuviewbuilder.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -34,34 +35,6 @@ #include "hsmenuviewbuilder.h" #include "hsmenustates_global.h" -// TODO this class is temprary solution, proper one should come from Orbit -class HsVkbHost : public HbStaticVkbHost -{ -public: - explicit HsVkbHost(HbWidget *target): - HbStaticVkbHost(target), mWidget(target) {} - -#ifdef COVERAGE_MEASUREMENT -#pragma CTC SKIP -#endif //COVERAGE_MEASUREMENT skipped: its very temporary TODO - void openFinished() { - updateViewHeight(applicationArea().height()); - } - - void closeFinished() { - updateViewHeight(-1); - } - - void updateViewHeight(qreal height) { - HbView *view = mWidget->mainWindow()->currentView(); - view->setMaximumHeight(height); - } -#ifdef COVERAGE_MEASUREMENT -#pragma CTC ENDSKIP -#endif //COVERAGE_MEASUREMENT - - HbWidget *mWidget; -}; /*! \class HsMenuViewBuilder @@ -85,19 +58,12 @@ void HsMenuViewBuilder::searchPanelVisibilityChange(bool visible) { if (visible) { - // TODO this is temprary solution, proper solution should come from Orbit - if (!HbVkbHost::getVkbHost(currentSearchPanel())) { - new HsVkbHost(currentSearchPanel()); - } + HbLineEdit *const lineEdit(searchPanelLineEdit()); lineEdit->setText(""); - } else { - if (static_cast(HbVkbHost::getVkbHost(currentSearchPanel()))) { - static_cast(HbVkbHost::getVkbHost(currentSearchPanel()))-> - updateViewHeight(-1); - } - } + lineEdit->setFocus(); + } } @@ -118,7 +84,6 @@ if (view != NULL && mViewContext != HsInstalledAppsContext) { view->setToolBar(mToolBar); } - return view; } @@ -130,9 +95,11 @@ */ HbListView *HsMenuViewBuilder::currentListView() const { - const QString LIST_VIEW_NAME = mViewContextToStringMap[mViewContext] - + mOperationalContextToStringMap[mOperationalContext] - + "ListView"; + QString LIST_VIEW_NAME = mViewContextToStringMap[mViewContext]; + if (mOperationalContext == HsSearchContext) { + LIST_VIEW_NAME.append(mOperationalContextToStringMap[mOperationalContext]); + } + LIST_VIEW_NAME.append("ListView"); return qobject_cast( mDocumentLoader.findWidget(LIST_VIEW_NAME)); @@ -166,6 +133,17 @@ } /*! + \return pointer to a button + The pointer is valid until the HsMenuViewBuilder instance is destroyed. + Memory ownership is not changed. + */ +HbPushButton *HsMenuViewBuilder::collectionButton() const +{ + return qobject_cast(mDocumentLoader.findWidget( + BUTTON_NAME)); +} + +/*! \return pointer to All Applications Action. Guaranteed to be not NULL. The pointer is valid until the HsMenuViewBuilder instance is destroyed. Memory ownership is not changed. @@ -265,13 +243,13 @@ */ HsMenuViewBuilder::HsMenuViewBuilder(): DOCUMENT_FILE_NAME(":/xml/applibrary.docml"), - COMMON_SECTION_NAME("commonDefinitions"), ALL_APPS_ACTION_NAME("allAppsAction"), ALL_COLLECTIONS_ACTION_NAME("allCollectionsAction"), SEARCH_ACTION_NAME("searchAction"), OVI_STORE_ACTION_NAME("oviStoreAction"), OPERATOR_ACTION_NAME("operatorAction"), SEARCH_PANEL_NAME("searchPanel"), + BUTTON_NAME("collectionButton"), TOOL_BAR_NAME("toolBar"), mToolBar(new HbToolBar), mToolBarExtension(new HbToolBarExtension), @@ -281,7 +259,7 @@ init(); // parse common section and the one specified by view options - const bool result = parseSection(COMMON_SECTION_NAME); + const bool result = parseSection(); Q_ASSERT_X(result, "HsMenuViewBuilder::HsMenuViewBuilder()", @@ -319,12 +297,10 @@ HSMENUTEST_FUNC_ENTRY("HsMenuViewBuilder::parseSection"); bool loadStatusOk = false; - const QObjectList loadedObjects = mDocumentLoader.load(DOCUMENT_FILE_NAME, sectionName, - &loadStatusOk); - + &loadStatusOk); mLoadedObjects |= loadedObjects.toSet(); Q_ASSERT_X(loadStatusOk, @@ -377,6 +353,9 @@ mViewContextToStringMap[HsCollectionContext] = "collection"; mOperationalContextToStringMap[HsItemViewContext] = ""; mOperationalContextToStringMap[HsSearchContext] = "Search"; + mOperationalContextToStringMap[HsButtonContext] = "Button"; + mOperationalContextToStringMap[HsEmptyLabelContext] = "EmptyLabel"; + } /*! @@ -395,7 +374,6 @@ void HsMenuViewBuilder::setOperationalContext( HsOperationalContext operationalContext) { - mOperationalContext = operationalContext; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsbackuprestorestate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsbackuprestorestate.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,52 @@ +/* +* 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: +* +*/ + +#ifndef HSBACKUPRESTORESTATE_H +#define HSBACKUPRESTORESTATE_H + +#include +#include "hstest_global.h" +HOMESCREEN_TEST_CLASS(HomeScreenStatePluginTest) + +class HsDatabase; + +class HsBackupRestoreState : public QState +{ + Q_OBJECT + +public: + HsBackupRestoreState(QState *parent = 0); + ~HsBackupRestoreState(); + +signals: + void event_loadScene(); + +private slots: + void action_startListenBURStatus(); + void action_stopListenBURStatus(); + +private: + void deleteIdleView(); + Q_DISABLE_COPY(HsBackupRestoreState) + +private: + QScopedPointer mDatabase; + + HOMESCREEN_TEST_FRIEND_CLASS(HomeScreenStatePluginTest) +}; + +#endif // HSBACKUPRESTORESTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsidlestate.h --- a/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsidlestate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsidlestate.h Wed Jun 23 17:05:06 2010 +0100 @@ -21,6 +21,7 @@ #include #include #include +#include #include "hstest_global.h" HOMESCREEN_TEST_CLASS(HomeScreenStatePluginTest) @@ -28,7 +29,6 @@ class QGraphicsItem; class QGraphicsSceneMouseEvent; class QPropertyAnimation; -class HbView; class HbAction; class HbContinuousFeedback; class HsIdleWidget; @@ -75,6 +75,7 @@ void addPageToScene(int pageIndex); qreal parallaxFactor() const; void updateZoneAnimation(); + void showTrashBin(); void removeActivePage(); private slots: @@ -135,29 +136,23 @@ void moveScene_onMouseReleased( QGraphicsItem *watched, QGraphicsSceneMouseEvent *event, bool &filtered); - void onOrientationChanged(Qt::Orientation orientation); - void widgetInteraction_onTapAndHoldTimeout(); void sceneInteraction_onTapAndHoldTimeout(); - void onTitleChanged(QString title); - void onAddContentActionTriggered(); - bool openTaskSwitcher(); void zoneAnimationFinished(); + void onSceneMenuTriggered(HbAction *action); + void onRemovePageConfirmationOk(); void onSceneMenuAboutToClose(); - void onRemovePageMessageBoxClosed(HbAction *action); private: - HbView *mView; HbAction *mNavigationAction; HsIdleWidget *mUiWidget; + QTimer mTimer; - qreal mTapAndHoldDistance; - qreal mPageChangeZoneWidth; - QPointF mSceneMenuPos; + QPointF mTouchScenePos; HsTitleResolver *mTitleResolver; QPropertyAnimation *mZoneAnimation; bool mPageChanged; @@ -167,6 +162,7 @@ bool mTrashBinFeedbackAlreadyPlayed; qreal mDeltaX; + QPointer mSceneMenu; #ifdef Q_OS_SYMBIAN XQSettingsManager *mSettingsMgr; #endif diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsloadscenestate.h --- a/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsloadscenestate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsloadscenestate.h Wed Jun 23 17:05:06 2010 +0100 @@ -19,6 +19,11 @@ #define HSLOADSCENESTATE_H #include +#ifdef Q_OS_SYMBIAN +#include + +class XQSettingsManager; +#endif class HsLoadSceneState : public QState { @@ -27,15 +32,24 @@ public: HsLoadSceneState(QState *parent = 0); ~HsLoadSceneState(); - +#ifdef Q_OS_SYMBIAN +public slots: + void handleKeyChange(XQSettingsKey key, const QVariant &value); +#endif signals: - void event_idle(); + void event_history(); private slots: void action_loadScene(); private: Q_DISABLE_COPY(HsLoadSceneState) + void showUi(); + +#ifdef Q_OS_SYMBIAN + XQPublishAndSubscribeSettingsKey mStartupKey; + XQSettingsManager *mSettingsMgr; +#endif }; #endif // HSLOADSCENESTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsrootstate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsrootstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,48 @@ +/* +* 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: +* +*/ + +#ifndef HSROOTSTATE_H +#define HSROOTSTATE_H + +#include +#include "hstest_global.h" +HOMESCREEN_TEST_CLASS(HomeScreenStatePluginTest) + + +class HsRootState : public QState +{ + Q_OBJECT + +public: + HsRootState(QState *parent = 0); + ~HsRootState(); + +signals: + void event_backupRestore(); + +private slots: + void action_startListenBURStatus(); + void action_stopListenBURStatus(); + +private: + Q_DISABLE_COPY(HsRootState) + +private: + HOMESCREEN_TEST_FRIEND_CLASS(HomeScreenStatePluginTest) +}; + +#endif // HSROOTSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsselectbackgroundstate.h --- a/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsselectbackgroundstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsselectbackgroundstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -26,15 +26,13 @@ HOMESCREEN_TEST_CLASS(HomeScreenStatePluginTest) -class QThread; +class HbProgressDialog; class HbView; -class HbProgressDialog; #ifdef Q_OS_SYMBIAN class HsImageFetcherClient; #else class XQAIWGetImageClient; #endif -class HsImageRender; class HsSelectBackgroundState : public QState { @@ -47,15 +45,6 @@ private: Q_DISABLE_COPY(HsSelectBackgroundState) - enum ImageProcessingState { - NotRunning, - ProcessPortraitAsFirst, - ProcessLandscapeAsFirst, - ProcessPortraitAsSecond, - ProcessLandscapeAsSecond, - Error - }; - signals: void event_waitInput(); void handleError(); @@ -85,10 +74,10 @@ #endif HbView *mSourceView; - QThread *mWallpaperImageReaderThread; - HsWallpaperImageReader *mWallpaperImageReader; + HsWallpaperImageReader *mPortraitWallpaperImageReader; + HsWallpaperImageReader *mLandscapeWallpaperImageReader; HbProgressDialog *mProgressDialog; - ImageProcessingState mImageProcessingState; + int mRunningThreadAmount; bool mShowAnimation; HOMESCREEN_TEST_FRIEND_CLASS(HomeScreenStatePluginTest) diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/resource/hshomescreenstateplugin.xml --- a/homescreenapp/stateplugins/hshomescreenstateplugin/resource/hshomescreenstateplugin.xml Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/resource/hshomescreenstateplugin.xml Wed Jun 23 17:05:06 2010 +0100 @@ -4,6 +4,12 @@ hshomescreenstateplugin + com.nokia.homescreen.state.HsRootState + 1.0 + + + + com.nokia.homescreen.state.HsLoadSceneState 1.0 @@ -15,4 +21,10 @@ + + com.nokia.homescreen.state.HsBackupRestoreState + 1.0 + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsbackuprestorestate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsbackuprestorestate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,105 @@ +/* +* 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: +* +*/ + +#include +#include +#include +#include +#include +#include "hsdatabase.h" +#include "hsscene.h" +#include "hsbackuprestoreobserver.h" +#include "hsbackuprestorestate.h" +#include "hsscene.h" +#include "hsgui.h" + +/*! + \class HsBackupRestoreState + \ingroup group_hshomescreenstateplugin + \brief Home screen Bacup/Restore state. + + Releases all Home screen data, which will be backed up or restored. +*/ + +/*! + Constructs a new backup/restore state with the given \a parent. +*/ +HsBackupRestoreState::HsBackupRestoreState(QState *parent) + : QState(parent) +{ + connect(this, SIGNAL(entered()), SLOT(action_startListenBURStatus())); + connect(this, SIGNAL(exited()), SLOT(action_stopListenBURStatus())); +} + +/*! + Destroys this backup/restore state. +*/ +HsBackupRestoreState::~HsBackupRestoreState() +{ +} + +/*! + Starts listen backup/restore status and releases Home screen data. +*/ +void HsBackupRestoreState::action_startListenBURStatus() +{ + HsBackupRestoreObserver *backupRestoreObserver = + HsBackupRestoreObserver::instance(); + + connect(backupRestoreObserver, + SIGNAL(event_backupRestoreComplited()), + SIGNAL(event_loadScene())); + + // Close database + mDatabase.reset(HsDatabase::takeInstance()); + mDatabase->close(); + + deleteIdleView(); + + // Delete scene + HsScene *scene = HsScene::instance(); + delete scene; + + backupRestoreObserver->readyForBUR(); +} + +/*! + Stops listen backup/restore status. +*/ +void HsBackupRestoreState::action_stopListenBURStatus() +{ + HsBackupRestoreObserver::instance()->disconnect(this); + + // Open database + HsDatabase::setInstance(mDatabase.data()); + mDatabase.take(); + HsDatabase::instance()->open(); +} + +/*! + Deletes idle view +*/ +void HsBackupRestoreState::deleteIdleView() +{ + // Delete idle view + QScopedPointer idleView(HsGui::takeIdleView()); + + if (idleView){ + idleView->setNavigationAction(0); + HsScene::mainWindow()->removeView(idleView.data()); + } +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsdocumentloader.cpp --- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsdocumentloader.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsdocumentloader.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -18,6 +18,7 @@ #include "hsdocumentloader.h" #include "hspageindicator.h" #include "hstrashbinwidget.h" +#include "hsconfiguration.h" /*! \class HsDocumentLoader @@ -50,7 +51,7 @@ QObject *HsDocumentLoader::createObject(const QString &type, const QString &name) { if (type == HsPageIndicator::staticMetaObject.className()) { - QObject *object = new HsPageIndicator; + QObject *object = new HsPageIndicator(HsConfiguration::pageIndicatorSpacing()); object->setObjectName(name); return object; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hshomescreenstateplugin.cpp --- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hshomescreenstateplugin.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hshomescreenstateplugin.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -22,6 +22,8 @@ #include "hshomescreenstateplugin.h" #include "hsloadscenestate.h" #include "hsidlestate.h" +#include "hsrootstate.h" +#include "hsbackuprestorestate.h" #ifdef COVERAGE_MEASUREMENT #pragma CTC SKIP @@ -40,9 +42,16 @@ if (descriptor.interfaceName() == QLatin1String("com.nokia.homescreen.state.HsLoadSceneState")) { return new HsLoadSceneState(); - } else if(descriptor.interfaceName() == QLatin1String("com.nokia.homescreen.state.HsIdleState")) { + } + else if(descriptor.interfaceName() == QLatin1String("com.nokia.homescreen.state.HsIdleState")) { return new HsIdleState(); - } else { + } + else if(descriptor.interfaceName() == QLatin1String("com.nokia.homescreen.state.HsRootState")) { + return new HsRootState(); + } + else if(descriptor.interfaceName() == QLatin1String("com.nokia.homescreen.state.HsBackupRestoreState")) { + return new HsBackupRestoreState(); + }else { return 0; } } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlestate.cpp --- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlestate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlestate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -46,11 +46,12 @@ #include "hsselectbackgroundstate.h" #include "hstrashbinwidget.h" #include "hspageindicator.h" -#include "hswidgetpositioningonorientationchange.h" #include "hsmenueventfactory.h" #include "hshomescreenstatecommon.h" #include "hstitleresolver.h" #include "hsmenuservice.h" +#include "hsgui.h" +#include "hsconfiguration.h" // Helper macros for connecting state entry and exit actions. #define ENTRY_ACTION(state, action) \ @@ -121,9 +122,7 @@ */ HsIdleState::HsIdleState(QState *parent) : QState(parent), - mView(0), mNavigationAction(0), mUiWidget(0), - mTapAndHoldDistance(16), - mPageChangeZoneWidth(60), + mNavigationAction(0), mUiWidget(0), mTitleResolver(0), mZoneAnimation(0), mPageChanged(false), @@ -131,10 +130,11 @@ mPageChangeAnimation(0), mContinuousFeedback(0), mTrashBinFeedbackAlreadyPlayed(false), - mDeltaX(0) -#ifdef Q_OS_SYMBIAN + mDeltaX(0), + mSceneMenu(0) +#ifdef Q_OS_SYMBIAN ,mSettingsMgr(0) -#endif +#endif { setupStates(); mTimer.setSingleShot(true); @@ -281,6 +281,8 @@ this, SIGNAL(event_waitInput()), state_waitInput); state_widgetInteraction->addTransition( this, SIGNAL(event_moveWidget()), state_moveWidget); + state_widgetInteraction->addTransition( + this, SIGNAL(event_moveScene()), state_moveScene); state_sceneInteraction->addTransition( this, SIGNAL(event_waitInput()), state_waitInput); @@ -326,7 +328,7 @@ ENTRY_ACTION(state_waitInput, action_waitInput_updateOptionsMenu) ENTRY_ACTION(state_waitInput, action_waitInput_connectMouseEventHandlers) - ENTRY_ACTION(state_waitInput, action_waitInput_publishIdleKey) + ENTRY_ACTION(state_waitInput, action_waitInput_publishIdleKey) EXIT_ACTION(state_waitInput, action_waitInput_disconnectMouseEventHandlers) ENTRY_ACTION(state_widgetInteraction, action_widgetInteraction_connectMouseEventHandlers) @@ -389,7 +391,7 @@ mPageChangeAnimation->addAnimation(animation); animation = new QPropertyAnimation(mUiWidget->sceneLayer(), "x"); - animation->setEndValue((parallaxFactor() * pageLayerXPos(targetPageIndex)) - HSBOUNDARYEFFECT / 2); + animation->setEndValue((parallaxFactor() * pageLayerXPos(targetPageIndex)) - HsConfiguration::bounceEffect() / 2); animation->setDuration(duration); mPageChangeAnimation->addAnimation(animation); } @@ -403,11 +405,11 @@ qobject_cast(animation)->setDuration(duration); animation = mPageChangeAnimation->animationAt(1); - qobject_cast(animation)->setEndValue((parallaxFactor() * pageLayerXPos(targetPageIndex)) - HSBOUNDARYEFFECT / 2); + qobject_cast(animation)->setEndValue((parallaxFactor() * pageLayerXPos(targetPageIndex)) - HsConfiguration::bounceEffect() / 2); qobject_cast(animation)->setDuration(duration); } mPageChangeAnimation->start(); - HbInstantFeedback::play(HbFeedback::Sensitive); + HbInstantFeedback::play(HsConfiguration::pageChangeFeedbackType()); mUiWidget->showPageIndicator(); mUiWidget->setActivePage(targetPageIndex); } @@ -424,7 +426,7 @@ if (isInLeftPageChangeZone() && 0 < targetPageIndex) { --targetPageIndex; } else if (isInRightPageChangeZone() && - targetPageIndex < scene->pages().count()) { + targetPageIndex < scene->maximumPageCount()-1) { ++targetPageIndex; } else { mAllowZoneAnimation = true; @@ -441,10 +443,12 @@ mZoneAnimation = new QPropertyAnimation(mUiWidget->sceneLayer(), "x"); } + int bounceEffect = HsConfiguration::bounceEffect(); + if (isInLeftPageChangeZone()) { - mZoneAnimation->setEndValue(((parallaxFactor() * pageLayerXPos(scene->activePageIndex()))-HSBOUNDARYEFFECT/2)+HSBOUNDARYEFFECT/2); + mZoneAnimation->setEndValue(((parallaxFactor() * pageLayerXPos(scene->activePageIndex()))-bounceEffect/2)+bounceEffect/2); } else { - mZoneAnimation->setEndValue(((parallaxFactor() * pageLayerXPos(scene->activePageIndex()))-HSBOUNDARYEFFECT/2)-HSBOUNDARYEFFECT/2); + mZoneAnimation->setEndValue(((parallaxFactor() * pageLayerXPos(scene->activePageIndex()))-bounceEffect/2)-bounceEffect/2); } mZoneAnimation->setDuration(duration); mZoneAnimation->setDirection(QAbstractAnimation::Forward); @@ -462,31 +466,27 @@ */ bool HsIdleState::isInPageChangeZone() { - qreal widgetXPos = HsScene::instance()->activeWidget()->geometry().center().x(); - qreal pageWidth = HsScene::mainWindow()->layoutRect().width(); - return widgetXPos < mPageChangeZoneWidth || - pageWidth - mPageChangeZoneWidth < widgetXPos; + return isInLeftPageChangeZone() || + isInRightPageChangeZone(); } /*! - Checks if the active widget is located inside the left + Checks if touch point in the active widget is located inside the left page change zone. */ bool HsIdleState::isInLeftPageChangeZone() { - qreal widgetXPos = HsScene::instance()->activeWidget()->geometry().center().x(); - return widgetXPos < mPageChangeZoneWidth; + return mTouchScenePos.x() < HsConfiguration::pageChangeZoneWidth(); } /*! - Checks if the active widget is located inside the right + Checks if touch point in the active widget is located inside the right page change zone. */ bool HsIdleState::isInRightPageChangeZone() { - qreal widgetXPos = HsScene::instance()->activeWidget()->geometry().center().x(); qreal pageWidth = HsScene::mainWindow()->layoutRect().width(); - return pageWidth - mPageChangeZoneWidth < widgetXPos; + return mTouchScenePos.x() > pageWidth - HsConfiguration::pageChangeZoneWidth();; } /*! @@ -509,7 +509,7 @@ qreal HsIdleState::parallaxFactor() const { qreal clw = mUiWidget->controlLayer()->size().width(); - qreal slw = mUiWidget->sceneLayer()->size().width() - HSBOUNDARYEFFECT; + qreal slw = mUiWidget->sceneLayer()->size().width() - HsConfiguration::bounceEffect(); int n = HsScene::instance()->pages().count(); if (n < 2) { return 1; @@ -528,14 +528,14 @@ /* We don't want to create another animation before previous is finished */ mAllowZoneAnimation = false; - startPageChangeZoneAnimation(800); + startPageChangeZoneAnimation(HsConfiguration::pageChangeZoneAnimationDuration()); } } else if (mZoneAnimation && !isInPageChangeZone()) { if (mZoneAnimation->state() == QAbstractAnimation::Running) { if (mZoneAnimation->direction() == QAbstractAnimation::Forward) { mPageChanged = false; - mZoneAnimation->setDuration(200); + mZoneAnimation->setDuration(HsConfiguration::pageChangeZoneReverseAnimationDuration()); mZoneAnimation->setDirection(QAbstractAnimation::Backward); } } @@ -554,24 +554,45 @@ } /*! + Selects which trash bin icon is shown or not shown at all +*/ +void HsIdleState::showTrashBin() +{ + if (mUiWidget->trashBin()->isUnderMouse()) { + if (!mTrashBinFeedbackAlreadyPlayed) { + HbInstantFeedback::play(HsConfiguration::widgetOverTrashbinFeedbackType()); + mTrashBinFeedbackAlreadyPlayed = true; + } + mUiWidget->trashBin()->activate(); + } else { + mUiWidget->trashBin()->deactivate(); + mTrashBinFeedbackAlreadyPlayed = false; + } + + if (!mUiWidget->pageIndicator()->isAnimationRunning()) { + mUiWidget->showTrashBin(); + } +} + +/*! Removes currently active page. */ void HsIdleState::removeActivePage() { HsScene *scene = HsScene::instance(); HsPage *page = scene->activePage(); - + int pageIndex = scene->activePageIndex(); - + mUiWidget->removePage(pageIndex); scene->removePage(page); delete page; - + pageIndex = pageIndex == 0 ? 0 : pageIndex - 1; scene->setActivePageIndex(pageIndex); - - startPageChangeAnimation(pageIndex, 200); - + + startPageChangeAnimation(pageIndex, HsConfiguration::pageRemovedAnimationDuration()); + mUiWidget->pageIndicator()->removeItem(pageIndex); mUiWidget->setActivePage(pageIndex); mUiWidget->showPageIndicator(); @@ -600,21 +621,26 @@ */ void HsIdleState::action_idle_setupView() { - if (!mView) { + HbView *idleView = HsGui::idleView(); + if (!idleView) { mUiWidget = new HsIdleWidget; - mView = HsScene::mainWindow()->addView(mUiWidget); - mView->setContentFullScreen(); + idleView = HsScene::mainWindow()->addView(mUiWidget); + idleView->setContentFullScreen(); mNavigationAction = new HbAction(this); mNavigationAction->setIcon(HbIcon(gApplicationLibraryIconName)); connect(mNavigationAction, SIGNAL(triggered()), SIGNAL(event_applicationLibrary())); - mView->setNavigationAction(mNavigationAction); + idleView->setNavigationAction(mNavigationAction); + + HsGui::setIdleView(idleView); - // TODO: Workaround to Qt/Hb layouting bugs. - QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + if (mPageChangeAnimation) { + delete mPageChangeAnimation; + mPageChangeAnimation = NULL; + } } - HsScene::mainWindow()->setCurrentView(mView); + HsScene::mainWindow()->setCurrentView(idleView); } /*! @@ -634,7 +660,7 @@ void HsIdleState::onTitleChanged(QString title) { qDebug() << "HsIdleState::onTitleChanged() to title: " << title; - mView->setTitle(title); + HsGui::idleView()->setTitle(title); } /*! @@ -671,8 +697,7 @@ } foreach (HsWidgetHost *widget, widgets) { - widget->initializeWidget(); - widget->showWidget(); + widget->startWidget(); } page->layoutNewWidgets(); @@ -687,7 +712,7 @@ { qreal x = pageLayerXPos(HsScene::instance()->activePageIndex()); mUiWidget->pageLayer()->setX(x); - mUiWidget->sceneLayer()->setX((parallaxFactor() * x) - HSBOUNDARYEFFECT / 2); + mUiWidget->sceneLayer()->setX((parallaxFactor() * x) - HsConfiguration::bounceEffect() / 2); } /*! @@ -697,7 +722,7 @@ { connect(HsScene::mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), - SLOT(onOrientationChanged(Qt::Orientation))); + SLOT(action_idle_showActivePage())); } /*! @@ -721,7 +746,7 @@ mSettingsMgr = new XQSettingsManager(this); XQPublishAndSubscribeSettingsKey key(KPSUidStartup.iUid, KPSIdlePhase1Ok); mSettingsMgr->writeItemValue(key, EIdlePhase1Ok); - + // Done, we can disconnect this signal. disconnect(sender(), SIGNAL(entered()), this, SLOT(action_waitInput_publishIdleKey())); } @@ -733,9 +758,18 @@ */ void HsIdleState::action_idle_cleanupView() { - if (mUiWidget){ + if (mUiWidget) { mUiWidget->clearDelayedPress(); } + + //Close options menu on view change + HsGui::idleView()->setMenu(NULL); + + //Close context menu on view change + if (mSceneMenu) { + disconnect(mSceneMenu, SIGNAL(aboutToClose()), this, SLOT(onSceneMenuAboutToClose())); + mSceneMenu->close(); + } } /*! @@ -745,7 +779,7 @@ { disconnect(HsScene::mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(onOrientationChanged(Qt::Orientation))); + this, SLOT(action_idle_showActivePage())); } /*! @@ -798,7 +832,7 @@ this, SIGNAL(event_toggleConnection())); } - mView->setMenu(menu); + HsGui::idleView()->setMenu(menu); } /*! @@ -831,13 +865,10 @@ */ void HsIdleState::action_widgetInteraction_connectGestureTimers() { - mTimer.setInterval(500); + mTimer.setInterval(HsConfiguration::widgetTapAndHoldTimeout()); connect(&mTimer, SIGNAL(timeout()), SLOT(widgetInteraction_onTapAndHoldTimeout())); mTimer.start(); - - HsWidgetHost *widget = HsScene::instance()->activeWidget(); - widget->startTapAndHoldAnimation(); } /*! @@ -856,9 +887,6 @@ { disconnect(&mTimer, SIGNAL(timeout()), this, SLOT(widgetInteraction_onTapAndHoldTimeout())); - - HsWidgetHost *widget = HsScene::instance()->activeWidget(); - widget->stopTapAndHoldAnimation(); } /*! @@ -875,7 +903,7 @@ */ void HsIdleState::action_sceneInteraction_connectGestureTimers() { - mTimer.setInterval(500); + mTimer.setInterval(HsConfiguration::sceneTapAndHoldTimeout()); connect(&mTimer, SIGNAL(timeout()), SLOT(sceneInteraction_onTapAndHoldTimeout())); mTimer.start(); @@ -941,7 +969,7 @@ && mZoneAnimation->state() == QAbstractAnimation::Running && mZoneAnimation->direction() == QAbstractAnimation::Forward) { mPageChanged = false; - mZoneAnimation->setDuration(200); + mZoneAnimation->setDuration(HsConfiguration::pageChangeZoneReverseAnimationDuration()); mZoneAnimation->setDirection(QAbstractAnimation::Backward); } @@ -950,20 +978,18 @@ HsWidgetHost *widget = scene->activeWidget(); if (mUiWidget->trashBin()->isUnderMouse()) { - HbInstantFeedback::play(HbFeedback::ItemDrop); + HbInstantFeedback::play(HsConfiguration::widgetDropToTrashbinFeedbackType()); widget->page()->removeWidget(widget); - widget->uninitializeWidget(); - widget->deleteFromDatabase(); - widget->deleteLater(); + widget->remove(); scene->setActiveWidget(0); } else { if (widget->page() != page) { widget->page()->removeWidget(widget); page->addExistingWidget(widget); if (HsScene::orientation() == Qt::Horizontal) { - widget->deleteWidgetPresentation(Qt::Vertical); + widget->removePresentation(Qt::Vertical); } else { - widget->deleteWidgetPresentation(Qt::Horizontal); + widget->removePresentation(Qt::Horizontal); } } @@ -974,11 +1000,11 @@ // play feedback effect if user drops widget between pages and it needs to be repositioned back to original page if( widgetX != widgetRect.x() || widgetY != widgetRect.y()) { - HbInstantFeedback::play(HbFeedback::BounceEffect); + HbInstantFeedback::play(HsConfiguration::widgetRepositionFeedbackType()); } widget->setPos(widgetX, widgetY); - widget->setWidgetPresentation(); + widget->savePresentation(); page->updateZValues(); } mAllowZoneAnimation = true; @@ -1027,15 +1053,15 @@ int pageIndex = HsScene::instance()->activePageIndex(); - if (mDeltaX < -pageSize.width() / 3) { + if (mDeltaX < -HsConfiguration::pageChangePanDistanceInPixels()) { pageIndex = qMin(pageIndex + 1, pages.count() - 1); - } else if (pageSize.width() / 3 < mDeltaX) { + } else if (HsConfiguration::pageChangePanDistanceInPixels() < mDeltaX) { pageIndex = qMax(pageIndex - 1, 0); } HsScene::instance()->setActivePageIndex(pageIndex); - startPageChangeAnimation(pageIndex, 200); + startPageChangeAnimation(pageIndex, HsConfiguration::pageChangeAnimationDuration()); } /*! @@ -1055,29 +1081,22 @@ */ void HsIdleState::action_sceneMenu_showMenu() { - HbMenu *sceneMenu = new HbMenu(); - sceneMenu->setAttribute(Qt::WA_DeleteOnClose); - sceneMenu->setDismissPolicy(HbDialog::TapOutside); + mSceneMenu = new HbMenu(); + mSceneMenu->setAttribute(Qt::WA_DeleteOnClose); + mSceneMenu->setDismissPolicy(HbDialog::TapOutside); //This is used to check if any action is not triggered ( == menu is dismissed by user or timeout). - connect(sceneMenu, SIGNAL(aboutToClose()), this, SLOT(onSceneMenuAboutToClose())); + connect(mSceneMenu, SIGNAL(aboutToClose()), this, SLOT(onSceneMenuAboutToClose())); - HbAction *addContentAction = - sceneMenu->addAction(hbTrId(hsLocTextId_ContextMenu_AddContent)); - connect(addContentAction, SIGNAL(triggered()), this, SLOT(onAddContentActionTriggered())); + mSceneMenu->addAction(hbTrId(hsLocTextId_ContextMenu_AddContent), this, SLOT(onAddContentActionTriggered())); - HbAction *addPageAction = 0; HsScene *scene = HsScene::instance(); if (scene->pages().count() < scene->maximumPageCount()) { - addPageAction = sceneMenu->addAction(hbTrId(hsLocTextId_OptionsMenu_AddPage)); - connect(addPageAction, SIGNAL(triggered()), this, SIGNAL(event_addPage())); + mSceneMenu->addAction(hbTrId(hsLocTextId_OptionsMenu_AddPage), this, SIGNAL(event_addPage())); } - HbAction *changeWallpaperAction = - sceneMenu->addAction(hbTrId(hsLocTextId_ContextMenu_ChangeWallpaper)); - connect(changeWallpaperAction, SIGNAL(triggered()), this, SIGNAL(event_selectSceneWallpaper())); - - sceneMenu->setPreferredPos(mSceneMenuPos); - sceneMenu->show(); + mSceneMenu->addAction(hbTrId(hsLocTextId_ContextMenu_ChangeWallpaper), this, SIGNAL(event_selectSceneWallpaper())); + mSceneMenu->setPreferredPos(mTouchScenePos); + mSceneMenu->open(this, SLOT(onSceneMenuTriggered(HbAction *))); } #ifdef COVERAGE_MEASUREMENT #pragma CTC ENDSKIP @@ -1089,10 +1108,10 @@ void HsIdleState::action_addPage_addPage() { HsScene *scene = HsScene::instance(); - int pageIndex = scene->pages().count(); + int pageIndex = scene->activePageIndex() + 1; addPageToScene(pageIndex); scene->setActivePageIndex(pageIndex); - startPageChangeAnimation(pageIndex, 700); + startPageChangeAnimation(pageIndex, HsConfiguration::newPageAddedAnimationDuration()); mUiWidget->pageIndicator()->addItem(pageIndex); mUiWidget->showPageIndicator(); } @@ -1109,16 +1128,18 @@ #ifndef HOMESCREEN_TEST //We don't want to test message box. //Confirm removal of page having content HbMessageBox *box = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + box->setAttribute(Qt::WA_DeleteOnClose); box->setHeadingWidget(new HbLabel (hbTrId(hsLocTextId_Title_RemovePage))); box->setText(hbTrId(hsLocTextId_Confirmation_RemovePage)); - box->setPrimaryAction(new HbAction(hbTrId(hsLocTextId_ConfirmationButton_Ok))); - box->setSecondaryAction(new HbAction(hbTrId(hsLocTextId_ConfirmationButton_Cancel))); - box->setAttribute(Qt::WA_DeleteOnClose); + + QAction *buttonOk = box->actions().at(0); + //We are keen only from OK button. Cancel is not connected to any slot. + connect(buttonOk, SIGNAL(triggered()), SLOT(onRemovePageConfirmationOk())); HsScene::mainWindow()->setInteractive(true); - box->open(this,SLOT(onRemovePageMessageBoxClosed(HbAction*))); + box->open(); #endif //HOMESCREEN_TEST } else { //Empty page can be removed without confirmation @@ -1166,7 +1187,7 @@ } } - mSceneMenuPos = event->scenePos(); + mTouchScenePos = event->scenePos(); emit event_sceneInteraction(); } @@ -1190,11 +1211,19 @@ QPointF point = event->scenePos() - event->buttonDownScenePos(Qt::LeftButton); - if (mTapAndHoldDistance < point.manhattanLength()) { + if (HsConfiguration::tapAndHoldDistance() < point.manhattanLength()) { + // Threshold area for tap exceeded. This is pan or swipe mTimer.stop(); - mUiWidget->sendDelayedPress(); - HsScene::instance()->activeWidget()->stopTapAndHoldAnimation(); + if (HsScene::instance()->activeWidget()->isPannable(event)) { + // let widget get first press + mUiWidget->sendDelayedPress(); + } else { + // Widget doesn't consume pan or swipe gestures + mUiWidget->clearDelayedPress(); + emit event_moveScene(); + } } + } /*! @@ -1233,7 +1262,7 @@ Q_UNUSED(watched) Q_UNUSED(filtered) - mSceneMenuPos = event->scenePos(); + mTouchScenePos = event->scenePos(); if (!mTimer.isActive()) { return; @@ -1243,7 +1272,7 @@ QPointF point = event->scenePos() - event->buttonDownScenePos(Qt::LeftButton); - if (mTapAndHoldDistance < point.manhattanLength()) { + if (HsConfiguration::tapAndHoldDistance() < point.manhattanLength()) { mTimer.stop(); mUiWidget->clearDelayedPress(); emit event_moveScene(); @@ -1286,32 +1315,40 @@ HsScene *scene = HsScene::instance(); HsWidgetHost *widget = scene->activeWidget(); - HsPage *page = scene->activePage(); + QRectF widgetRect = widget->geometry(); + //Move widget to new position: + mTouchScenePos = event->scenePos(); QPointF delta(event->scenePos() - event->lastScenePos()); - - QRectF widgetRect = widget->geometry(); widgetRect.moveTopLeft(widgetRect.topLeft() + delta); - QRectF pageRect = mView->rect(); + //Widget can be moved over the pages left border + qreal lowerBoundX = -widgetRect.width(); + HsPage *page = scene->activePage(); + QRectF pageRect = HsGui::idleView()->rect(); + //Widget can be moved over the pages right border + qreal upperBoundX = pageRect.width(); - qreal lowerBoundX = -widgetRect.width() / 2 + 10; - if (page == scene->pages().first()) { - lowerBoundX = 0; - } - qreal upperBoundX = pageRect.width() - widgetRect.width() / 2 - 10; - if (page == scene->pages().last() && scene->pages().count() == scene->maximumPageCount()) { - upperBoundX = pageRect.width() - widgetRect.width(); - } + //Notice that chrome height is 64 pixels + qreal lowerBoundY = qreal(64) - widgetRect.height(); + //Widget can be moved over the pages down border + qreal upperBoundY = pageRect.height(); qreal widgetX = qBound(lowerBoundX, widgetRect.x(), upperBoundX); - qreal widgetY = qBound(qreal(64), widgetRect.y(), pageRect.height() - widgetRect.height()); + qreal widgetY = qBound(lowerBoundY, widgetRect.y(), upperBoundY); + /* if using ItemClipsChildrenToShape-flag in widgethost then + setPos does not update position here, however setGeometry does it, QT bug? + */ + widget->setGeometry(widgetX, widgetY, widgetRect.width(), widgetRect.height()); - // if user is trying to move widget past first or last page, play "not a good idea" feedback effect - if( (page == scene->pages().first() && widgetRect.x() < 3 ) || + int bounceFeedbackEffectDistance = HsConfiguration::bounceFeedbackEffectDistance(); + //Handle effects: + //User is indicated by a tactile feedback if he/she is trying to move + //widget over the first or the last page. + if( (page == scene->pages().first() && mTouchScenePos.x() < bounceFeedbackEffectDistance ) || (page == scene->pages().last() && scene->pages().count() == scene->maximumPageCount() - && widgetRect.x()+ widgetRect.width() > pageRect.width()-3)) { - HbInstantFeedback::play(HbFeedback::Basic); + && mTouchScenePos.x() > pageRect.width() - bounceFeedbackEffectDistance)) { + HbInstantFeedback::play(HsConfiguration::widgetMoveBlockedFeedbackType()); // TODO: use code below when Orbit has updated ContinuousFeedback API //if (!mContinuousFeedback->isPlaying()) { // mContinuousFeedback->play(); @@ -1321,27 +1358,9 @@ //mContinuousFeedback->stop(); } - /* if using ItemClipsChildrenToShape-flag in widgethost then - setPos does not update position here, however setGeometry does it, QT bug? - */ - widget->setGeometry(widgetX, widgetY, widgetRect.width(), widgetRect.height()); - - updateZoneAnimation(); // cyclomatic complexity was 20, logic moved to separate function + updateZoneAnimation(); + showTrashBin(); - if (mUiWidget->trashBin()->isUnderMouse()) { - if (!mTrashBinFeedbackAlreadyPlayed) { - HbInstantFeedback::play(HbFeedback::ItemMoveOver); - mTrashBinFeedbackAlreadyPlayed = true; - } - mUiWidget->trashBin()->activate(); - } else { - mUiWidget->trashBin()->deactivate(); - mTrashBinFeedbackAlreadyPlayed = false; - } - - if (!mUiWidget->pageIndicator()->isAnimationRunning()) { - mUiWidget->showTrashBin(); - } filtered = true; } @@ -1373,15 +1392,19 @@ Q_UNUSED(watched) Q_UNUSED(filtered) + filtered = true; + HsScene *scene = HsScene::instance(); mDeltaX = event->scenePos().x() - event->buttonDownScenePos(Qt::LeftButton).x(); - qreal x = qBound(pageLayerXPos(scene->pages().count() - 1) - HSBOUNDARYEFFECT / 2 / parallaxFactor(), + int bounceEffect = HsConfiguration::bounceEffect(); + + qreal x = qBound(pageLayerXPos(scene->pages().count() - 1) - bounceEffect / 2 / parallaxFactor(), pageLayerXPos(scene->activePageIndex()) + mDeltaX, - pageLayerXPos(0) + (HSBOUNDARYEFFECT / 2 / parallaxFactor()) - qreal(0.5)); + pageLayerXPos(0) + (bounceEffect / 2 / parallaxFactor()) - qreal(0.5)); mUiWidget->pageLayer()->setX(x); - mUiWidget->sceneLayer()->setX((parallaxFactor() * x) - HSBOUNDARYEFFECT / 2); + mUiWidget->sceneLayer()->setX((parallaxFactor() * x) - bounceEffect / 2); } /*! @@ -1395,6 +1418,7 @@ { Q_UNUSED(watched) Q_UNUSED(filtered) + filtered = true; mDeltaX = event->scenePos().x() - event->buttonDownScenePos(Qt::LeftButton).x(); @@ -1402,56 +1426,6 @@ } /*! - Handles orientation change events. \a orientation is the - new orientation. -*/ -void HsIdleState::onOrientationChanged(Qt::Orientation orientation) -{ - QList pages = HsScene::instance()->pages(); - QList widgets; - HsWidgetHost *widget = 0; - - QRectF pageRect = HsScene::mainWindow()->layoutRect(); - - // TODO: Temporary workaround for the Orbit bug. - if (orientation == Qt::Horizontal) { - pageRect = QRectF(0, 0, 640, 360); - } else { - pageRect = QRectF(0, 0, 360, 640); - } - // End of the workaround. - - const int chromeHeight = 64; // TODO: get this somewhere - - for (int i = 0; i < pages.count(); ++i) { - widgets = pages[i]->widgets(); - for (int j = 0; j < widgets.count(); ++j) { - widget = widgets[j]; - HsWidgetPresentationData presentation = widget->widgetPresentation(orientation); - if (presentation.widgetId < 0) { - QList geometries = - HsWidgetPositioningOnOrientationChange::instance()->convert( - QRectF(0, chromeHeight, - pageRect.height(), - pageRect.width() - chromeHeight), - QList() << widget->geometry(), - QRectF(0, chromeHeight, - pageRect.width(), - pageRect.height() - chromeHeight)); - widget->setGeometry(geometries.first()); - widget->setWidgetPresentation(); - } else { - widget->setPos(presentation.x, presentation.y); - widget->setZValue(presentation.zValue); - } - } - } - // TODO: Workaround to Qt/Hb layouting bugs. - QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - action_idle_showActivePage(); -} - -/*! Handles tap-and-hold events for the widgetInteraction state. */ void HsIdleState::widgetInteraction_onTapAndHoldTimeout() @@ -1529,7 +1503,7 @@ } } scene->setActivePageIndex(pageIndex); - startPageChangeAnimation(pageIndex, 200); + startPageChangeAnimation(pageIndex, HsConfiguration::pageChangeAnimationDuration()); } else { scene->setActivePageIndex(pageIndex); @@ -1542,14 +1516,16 @@ } /*! - Handles the close of the scene menu. + Handles the close of the scene menu when menu is dismissed. + While dismissed menu should be triggered with NULL action. + Actions on menu are connected stright to desired slot or signal. */ -void HsIdleState::onSceneMenuAboutToClose() { - //We need to check if menu is dismissed either by user tap in outside of the menu or - //menu's dismiss timer timeouts. There is active action if any action tapped otherwise - //menu was dissmised. - HbMenu *menu = static_cast(sender()); - if(!menu->activeAction()) { +void HsIdleState::onSceneMenuTriggered(HbAction *action) +{ + //We check if menu was dismissed either by user tap in outside of the menu, + //menu's dismiss timer timeouts or state_sceneMenu was exited by any other reason + //than triggered action, e.g. applib activated while context menu is active. + if(!action) { emit event_waitInput(); } } @@ -1557,17 +1533,26 @@ /*! Handles the close of remove page confirmation dialog for page having content. */ -void HsIdleState::onRemovePageMessageBoxClosed(HbAction *action) +void HsIdleState::onRemovePageConfirmationOk() { - HbMessageBox *dlg = static_cast(sender()); - if(action == dlg->primaryAction()) { - //Page removal accepted - removeActivePage(); + removeActivePage(); +} + +/*! + Handles the close of the scene menu. + + This workaround is needed since HbMenu does not trigger empty action in case of + dismission of menu dialog. That functionality will be added in near future. Thereafter + onSceneMenuTriggered() can handle dismissions (HbMenu::triggered() emitted with NULL + action). This workaround can be removed at that time. +*/ +void HsIdleState::onSceneMenuAboutToClose() { + //We need to check if menu is dismissed either by user tap in outside of the menu or + //menu's dismiss timer timeouts. There is active action if any action tapped otherwise + //menu was dissmised. + HbMenu *menu = static_cast(sender()); + if(!menu->activeAction()) { + //mSceneMenu = 0; //Menu deletes itself at the close + emit event_waitInput(); } } - -// Undefine the helper macros. -#undef ENTRY_ACTION -#undef EXIT_ACTION -#undef CONNECT_MOUSE_EVENT_HANDLER -#undef DISCONNECT_MOUSE_EVENT_HANDLER diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlewidget.cpp --- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlewidget.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlewidget.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -31,7 +31,7 @@ #include "hstrashbinwidget.h" #include "hspageindicator.h" #include "hsdocumentloader.h" -#include "hshomescreenstatecommon.h" +#include "hsconfiguration.h" namespace { @@ -109,10 +109,17 @@ void HsIdleWidget::setGeometry(const QRectF &rect) { int n = HsScene::instance()->pages().count(); - mControlLayer->resize(rect.size()); - mPageLayer->resize(n * rect.width(), rect.height()); - mSceneLayer->resize(2 * rect.width() + HSBOUNDARYEFFECT, rect.height()); - HbWidget::setGeometry(rect); + QRectF layoutRect(HsScene::instance()->mainWindow()->layoutRect()); + if (layoutRect == rect || (layoutRect.height() == rect.width() && layoutRect.width() == rect.height())) { + mControlLayer->resize(rect.size()); + mPageLayer->resize(n * rect.width(), rect.height()); + mSceneLayer->resize(2 * rect.width() + HsConfiguration::bounceEffect(), rect.height()); + HbWidget::setGeometry(rect); + } else { + QRectF sceneRect = mapToScene(rect).boundingRect(); + sceneRect.setTop(-sceneRect.top()); + HbWidget::setGeometry(sceneRect); + } } /*! @@ -257,6 +264,7 @@ { mTrashBin->hide(); mTrashBin->deactivate(); + mPageIndicator->setSpacing(HsConfiguration::pageIndicatorSpacing()); // for usability optimization widget, can be removed later on mPageIndicator->setVisible(1 < mPageIndicator->itemCount()); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsloadscenestate.cpp --- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsloadscenestate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsloadscenestate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -16,6 +16,10 @@ */ #include +#ifdef Q_OS_SYMBIAN +#include +#include +#endif #include "hsloadscenestate.h" #include "hsscene.h" @@ -32,8 +36,17 @@ */ HsLoadSceneState::HsLoadSceneState(QState *parent) : QState(parent) +#ifdef Q_OS_SYMBIAN + ,mStartupKey(KPSUidStartup.iUid, KPSStartupUiPhase), + mSettingsMgr(0) +#endif { connect(this, SIGNAL(entered()), SLOT(action_loadScene())); +#ifdef Q_OS_SYMBIAN + + mSettingsMgr = new XQSettingsManager(this); + +#endif //Q_OS_SYMBIAN } /*! @@ -55,6 +68,63 @@ void HsLoadSceneState::action_loadScene() { HsScene::instance()->load(); + +#ifdef Q_OS_SYMBIAN + + int startupPhase = mSettingsMgr->readItemValue(mStartupKey).toInt(); + qDebug() << "HsLoadSceneState::action_loadScene boot phase " << startupPhase; + + if (EStartupUiPhaseAllDone != startupPhase) { + qDebug() << "HsLoadSceneState::HsLoadSceneState, starting to listen key"; + + connect(mSettingsMgr,SIGNAL(valueChanged(XQSettingsKey, const QVariant &)), this, + SLOT(handleKeyChange(XQSettingsKey, const QVariant &))); + + mSettingsMgr->startMonitoring(mStartupKey); + } else { + // We're already at the phase in boot where we can draw ourself to the foreground. + showUi(); + delete mSettingsMgr; + mSettingsMgr = 0; + } + +#else + + showUi(); + +#endif +} +#ifdef Q_OS_SYMBIAN +/*! + \fn HsLoadSceneState::handleKeyChange() + + Handles the key change. Activates hs ui when appropriate. +*/ + +void HsLoadSceneState::handleKeyChange(XQSettingsKey key, const QVariant &value) +{ + qDebug() << "HsLoadSceneState::handleKeyChange key " << key.key() + << "value " << value.toInt(); + + if (key.key() == KPSStartupUiPhase && value.toInt() == EStartupUiPhaseAllDone) { + showUi(); + mSettingsMgr->stopMonitoring(mStartupKey); + mSettingsMgr->deleteLater(); + mSettingsMgr = 0; + } +} +#endif +/*! + \fn HsLoadSceneState::showUi() + + Makes the main window visible, signals transition to idle state and + brings the hs app to the foreground. +*/ + +void HsLoadSceneState::showUi() +{ + qDebug() << "HsLoadSceneState::showUi"; + HsScene::mainWindow()->raise(); HsScene::mainWindow()->show(); - emit event_idle(); + emit event_history(); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsrootstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsrootstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#include +#include "hsbackuprestoreobserver.h" +#include "hsrootstate.h" + +/*! + \class HsRootState + \ingroup group_hshomescreenstateplugin + \brief View part of the home screen idle state. + + Loads the home screen scene. +*/ + +/*! + Constructs a new load scene state with the given \a parent. +*/ +HsRootState::HsRootState(QState *parent) + : QState(parent) +{ + connect(this, SIGNAL(entered()), SLOT(action_startListenBURStatus())); + connect(this, SIGNAL(exited()), SLOT(action_stopListenBURStatus())); +} + +/*! + Destroys this idle state. +*/ +HsRootState::~HsRootState() +{ +} + +/*! + Starts listen backup/restore status. +*/ +void HsRootState::action_startListenBURStatus() +{ + HsBackupRestoreObserver *backupRestoreObserver = + HsBackupRestoreObserver::instance(); + + connect(backupRestoreObserver, + SIGNAL(event_backupRestoreStarted()), + SIGNAL(event_backupRestore())); +} + +/*! + Stops listen backup/restore status. +*/ +void HsRootState::action_stopListenBURStatus() +{ + HsBackupRestoreObserver *backupRestoreObserver = + HsBackupRestoreObserver::instance(); + + backupRestoreObserver->disconnect(this); +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hshomescreenstateplugin/src/hsselectbackgroundstate.cpp --- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsselectbackgroundstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsselectbackgroundstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -15,16 +15,13 @@ * */ +#include #include #include #include -#include -#include -#include #include #include -#include #include "hsselectbackgroundstate.h" #include "hsscene.h" @@ -32,6 +29,7 @@ #include "hswallpaper.h" #include "hsdatabase.h" #include "hshomescreenstatecommon.h" +#include "hsconfiguration.h" #ifdef Q_OS_SYMBIAN #include "hsimagefetcherclient.h" @@ -40,7 +38,8 @@ #include "xqaiwcommon.h" #endif -const char hsLocTextId_ProgressDialog_WallpaperLoading[] = "txt_homescreen_dpopinfo_loading_wallpaper"; +const char hsLocTextId_ProgressDialog_WallpaperLoading[] = + "txt_homescreen_dpopinfo_loading_wallpaper"; /*! \class HsSelectBackgroundState @@ -58,10 +57,10 @@ QState(parent), mImageFetcher(0), mSourceView(0), - mWallpaperImageReaderThread(0), - mWallpaperImageReader(0), + mPortraitWallpaperImageReader(0), + mLandscapeWallpaperImageReader(0), mProgressDialog(0), - mImageProcessingState(NotRunning), + mRunningThreadAmount(0), mShowAnimation(false) { #ifdef Q_OS_SYMBIAN @@ -82,8 +81,8 @@ HsSelectBackgroundState::~HsSelectBackgroundState() { delete mImageFetcher; - delete mWallpaperImageReaderThread; - delete mWallpaperImageReader; + delete mPortraitWallpaperImageReader; + delete mLandscapeWallpaperImageReader; } /*! @@ -95,7 +94,7 @@ { mSourceView = HsScene::mainWindow()->currentView(); - mImageProcessingState = NotRunning; + mRunningThreadAmount = 0; mShowAnimation = false; #ifdef Q_OS_SYMBIAN @@ -129,18 +128,12 @@ */ void HsSelectBackgroundState::onFetchComplete(QStringList imageStringList) { - if (mImageProcessingState == NotRunning) { - // TODO: temporarily show animation immediately (~0.5 sec delay) - onShowAnimation(); - // start counting time for possible animation - // TODO: from UX the real response time - // TODO: cannot use timer since UI does not respond during hardcore image processing - //QTimer::singleShot(1000, this, SLOT(onShowAnimation())); - } + // start animation immediately + onShowAnimation(); + // check that sceneData is available HsDatabase *db = HsDatabase::instance(); Q_ASSERT(db); - HsSceneData sceneData; if (!db->scene(sceneData)) { emit handleError(); @@ -148,69 +141,54 @@ } // clean thread instances - delete mWallpaperImageReader; - delete mWallpaperImageReaderThread; - mWallpaperImageReader = NULL; - mWallpaperImageReaderThread = NULL; + delete mPortraitWallpaperImageReader; + delete mLandscapeWallpaperImageReader; + mPortraitWallpaperImageReader = NULL; + mLandscapeWallpaperImageReader = NULL; - mWallpaperImageReaderThread = new QThread(); - mWallpaperImageReader = new HsWallpaperImageReader(); + mPortraitWallpaperImageReader = new HsWallpaperImageReader(); + mLandscapeWallpaperImageReader = new HsWallpaperImageReader(); - // setup processing when image is fetched at first time - if (mImageProcessingState == NotRunning) { - // delete old wallpapers - QFile::remove(sceneData.portraitWallpaper); - QFile::remove(sceneData.landscapeWallpaper); - - QString wallpaperDir = HsWallpaper::wallpaperDirectory(); - QDir dir(wallpaperDir); - if (!dir.exists()) { - dir.mkpath(wallpaperDir); - } - HsScene *scene = HsScene::instance(); - Qt::Orientation orientation = scene->orientation(); - // based on screen orientation select first image to process - if (orientation == Qt::Vertical) { - mImageProcessingState = ProcessPortraitAsFirst; - } else { - mImageProcessingState = ProcessLandscapeAsFirst; - } - } + mRunningThreadAmount = 2; - QRect targetRect; + // delete old wallpapers + QFile::remove(sceneData.portraitWallpaper); + QFile::remove(sceneData.landscapeWallpaper); - switch (mImageProcessingState) { - case ProcessPortraitAsFirst: - case ProcessPortraitAsSecond: - targetRect = QRect(0, 0, (2 * 360) + HSBOUNDARYEFFECT, 640); - break; - case ProcessLandscapeAsFirst: - case ProcessLandscapeAsSecond: - targetRect = QRect(0, 0, (2 * 640) + HSBOUNDARYEFFECT, 360); - break; - default: - emit handleError(); - return; + QString wallpaperDir = HsWallpaper::wallpaperDirectory(); + QDir dir(wallpaperDir); + if (!dir.exists()) { + dir.mkpath(wallpaperDir); } // left empty to signal we want to use full size image as source QRect sourceRect; - mWallpaperImageReader->setSourcePath(imageStringList.first()); - mWallpaperImageReader->setSourceRect(sourceRect); - mWallpaperImageReader->setTargetRect(targetRect); - mWallpaperImageReader->setCenterTarget(true); - mWallpaperImageReader->moveToThread(mWallpaperImageReaderThread); + + // Initialize portrait image threading + QRect targetRectPortrait(0, 0, (2 * 360) + HsConfiguration::bounceEffect(), 640); + mPortraitWallpaperImageReader->setSourcePath(imageStringList.first()); + mPortraitWallpaperImageReader->setSourceRect(sourceRect); + mPortraitWallpaperImageReader->setTargetRect(targetRectPortrait); + mPortraitWallpaperImageReader->setCenterTarget(true); - mWallpaperImageReader->connect(mWallpaperImageReaderThread, - SIGNAL(started()), - SLOT(processImage())); - - connect(mWallpaperImageReader, - SIGNAL(processingFinished()), + connect(mPortraitWallpaperImageReader, + SIGNAL(finished()), + SLOT(onImageProcessed())); + + // Initialize landscape image threading + QRect targetRectLandscape(0, 0, (2 * 640) + HsConfiguration::bounceEffect(), 360); + mLandscapeWallpaperImageReader->setSourcePath(imageStringList.first()); + mLandscapeWallpaperImageReader->setSourceRect(sourceRect); + mLandscapeWallpaperImageReader->setTargetRect(targetRectLandscape); + mLandscapeWallpaperImageReader->setCenterTarget(true); + + connect(mLandscapeWallpaperImageReader, + SIGNAL(finished()), SLOT(onImageProcessed())); // start image processing in thread - mWallpaperImageReaderThread->start(QThread::IdlePriority); + mPortraitWallpaperImageReader->start(); + mLandscapeWallpaperImageReader->start(); } /*! @@ -229,7 +207,8 @@ */ void HsSelectBackgroundState::onImageProcessed() { - HsScene *scene = HsScene::instance(); + mRunningThreadAmount--; + HsDatabase *db = HsDatabase::instance(); Q_ASSERT(db); HsSceneData sceneData; @@ -237,88 +216,74 @@ emit handleError(); return; } - QFileInfo fileInfo(mWallpaperImageReader->getSourcePath()); + + QFileInfo fileInfo; + // get image path + if (sender() == mPortraitWallpaperImageReader) { + fileInfo = mPortraitWallpaperImageReader->sourcePath(); + } else { + fileInfo = mLandscapeWallpaperImageReader->sourcePath(); + } + // suffix is same for both orientations QString fileExtension(""); if (!fileInfo.suffix().isEmpty()) { fileExtension = fileInfo.suffix(); } - // set image path to sceneData - QString path; - if (mImageProcessingState == ProcessPortraitAsFirst || - mImageProcessingState == ProcessPortraitAsSecond) { - path = HsWallpaper::wallpaperPath(Qt::Vertical, QString(), fileExtension); - sceneData.portraitWallpaper = path; + + QImage image; + // set portrait image path to sceneData + QString portraitPath(HsWallpaper::wallpaperPath(Qt::Vertical, QString(), + fileExtension)); + // we need to set this always as image to be activated can be either orientation + sceneData.portraitWallpaper = portraitPath; + QString landscapePath(HsWallpaper::wallpaperPath(Qt::Horizontal, QString(), + fileExtension)); + sceneData.landscapeWallpaper = landscapePath; + + if (sender() == mPortraitWallpaperImageReader) { + // get image from thread + image = mPortraitWallpaperImageReader->processedImage(); + // save image + image.save(portraitPath); } else { - path = HsWallpaper::wallpaperPath(Qt::Horizontal, QString(), fileExtension); - sceneData.landscapeWallpaper = path; + image = mLandscapeWallpaperImageReader->processedImage(); + image.save(landscapePath); } - // get image from renderer and save it - QImage image = mWallpaperImageReader->getProcessedImage(); - image.save(path); - if (!image.isNull()) { - // update scenedata and set new image to background - if (db->updateScene(sceneData)) { - switch (mImageProcessingState) { - case ProcessPortraitAsFirst: - scene->wallpaper()->setPortraitImage(path, true); - break; - case ProcessPortraitAsSecond: - // if orientation changed during first image settings - if (HsScene::orientation() == Qt::Vertical) { - scene->wallpaper()->setPortraitImage(path, true); - } else { - scene->wallpaper()->setPortraitImage(path); - } - break; - case ProcessLandscapeAsFirst: - scene->wallpaper()->setLandscapeImage(path, true); - break; - case ProcessLandscapeAsSecond: - if (HsScene::orientation() == Qt::Horizontal) { - scene->wallpaper()->setLandscapeImage(path, true); - } else { - scene->wallpaper()->setLandscapeImage(path); - } - break; - default: - emit handleError(); - break; - } - } - } else { + + if (image.isNull()) { emit handleError(); return; } - - switch (mImageProcessingState) { - case ProcessPortraitAsFirst: - mImageProcessingState = ProcessLandscapeAsSecond; - if (mShowAnimation) { - mProgressDialog->setProgressValue(2); - } - // process second orientation - onFetchComplete(QStringList(mWallpaperImageReader->getSourcePath())); - break; - case ProcessLandscapeAsFirst: - mImageProcessingState = ProcessPortraitAsSecond; - if (mShowAnimation) { - mProgressDialog->setProgressValue(2); + // update scenedata and set new image to background + if (db->updateScene(sceneData)) { + HsScene *scene = HsScene::instance(); + // set image to wallpaper (don't activate yet) + if (sender() == mPortraitWallpaperImageReader) { + scene->wallpaper()->setPortraitImage(portraitPath, false); + } else { + scene->wallpaper()->setLandscapeImage(landscapePath, false); } - onFetchComplete(QStringList(mWallpaperImageReader->getSourcePath())); - break; - case ProcessPortraitAsSecond: - case ProcessLandscapeAsSecond: - mImageProcessingState = NotRunning; - if (mShowAnimation) { - mProgressDialog->setProgressValue(3); + // if last thread running + if (mRunningThreadAmount == 0) { + // if current orientation matches -> set to active wallpaper + if (HsScene::orientation() == Qt::Vertical) { + scene->wallpaper()->setPortraitImage(portraitPath, true); + } else { + scene->wallpaper()->setLandscapeImage(landscapePath, true); + } + // finish progress bar + if (mShowAnimation) { + mProgressDialog->setProgressValue(3); + } + // let user control again homescreen + emit event_waitInput(); + } else { + // update progress information + if (mShowAnimation) { + mProgressDialog->setProgressValue(2); + } } - // let user control again homescreen - emit event_waitInput(); - break; - default: - emit handleError(); - break; - } + } } /*! @@ -329,18 +294,20 @@ { delete mProgressDialog; mProgressDialog = new HbProgressDialog(HbProgressDialog::ProgressDialog); - // TODO: setPrimaryAction is deprecated, clearActions does the same but crashes when dialog closes, check orbit list - mProgressDialog->setPrimaryAction(0); + /* TODO: workaround to remove cancel button (setPrimaryAction(0) is deprecated). + * clearActions does the same but crashes, fix should be in wk16, check orbit list + */ + QList actions = mProgressDialog->actions(); + actions[0]->setVisible(false); mProgressDialog->setIcon(HbIcon("note_info")); mProgressDialog->setText(hbTrId(hsLocTextId_ProgressDialog_WallpaperLoading)); mProgressDialog->setMinimum(0); mProgressDialog->setMaximum(3); mProgressDialog->setBackgroundFaded(true); mProgressDialog->setAutoClose(true); + // set initial value to appear as loading mProgressDialog->setProgressValue(1); mProgressDialog->show(); - // TODO: temporary solution to minimize progress dialog resizing problem - QApplication::processEvents(); mShowAnimation = true; } @@ -350,7 +317,6 @@ */ void HsSelectBackgroundState::onHandleError() { - mImageProcessingState = Error; if (mShowAnimation) { mProgressDialog->close(); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.pro --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.pro Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -25,7 +25,8 @@ LIBS += -lhsdomainmodel \ -lhsmenuserviceprovider \ -lhsutils \ - -lcaclient + -lcaclient \ + -lcasoftwareregistry DEPENDPATH += ./inc \ ./src diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.qrc --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.qrc Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.qrc Wed Jun 23 17:05:06 2010 +0100 @@ -3,5 +3,6 @@ resource/hsappchecklist.docml resource/hswidgetpreviewdialog.docml resource/hsarrangedialog.docml + resource/hsdetailsdialog.docml diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddappstocollectionstate.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddappstocollectionstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddappstocollectionstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -134,12 +134,8 @@ HsCollectionNameDialog *mEditorDialog; - bool mEditorFinishedEntered; - HsCollectionsListDialog *mListDialog; - bool mListFinishedEntered; - }; #endif /* ADDAPPSTOCOLLECTIONSTATE_H */ diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddtohomescreenstate.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddtohomescreenstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddtohomescreenstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -27,9 +27,9 @@ HS_STATES_TEST_CLASS(MenuStatesTest) class HbAction; +class HbMessageBox; class CaEntry; -class HbMessageBox; - +class CaNotifier; class HsAddToHomeScreenState: public HsMenuBaseState { @@ -50,6 +50,8 @@ void cleanUp(); void messageWidgetCorruptedFinished(HbAction* finishedAction); + + void memoryCardRemoved(); signals: @@ -67,6 +69,7 @@ void logActionResult(QString operationName, int entryId, bool operationSucceded); + void subscribeForMemoryCardRemove(); private: @@ -78,7 +81,10 @@ HbMessageBox *mCorruptedMessage; HbAction *mConfirmAction; + HsMenuMode mMenuMode; + + CaNotifier *mNotifier; }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsarrangestate.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsarrangestate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsarrangestate.h Wed Jun 23 17:05:06 2010 +0100 @@ -84,9 +84,6 @@ QList mArrangedCollIdList; QObjectList mObjectList; - - bool mFinishedEntered; - }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hscollectionnamestate.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hscollectionnamestate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hscollectionnamestate.h Wed Jun 23 17:05:06 2010 +0100 @@ -71,7 +71,6 @@ HsCollectionNameDialog *mCollectionNameDialog; - bool mFinishedEntered; }; #endif /* COLLECTIONANAMESTATE_H */ diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenustates_global.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenustates_global.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenustates_global.h Wed Jun 23 17:05:06 2010 +0100 @@ -44,6 +44,10 @@ ":/xml/hsarrangedialog.docml"; static const char *const HS_ARRANGE_DIALOG_NAME="arrange_dialog"; static const char *const HS_ARRANGE_LIST_NAME="arrange_list"; + +static const char *const HS_DETAILS_DIALOG_LAYOUT = + ":/xml/hsdetailsdialog.docml"; +static const char *const HS_DETAILS_DIALOG_NAME="details_dialog"; /*! To enable logging of function entry and exit use the following flag for qmake: -config nft diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenuworkerstate.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenuworkerstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenuworkerstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -37,6 +37,10 @@ HsMenuWorkerState(QState *parent = 0); virtual ~HsMenuWorkerState(); + +signals: + + void reset(); private: diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hspreviewhswidgetstate.h --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hspreviewhswidgetstate.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hspreviewhswidgetstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -53,8 +53,6 @@ void cleanUp(); - void memoryCardRemoved(); - signals: void exit(); @@ -79,7 +77,7 @@ int mEntryId; HbMessageBox *mCorruptedMessage; - + }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsuninstallitemstate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsuninstallitemstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2009 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: + * + */ + +#ifndef HSUNINSTALLITEMSTATE_H +#define HSUNINSTALLITEMSTATE_H + +#include + +#include "hsmenustates_global.h" +HS_STATES_TEST_CLASS(MenuStatesTest) + +class HbAction; +class HbMessageBox; +class HsShortcutService; +class HsMenuService; + +class HsUninstallItemState: public QState +{ + Q_OBJECT + + HS_STATES_TEST_FRIEND_CLASS(MenuStatesTest) + +public: + + HsUninstallItemState(QState *parent = 0); + + virtual ~HsUninstallItemState(); + +protected: + + void onEntry(QEvent *event); + +private slots: + + void uninstallMessageFinished(HbAction* finishedAction); + + void cleanUp(); + +signals: + + void exit(); + +private: + + void construct(); + + HsShortcutService *shortcutService() const; + +private: + + int mItemId; + + HbMessageBox *mUninstallMessage; // deletes itself automatically on close + + HbAction *mConfirmAction; // child for mConfirmMessage + +}; + +#endif //HSUNINSTALLITEMSTATE_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsviewappdetailsstate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsviewappdetailsstate.h Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,71 @@ +/* +* 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: Menu Application Library state. +* +*/ + +#ifndef HSVIEWAPPDETAILSSTATE_H_ +#define HSVIEWAPPDETAILSSTATE_H_ + +#include +#include + +#include "hsmenustates_global.h" +HS_STATES_TEST_CLASS(MenuStatesTest) + +class HbListWidget; +class HsMenuItemModel; +class HbDialog; +class CaNotifier; + +class HsViewAppDetailsState: public QState +{ + Q_OBJECT + + HS_STATES_TEST_FRIEND_CLASS(MenuStatesTest) + +public: + + HsViewAppDetailsState(QState *parent = 0); + + virtual ~HsViewAppDetailsState(); + +protected: + + void onEntry(QEvent *event); + void onExit(QEvent *event); + +private slots: + + void stateExited(); + void memoryCardRemoved(); + +signals: + void exit(); + +private: + + void construct(); + void subscribeForMemoryCardRemove(int entryId); + +private: + + HbDialog *mDialog; + + QObjectList mObjectList; + + CaNotifier *mNotifier; +}; + +#endif /* HSVIEWAPPDETAILSSTATE_H_ */ diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsappchecklist.docml --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsappchecklist.docml Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsappchecklist.docml Wed Jun 23 17:05:06 2010 +0100 @@ -2,6 +2,9 @@ + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsdetailsdialog.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsdetailsdialog.docml Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -180,8 +180,7 @@ mNewCollectionState(0), mAppsCheckListState(0), mActionType( NoActionType), mApplicationsSortAttribute(NoHsSortAttribute), mCollectionsSortAttribute(NoHsSortAttribute), mAppsCheckList(0), - mEditorDialog(0), mEditorFinishedEntered(false), mListDialog(0), - mListFinishedEntered(false) + mEditorDialog(0), mListDialog(0) { construct(); } @@ -376,11 +375,15 @@ mAppsCheckList = NULL; if (mEditorDialog) { + disconnect(mEditorDialog, SIGNAL(finished(HbAction*)), + this, SLOT(editorDialogFinished(HbAction*))); mEditorDialog->close(); mEditorDialog = NULL; } if (mListDialog) { + disconnect(mListDialog, SIGNAL(finished(HbAction*)), + this, SLOT(listDialogFinished(HbAction*))); mListDialog->close(); mListDialog = NULL; } @@ -399,7 +402,6 @@ { qDebug("HsAddAppsToCollectionState::newCollection"); HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::newCollection"); - mEditorFinishedEntered = false; mEditorDialog = new HsCollectionNameDialog(); mEditorDialog->open(this, SLOT(editorDialogFinished(HbAction*))); @@ -415,31 +417,23 @@ // void HsAddAppsToCollectionState::editorDialogFinished(HbAction* finishedAction) { - if (!mEditorFinishedEntered) { - mEditorFinishedEntered = true; - - if (finishedAction == mEditorDialog->actions().value(0)) { - QString newName(mEditorDialog->newName(mEditorDialog->value().toString(), true)); - if (mActionType == ViaAllViewOptionMenuType) { - qDebug("HsAddAppsToCollectionState::newCollection() " - "- emit collectionNameSelectedCl(newName)"); - emit transitToAppsCheckListState(newName); - } else { - qDebug("HsAddAppsToCollectionState::newCollection() " - "- emit collectionNameSelected(newName)"); - emit transitToSaveState(newName); - } + if (finishedAction == mEditorDialog->actions().value(0)) { + QString newName(mEditorDialog->newName(mEditorDialog->value().toString(), true)); + if (mActionType == ViaAllViewOptionMenuType) { + qDebug("HsAddAppsToCollectionState::newCollection() " + "- emit collectionNameSelectedCl(newName)"); + emit transitToAppsCheckListState(newName); } else { - qDebug( - "HsAddAppsToCollectionState::newCollection() - emit cancel()"); - emit transitToFinalState(); + qDebug("HsAddAppsToCollectionState::newCollection() " + "- emit collectionNameSelected(newName)"); + emit transitToSaveState(newName); } - mEditorDialog = NULL; // set to null since this will be deleted after close - } else { - // (work-around if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + qDebug( + "HsAddAppsToCollectionState::newCollection() - emit cancel()"); + emit transitToFinalState(); } + mEditorDialog = NULL; // set to null since this will be deleted after close } /*! @@ -452,7 +446,6 @@ { qDebug("HsAddAppsToCollectionState::selectCollection()"); HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::selectCollection"); - mListFinishedEntered = false; mListDialog = new HsCollectionsListDialog(mCollectionsSortAttribute, mCollectionId); mListDialog->open(this, SLOT(listDialogFinished(HbAction*))); @@ -469,34 +462,25 @@ // void HsAddAppsToCollectionState::listDialogFinished(HbAction* finishedAction) { - if (!mListFinishedEntered) { - mListFinishedEntered = true; - - if (finishedAction != mListDialog->actions().value(1)) { - int itemId = mListDialog->getItemId(); - if (itemId) { - if (mActionType == ViaAllViewOptionMenuType) { - qDebug("emit collectionSelectedCl(%d)", itemId); - emit transitToAppsCheckListState(itemId); - } else { - qDebug("emit collectionSelected(%d)", itemId); - emit transitToSaveState(itemId); - } + if (finishedAction != mListDialog->actions().value(0)) { + int itemId = mListDialog->getItemId(); + if (itemId) { + if (mActionType == ViaAllViewOptionMenuType) { + qDebug("emit collectionSelectedCl(%d)", itemId); + emit transitToAppsCheckListState(itemId); } else { - qDebug("emit createNewCollection()"); - emit transitToNewCollectionState(); + qDebug("emit collectionSelected(%d)", itemId); + emit transitToSaveState(itemId); } } else { - qDebug("emit cancel()"); - emit transitToFinalState(); + qDebug("emit createNewCollection()"); + emit transitToNewCollectionState(); } - - mListDialog = NULL; // set to null since this will be deleted after close - } else { - // (work-around if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + qDebug("emit cancel()"); + emit transitToFinalState(); } + mListDialog = NULL; // set to null since this will be deleted after close } /*! diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddtohomescreenstate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddtohomescreenstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddtohomescreenstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -27,6 +27,8 @@ #include "hsaddtohomescreenstate.h" #include "hsmenuevent.h" +#include "canotifier.h" +#include "canotifierfilter.h" #include "caservice.h" #include "caquery.h" #include "hsmenuservice.h" @@ -54,7 +56,8 @@ HsAddToHomeScreenState::HsAddToHomeScreenState(QState *parent) : HsMenuBaseState(ADD_TO_HOMESCREEN_STATE, parent), mCorruptedMessage(NULL), mConfirmAction(NULL), - mMenuMode(NormalHsMenuMode) + mMenuMode(NormalHsMenuMode), + mNotifier(0) { requestServices(QList () << SHORTCUT_SERVICE_KEY << CONTENT_SERVICE_KEY); @@ -105,6 +108,7 @@ if (success && (mMenuMode == NormalHsMenuMode)) { HbNotificationDialog *notificationDialog = new HbNotificationDialog(); notificationDialog->setAttribute(Qt::WA_DeleteOnClose); + notificationDialog->setSequentialShow(false); notificationDialog->setTitle(hbTrId( "txt_applib_dpophead_added_to_homescreen") ); notificationDialog->show(); @@ -130,6 +134,7 @@ params[URI] = uri; bool success = contentService.createWidget(params); if (!success) { + subscribeForMemoryCardRemove(); showMessageWidgetCorrupted(); } else { emit exit(); @@ -154,6 +159,7 @@ void HsAddToHomeScreenState::showMessageWidgetCorrupted() { HSMENUTEST_FUNC_ENTRY("HsCollectionState::showMessageWidgetCorrupted"); + mCorruptedMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion); mCorruptedMessage->setAttribute(Qt::WA_DeleteOnClose); @@ -184,20 +190,13 @@ void HsAddToHomeScreenState::messageWidgetCorruptedFinished (HbAction* finishedAction) { - if (mCorruptedMessage) { - if (finishedAction == mConfirmAction) { - HsMenuService::executeAction(mEntryId, removeActionIdentifier()); - } - mCorruptedMessage = NULL; - emit exit(); - if (mMenuMode == AddHsMenuMode) { - machine()->postEvent( - HsMenuEventFactory::createOpenHomeScreenEvent()); - } - - } else { - // (work-around for crash if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + if (finishedAction == mConfirmAction) { + HsMenuService::executeAction(mEntryId, removeActionIdentifier()); + } + emit exit(); + if (mMenuMode == AddHsMenuMode) { + machine()->postEvent( + HsMenuEventFactory::createOpenHomeScreenEvent()); } } @@ -210,9 +209,18 @@ { // Close popups if App key was pressed if (mCorruptedMessage) { + disconnect(mCorruptedMessage, SIGNAL(finished(HbAction*)), + this, SLOT(messageWidgetCorruptedFinished(HbAction*))); mCorruptedMessage->close(); mCorruptedMessage = NULL; } + + disconnect(mNotifier, + SIGNAL(entryChanged(CaEntry,ChangeType)), + this, SLOT(memoryCardRemoved())); + + delete mNotifier; + mNotifier = NULL; } @@ -305,3 +313,33 @@ qWarning() << message; } } + +/*! + Subscribe for memory card remove. + \retval void + */ +void HsAddToHomeScreenState::subscribeForMemoryCardRemove() +{ + CaNotifierFilter filter; + QList entryIds; + entryIds.append(mEntryId); + filter.setIds(entryIds); + mNotifier = CaService::instance()->createNotifier(filter); + mNotifier->setParent(this); + connect(mNotifier, + SIGNAL(entryChanged(CaEntry,ChangeType)), + SLOT(memoryCardRemoved())); +} + +/*! + Memory card with instaled widget was removed. + \retval void + */ +void HsAddToHomeScreenState::memoryCardRemoved() +{ + if (mCorruptedMessage) { + mCorruptedMessage->close(); + mCorruptedMessage = NULL; + } + // exit not needed, it is called after dialog closed +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsarrangestate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsarrangestate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsarrangestate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -78,7 +78,7 @@ */ HsArrangeState::HsArrangeState(QState *parent) : QState(parent), mDialog(0), mEntriesList(0), - mItemModel(0), mFinishedEntered(false) + mItemModel(0) { construct(); } @@ -193,21 +193,13 @@ */ void HsArrangeState::arrangeDialogFinished(HbAction* finishedAction) { - if (!mFinishedEntered) { - mFinishedEntered = true; - - mEntriesList->setArrangeMode(false); - if (finishedAction == mDialog->actions().value(0)) { - save(*mEntriesList); - } - emit exit(); - } else { - // (work-around for crash if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + mEntriesList->setArrangeMode(false); + if (finishedAction == mDialog->actions().value(0)) { + save(*mEntriesList); } + emit exit(); } - /*! Slot invoked when a state is exited. */ @@ -215,9 +207,10 @@ { HSMENUTEST_FUNC_ENTRY("HsArrangeState::stateExited"); if (mDialog) { + disconnect(mDialog, SIGNAL(finished(HbAction*)), this, SLOT(arrangeDialogFinished(HbAction*))); mDialog->close(); + mDialog = NULL; } - mDialog = NULL; mObjectList.clear(); // mDialog as parent for all confml items @@ -228,8 +221,6 @@ mArrangedCollIdList.clear(); mCollIdList.clear(); - mFinishedEntered = false; - HSMENUTEST_FUNC_EXIT("HsArrangeState::stateExited"); qDebug("HsArrangeState::stateExited()"); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionnamedialog.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionnamedialog.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionnamedialog.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -81,9 +81,6 @@ \param item_id Item's id. \retval Selected action. */ -#ifdef COVERAGE_MEASUREMENT -#pragma CTC SKIP // Reason: Modal inputdialog open -#endif //COVERAGE_MEASUREMENT void HsCollectionNameDialog::open(QObject* receiver, const char* member) { HSMENUTEST_FUNC_ENTRY("HsCollectionNameDialog::open"); @@ -96,10 +93,6 @@ HSMENUTEST_FUNC_EXIT("HsCollectionNameDialog::open"); } -#ifdef COVERAGE_MEASUREMENT -#pragma CTC ENDSKIP // Reason: Modal inputdialog exec -#endif //COVERAGE_MEASUREMENT - /*! \reimp diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionnamestate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionnamestate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionnamestate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -55,7 +55,7 @@ */ HsCollectionNameState::HsCollectionNameState(QState *parent) : QState(parent), - mItemId(0), mCollectionNameDialog(NULL), mFinishedEntered(false) + mItemId(0), mCollectionNameDialog(NULL) { construct(); } @@ -76,7 +76,6 @@ { setObjectName(this->parent()->objectName() + "/collectionnamestate"); connect(this, SIGNAL(exited()), SLOT(cleanUp())); - } /*! @@ -93,7 +92,6 @@ QState::onEntry(event); mItemId = 0; - mFinishedEntered = false; if (event->type() == HsMenuEvent::eventType()) { HsMenuEvent *menuEvent = static_cast(event); QVariantMap data = menuEvent->data(); @@ -115,24 +113,18 @@ // void HsCollectionNameState::dialogFinished(HbAction* finishedAction) { - if (!mFinishedEntered) { - mFinishedEntered = true; - if (finishedAction == mCollectionNameDialog->actions().value(0)) { - QString newName(mCollectionNameDialog->newName(mCollectionNameDialog->value().toString(), true)); - if (mItemId) { - if (newName != HsMenuService::getName(mItemId)) { - HsMenuService::renameCollection(mItemId, newName); - } - } else { - HsMenuService::createCollection(newName); + if (finishedAction == mCollectionNameDialog->actions().value(0)) { + QString newName(mCollectionNameDialog->newName(mCollectionNameDialog->value().toString(), true)); + if (mItemId) { + if (newName != HsMenuService::getName(mItemId)) { + HsMenuService::renameCollection(mItemId, newName); } + } else { + HsMenuService::createCollection(newName); } - mCollectionNameDialog = NULL; //set to NULL since this will be deleted atfer close - emit exit(); - } else { - // (work-around if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); } + mCollectionNameDialog = NULL; //set to NULL since this will be deleted atfer close + emit exit(); } // --------------------------------------------------------------------------- @@ -141,6 +133,7 @@ void HsCollectionNameState::cleanUp() { if (mCollectionNameDialog) { + disconnect(mCollectionNameDialog, SIGNAL(finished(HbAction*)), this, SLOT(dialogFinished(HbAction*))); mCollectionNameDialog->close(); mCollectionNameDialog = NULL; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionslistdialog.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionslistdialog.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionslistdialog.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -62,7 +62,10 @@ int collectionId) : HbSelectionDialog(), mItemId(0) { - setPrimaryAction(NULL); + clearActions(); + HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"), this); + addAction(cancelAction); + setHeadingWidget(new HbLabel(hbTrId("txt_applib_title_add_to"))); // it must be single selection, although it shows checkboxes - // it is Orbit defect and will be fixed in next release @@ -79,10 +82,6 @@ delete mModel; } - -#ifdef COVERAGE_MEASUREMENT -#pragma CTC SKIP // Reason: Modal inputdialog open -#endif //COVERAGE_MEASUREMENT /*! Executes dialog. \retval Selected action. @@ -92,11 +91,6 @@ this->setAttribute(Qt::WA_DeleteOnClose); HbSelectionDialog::open(receiver, member); } -#ifdef COVERAGE_MEASUREMENT -#pragma CTC ENDSKIP // Reason: Modal inputdialog exec -#endif //COVERAGE_MEASUREMENT - - /*! \reimp @@ -107,7 +101,7 @@ qDebug("HsCollectionsListDialog::closeEvent"); HbAction *closingAction = qobject_cast(sender()); - if (closingAction != actions().value(1)) { + if (closingAction != actions().value(0)) { QModelIndexList modlist = selectedModelIndexes(); if (modlist.count()) { mItemId @@ -118,8 +112,6 @@ HbDialog::closeEvent(event); // emits finished(HbAction*) } - - /*! Creates standard item model. \param sortOrder sort order. diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionitemstate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionitemstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionitemstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -66,9 +66,6 @@ Sets entry event. \param event entry event. */ -#ifdef COVERAGE_MEASUREMENT -#pragma CTC SKIP -#endif //COVERAGE_MEASUREMENT void HsDeleteCollectionItemState::onEntry(QEvent *event) { HSMENUTEST_FUNC_ENTRY("HsDeleteCollectionItemState::onEntry"); @@ -102,26 +99,18 @@ HSMENUTEST_FUNC_EXIT("HsDeleteCollectionItemState::onEntry"); } -#ifdef COVERAGE_MEASUREMENT -#pragma CTC ENDSKIP -#endif //COVERAGE_MEASUREMENT -// --------------------------------------------------------------------------- -// --------------------------------------------------------------------------- -// +/*! + Action after closed confirmation dialog. + \param finishedAction chosen action. + \retval void + */ void HsDeleteCollectionItemState::deleteMessageFinished(HbAction* finishedAction) { - if (mItemId !=0 ) { // (work-around for crash if more then one action is selected in HbDialog) - - if (finishedAction == mConfirmAction) { - HsMenuService::removeApplicationFromCollection(mItemId, mCollectionId); - } - mItemId = 0; - emit exit(); - } else { - // (work-around for crash if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + if (finishedAction == mConfirmAction) { + HsMenuService::removeApplicationFromCollection(mItemId, mCollectionId); } + emit exit(); } /*! @@ -132,11 +121,12 @@ { // Close messagebox if App key was pressed if (mDeleteMessage) { + disconnect(mDeleteMessage, SIGNAL(finished(HbAction*)), this, SLOT(deleteMessageFinished(HbAction*))); mDeleteMessage->close(); + mDeleteMessage = NULL; } - - mDeleteMessage = NULL; - mConfirmAction= NULL; + + mConfirmAction = NULL; mItemId = 0; mCollectionId = 0; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionstate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -126,19 +126,12 @@ // void HsDeleteCollectionState::deleteMessageFinished(HbAction* finishedAction) { - if (mItemId !=0 ) { // (work-around for crash if more then one action is selected in HbDialog) - - if (finishedAction == mConfirmAction) { - HsMenuService::removeCollection(mItemId); - machine()->postEvent( - HsMenuEventFactory::createCollectionDeletedEvent()); - } - mItemId = 0; - emit exit(); - } else { - // (work-around for crash if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + if (finishedAction == mConfirmAction) { + HsMenuService::removeCollection(mItemId); + machine()->postEvent( + HsMenuEventFactory::createCollectionDeletedEvent()); } + emit exit(); } /*! @@ -149,10 +142,11 @@ { // Close messagebox if App key was pressed if (mDeleteMessage) { + disconnect(mDeleteMessage, SIGNAL(finished(HbAction*)), this, SLOT(deleteMessageFinished(HbAction*))); mDeleteMessage->close(); + mDeleteMessage = NULL; } - mDeleteMessage = NULL; - mConfirmAction= NULL; + mConfirmAction = NULL; mItemId = 0; } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsmenuworkerstate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsmenuworkerstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsmenuworkerstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -21,11 +21,13 @@ #include "hsaddappstocollectionstate.h" #include "hsdeletecollectionstate.h" #include "hsdeletecollectionitemstate.h" +#include "hsuninstallitemstate.h" #include "hsmenuworkerstate.h" #include "hscollectionnamestate.h" #include "hsarrangestate.h" #include "hspreviewhswidgetstate.h" #include "hsviewappsettingsstate.h" +#include "hsviewappdetailsstate.h" /*! \class HsMenuWorkerState @@ -74,6 +76,8 @@ HsMenuEvent::DeleteCollection); createChildState ( HsMenuEvent::RemoveAppFromCollection); + createChildState ( + HsMenuEvent::UninstallApplication); createChildState (HsMenuEvent::ArrangeCollection); // create a new child state based on the template @@ -103,9 +107,10 @@ // set a transition to the initial state after child processing finished addAppsToCollectionState->addTransition(addAppsToCollectionState, SIGNAL(finished()), mInitialState); - + connect(this, SIGNAL(reset()), addAppsToCollectionState, SIGNAL(finished())); createChildState (HsMenuEvent::PreviewHSWidget); createChildState (HsMenuEvent::ShowAppSettings); + createChildState (HsMenuEvent::ShowAppDetails); HSMENUTEST_FUNC_EXIT("HsMenuWorkerState::construct"); } @@ -130,6 +135,7 @@ mInitialState->addTransition(newChildStateTransition); // set a transition to the initial state after child processing finished newChildState->addTransition(newChildState, SIGNAL(exit()), mInitialState); + connect(this, SIGNAL(reset()), newChildState, SIGNAL(exit())); HSMENUTEST_FUNC_EXIT("HsMenuWorkerState::createChildState"); return newChildState; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp --- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -41,11 +41,9 @@ #include "canotifier.h" #include "canotifierfilter.h" #include "caservice.h" - #include "hsdomainmodel_global.h" #include - const char HS_PREVIEW_HS_WIDGET_STATE[] = "HsPreviewHSWidgetState"; /*! @@ -147,13 +145,13 @@ mScrollArea->setContentWidget(mWidget); // ownership transferred subscribeForMemoryCardRemove(); - mWidget->initializeWidget(); - mWidget->showWidget(); + mWidget->startWidget(); // Launch popup asyncronously mPopupDialog->open(this, SLOT(previewDialogFinished(HbAction*))); } } else { + subscribeForMemoryCardRemove(); showMessageWidgetCorrupted(); } @@ -169,73 +167,54 @@ */ void HsPreviewHSWidgetState::cleanUp() { - // Close popups if App key was pressed + // Close popups if App key was pressed or memory card removed if (mPopupDialog) { + disconnect(mPopupDialog, SIGNAL(finished(HbAction*)), this, SLOT(previewDialogFinished(HbAction*))); mPopupDialog->close(); + mPopupDialog = NULL; } if (mCorruptedMessage) { + disconnect(mCorruptedMessage, SIGNAL(finished(HbAction*)), this, SLOT(messageWidgetCorruptedFinished(HbAction*))); mCorruptedMessage->close(); + mCorruptedMessage = NULL; } - mPopupDialog = NULL; mScrollArea = NULL; mWidget = NULL; - mCorruptedMessage = NULL; disconnect(mNotifier, SIGNAL(entryChanged(CaEntry,ChangeType)), - this, SLOT(memoryCardRemoved())); + this, SIGNAL(exit())); delete mNotifier; mNotifier = NULL; } /*! - Memory card with instaled widget was removed. - \retval void - */ -void HsPreviewHSWidgetState::memoryCardRemoved() -{ - if (mPopupDialog) { - mPopupDialog->close(); - } - // exit not needed, it is called after dialog closed - -} - -/*! Slot launched on dismissing the preview dialog \retval void */ void HsPreviewHSWidgetState::previewDialogFinished(HbAction* finishedAction) { - if (mPopupDialog != NULL) { - // (work-around for crash if more then one action is selected in HbDialog) - if (finishedAction == mPopupDialog->actions().value(0)) { - mWidget->hideWidget(); + if (finishedAction == mPopupDialog->actions().value(0)) { + mWidget->hideWidget(); + mScrollArea->takeContentWidget(); + HsScene::instance()->activePage()->addNewWidget( + mWidget); // ownership transferred + HbNotificationDialog *notificationDialog = new HbNotificationDialog(); + notificationDialog->setAttribute(Qt::WA_DeleteOnClose); + notificationDialog->setTitle(hbTrId( + "txt_applib_dpophead_added_to_homescreen") ); + notificationDialog->show(); + } else { mScrollArea->takeContentWidget(); - HsScene::instance()->activePage()->addNewWidget( - mWidget); // ownership transferred - HbNotificationDialog *notificationDialog = new HbNotificationDialog(); - notificationDialog->setAttribute(Qt::WA_DeleteOnClose); - notificationDialog->setTitle(hbTrId( - "txt_applib_dpophead_added_to_homescreen") ); - notificationDialog->show(); - } else { - mWidget->uninitializeWidget(); - mWidget->deleteFromDatabase(); - } - mPopupDialog = NULL; - emit exit(); - } else { - // (work-around for crash if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + mWidget->remove(); + mWidget = NULL; } + emit exit(); } - - /*! Subscribe for memory card remove. \retval void @@ -250,10 +229,9 @@ mNotifier->setParent(this); connect(mNotifier, SIGNAL(entryChanged(CaEntry,ChangeType)), - SLOT(memoryCardRemoved())); + SIGNAL(exit())); } - /*! Shows message about corrupted widget library. Deletes widget eventually \retval void @@ -271,9 +249,9 @@ QString message(hbTrId("txt_applib_dialog_file_corrupted_unable_to_use_wi")); mCorruptedMessage->setText(message); - mCorruptedMessage->clearActions(); + mCorruptedMessage->clearActions(); HbAction *primaryAction = new HbAction(hbTrId("txt_common_button_ok"), mCorruptedMessage); - mCorruptedMessage->addAction(primaryAction); + mCorruptedMessage->addAction(primaryAction); HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), mCorruptedMessage); mCorruptedMessage->addAction(secondaryAction); @@ -291,14 +269,8 @@ */ void HsPreviewHSWidgetState::messageWidgetCorruptedFinished(HbAction* finishedAction) { - if (mCorruptedMessage) { - if (finishedAction == mCorruptedMessage->actions().value(0)) { - HsMenuService::executeAction(mEntryId, removeActionIdentifier()); - } - mCorruptedMessage = NULL; - emit exit(); - } else { - // (work-around for crash if more then one action is selected in HbDialog) - qWarning("Another signal finished was emited."); + if (finishedAction == mCorruptedMessage->actions().value(0)) { + HsMenuService::executeAction(mEntryId, removeActionIdentifier()); } + emit exit(); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsuninstallitemstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsuninstallitemstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2009 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: Menu delete collection item state + * + */ + +#include +#include +#include +#include + +#include "hsuninstallitemstate.h" +#include "hsmenuevent.h" + +/*! + \class HsUninstallItemState + \ingroup group_hsworkerstateplugin + \brief Uninstall Item State. + Deletes app from collection. + */ + +/*! + Constructor. + \param parent Owner. + */ +HsUninstallItemState::HsUninstallItemState(QState *parent) : + QState(parent), + mItemId(0), + mUninstallMessage(NULL), + mConfirmAction(NULL) +{ + construct(); +} + +/*! + Destructor. + */ +HsUninstallItemState::~HsUninstallItemState() +{ + cleanUp(); // in case of throw +} + +/*! + Constructs contained objects. + */ +void HsUninstallItemState::construct() +{ + setObjectName(this->parent()->objectName() + + "/UninstallItemState"); + setProperty(HS_SERVICES_REGISTRATION_KEY, QList () + << SHORTCUT_SERVICE_KEY); + connect(this, SIGNAL(exited()), SLOT(cleanUp())); +} + +/*! + Sets entry event. + \param event entry event. + */ +void HsUninstallItemState::onEntry(QEvent *event) +{ + HSMENUTEST_FUNC_ENTRY("HsUninstallItemState::onEntry"); + QState::onEntry(event); + qDebug("HsUninstallItemState::onEntry()"); + HsMenuEvent *menuEvent = static_cast(event); + QVariantMap data = menuEvent->data(); + + mItemId = data.value(itemIdKey()).toInt(); + + QString message; + if (shortcutService()->isItemShortcutWidget(mItemId)) { + message.append( + hbTrId("txt_applib_dialog_uninstalls_1_and_deletes_all_sh").arg( + HsMenuService::getName(mItemId))); + } else { + message.append( + hbTrId("txt_applib_dialog_1_will_be_removed_from_phone_c").arg( + HsMenuService::getName(mItemId))); + } + + // create and show message box + mUninstallMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + mUninstallMessage->setAttribute(Qt::WA_DeleteOnClose); + + mUninstallMessage->setText(message); + + mUninstallMessage->clearActions(); + mConfirmAction = new HbAction(hbTrId("txt_common_button_ok"), mUninstallMessage); + mUninstallMessage->addAction(mConfirmAction); + + HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), mUninstallMessage); + mUninstallMessage->addAction(secondaryAction); + + mUninstallMessage->open(this, SLOT(uninstallMessageFinished(HbAction*))); + + HSMENUTEST_FUNC_EXIT("HsUninstallItemState::onEntry"); +} + +/*! + Action after closed confirmation dialog. + \param finishedAction chosen action. + \retval void + */ +void HsUninstallItemState::uninstallMessageFinished(HbAction* finishedAction) +{ + if (finishedAction == mConfirmAction) { + HsMenuService::executeAction(mItemId, removeActionIdentifier()); + } + emit exit(); +} + +/*! + Convenience method returning the shortcut service. + \since S60 ?S60_version. + \return Shortcut Service. + */ +HsShortcutService *HsUninstallItemState::shortcutService() const +{ + return property(SHORTCUT_SERVICE_KEY).value (); +} + +/*! + Slot launched after state has exited and in destructor. + \retval void + */ +void HsUninstallItemState::cleanUp() +{ + // Close messagebox if App key was pressed + if (mUninstallMessage) { + disconnect(mUninstallMessage, SIGNAL(finished(HbAction*)), this, SLOT(uninstallMessageFinished(HbAction*))); + mUninstallMessage->close(); + mUninstallMessage = NULL; + } + + mConfirmAction = NULL; + mItemId = 0; +} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsviewappdetailsstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsviewappdetailsstate.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -0,0 +1,175 @@ +/* +* 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: Menu Application Library state. + * +*/ + +#include +#include +#include +#include +#include + +#include "caservice.h" +#include "casoftwareregistry.h" + +#include "canotifier.h" +#include "canotifierfilter.h" + +#include "hsviewappdetailsstate.h" +#include "hsmenuevent.h" +#include "hsmenuitemmodel.h" + +HsViewAppDetailsState::HsViewAppDetailsState(QState *parent) : + QState(parent), mDialog(0), mNotifier(0) +{ + construct(); +} + +HsViewAppDetailsState::~HsViewAppDetailsState() +{ + if (mDialog) { + delete mDialog; + } +} + +void HsViewAppDetailsState::construct() +{ + HSMENUTEST_FUNC_ENTRY("HsViewAppDetailsState::construct"); + setObjectName(this->parent()->objectName() + + "/ViewAppDetailsState"); + HSMENUTEST_FUNC_EXIT("HsViewAppDetailsState::construct"); +} + +void HsViewAppDetailsState::onEntry(QEvent *event) +{ + HSMENUTEST_FUNC_ENTRY("HsViewAppDetailsState::onEntry"); + QState::onEntry(event); + HsMenuEvent *menuEvent = static_cast(event); + QVariantMap data = menuEvent->data(); + + const int entryId = data.value(itemIdKey()).toInt(); + QSharedPointer entry = CaService::instance()->getEntry(entryId); + const int componentId = entry->attribute(componentIdAttributeName()).toInt(); + + QSharedPointer scr = CaSoftwareRegistry::create(); + CaSoftwareRegistry::DetailMap detailMap = scr->entryDetails(componentId); + + HbDocumentLoader loader; + bool loadStatusOk = false; + mObjectList = + loader.load(HS_DETAILS_DIALOG_LAYOUT, &loadStatusOk); + Q_ASSERT_X(loadStatusOk, + HS_DETAILS_DIALOG_LAYOUT, + "Error while loading docml file."); + + mDialog = qobject_cast(loader.findWidget(HS_DETAILS_DIALOG_NAME)); + mDialog->actions()[0]->setParent(mDialog); + + subscribeForMemoryCardRemove(entryId); + + HbLabel* nameLabel = qobject_cast(loader.findWidget(CaSoftwareRegistry::componentNameKey())); + HbLabel* versionLabel = qobject_cast(loader.findWidget(CaSoftwareRegistry::componentVersionKey())); + HbLabel* supplierLabel = qobject_cast(loader.findWidget(CaSoftwareRegistry::componentVendorKey())); + HbLabel* memoryLabel = qobject_cast(loader.findWidget(CaSoftwareRegistry::componentDriveInfoKey())); + HbLabel* sizeLabel = qobject_cast(loader.findWidget(CaSoftwareRegistry::componentSizeKey())); + HbLabel* typeLabel = qobject_cast(loader.findWidget(CaSoftwareRegistry::componentTypeKey())); + + nameLabel->setPlainText(detailMap[CaSoftwareRegistry::componentNameKey()]); + versionLabel->setPlainText(detailMap[CaSoftwareRegistry::componentVersionKey()]); + supplierLabel->setPlainText(detailMap[CaSoftwareRegistry::componentVendorKey()]); + memoryLabel->setPlainText(detailMap[CaSoftwareRegistry::componentDriveInfoKey()]); + sizeLabel->setPlainText(detailMap[CaSoftwareRegistry::componentSizeKey()]); + typeLabel->setPlainText(detailMap[CaSoftwareRegistry::componentTypeKey()]); + + if (mDialog != NULL) { + mDialog->setTimeout(HbPopup::NoTimeout); + mDialog->setAttribute(Qt::WA_DeleteOnClose, true); + mDialog->open(this, SLOT(stateExited())); + } + + HSMENUTEST_FUNC_EXIT("HsViewAppDetailsState::onEntry"); +} +#ifdef COVERAGE_MEASUREMENT +#pragma CTC SKIP +#endif //COVERAGE_MEASUREMENT +/*! + Slot invoked when a state is exited. + */ +void HsViewAppDetailsState::stateExited() +{ + HSMENUTEST_FUNC_ENTRY("HsViewAppDetailsState::stateExited"); + mDialog = NULL; + emit exit(); + HSMENUTEST_FUNC_EXIT("HsViewAppDetailsState::stateExited"); + qDebug("HsViewAppDetailsState::stateExited()"); +} +#ifdef COVERAGE_MEASUREMENT +#pragma CTC ENDSKIP +#endif //COVERAGE_MEASUREMENT + + +#ifdef COVERAGE_MEASUREMENT +#pragma CTC SKIP +#endif //COVERAGE_MEASUREMENT +void HsViewAppDetailsState::onExit(QEvent *event) +{ + QState::onExit(event); + // Close popups if App key was pressed + if (mDialog) { + mDialog->close(); + } + mDialog = NULL; +} +#ifdef COVERAGE_MEASUREMENT +#pragma CTC ENDSKIP +#endif //COVERAGE_MEASUREMENT + +/*! + Subscribe for memory card remove. + \param entryId: entry id. + \retval void + */ +void HsViewAppDetailsState::subscribeForMemoryCardRemove(int entryId) +{ + CaNotifierFilter filter; + QList entryIds; + entryIds.append(entryId); + filter.setIds(entryIds); + mNotifier = CaService::instance()->createNotifier(filter); + mNotifier->setParent(this); + connect(mNotifier, + SIGNAL(entryChanged(CaEntry,ChangeType)), + SLOT(memoryCardRemoved())); +} + +#ifdef COVERAGE_MEASUREMENT +#pragma CTC SKIP +#endif //COVERAGE_MEASUREMENT +/*! + Memory card with instaled widget was removed. + \retval void + */ +void HsViewAppDetailsState::memoryCardRemoved() +{ + if (mDialog) { + mDialog->close(); + } + // exit not needed, it is called after dialog closed + +} +#ifdef COVERAGE_MEASUREMENT +#pragma CTC ENDSKIP +#endif //COVERAGE_MEASUREMENT + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsclockwidgetplugin/hsclockwidgetplugin.pro --- a/homescreenapp/widgetplugins/hsclockwidgetplugin/hsclockwidgetplugin.pro Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/hsclockwidgetplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -17,14 +17,20 @@ TEMPLATE = lib CONFIG += plugin hb mobility MOBILITY = serviceframework + +HB += hbfeedback + +LIBS += -lhsdomainmodel + PLUGIN_SUBDIR = /private/20022F35/import/widgetregistry/20022F6C include(../../common.pri) DEPENDPATH += ./inc \ ./src -INCLUDEPATH += ./inc - +INCLUDEPATH += ./inc \ + ../../hsdomainmodel/inc + symbian: { TARGET.UID3 = 0x20022F6C LIBS += -lbafl -lapgrfx -lcone diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsclockwidgetplugin/inc/hsclockwidget.h --- a/homescreenapp/widgetplugins/hsclockwidgetplugin/inc/hsclockwidget.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/inc/hsclockwidget.h Wed Jun 23 17:05:06 2010 +0100 @@ -38,9 +38,6 @@ HsClockWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0); ~HsClockWidget(); -signals: - void setPreferences(const QStringList &names); - public slots: void onInitialize(); void onShow(); diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsanalogclockwidget.cpp --- a/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsanalogclockwidget.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsanalogclockwidget.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -21,7 +21,9 @@ #include #include #include +#include +#include "hsconfiguration.h" #include "hsanalogclockwidget.h" /*! @@ -147,5 +149,7 @@ return; } + HbInstantFeedback::play(HsConfiguration::clockWidgetTapFeedbackType()); + emit clockTapped(); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsdigitalclockwidget.cpp --- a/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsdigitalclockwidget.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsdigitalclockwidget.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -23,6 +23,7 @@ #include #include #include +#include #include "hsdigitalclockwidget.h" @@ -247,5 +248,7 @@ return; } + HbInstantFeedback::play(HbFeedback::BasicItem); + emit clockTapped(); } diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsshortcutwidgetplugin/inc/hsshortcutwidget.h --- a/homescreenapp/widgetplugins/hsshortcutwidgetplugin/inc/hsshortcutwidget.h Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsshortcutwidgetplugin/inc/hsshortcutwidget.h Wed Jun 23 17:05:06 2010 +0100 @@ -37,6 +37,8 @@ Q_PROPERTY(int caEntryId READ caEntryId WRITE setCaEntryId) Q_PROPERTY(QString uid READ uid WRITE setUid) + Q_PROPERTY(QString text READ text WRITE setText ) + public: HsShortcutWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0); ~HsShortcutWidget(); @@ -46,6 +48,9 @@ void setUid(const QString &uid); QString uid() const; + QString text() const; + void setText(const QString& textItem); + bool eventFilter(QObject *watched, QEvent *event); signals: diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsshortcutwidgetplugin/resource/hsshortcutwidget.css --- a/homescreenapp/widgetplugins/hsshortcutwidgetplugin/resource/hsshortcutwidget.css Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsshortcutwidgetplugin/resource/hsshortcutwidget.css Wed Jun 23 17:05:06 2010 +0100 @@ -1,30 +1,30 @@ HsShortcutWidget { + layout: icon_shortcut; +} + +HsShortcutWidget[text] { layout: icon_text_shortcut; } -HsShortcutWidget[icon][text] { - layout: icon_text_shortcut; -} - -HsShortcutWidget[icon][!text] { +HsShortcutWidget[!text] { layout: icon_shortcut; } HsShortcutWidget::background { border-width: 0.0un; fixed-width: 12un; - fixed-height: expr(12.5un + var(hb-param-text-height-tiny)); + fixed-height: 12un; zvalue: 0; } -HsShortcutWidget[icon][text]::background { +HsShortcutWidget[text]::background { border-width: 0.0un; fixed-width: 12un; fixed-height: expr(12.5un + var(hb-param-text-height-tiny)); zvalue: 0; } -HsShortcutWidget[icon][!text]::background { +HsShortcutWidget[!text]::background { border-width: 0.0un; fixed-width: 12un; fixed-height: 12un; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 homescreenapp/widgetplugins/hsshortcutwidgetplugin/src/hsshortcutwidget.cpp --- a/homescreenapp/widgetplugins/hsshortcutwidgetplugin/src/hsshortcutwidget.cpp Tue May 18 12:12:12 2010 +0100 +++ b/homescreenapp/widgetplugins/hsshortcutwidgetplugin/src/hsshortcutwidget.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -31,6 +31,7 @@ #include "caservice.h" #include "canotifier.h" #include "caquery.h" +#include "hsconfiguration.h" /*! \class HsShortcutWidget @@ -97,6 +98,28 @@ } /*! + Returns the text property. This property is needed by css selector. +*/ +QString HsShortcutWidget::text() const +{ + if ( mText ) { + return mText->text(); + } else { + return QString(); + } +} + +/*! + Sets the text property. This property is needed by css selector. +*/ +void HsShortcutWidget::setText(const QString& textItem) +{ + if ( mText ) { + mText->setText(textItem); + } +} + +/*! Filters touch area events. */ bool HsShortcutWidget::eventFilter(QObject *watched, QEvent *event) @@ -209,7 +232,7 @@ return; } - HbInstantFeedback::play(HbFeedback::BasicItem); + HbInstantFeedback::play(HsConfiguration::shortcutWidgetTapFeedbackType()); if (mCaEntryRole == ItemEntryRole) { CaService::instance()->executeCommand(mCaEntryId); @@ -238,11 +261,10 @@ } // Text - if (!mText) { + if ( HsConfiguration::shortcutLabelsVisible() && !mText ) { mText = new HbTextItem(this); HbStyle::setItemName(mText, QLatin1String("text")); - } - + } // Touch Area if (!mTouchArea) { mTouchArea = new HbTouchArea(this); @@ -260,7 +282,9 @@ mCaEntryFlags = caEntry.flags(); mCaEntryTypeName = caEntry.entryTypeName(); mIcon->setIcon(caEntry.makeIcon()); - mText->setText(caEntry.text()); + if (mText) { + mText->setText(caEntry.text()); + } } /*! @@ -319,3 +343,5 @@ emit finished(); } } + + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/rom/tsapplication_core.iby --- a/taskswitcherapp/rom/tsapplication_core.iby Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/rom/tsapplication_core.iby Wed Jun 23 17:05:06 2010 +0100 @@ -17,8 +17,6 @@ #ifndef __TSAPP_CORE_IBY__ #define __TSAPP_CORE_IBY__ -data=\epoc32\data\z\resource\qt\crml\tsexternalactivation.qcrml resource\qt\crml\tsexternalactivation.qcrml - file=ABI_DIR\BUILD_DIR\tsdevicedialogplugin.dll SHARED_LIB_DIR\tsdevicedialogplugin.dll data=\epoc32\data\z\resource\plugins\devicedialogs\tsdevicedialogplugin.qtplugin resource\plugins\devicedialogs\tsdevicedialogplugin.qtplugin diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/taskswitcherapp.pro --- a/taskswitcherapp/taskswitcherapp.pro Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/taskswitcherapp.pro Wed Jun 23 17:05:06 2010 +0100 @@ -16,20 +16,27 @@ TEMPLATE = subdirs +coverage { + SUBDIRS += ../../homescreensrv/activityfw + SUBDIRS += ../../homescreensrv/hsappkeyhandler + SUBDIRS += ../../homescreensrv/tstaskmonitor +} + SUBDIRS += tsdevicedialogplugin tests { - SUBDIRS += internal\tstestrunner - SUBDIRS += tsdevicedialogplugin\tsrc - SUBDIRS += ..\..\homescreensrv\activityfw\activityserviceplugin\unittests - SUBDIRS += ..\..\homescreensrv\activityfw\activitydatabase\hsactivitydbclient\t_hsactivitydbclient - SUBDIRS += ..\..\homescreensrv\hsappkeyhandler\tsrc\t_hsappkeyhandler - SUBDIRS += ..\..\homescreensrv\activityfw\activityserviceplugin\s60\tsrc -} - -coverage { - SUBDIRS += ..\..\homescreensrv\activityfw - SUBDIRS += ..\..\homescreensrv\hsappkeyhandler + SUBDIRS += internal/tstestrunner + SUBDIRS += tsdevicedialogplugin/tsrc + SUBDIRS += ../../homescreensrv/activityfw/activityserviceplugin/tsrc + SUBDIRS += ../../homescreensrv/activityfw/activitydatabase/hsactivitydbclient/t_hsactivitydbclient + SUBDIRS += ../../homescreensrv/hsappkeyhandler/tsrc/t_hsappkeyhandler + SUBDIRS += ../../homescreensrv/activityfw/activityserviceplugin/s60/tsrc + SUBDIRS += ../../homescreensrv/tstaskmonitor/client/tsrc + SUBDIRS += ../../homescreensrv/tstaskmonitor/server/tsrc + SUBDIRS += ../../homescreensrv/tstaskmonitor/screenshotplugin/tsrc + SUBDIRS += ../../homescreensrv/activityfw/tsutils/tsrc + SUBDIRS += ../../homescreensrv/tstaskmonitor/utils/tsrc + SUBDIRS += ../../homescreensrv/tstaskmonitor/backstepping/tsrc } symbian:include(rom.pri) diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/inc/tsdevicedialogplugin.h --- a/taskswitcherapp/tsdevicedialogplugin/inc/tsdevicedialogplugin.h Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/inc/tsdevicedialogplugin.h Wed Jun 23 17:05:06 2010 +0100 @@ -27,7 +27,7 @@ #include "tsdocumentloader.h" -class CaService; +class TsTaskMonitor; class TsDeviceDialogPlugin : public HbDeviceDialogPlugin { Q_OBJECT @@ -43,20 +43,11 @@ PluginFlags pluginFlags() const; int error() const; -private slots: - void activated(QModelIndex index); - void pressed(); - void longPressed(); - -signals: - void activate(QModelIndex); - private: int mError; TsDocumentLoader mLoader; QAbstractListModel *mModel; - QSharedPointer mStorage; - bool mLongPressed; + TsTaskMonitor *mStorage; Q_DISABLE_COPY(TsDeviceDialogPlugin) }; diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/inc/tsentrymodelitem.h --- a/taskswitcherapp/tsdevicedialogplugin/inc/tsentrymodelitem.h Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/inc/tsentrymodelitem.h Wed Jun 23 17:05:06 2010 +0100 @@ -18,9 +18,11 @@ #ifndef TSENTRYMODELITEM_H #define TSENTRYMODELITEM_H #include "tsmodelitem.h" -#include -class CaEntry; +#include +#include + +class TsTask; /*! Class implements model item which represents Content Arsenal entry @@ -28,19 +30,14 @@ class TsEntryModelItem : public TsModelItem { public: - TsEntryModelItem(CaService &service, QSharedPointer entry, QSize mSize); + TsEntryModelItem(QSharedPointer entry); ~TsEntryModelItem(); QVariant data(int role) const; void close(); void open(); private: - bool closable() const; - -private: - CaService &mService; - const QSharedPointer mEntry; - const QSize mSize; + const QSharedPointer mEntry; }; #endif // TSMODEL_H diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/inc/tsmodel.h --- a/taskswitcherapp/tsdevicedialogplugin/inc/tsmodel.h Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/inc/tsmodel.h Wed Jun 23 17:05:06 2010 +0100 @@ -22,10 +22,12 @@ #include #include #include -#include -#include +#include +#ifdef Q_OS_SYMBIAN +#include +#endif -class CaService; +class TsTaskMonitor; class ActivityManager; class CaNotifier; class TsModelItem; @@ -35,7 +37,7 @@ Q_OBJECT public: - explicit TsModel(CaService &applicationSrv, + explicit TsModel(TsTaskMonitor &applicationSrv, QObject &activitySrv, QObject *parent = 0); ~TsModel(); @@ -48,7 +50,6 @@ void openApplication(const QModelIndex &index); void closeApplication(const QModelIndex &index); void updateModel(); - void entryChanged(CaEntry, ChangeType); void entryChanged(TsModelItem *); private: TsModelItem *entry(const QModelIndex &index) const; @@ -63,25 +64,16 @@ */ QList mEntries; - /* - * Query - */ - CaQuery mQuery; - - /* - * Content Arsenal Service - */ - CaService &mApplicationService; + TsTaskMonitor &mApplicationService; /* * Activity Service */ QObject &mActivityService; - - /* - * Content Arsenal Notifier - */ - CaNotifier *mNotifier; + +#ifdef Q_OS_SYMBIAN + RApaLsSession iAppArcSession; +#endif /* * Icon size in model diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/resource/layout.docml --- a/taskswitcherapp/tsdevicedialogplugin/resource/layout.docml Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/resource/layout.docml Wed Jun 23 17:05:06 2010 +0100 @@ -9,6 +9,7 @@ + diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/src/tsdevicedialogplugin.cpp --- a/taskswitcherapp/tsdevicedialogplugin/src/tsdevicedialogplugin.cpp Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/src/tsdevicedialogplugin.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -26,7 +26,6 @@ #include "tstasksgriditem.h" #include "tsdocumentloader.h" #include "tsmodel.h" -#include /*! \class TsDeviceDialogPlugin @@ -39,7 +38,7 @@ /*! Constructor. */ -TsDeviceDialogPlugin::TsDeviceDialogPlugin() : mError(0), mModel(0), mStorage(CaService::instance()), mLongPressed(false) +TsDeviceDialogPlugin::TsDeviceDialogPlugin() : mError(0), mModel(0), mStorage(0) { } @@ -70,6 +69,10 @@ TsDeviceDialog *dialog(0); if (deviceDialogType == KTsDialogType) { if (0 == mModel) { + mStorage = new TsTaskMonitor(this); + if (0 == mStorage) { + return 0; + } QtMobility::QServiceManager serviceManager; QObject *objPtr(serviceManager.loadInterface("com.nokia.qt.activities.ActivityManager")); if (objPtr) { @@ -96,23 +99,17 @@ grid->setItemPrototype(new TsTasksGridItem()); grid->setModel(mModel); - static_cast(mModel)->updateModel(); + //static_cast(mModel)->updateModel(); // connect the grid and model qRegisterMetaType("QModelIndex"); - disconnect(grid, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex))); - disconnect(grid, SIGNAL(pressed(QModelIndex)), this, SLOT(pressed())); - disconnect(grid, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)), this, SLOT(longPressed())); - disconnect(this, SIGNAL(activate(QModelIndex)), mModel, SLOT(openApplication(QModelIndex))); - disconnect(this, SIGNAL(activate(QModelIndex)), dialog, SLOT(close())); + disconnect(grid, SIGNAL(activated(QModelIndex)), mModel, SLOT(openApplication(QModelIndex))); + disconnect(grid, SIGNAL(activated(QModelIndex)), dialog, SLOT(close())); disconnect(grid, SIGNAL(deleteButtonClicked(QModelIndex)), mModel, SLOT(closeApplication(QModelIndex))); - connect(grid, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex))); - connect(grid, SIGNAL(pressed(QModelIndex)), this, SLOT(pressed())); - connect(grid, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)), this, SLOT(longPressed())); - connect(this, SIGNAL(activate(QModelIndex)), mModel, SLOT(openApplication(QModelIndex))); - connect(this, SIGNAL(activate(QModelIndex)), dialog, SLOT(close())); + connect(grid, SIGNAL(activated(QModelIndex)), mModel, SLOT(openApplication(QModelIndex))); + connect(grid, SIGNAL(activated(QModelIndex)), dialog, SLOT(close())); connect(grid, SIGNAL(deleteButtonClicked(QModelIndex)), mModel, SLOT(closeApplication(QModelIndex)), Qt::QueuedConnection); } return dialog; @@ -157,21 +154,12 @@ return mError; } -void TsDeviceDialogPlugin::activated(QModelIndex index) -{ - if (!mLongPressed) { - emit activate(index); - } -} - -void TsDeviceDialogPlugin::pressed() -{ - mLongPressed = false; -} - -void TsDeviceDialogPlugin::longPressed() -{ - mLongPressed = true; -} +#ifdef COVERAGE_MEASUREMENT +#pragma CTC SKIP +#endif //COVERAGE_MEASUREMENT Q_EXPORT_PLUGIN2(tsdevicedialogplugin, TsDeviceDialogPlugin) + +#ifdef COVERAGE_MEASUREMENT +#pragma CTC ENDSKIP +#endif //COVERAGE_MEASUREMENT diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/src/tsentrymodelitem.cpp --- a/taskswitcherapp/tsdevicedialogplugin/src/tsentrymodelitem.cpp Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/src/tsentrymodelitem.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -17,6 +17,7 @@ #include "tsentrymodelitem.h" #include "tsdataroles.h" +#include #include /*! @@ -27,15 +28,11 @@ /*! Standard C++ constructor - /param service - reference to initialized Content Aresnal client instance /param entry - Content Arsenal data - /param size - icon size */ -TsEntryModelItem::TsEntryModelItem(CaService& service, QSharedPointer entry, QSize size) +TsEntryModelItem::TsEntryModelItem(QSharedPointer entry) : - mService(service), - mEntry(entry), - mSize(size) + mEntry(entry) { //no implementation required } @@ -56,11 +53,20 @@ { switch (role) { case Qt::DisplayRole: - return QVariant(mEntry->text()); + return QVariant(mEntry->name()); case Qt::DecorationRole: - return QVariant(mEntry->makeIcon(mSize)); + { + QPixmap icon = mEntry->screenshot().isNull() ? + mEntry->icon() : + mEntry->screenshot(); + if (icon.isNull()) { + return HbIcon("qtg_large_application"); + } else { + return QVariant::fromValue(HbIcon(icon)); + } + } case TsDataRoles::Closable: - return QVariant(closable()); + return QVariant(mEntry->isClosable()); case TsDataRoles::Visible: return QVariant(true); default: @@ -73,7 +79,7 @@ */ void TsEntryModelItem::close() { - mService.executeCommand(mEntry->id(), QString("close")); + mEntry->close(); } /*! @@ -81,15 +87,6 @@ */ void TsEntryModelItem::open() { - mService.executeCommand(mEntry->id(), QString("open")); + mEntry->open(); } -/*! - Check if application represented by entry is running. - /return true if application is running, false otherwise -*/ -bool TsEntryModelItem::closable() const -{ - return (mEntry->flags().testFlag(RunningEntryFlag) && - !mEntry->flags().testFlag(SystemEntryFlag)); -} diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/src/tsmodel.cpp --- a/taskswitcherapp/tsdevicedialogplugin/src/tsmodel.cpp Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/src/tsmodel.cpp Wed Jun 23 17:05:06 2010 +0100 @@ -23,21 +23,16 @@ #include #include #include -#include - -#include -#include #include #ifdef Q_OS_SYMBIAN #include +#include const int TSDeviceDialogUid = 0x2002677F; const int ItemsLimit = 0x00000001; #endif -const char entryTypeKeyword[] = "application"; -const char applicationUidKeyword [] = "application:uid"; const int maxItems(10); /*! \class TsModel @@ -50,33 +45,15 @@ \param query used to create model \param pointer to parent object */ -TsModel::TsModel(CaService &applicationSrv, QObject &activitySrv, QObject *parent) : +TsModel::TsModel(TsTaskMonitor &applicationSrv, QObject &activitySrv, QObject *parent) : QAbstractListModel(parent), mEntries(), mApplicationService(applicationSrv), mActivityService(activitySrv), - mNotifier(NULL), mSize(240, 240), mMaxItems(maxItems) { - // creating query - mQuery.setEntryRoles(ItemEntryRole); - mQuery.addEntryTypeName(entryTypeKeyword); - mQuery.setFlagsOn(VisibleEntryFlag); - mQuery.setFlagsOff(MissingEntryFlag); - mQuery.setFlagsOn(UsedEntryFlag); - mQuery.setSort(LastUsedSortAttribute, Qt::DescendingOrder); - // requesting new data - updateModel(); - // creating notyfication filter - CaNotifierFilter filter(mQuery); - mNotifier = mApplicationService.createNotifier(filter); - connect(mNotifier, SIGNAL(entryChanged(CaEntry,ChangeType)), this, SLOT(entryChanged(CaEntry, ChangeType))); - connect(mNotifier, SIGNAL(entryTouched(int)), this, SLOT(updateModel())); - if (mQuery.parentId() > 0) { - connect(mNotifier, SIGNAL(groupContentChanged(int)), this, SLOT(updateModel())); - } - + #ifdef Q_OS_SYMBIAN XQSettingsManager *crManager = new XQSettingsManager; XQCentralRepositorySettingsKey itemsNumberKey(TSDeviceDialogUid, ItemsLimit); @@ -87,7 +64,12 @@ mMaxItems = number; } } + iAppArcSession.Connect(); #endif + + connect(&activitySrv, SIGNAL(dataChanged()), this, SLOT(updateModel())); + connect(&applicationSrv, SIGNAL(taskListChanged()), this, SLOT(updateModel())); + updateModel(); } /*! @@ -95,8 +77,10 @@ */ TsModel::~TsModel() { +#ifdef Q_OS_SYMBIAN + iAppArcSession.Close(); +#endif qDeleteAll(mEntries); - delete mNotifier; } /*! @@ -177,18 +161,11 @@ { //get running applications TsModelItem *entry(0); - QList< QSharedPointer > applications(mApplicationService.getEntries(mQuery)); - foreach(QSharedPointer application, applications) { - //CA entry ownership is transfered to model item - entry = new TsEntryModelItem(mApplicationService, application, mSize); - if (entry) { - //add running application filtering - if (entry->data(TsDataRoles::Closable).toBool() && //running application filtering - entry->data(TsDataRoles::Visible).toBool()) { //visible applications filtering - mEntries.append(entry); - } else { - delete entry; - } + QList< QSharedPointer > tasks(mApplicationService.taskList()); + foreach (QSharedPointer taskData, tasks) { + entry = new TsEntryModelItem(taskData); + if (0 != entry) { + mEntries.append(entry); } } } @@ -206,9 +183,9 @@ prepareActivityEntry(activity); entry = new TsActivityModelItem(*this, mActivityService, activity); if (entry) { - if (maxRowCount() <= mEntries.count()) { - break; - } + if (maxRowCount() <= mEntries.count()) { + break; + } if (entry->data(TsDataRoles::Visible).toBool()) { //visible activity filtering mEntries.append(entry); } else { @@ -235,32 +212,17 @@ */ QString TsModel::getApplicationName(int id) { - CaQuery query; QString retVal; - query.setEntryRoles(ItemEntryRole); - query.addEntryTypeName(entryTypeKeyword); - query.setAttribute(applicationUidKeyword, QString::number(id)); - QList< QSharedPointer > applications(mApplicationService.getEntries(query)); - if (applications.begin() != applications.end()) { - retVal = (*applications.begin())->text(); - } +#ifdef Q_OS_SYMBIAN + TApaAppInfo info; + iAppArcSession.GetAppInfo( info, TUid::Uid(id)); + retVal = QString::fromUtf16(info.iShortCaption.Ptr(), + info.iShortCaption.Length()); +#endif return retVal; } /*! - Called when some entry was changed - \param updatedEntry entry that was changed - \param change change type -*/ -void TsModel::entryChanged(CaEntry updatedEntry, - ChangeType change) -{ - Q_UNUSED(updatedEntry); - Q_UNUSED(change) - updateModel(); -} - -/*! Called when some item was changed \param itemPtr - address of updated item */ diff -r 11a8fa9275d5 -r 29d7e0a3b7b2 taskswitcherapp/tsdevicedialogplugin/tsdevicedialogplugin.pro --- a/taskswitcherapp/tsdevicedialogplugin/tsdevicedialogplugin.pro Tue May 18 12:12:12 2010 +0100 +++ b/taskswitcherapp/tsdevicedialogplugin/tsdevicedialogplugin.pro Wed Jun 23 17:05:06 2010 +0100 @@ -43,7 +43,7 @@ INCLUDEPATH += . \ ./inc \ -LIBS += -lcaclient +LIBS += -ltstaskmonitorclient TRANSLATIONS = taskswitcher.ts