homescreenapp/hsdomainmodel/src/hspage.cpp
changeset 36 cdae8c6c3876
parent 35 f9ce957a272c
child 39 4e8ebe173323
--- a/homescreenapp/hsdomainmodel/src/hspage.cpp	Fri Mar 19 09:27:44 2010 +0200
+++ b/homescreenapp/hsdomainmodel/src/hspage.cpp	Fri Apr 16 14:54:01 2010 +0300
@@ -16,16 +16,15 @@
 */
 
 #include <QPainter>
+#include <QRectF>
 #include <QGraphicsLinearLayout>
 #include <HbInstance>
 
+#include "hsdomainmodeldatastructures.h"
 #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"
 
@@ -51,6 +50,9 @@
     setFlag(QGraphicsItem::ItemHasNoContents);
     setSizePolicy(QSizePolicy(QSizePolicy::Ignored, 
                               QSizePolicy::Ignored));
+                              
+    mStartPoint["portrait"] = QPointF();                              
+    mStartPoint["landscape"] = QPointF();                              
 }
 
 /*!
@@ -81,35 +83,31 @@
 */
 bool HsPage::load()
 {
-    HsDatabase *db = HsDatabase::instance();
-    Q_ASSERT(db);
+    if (mDatabaseId < 0) {
+        return false;
+    }
 
-    HsPageData pageData;
-    if (!db->page(mDatabaseId, pageData, true)) {
+    HsDatabase *db = HsDatabase::instance();
+    
+    QList<HsWidgetData> datas;
+    if (!db->widgets(mDatabaseId, datas)) {
         return false;
     }
 
-    QList<HsWidgetData> 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;
+    foreach (HsWidgetData data, datas) {
+        QScopedPointer<HsWidgetHost> widget(new HsWidgetHost(data.id));
+        if(!widget->load() || !widget->isValid()) {
+            continue;
 		}
-
+        connectWidget(widget.data());
         widget->setPage(this);
-        mWidgets << widget;
+        widget->initializeWidget();
+        widget->showWidget();
+        mWidgets.append(widget.data());
+        widget->setParentItem(this);
+        widget.take(); // now this page owns widget
     }
 
-    foreach (HsWidgetHost *widget, mWidgets) {
-        widget->initializeWidget();
-        widget->showWidget();
-        widget->setParentItem(this);
-    }
-    
     return true;    
 }
 
@@ -171,17 +169,16 @@
 
     HsWidgetPresentationData presentation;
     if (!widgetHost->widgetPresentationData(key, presentation)) {
-        presentation.setKey(key);
-        presentation.setPosition(QPointF());
+        presentation.key = key;
+        presentation.setPos(QPointF());
         presentation.setSize(widgetHost->preferredSize());
-        presentation.setZValue(0);       
+        presentation.zValue = 0;
         widgetHost->setWidgetPresentationData(presentation);
     }
 
     widgetHost->hide();
-    widgetHost->setGeometry(QRectF(presentation.position(), 
-                                   presentation.size()));
-    widgetHost->setZValue(presentation.zValue());   
+    widgetHost->setGeometry(presentation.geometry());
+    widgetHost->setZValue(presentation.zValue);
     
     connectWidget(widgetHost);
     mNewWidgets << widgetHost;
@@ -194,29 +191,39 @@
 */
 void HsPage::layoutNewWidgets()
 {
-    QList<QRectF> oldWidgetGeometries;
+    if (mNewWidgets.isEmpty()) {
+        return;
+    }
+    
+    QString key = HsScene::orientation() == Qt::Horizontal ? 
+        "landscape" : "portrait";
 
-    foreach(HsWidgetHost *widget, mNewWidgets) {
-        oldWidgetGeometries << widget->rect();
-    }
+    QList<QRectF> rects;
 
-    QList<QRectF> newWidgetGeometries = 
-        HsWidgetPositioningOnWidgetAdd::instance()->convert(
-        rect().adjusted(10, 10, -10, -10),
-        oldWidgetGeometries);
-
+    foreach (HsWidgetHost *newWidget, mNewWidgets) {
+        rects << newWidget->rect();
+    }
+    
+    HsWidgetPositioningOnWidgetAdd *algorithm = 
+        HsWidgetPositioningOnWidgetAdd::instance();
+   
+    QList<QRectF> calculatedRects = 
+        algorithm->convert(HsScene::mainWindow()->layoutRect(), rects, mStartPoint[key]);
+    
     updateZValues();
 
-    HsWidgetHost *widget = NULL;
-    for(int i = 0; i < mNewWidgets.count(); ++i) {  
-        widget = mNewWidgets[i];
-        widget->setGeometry(newWidgetGeometries[i]);
+    HsWidgetHost *widget = 0;
+    for (int i = 0; i < mNewWidgets.count(); ++i) {
+        widget = mNewWidgets.at(i);
+        widget->setGeometry(calculatedRects.at(i));
         widget->setWidgetPresentation();
         widget->setPage(this);
         widget->setParentItem(this);
         widget->show();
-        mWidgets << widget;
     }
+    mStartPoint[key] = widget->geometry().bottomRight();
+    mWidgets << mNewWidgets;
+    mNewWidgets.clear();
 }
 
 /*!
@@ -229,24 +236,18 @@
 
 bool HsPage::deleteFromDatabase()
 {
-    HsDatabase *db = HsDatabase::instance();
-    Q_ASSERT(db);
-
-    db->transaction();
-
+    HsDatabase *db = HsDatabase::instance();    
+    
     foreach (HsWidgetHost *widget, mWidgets) {
-        if (!widget->deleteFromDatabase()) {
-            db->rollback();
+        if (!widget->deleteFromDatabase()) {            
             return false;
         }
     }
 
     if (!db->deletePage(mDatabaseId))  {
-        db->rollback();
         return false;
     }
 
-    db->commit();
     return true;
 }
 
@@ -274,39 +275,79 @@
 
 bool HsPage::updateZValues()
 {
-    if (mWidgets.isEmpty()) {
-        return true;
-    }
-    
-    QMultiMap<qreal, HsWidgetHost *> map;
-    foreach (HsWidgetHost *widget, mWidgets) {
-        map.insert(widget->zValue(), widget);
-    }
-    
-    QList<HsWidgetHost *> sortedWidgets = map.values();
-            
-    HsWidgetHost *activeWidget = HsScene::instance()->activeWidget();    
-    if (sortedWidgets.contains(activeWidget)) {
-        sortedWidgets.removeOne(activeWidget);
-        sortedWidgets.append(activeWidget);        
+    int z = 0;
+
+    if (!mWidgets.isEmpty()) {
+        QMultiMap<qreal, HsWidgetHost *> map;
+        foreach (HsWidgetHost *widget, mWidgets) {
+            map.insert(widget->zValue(), widget);
+        }
+        
+        QList<HsWidgetHost *> sortedWidgets = map.values();
+                
+        HsWidgetHost *activeWidget = HsScene::instance()->activeWidget();    
+        if (sortedWidgets.contains(activeWidget)) {
+            sortedWidgets.removeOne(activeWidget);
+            sortedWidgets.append(activeWidget);        
+        }
+        
+        foreach (HsWidgetHost *widget, sortedWidgets) {
+            widget->setZValue(z++);
+            widget->setWidgetPresentation();
+        }
     }
 
-    int z = 0;
-    foreach (HsWidgetHost *widget, sortedWidgets) {
-        widget->setZValue(z++);
-        widget->setWidgetPresentation();
-    }
-
-    foreach (HsWidgetHost *widget, mNewWidgets) {
-        widget->setZValue(z++);
-        widget->setWidgetPresentation();
+    if (!mNewWidgets.isEmpty()) {
+        foreach (HsWidgetHost *widget, mNewWidgets) {
+            widget->setZValue(z++);
+            widget->setWidgetPresentation();
+        }
     }
 
     return true;
 }
+
+HsPage *HsPage::createInstance(const HsPageData &pageData)
+{
+    HsDatabase *db = HsDatabase::instance();
+    Q_ASSERT(db);
+    
+    HsPageData data(pageData);    
+    if (db->insertPage(data)) {
+        HsPage *page = new HsPage;
+        page->setDatabaseId(data.id);
+        return page;
+    }
+
+    return 0;
+}
+
+/*!
+    Calls onShow() for contained widgets.
+*/
+void HsPage::showWidgets()
+{
+    foreach (HsWidgetHost *widget, mWidgets) {
+        if (widget->parentItem() == this) {
+            widget->showWidget();
+        }
+    }
+}
+ 
+/*!
+    Calls onHide() for contained widgets.
+*/
+void HsPage::hideWidgets()
+{
+    foreach (HsWidgetHost *widget, mWidgets) {
+        if (widget->parentItem() == this) {
+            widget->hideWidget();
+        }
+    }
+}
+
 /*!
     Propogate online state to widgets.
-
 */
 void HsPage::setOnline(bool online)
 {
@@ -318,21 +359,6 @@
     }
 }
 
-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*)),
@@ -346,14 +372,13 @@
 
 void HsPage::onWidgetFinished(HsWidgetHost *widget)
 {
-    if (mNewWidgets.contains(widget)) {
-        mNewWidgets.removeOne(widget);
-    } else if (mWidgets.contains(widget)) {
-        mWidgets.removeOne(widget);        
-    } else {
-        return;
+    Q_ASSERT(widget);
+    // 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)) {
+        mWidgets.removeOne(widget);
     }
-
+   
     disconnectWidget(widget);
     widget->uninitializeWidget();
     widget->deleteFromDatabase();