diff -r 2e2dc3d30ca8 -r 341166945d65 homescreenapp/hsdomainmodel/src/hspage.cpp --- a/homescreenapp/hsdomainmodel/src/hspage.cpp Thu Jun 24 13:11:40 2010 +0100 +++ b/homescreenapp/hsdomainmodel/src/hspage.cpp Fri Jun 25 19:19:22 2010 +0300 @@ -15,26 +15,26 @@ * */ -#include -#include -#include #include #include "hsdomainmodeldatastructures.h" #include "hspage.h" +#include "hspagetoucharea.h" +#include "hspagenewwidgetlayout.h" #include "hsscene.h" #include "hsdatabase.h" #include "hswidgethost.h" #include "hswallpaper.h" #include "hswidgetpositioningonwidgetadd.h" #include "hswidgetpositioningonorientationchange.h" +#include "hsconfiguration.h" /*! \class HsPage - \ingroup group_hsutils + \ingroup group_hsdomainmodel \brief Represents a page in the framework. - HsPage is a parent for a group of widgets. HsPage can have a wallpaper. + HsPage contains group of widgets. HsPage can have a wallpaper. */ /*! @@ -46,11 +46,15 @@ HsPage::HsPage(QGraphicsItem* parent) : HbWidget(parent), mDatabaseId(-1), - mRemovable(true) + mWallpaper(0), + mRemovable(true), + mTouchArea(0) { setFlag(QGraphicsItem::ItemHasNoContents); setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored)); + + setupTouchArea(); } /*! @@ -58,6 +62,7 @@ */ HsPage::~HsPage() { + delete mWallpaper; } /*! @@ -76,6 +81,15 @@ mDatabaseId = id; } +void HsPage::setGeometry(const QRectF &rect) +{ + if (mTouchArea) { + mTouchArea->resize(rect.size()); + } + + HbWidget::setGeometry(rect); +} + /*! Loads widgets. */ @@ -92,13 +106,17 @@ return false; } + if (HSCONFIGURATION_GET(sceneType) == HsConfiguration::PageWallpapers) { + mWallpaper = new HsPageWallpaper(this); + } + foreach (HsWidgetData data, datas) { HsWidgetHost *widget = new HsWidgetHost(data.id); mWidgets.append(widget); connectWidget(widget); widget->setPage(this); widget->setParentItem(this); - widget->startWidget(); + widget->startWidget(isDefaultPage()); } connect(HsScene::mainWindow(), @@ -108,6 +126,16 @@ return true; } +/*! + Return wallpaper. +*/ +HsWallpaper *HsPage::wallpaper() const +{ + return mWallpaper; +} +/*! + Add given existing \a widgetHost to a page. Returns true if successful +*/ bool HsPage::addExistingWidget(HsWidgetHost *widgetHost) { if (!widgetHost) { @@ -128,7 +156,10 @@ return true; } - +/*! + Remove given \a widgetHost from a page. Widget is not deleted. + Returns true if successful +*/ bool HsPage::removeWidget(HsWidgetHost *widgetHost) { if (!widgetHost || !widgetHost->setPage(0)) { @@ -141,7 +172,10 @@ return true; } - +/*! + Returns list of new widgets belonging to a page. Widgets which are + not yet layouted are considered as new widgets. +*/ QList HsPage::newWidgets() { return mNewWidgets; @@ -150,8 +184,10 @@ /*! Adds new widget into a page. Returns true if successfull. */ -bool HsPage::addNewWidget(HsWidgetHost* widgetHost) +bool HsPage::addNewWidget(HsWidgetHost* widgetHost, const QPointF &touchPoint) { + mTouchPoint = touchPoint; + if (!widgetHost || mWidgets.contains(widgetHost)) { return false; } @@ -164,7 +200,7 @@ presentation.orientation = HsScene::orientation(); if (!widgetHost->getPresentation(presentation)) { presentation.orientation = HsScene::orientation(); - presentation.setPos(QPointF()); + presentation.setPos(mTouchPoint); presentation.zValue = 0; widgetHost->savePresentation(presentation); } @@ -188,28 +224,16 @@ return; } - QString key = HsScene::orientation() == Qt::Horizontal ? - "landscape" : "portrait"; - - QList rects; - - foreach (HsWidgetHost *newWidget, mNewWidgets) { - rects << newWidget->rect(); - } - - HsWidgetPositioningOnWidgetAdd *algorithm = - HsWidgetPositioningOnWidgetAdd::instance(); - - QList calculatedRects = - algorithm->convert(HsScene::mainWindow()->layoutRect(), rects, QPointF()); - + HsPageNewWidgetLayout *newWidgetLayout = static_cast(layout()); + if (!newWidgetLayout) { + newWidgetLayout = new HsPageNewWidgetLayout(mTouchPoint); + setLayout(newWidgetLayout); + } updateZValues(); - HsWidgetHost *widget = 0; for (int i = 0; i < mNewWidgets.count(); ++i) { widget = mNewWidgets.at(i); - widget->setGeometry(calculatedRects.at(i)); - widget->savePresentation(); + newWidgetLayout->addItem(widget); widget->setPage(this); widget->setParentItem(this); widget->showWidget(); @@ -219,14 +243,16 @@ mNewWidgets.clear(); } - +/*! + Remove page and all it's contained widgets from database +*/ bool HsPage::deleteFromDatabase() { foreach (HsWidgetHost *widget, mWidgets) { widget->remove(); } mWidgets.clear(); - + foreach (HsWidgetHost *widget, mNewWidgets) { widget->remove(); } @@ -239,7 +265,9 @@ return HsDatabase::instance()->deletePage(mDatabaseId); } - +/*! + Return list of widgets belonging to a page +*/ QList HsPage::widgets() const { return mWidgets; @@ -261,12 +289,23 @@ { mRemovable = removable; } - +/*! + Return true if page is default page. +*/ +bool HsPage::isDefaultPage() const +{ + return mDatabaseId == HSCONFIGURATION_GET(defaultPageId); +} +/*! + Return true if page is active page. +*/ bool HsPage::isActivePage() const { return this == HsScene::instance()->activePage(); } - +/*! + Create page into database and return instance of a new page. +*/ HsPage *HsPage::createInstance(const HsPageData &pageData) { HsDatabase *db = HsDatabase::instance(); @@ -318,7 +357,10 @@ widget->setOnline(online); } } - +/*! + Update widgets z-values and persist those. Active widget has top most + z-value. +*/ void HsPage::updateZValues() { int z = 0; @@ -350,12 +392,24 @@ } } } - +/*! + Return this page's index. +*/ int HsPage::pageIndex() { return HsScene::instance()->pages().indexOf(this); } - +/*! + Create touch area for page. +*/ +void HsPage::setupTouchArea() +{ + mTouchArea = new HsPageTouchArea(this); + mTouchArea->setZValue(-1); +} +/*! + Utility to connect widget signals to page. +*/ void HsPage::connectWidget(HsWidgetHost *widget) { connect(widget, SIGNAL(finished()), SLOT(onWidgetFinished())); @@ -364,12 +418,16 @@ connect(widget, SIGNAL(available()), SLOT(onWidgetAvailable())); connect(widget, SIGNAL(unavailable()), SLOT(onWidgetUnavailable())); } - +/*! + Disconnect widget signals from page +*/ void HsPage::disconnectWidget(HsWidgetHost *widget) { widget->disconnect(this); } - +/*! + Disconnect and remove widget +*/ void HsPage::onWidgetFinished() { HsWidgetHost *widget = qobject_cast(sender()); @@ -383,38 +441,38 @@ disconnectWidget(widget); widget->remove(); } - +/*! + Remove widget if it faulted +*/ void HsPage::onWidgetFaulted() { onWidgetFinished(); } /*! - Calculates new widget position on page when widget size changes + Calculates new widget position on page when widget size changes. If page has layout then there are new widgets + and we use layout to calculate new widget positions. */ void HsPage::onWidgetResized() { + if ( !layout() ) { + HsWidgetHost *widget = qobject_cast(sender()); + QRectF widgetRect = widget->geometry(); + QRectF pageRect = HsScene::mainWindow()->layoutRect(); + qreal widgetX = qBound(qreal(0), widgetRect.x(), pageRect.width() - widgetRect.width()); + qreal widgetY = qBound(qreal(64), widgetRect.y(), pageRect.height() - widgetRect.height()); + widget->setPos(widgetX, widgetY); + } else { + layout()->invalidate(); + } +} +/*! + Show widget if it came available +*/ +void HsPage::onWidgetAvailable() +{ HsWidgetHost *widget = qobject_cast(sender()); - QRectF widgetRect = widget->geometry(); - - QRectF pageRect = HsScene::mainWindow()->layoutRect(); - - qreal lowerBoundX = 0; - - qreal upperBoundX = pageRect.width() - widgetRect.width() / 2 - 10; - upperBoundX = pageRect.width() - widgetRect.width(); - - qreal widgetX = qBound(lowerBoundX, widgetRect.x(), upperBoundX); - qreal widgetY = qBound(qreal(64), widgetRect.y(), pageRect.height() - widgetRect.height()); - - widget->setPos(widgetX, widgetY); -} - -void HsPage::onWidgetAvailable() -{ - HsWidgetHost *widget = qobject_cast(sender()); - mUnavailableWidgets.removeOne(widget); mWidgets.append(widget); @@ -422,7 +480,9 @@ widget->startWidget(isActivePage()); widget->show(); } - +/*! + Update internal bookkeeping and hide widget +*/ void HsPage::onWidgetUnavailable() { HsWidgetHost *widget = qobject_cast(sender()); @@ -440,11 +500,14 @@ widget->hide(); widget->setParentItem(0); } - +/*! + Run positioning algorithm for widgets which don't have position on + target orientation. Otherwise set orientation positions for widgets. +*/ void HsPage::onOrientationChanged(Qt::Orientation orientation) { - QRectF rect = HsScene::mainWindow()->layoutRect(); - + QRectF rect = HsScene::mainWindow()->layoutRect(); + HsWidgetPositioningOnOrientationChange *converter = HsWidgetPositioningOnOrientationChange::instance(); @@ -465,5 +528,15 @@ widget->setPos(presentation.pos()); widget->setZValue(presentation.zValue); } - } + } } + +/*! + Clears new widgets list and resets layout. +*/ +void HsPage::resetNewWidgets() +{ + mNewWidgets.clear(); + setLayout(0); +} +