homescreenapp/hsdomainmodel/src/hspage.cpp
changeset 46 23b5d6a29cce
parent 39 4e8ebe173323
child 51 4785f57bf3d4
--- a/homescreenapp/hsdomainmodel/src/hspage.cpp	Mon May 03 12:24:59 2010 +0300
+++ b/homescreenapp/hsdomainmodel/src/hspage.cpp	Fri May 14 15:43:04 2010 +0300
@@ -48,7 +48,7 @@
       mRemovable(true)
 {
     setFlag(QGraphicsItem::ItemHasNoContents);
-    setSizePolicy(QSizePolicy(QSizePolicy::Ignored, 
+    setSizePolicy(QSizePolicy(QSizePolicy::Ignored,
                               QSizePolicy::Ignored));
 }
 
@@ -66,7 +66,7 @@
 {
     return mDatabaseId;
 }
- 
+
 /*!
     Sets the database id to \a id.
 */
@@ -85,7 +85,7 @@
     }
 
     HsDatabase *db = HsDatabase::instance();
-    
+
     QList<HsWidgetData> datas;
     if (!db->widgets(mDatabaseId, datas)) {
         return false;
@@ -105,7 +105,7 @@
         widget.take(); // now this page owns widget
     }
 
-    return true;    
+    return true;
 }
 
 bool HsPage::addExistingWidget(HsWidgetHost *widgetHost)
@@ -113,7 +113,7 @@
     if (!widgetHost) {
         return false;
     }
-    
+
     if (mWidgets.contains(widgetHost)) {
         return true;
     }
@@ -125,7 +125,7 @@
     connectWidget(widgetHost);
     mWidgets << widgetHost;
     widgetHost->setParentItem(this);
-    
+
     return true;
  }
 
@@ -148,7 +148,7 @@
 }
 
 /*!
-    Adds new widget into a page. Returns true if successfull. 
+    Adds new widget into a page. Returns true if successfull.
 */
 bool HsPage::addNewWidget(HsWidgetHost* widgetHost)
 {
@@ -159,9 +159,9 @@
     if (mNewWidgets.contains(widgetHost)) {
         return true;
     }
-    
+
     // Set presentation.
-    QString key = HsScene::orientation() == Qt::Horizontal ? 
+    QString key = HsScene::orientation() == Qt::Horizontal ?
         "landscape" : "portrait";
 
     HsWidgetPresentationData presentation;
@@ -175,7 +175,7 @@
     widgetHost->hide();
     widgetHost->setPos(presentation.x, presentation.y);
     widgetHost->setZValue(presentation.zValue);
-    
+
     connectWidget(widgetHost);
     mNewWidgets << widgetHost;
 
@@ -190,8 +190,8 @@
     if (mNewWidgets.isEmpty()) {
         return;
     }
-    
-    QString key = HsScene::orientation() == Qt::Horizontal ? 
+
+    QString key = HsScene::orientation() == Qt::Horizontal ?
         "landscape" : "portrait";
 
     QList<QRectF> rects;
@@ -199,13 +199,13 @@
     foreach (HsWidgetHost *newWidget, mNewWidgets) {
         rects << newWidget->rect();
     }
-    
-    HsWidgetPositioningOnWidgetAdd *algorithm = 
+
+    HsWidgetPositioningOnWidgetAdd *algorithm =
         HsWidgetPositioningOnWidgetAdd::instance();
-   
-    QList<QRectF> calculatedRects = 
+
+    QList<QRectF> calculatedRects =
         algorithm->convert(HsScene::mainWindow()->layoutRect(), rects, QPointF());
-    
+
     updateZValues();
 
     HsWidgetHost *widget = 0;
@@ -224,10 +224,10 @@
 
 bool HsPage::deleteFromDatabase()
 {
-    HsDatabase *db = HsDatabase::instance();    
-    
+    HsDatabase *db = HsDatabase::instance();
+
     foreach (HsWidgetHost *widget, mWidgets) {
-        if (!widget->deleteFromDatabase()) {            
+        if (!widget->deleteFromDatabase()) {
             return false;
         }
     }
@@ -250,7 +250,7 @@
 */
 bool HsPage::isRemovable() const
 {
-    return mRemovable; 
+    return mRemovable;
 }
 
 /*!
@@ -258,15 +258,15 @@
 */
 void HsPage::setRemovable(bool removable)
 {
-    mRemovable = removable; 
+    mRemovable = removable;
 }
 
 HsPage *HsPage::createInstance(const HsPageData &pageData)
 {
     HsDatabase *db = HsDatabase::instance();
     Q_ASSERT(db);
-    
-    HsPageData data(pageData);    
+
+    HsPageData data(pageData);
     if (db->insertPage(data)) {
         HsPage *page = new HsPage;
         page->setDatabaseId(data.id);
@@ -287,7 +287,7 @@
         }
     }
 }
- 
+
 /*!
     Calls onHide() for contained widgets.
 */
@@ -322,15 +322,15 @@
         foreach (HsWidgetHost *widget, mWidgets) {
             map.insert(widget->zValue(), widget);
         }
-        
+
         QList<HsWidgetHost *> sortedWidgets = map.values();
-                
-        HsWidgetHost *activeWidget = HsScene::instance()->activeWidget();    
+
+        HsWidgetHost *activeWidget = HsScene::instance()->activeWidget();
         if (sortedWidgets.contains(activeWidget)) {
             sortedWidgets.removeOne(activeWidget);
-            sortedWidgets.append(activeWidget);        
+            sortedWidgets.append(activeWidget);
         }
-        
+
         foreach (HsWidgetHost *widget, sortedWidgets) {
             widget->setZValue(z++);
             widget->setWidgetPresentation();
@@ -349,8 +349,10 @@
 {
     connect(widget, SIGNAL(widgetFinished(HsWidgetHost*)),
             SLOT(onWidgetFinished(HsWidgetHost*)));
+    connect(widget, SIGNAL(widgetResized(HsWidgetHost*)),
+            SLOT(onWidgetResized(HsWidgetHost*)));
 }
- 
+
 void HsPage::disconnectWidget(HsWidgetHost *widget)
 {
     widget->disconnect(this);
@@ -364,9 +366,30 @@
     if (!mNewWidgets.removeOne(widget)) {
         mWidgets.removeOne(widget);
     }
-   
+
     disconnectWidget(widget);
     widget->uninitializeWidget();
     widget->deleteFromDatabase();
     widget->deleteLater();
 }
+
+/*!
+    Calculates new widget position on page when widget size changes
+*/
+void HsPage::onWidgetResized(HsWidgetHost *widget)
+{
+    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);
+}
+