diff -r c743ef5928ba -r f9ce957a272c homescreenapp/hsdomainmodel/src/hspage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsdomainmodel/src/hspage.cpp Fri Mar 19 09:27:44 2010 +0200 @@ -0,0 +1,361 @@ +/* +* 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 +#include + +#include "hspage.h" +#include "hsscene.h" +#include "hsdatabase.h" +#include "hswidgethost.h" +#include "hswidgetdata.h" +#include "hswidgetpresentationdata.h" +#include "hspagedata.h" +#include "hswallpaper.h" +#include "hswidgetpositioningonwidgetadd.h" + + +/*! + \class HsPage + \ingroup group_hsutils + \brief Represents a page in the framework. + HsPage is a parent for a group of widgets. HsPage can have a wallpaper. +*/ + +/*! + Constructor. + + \a parent Owner. + \a aFlags Window flags. +*/ +HsPage::HsPage(QGraphicsItem* parent) + : HbWidget(parent), + mDatabaseId(-1), + mRemovable(true) +{ + setFlag(QGraphicsItem::ItemHasNoContents); + setSizePolicy(QSizePolicy(QSizePolicy::Ignored, + QSizePolicy::Ignored)); +} + +/*! + Destructor. +*/ +HsPage::~HsPage() +{ +} + +/*! + Returns the database id. +*/ +int HsPage::databaseId() const +{ + return mDatabaseId; +} + +/*! + Sets the database id to \a id. +*/ +void HsPage::setDatabaseId(int id) +{ + mDatabaseId = id; +} + +/*! + Loads widgets. +*/ +bool HsPage::load() +{ + HsDatabase *db = HsDatabase::instance(); + Q_ASSERT(db); + + HsPageData pageData; + if (!db->page(mDatabaseId, pageData, true)) { + return false; + } + + QList widgetDatas = pageData.widgets(); + foreach (HsWidgetData widgetData, widgetDatas) { + HsWidgetHost *widget = new HsWidgetHost(widgetData.id()); + connectWidget(widget); + widget->load(); + + if (!widget->isValid()) { + qDebug() << "HsPage: Widget loading failed."; + continue; + } + + widget->setPage(this); + mWidgets << widget; + } + + foreach (HsWidgetHost *widget, mWidgets) { + widget->initializeWidget(); + widget->showWidget(); + widget->setParentItem(this); + } + + return true; +} + +bool HsPage::addExistingWidget(HsWidgetHost *widgetHost) +{ + if (!widgetHost) { + return false; + } + + if (mWidgets.contains(widgetHost)) { + return true; + } + + if (!widgetHost->setPage(this)) { + return false; + } + + connectWidget(widgetHost); + mWidgets << widgetHost; + widgetHost->setParentItem(this); + + return true; + } + +bool HsPage::removeWidget(HsWidgetHost *widgetHost) +{ + if (!widgetHost || !widgetHost->setPage(0)) { + return false; + } + + disconnectWidget(widgetHost); + mWidgets.removeOne(widgetHost); + widgetHost->setParentItem(0); + + return true; +} + +QList HsPage::newWidgets() +{ + return mNewWidgets; +} + +/*! + Adds new widget into a page. Returns true if successfull. +*/ +bool HsPage::addNewWidget(HsWidgetHost* widgetHost) +{ + if (!widgetHost || mWidgets.contains(widgetHost)) { + return false; + } + + if (mNewWidgets.contains(widgetHost)) { + return true; + } + + // Set presentation. + QString key = HsScene::orientation() == Qt::Horizontal ? + "landscape" : "portrait"; + + HsWidgetPresentationData presentation; + if (!widgetHost->widgetPresentationData(key, presentation)) { + presentation.setKey(key); + presentation.setPosition(QPointF()); + presentation.setSize(widgetHost->preferredSize()); + presentation.setZValue(0); + widgetHost->setWidgetPresentationData(presentation); + } + + widgetHost->hide(); + widgetHost->setGeometry(QRectF(presentation.position(), + presentation.size())); + widgetHost->setZValue(presentation.zValue()); + + connectWidget(widgetHost); + mNewWidgets << widgetHost; + + return true; +} + +/*! + Layouts all the new widgets +*/ +void HsPage::layoutNewWidgets() +{ + QList oldWidgetGeometries; + + foreach(HsWidgetHost *widget, mNewWidgets) { + oldWidgetGeometries << widget->rect(); + } + + QList newWidgetGeometries = + HsWidgetPositioningOnWidgetAdd::instance()->convert( + rect().adjusted(10, 10, -10, -10), + oldWidgetGeometries); + + updateZValues(); + + HsWidgetHost *widget = NULL; + for(int i = 0; i < mNewWidgets.count(); ++i) { + widget = mNewWidgets[i]; + widget->setGeometry(newWidgetGeometries[i]); + widget->setWidgetPresentation(); + widget->setPage(this); + widget->setParentItem(this); + widget->show(); + mWidgets << widget; + } +} + +/*! + Resets the new widgets list +*/ +void HsPage::resetNewWidgets() +{ + mNewWidgets.clear(); +} + +bool HsPage::deleteFromDatabase() +{ + HsDatabase *db = HsDatabase::instance(); + Q_ASSERT(db); + + db->transaction(); + + foreach (HsWidgetHost *widget, mWidgets) { + if (!widget->deleteFromDatabase()) { + db->rollback(); + return false; + } + } + + if (!db->deletePage(mDatabaseId)) { + db->rollback(); + return false; + } + + db->commit(); + return true; +} + +QList HsPage::widgets() const +{ + return mWidgets; +} + +/*! + Returns true if the page can be removed. Otherwise, + returns false. +*/ +bool HsPage::isRemovable() const +{ + return mRemovable; +} + +/*! + Sets removable flag to \a removable. +*/ +void HsPage::setRemovable(bool removable) +{ + mRemovable = removable; +} + +bool HsPage::updateZValues() +{ + if (mWidgets.isEmpty()) { + return true; + } + + QMultiMap map; + foreach (HsWidgetHost *widget, mWidgets) { + map.insert(widget->zValue(), widget); + } + + QList sortedWidgets = map.values(); + + HsWidgetHost *activeWidget = HsScene::instance()->activeWidget(); + if (sortedWidgets.contains(activeWidget)) { + sortedWidgets.removeOne(activeWidget); + sortedWidgets.append(activeWidget); + } + + int z = 0; + foreach (HsWidgetHost *widget, sortedWidgets) { + widget->setZValue(z++); + widget->setWidgetPresentation(); + } + + foreach (HsWidgetHost *widget, mNewWidgets) { + widget->setZValue(z++); + widget->setWidgetPresentation(); + } + + return true; +} +/*! + Propogate online state to widgets. + +*/ +void HsPage::setOnline(bool online) +{ + foreach (HsWidgetHost *widget, mNewWidgets) { + widget->setOnline(online); + } + foreach (HsWidgetHost *widget, mWidgets) { + widget->setOnline(online); + } +} + +HsPage *HsPage::createInstance(const HsPageData &pageData) +{ + HsDatabase *db = HsDatabase::instance(); + Q_ASSERT(db); + + HsPageData data(pageData); + if (!db->insertPage(data)) { + return 0; + } + + HsPage *page = new HsPage; + page->setDatabaseId(data.id()); + return page; +} + +void HsPage::connectWidget(HsWidgetHost *widget) +{ + connect(widget, SIGNAL(widgetFinished(HsWidgetHost*)), + SLOT(onWidgetFinished(HsWidgetHost*))); +} + +void HsPage::disconnectWidget(HsWidgetHost *widget) +{ + widget->disconnect(this); +} + +void HsPage::onWidgetFinished(HsWidgetHost *widget) +{ + if (mNewWidgets.contains(widget)) { + mNewWidgets.removeOne(widget); + } else if (mWidgets.contains(widget)) { + mWidgets.removeOne(widget); + } else { + return; + } + + disconnectWidget(widget); + widget->uninitializeWidget(); + widget->deleteFromDatabase(); + widget->deleteLater(); +}