homescreenapp/hsutils/src/hswidgetpositioningonorientationchange.cpp
branchRCL_3
changeset 82 5f0182e07bfb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/src/hswidgetpositioningonorientationchange.cpp	Tue Aug 31 15:06:34 2010 +0300
@@ -0,0 +1,149 @@
+/*
+* 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 <QtGlobal>
+#include "hswidgetpositioningonorientationchange.h"
+
+
+
+/*!
+    \class HsWidgetPositioningOnOrientationChange
+    \ingroup group_hsutils
+    \brief Defines widget positioning on orientation change.
+
+    Widget positioning on orientation change sets positions for
+    a set of home screen widgets from landscape to portrait
+    orientation and vice versa.
+*/
+
+/*!
+    Sets the positioning \a instance as the current one.
+    Deletes the existing instance if present.
+*/
+void HsWidgetPositioningOnOrientationChange::setInstance(
+    HsWidgetPositioningOnOrientationChange *instance)
+{
+    if (mInstance)
+        delete mInstance;
+    mInstance = instance;
+}
+
+/*!
+    Returns the current positioning instance.
+*/
+HsWidgetPositioningOnOrientationChange *HsWidgetPositioningOnOrientationChange::instance()
+{
+    return mInstance;
+}
+
+/*!
+    Stores the current positioning instance.
+*/
+HsWidgetPositioningOnOrientationChange *HsWidgetPositioningOnOrientationChange::mInstance = 0;
+
+/*!
+    \class HsSimpleWidgetPositioningOnOrientationChange
+    \brief Bounds center points of input geometries to
+           the given output rectangle.
+*/
+
+/*!
+    \class HsAdvancedWidgetPositioningOnOrientationChange
+    \brief More advanced widget positioning algorithm.
+
+    Calculates new center points of
+    \a fromGeometries when moving from \a fromRect to \a toRect.
+    Screen is divided to two pieces:
+    \verbatim
+    ------
+    | A  |
+    |    |
+    ------
+    | B  |
+    |    |
+    ------
+    \endverbatim
+    and after conversion widgets from A are moved to A' and widgets from B to B':
+    \verbatim
+    |-----|-----|
+    |A'   | B'  |
+    |-----|-----|
+    \endverbatim
+    and vice versa.
+*/
+QList<QRectF> HsAdvancedWidgetPositioningOnOrientationChange::convert(
+    const QRectF &fromRect,
+    const QList<QRectF> &fromGeometries,
+    const QRectF &toRect)
+{
+    QList<QRectF> toGeometries;
+
+    // Portrait -> Landscape
+    if (fromRect.width() < fromRect.height()) {
+        foreach (QRectF g, fromGeometries) {
+            
+            QRectF tg(g.topLeft() - fromRect.topLeft(), g.size());
+            
+            qreal x = tg.center().x() / fromRect.width();
+            qreal y = tg.center().y() / (fromRect.height() / 2);
+
+            if (y < 1) {
+                x *= toRect.width() / 2;
+                y *= toRect.height();
+            } else {
+                x *= toRect.width() / 2;
+                x += toRect.width() / 2;
+                y -= 1;
+                y *= toRect.height();
+            }
+            
+            x = qBound(g.width() / 2, x, toRect.width() - g.width() / 2);
+            y = qBound(g.height() / 2, y, toRect.height() - g.height() / 2);
+
+            g.moveCenter(QPointF(x, y) + toRect.topLeft());
+
+            toGeometries.append(g);
+        }
+    } else { // Landscape -> Portrait
+        foreach (QRectF g, fromGeometries) {
+            
+            QRectF tg(g.topLeft() - fromRect.topLeft(), g.size());
+            
+            qreal x = tg.center().x() / (fromRect.width() / 2);
+            qreal y = tg.center().y() / fromRect.height();
+
+            if (x < 1) {
+                x *= toRect.width();
+                y *= toRect.height() / 2;
+            } else {
+                x -= 1;
+                x += toRect.width();
+                y *= toRect.height() / 2;
+                y += toRect.height() / 2;
+            }
+            
+            x = qBound(g.width() / 2, x, toRect.width() - g.width() / 2);
+            y = qBound(g.height() / 2, y, toRect.height() - g.height() / 2);
+
+            g.moveCenter(QPointF(x, y) + toRect.topLeft());
+
+            toGeometries.append(g);
+        }
+    }
+
+    return toGeometries;
+}