--- a/homescreenapp/hsdomainmodel/src/hspage.cpp Thu May 27 12:46:08 2010 +0300
+++ b/homescreenapp/hsdomainmodel/src/hspage.cpp Fri Jun 11 13:30:16 2010 +0300
@@ -27,6 +27,7 @@
#include "hswidgethost.h"
#include "hswallpaper.h"
#include "hswidgetpositioningonwidgetadd.h"
+#include "hswidgetpositioningonorientationchange.h"
/*!
@@ -92,22 +93,18 @@
}
foreach (HsWidgetData data, datas) {
- QScopedPointer<HsWidgetHost> 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();
- if (widget->state() != HsWidgetHost::Initialized) {
- continue;
- }
- 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;
}
@@ -163,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();
@@ -215,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;
@@ -227,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<HsWidgetHost *> HsPage::widgets() const
@@ -264,6 +262,11 @@
mRemovable = removable;
}
+bool HsPage::isActivePage() const
+{
+ return this == HsScene::instance()->activePage();
+}
+
HsPage *HsPage::createInstance(const HsPageData &pageData)
{
HsDatabase *db = HsDatabase::instance();
@@ -336,14 +339,14 @@
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();
}
}
}
@@ -355,10 +358,11 @@
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)
@@ -366,9 +370,10 @@
widget->disconnect(this);
}
-void HsPage::onWidgetFinished(HsWidgetHost *widget)
+void HsPage::onWidgetFinished()
{
- Q_ASSERT(widget);
+ HsWidgetHost *widget = qobject_cast<HsWidgetHost *>(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)) {
@@ -376,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<HsWidgetHost *>(sender());
+
QRectF widgetRect = widget->geometry();
QRectF pageRect = HsScene::mainWindow()->layoutRect();
@@ -401,3 +411,59 @@
widget->setPos(widgetX, widgetY);
}
+void HsPage::onWidgetAvailable()
+{
+ HsWidgetHost *widget = qobject_cast<HsWidgetHost *>(sender());
+
+ mUnavailableWidgets.removeOne(widget);
+ mWidgets.append(widget);
+
+ widget->setParentItem(this);
+ widget->startWidget(isActivePage());
+ widget->show();
+}
+
+void HsPage::onWidgetUnavailable()
+{
+ HsWidgetHost *widget = qobject_cast<HsWidgetHost *>(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<QRectF> geometries = converter->convert(
+ from, QList<QRectF>() << widget->geometry(), to);
+ widget->setGeometry(geometries.first());
+ widget->savePresentation();
+ } else {
+ widget->setPos(presentation.pos());
+ widget->setZValue(presentation.zValue);
+ }
+ }
+}