--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/src/hswidgetpositioningonwidgetadd.cpp Fri Mar 19 09:27:44 2010 +0200
@@ -0,0 +1,139 @@
+/*
+* 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 "hswidgetpositioningonwidgetadd.h"
+#include <math.h>
+#include <QLineF>
+
+const qreal offset = 40; //TODO: Implement this as configurable parameter
+
+/*!
+ \class HsWidgetPositioningOnWidgetAdd
+ \brief Defines widget positioning on widget add.
+
+ Widget positioning on widget add sets positions for
+ a set of home screen widgets added from application library.
+*/
+
+/*!
+ Sets the positioning \a instance as the current one.
+ Deletes the existing instance if present.
+*/
+void HsWidgetPositioningOnWidgetAdd::setInstance(
+ HsWidgetPositioningOnWidgetAdd *instance)
+{
+ if (mInstance)
+ delete mInstance;
+ mInstance = instance;
+}
+
+/*!
+ Returns the current positioning instance.
+*/
+HsWidgetPositioningOnWidgetAdd *HsWidgetPositioningOnWidgetAdd::instance()
+{
+ return mInstance;
+}
+
+/*!
+ Stores the current positioning instance.
+*/
+HsWidgetPositioningOnWidgetAdd *HsWidgetPositioningOnWidgetAdd::mInstance = 0;
+
+/*!
+ \class HsAnchorPointInBottomRight
+ \brief Diagonal widget positioning algorithm.
+
+ Sets widget's lower right corner to follow content area's diagonal.
+ Widgets are positioned to certain offset to each other.
+*/
+QList<QRectF> HsAnchorPointInBottomRight::convert(
+ const QRectF &contentArea,
+ const QList<QRectF> &widgets)
+{
+ QList<QRectF> toGeometries;
+
+ //Offset for widgets' bottom right position to each other
+ qreal k = contentArea.height()/contentArea.width(); //slope of the diagonal
+ qreal offset_x = offset/(sqrt(k + 1));
+ qreal offset_y = k*offset_x;
+ QPointF offsetPoint(offset_x, offset_y);
+
+ QLineF diagonal(contentArea.topLeft(), contentArea.bottomRight());
+ QLineF widgetRight(contentArea.center().x()+ widgets.at(0).width()/2,
+ contentArea.top(),
+ contentArea.center().x()+ widgets.at(0).width()/2,
+ contentArea.bottom());
+
+ QPointF anchorPoint;
+ if(QLineF::BoundedIntersection != diagonal.intersect(widgetRight, &anchorPoint)) {
+ return widgets; //Return original since undefined error.
+ //In this case widget's must be wider than the content area.
+ }
+
+ //First widget to the center of the content area
+ foreach (QRectF g, widgets) {
+ g.moveBottomRight(anchorPoint);
+ toGeometries << g;
+ anchorPoint -= offsetPoint;
+ if(!contentArea.contains(anchorPoint)) {
+ anchorPoint = contentArea.bottomRight();
+ }
+ }
+ return toGeometries;
+}
+
+/*!
+ \class HsAnchorPointInCenter
+ \brief Diagonal widget positioning algorithm.
+
+ Sets widget's center point to follow content area's diagonal.
+ Widgets are positioned to certain offset to each other.
+*/
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+QList<QRectF> HsAnchorPointInCenter::convert(
+ const QRectF &contentArea,
+ const QList<QRectF> &widgets)
+{
+ QList<QRectF> toGeometries;
+
+ //Offset for widgets' centers position to each other
+ qreal k = contentArea.height()/contentArea.width(); //slope of the diagonal
+ qreal offset_x = offset/(sqrt(k + 1));
+ qreal offset_y = k*offset_x;
+ QPointF offsetPoint(offset_x, offset_y);
+
+ //First widget to the center of the content area
+ QPointF anchorPoint = contentArea.center();
+ foreach (QRectF g, widgets) {
+ g.moveCenter(anchorPoint);
+ toGeometries << g;
+ anchorPoint -= offsetPoint;
+ if(!contentArea.contains(anchorPoint)) {
+ anchorPoint = contentArea.bottomRight();
+ }
+ }
+ return toGeometries;
+}
+
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+