diff -r f00a6757af32 -r 5f0182e07bfb homescreenapp/hsutils/src/hswidgetpositioningonorientationchange.cpp --- /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 +#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 HsAdvancedWidgetPositioningOnOrientationChange::convert( + const QRectF &fromRect, + const QList &fromGeometries, + const QRectF &toRect) +{ + QList 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; +}