homescreenapp/hsutils/src/hswidgetpositioningonwidgetmove.cpp
author hgs
Mon, 20 Sep 2010 10:19:07 +0300
changeset 90 3ac3aaebaee5
parent 81 7dd137878ff8
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QVector2D>
hgs
parents:
diff changeset
    19
#include "hswidgetpositioningonwidgetmove.h"
hgs
parents:
diff changeset
    20
#include "hsapp_defs.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
/*!
hgs
parents:
diff changeset
    24
    The distance by which the line is extended on each side of reference points
hgs
parents:
diff changeset
    25
*/
hgs
parents:
diff changeset
    26
#define SNAP_LINE_EXTEND_VALUE 10.0
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*!
hgs
parents:
diff changeset
    29
    Sets the snap method instance. The existing instance
hgs
parents:
diff changeset
    30
    will be deleted.
hgs
parents:
diff changeset
    31
*/
hgs
parents:
diff changeset
    32
void HsWidgetPositioningOnWidgetMove::setInstance(HsWidgetPositioningOnWidgetMove *instance)
hgs
parents:
diff changeset
    33
{
hgs
parents:
diff changeset
    34
    if (mInstance)
hgs
parents:
diff changeset
    35
        delete mInstance;
hgs
parents:
diff changeset
    36
    mInstance = instance;
hgs
parents:
diff changeset
    37
}
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
/*!
hgs
parents:
diff changeset
    40
    Returns the snap method instance.
hgs
parents:
diff changeset
    41
*/
hgs
parents:
diff changeset
    42
HsWidgetPositioningOnWidgetMove *HsWidgetPositioningOnWidgetMove::instance()
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
    return mInstance;
hgs
parents:
diff changeset
    45
}
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
/*!
hgs
parents:
diff changeset
    48
    Points to the snap method instance.
hgs
parents:
diff changeset
    49
*/
hgs
parents:
diff changeset
    50
HsWidgetPositioningOnWidgetMove *HsWidgetPositioningOnWidgetMove::mInstance = 0;
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
/*!
hgs
parents:
diff changeset
    53
    Constructor.
hgs
parents:
diff changeset
    54
*/
hgs
parents:
diff changeset
    55
HsSnapToLines::HsSnapToLines() :
69
hgs
parents: 63
diff changeset
    56
    mActiveRectWidth(0.0), mActiveRectHeight(0.0), mMinDistancePosition(0.0),
62
hgs
parents:
diff changeset
    57
    mHorizontalSnapPosition(0.0), mVerticalSnapPosition(0.0),
69
hgs
parents: 63
diff changeset
    58
    mHorizontalSnapFound(false), mVerticalSnapFound(false),
hgs
parents: 63
diff changeset
    59
    mRectLieAbove(false), mLeftInRange(false), mRightInRange(false), mIsBetterFitHorizontalSnap(false),
hgs
parents: 63
diff changeset
    60
    mDistanceVerticalEdges(0.0), mVerticalEdgeToLeftOfInactiveRect(0.0), mVerticalEdgeToRightOfInactiveRect(0.0),
62
hgs
parents:
diff changeset
    61
    mMinVerticalEdgesDistance(0.0), mVerticalDistance(0.0),
hgs
parents:
diff changeset
    62
    mVerticalDistanceFromSelectedRect(0.0), mContainerVerticalEdgeDistance(0.0),
69
hgs
parents: 63
diff changeset
    63
    mRectLieLeft(false), mTopInRange(false), mBottomInRange(false), mIsBetterFitVerticalSnap(false),
hgs
parents: 63
diff changeset
    64
    mDistanceHorizontalEdges(0.0), mHorizontalEdgeToTopOfInactiveRect(0.0), mHorizontalEdgeToBottomOfInactiveRect(0.0),
62
hgs
parents:
diff changeset
    65
    mMinHorizontalEdgesDistance(0.0), mHorizontalDistance(0.0),
hgs
parents:
diff changeset
    66
    mHorizontalDistanceFromSelectedRect(0.0), mContainerHorizontalEdgeDistance(0.0),
63
hgs
parents: 62
diff changeset
    67
    mSnapEnabled(false), mSnapForce(0.0), mSnapGap(0.0),
62
hgs
parents:
diff changeset
    68
    mRectVerticalEdgeLiesInLineWithVerticalLine(false), mRectLieAboveVerticalLine(false), mRectLieBelowVerticalLine(false),
hgs
parents:
diff changeset
    69
    mRectHorizontalEdgeLiesInLineWithHorizontalLine(false), mRectLieLeftOfHorizontalLine(false), mRectLiesRightOfHorizontalLine(false)
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
}
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
/*!
hgs
parents:
diff changeset
    75
    Configures the snap-to-lines algorithm.
hgs
parents:
diff changeset
    76
*/
hgs
parents:
diff changeset
    77
void HsSnapToLines::setConfiguration(const QVariantHash &configuration)
hgs
parents:
diff changeset
    78
{
hgs
parents:
diff changeset
    79
    bool canConvert = false;
81
hgs
parents: 69
diff changeset
    80
    mSnapEnabled = configuration[Hs::snapEnabled].toBool();
62
hgs
parents:
diff changeset
    81
    //The following values should be in qreal, so the status received in canConvert is ignored
81
hgs
parents: 69
diff changeset
    82
    mSnapForce = configuration[Hs::snapForce].toDouble(&canConvert);
hgs
parents: 69
diff changeset
    83
    mSnapGap = configuration[Hs::snapGap].toDouble(&canConvert);
62
hgs
parents:
diff changeset
    84
}
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
/*!
hgs
parents:
diff changeset
    87
    Set the dimensions of container rect, active rect and position of Inactive Rects
hgs
parents:
diff changeset
    88
    on the page.
hgs
parents:
diff changeset
    89
*/
hgs
parents:
diff changeset
    90
void HsSnapToLines::setPagePresentation(const QRectF &containerRect, 
hgs
parents:
diff changeset
    91
                                        const QList<QRectF> &inactiveRects,
hgs
parents:
diff changeset
    92
                                        const QRectF &activeRect)
hgs
parents:
diff changeset
    93
{
63
hgs
parents: 62
diff changeset
    94
    mContainerRect = containerRect;
62
hgs
parents:
diff changeset
    95
    mActiveRectWidth = activeRect.width();
hgs
parents:
diff changeset
    96
    mActiveRectHeight = activeRect.height();
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    createSnappableRectangles(inactiveRects);
hgs
parents:
diff changeset
    99
}
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
/*!
hgs
parents:
diff changeset
   102
    Create the list of rects and flag if their sides are snappable from top or bottom or left or right,
hgs
parents:
diff changeset
   103
    depending on other rects overlapping with the rect.
hgs
parents:
diff changeset
   104
*/
hgs
parents:
diff changeset
   105
void HsSnapToLines::createSnappableRectangles(const QList<QRectF> &inactiveRects)
hgs
parents:
diff changeset
   106
{
hgs
parents:
diff changeset
   107
    mInactiveSnapRects.clear();
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    int i;
hgs
parents:
diff changeset
   110
    for (i = 0; i<inactiveRects.count(); ++i) {
hgs
parents:
diff changeset
   111
        QRectF rect = inactiveRects[i];
hgs
parents:
diff changeset
   112
        HsSnapRectangle snapRectangle(rect);
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
        int j;
hgs
parents:
diff changeset
   115
        for (j = 0; j<inactiveRects.count(); ++j) {
hgs
parents:
diff changeset
   116
            QRectF rectToCompare = inactiveRects[j];
hgs
parents:
diff changeset
   117
            if (rect != rectToCompare) {
hgs
parents:
diff changeset
   118
                //Check if the rectangles being compared intersect each other
hgs
parents:
diff changeset
   119
                if (rectToCompare.intersects(rect)) {
hgs
parents:
diff changeset
   120
                    //As the widgets intersect, check which corner is contained,
hgs
parents:
diff changeset
   121
                    //The corner that is contained is not snappable, when the moving widget is in the same position
hgs
parents:
diff changeset
   122
                    if (rectToCompare.contains(rect.topLeft())) {
hgs
parents:
diff changeset
   123
                        snapRectangle.isLeftSnapableForAbove = false;
hgs
parents:
diff changeset
   124
                        snapRectangle.isTopSnapableForLeft = false;
hgs
parents:
diff changeset
   125
                    }
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
                    if (rectToCompare.contains(rect.topRight())) {
hgs
parents:
diff changeset
   128
                        snapRectangle.isRightSnapableForAbove = false;
hgs
parents:
diff changeset
   129
                        snapRectangle.isTopSnapableForRight = false;
hgs
parents:
diff changeset
   130
                    }
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
                    if (rectToCompare.contains(rect.bottomRight())) {
hgs
parents:
diff changeset
   133
                        snapRectangle.isRightSnapableForBelow = false;
hgs
parents:
diff changeset
   134
                        snapRectangle.isBottomSnapableForRight = false;
hgs
parents:
diff changeset
   135
                    }
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
                    if (rectToCompare.contains(rect.bottomLeft())) {
hgs
parents:
diff changeset
   138
                        snapRectangle.isLeftSnapableForBelow = false;
hgs
parents:
diff changeset
   139
                        snapRectangle.isBottomSnapableForLeft = false;
hgs
parents:
diff changeset
   140
                    }
hgs
parents:
diff changeset
   141
                }
hgs
parents:
diff changeset
   142
            }
hgs
parents:
diff changeset
   143
        }
hgs
parents:
diff changeset
   144
        if (snapRectangle.isLeftSnapableForAbove || snapRectangle.isLeftSnapableForBelow ||
hgs
parents:
diff changeset
   145
            snapRectangle.isRightSnapableForAbove || snapRectangle.isRightSnapableForBelow ||
hgs
parents:
diff changeset
   146
            snapRectangle.isTopSnapableForLeft || snapRectangle.isTopSnapableForRight ||
hgs
parents:
diff changeset
   147
            snapRectangle.isBottomSnapableForLeft || snapRectangle.isBottomSnapableForRight) {
hgs
parents:
diff changeset
   148
                mInactiveSnapRects.append(snapRectangle);
hgs
parents:
diff changeset
   149
        }
hgs
parents:
diff changeset
   150
    }
hgs
parents:
diff changeset
   151
}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
/*!
hgs
parents:
diff changeset
   154
    Run the snap algorithm to with the position of moving rect, to get a snap result.
hgs
parents:
diff changeset
   155
*/
hgs
parents:
diff changeset
   156
HsWidgetPositioningOnWidgetMove::Result HsSnapToLines::run(const QRectF &movingRect)
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
    HsWidgetPositioningOnWidgetMove::Result result;
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    if (mSnapEnabled) {
hgs
parents:
diff changeset
   161
        mMovingRect = movingRect;
hgs
parents:
diff changeset
   162
        mHorizontalSnapPosition = 0.0;
hgs
parents:
diff changeset
   163
        mVerticalSnapPosition = 0.0;
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
        mVerticalLine = QLineF();
hgs
parents:
diff changeset
   166
        mMinVerticalEdgesDistance = mSnapForce;
hgs
parents:
diff changeset
   167
        mVerticalDistanceFromSelectedRect = 0.0;
hgs
parents:
diff changeset
   168
        mContainerVerticalEdgeDistance = 0.0;
hgs
parents:
diff changeset
   169
        mHorizontalSnapFound = false;
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
        mHorizontalLine = QLineF();
hgs
parents:
diff changeset
   172
        mMinHorizontalEdgesDistance = mSnapForce;
hgs
parents:
diff changeset
   173
        mHorizontalDistanceFromSelectedRect = 0.0;
hgs
parents:
diff changeset
   174
        mContainerHorizontalEdgeDistance = 0.0;
hgs
parents:
diff changeset
   175
        mVerticalSnapFound = false;
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
        for (int i = 0; i < mInactiveSnapRects.count(); ++i) {
hgs
parents:
diff changeset
   178
            mInactiveSnapRectToCompare = mInactiveSnapRects[i];
hgs
parents:
diff changeset
   179
            mInactiveRectToCompare = mInactiveSnapRectToCompare.rectangle;
hgs
parents:
diff changeset
   180
            if (!movingRect.intersects(mInactiveRectToCompare)) { //Only compare if Inactive Rect and moving rect do not overlap.
69
hgs
parents: 63
diff changeset
   181
                // Horizontal - Direction Snapping
62
hgs
parents:
diff changeset
   182
                compareLeftSideOfMovingRectForSnapping();
hgs
parents:
diff changeset
   183
                compareRightSideOfMovingRectForSnapping();
69
hgs
parents: 63
diff changeset
   184
                // Vertical - Direction Snapping
62
hgs
parents:
diff changeset
   185
                compareTopOfMovingRectForSnapping();
hgs
parents:
diff changeset
   186
                compareBottomOfMovingRectForSnapping();
hgs
parents:
diff changeset
   187
            }
hgs
parents:
diff changeset
   188
        }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
        if (mHorizontalSnapFound) {
hgs
parents:
diff changeset
   191
            result.hasHorizontalSnap = true;
hgs
parents:
diff changeset
   192
            result.horizontalSnapPosition = mHorizontalSnapPosition;
hgs
parents:
diff changeset
   193
            extendVerticalLine();
hgs
parents:
diff changeset
   194
            result.verticalSnapLine = mVerticalLine;
hgs
parents:
diff changeset
   195
        }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
        if (mVerticalSnapFound) {
hgs
parents:
diff changeset
   198
            result.hasVerticalSnap = true;
hgs
parents:
diff changeset
   199
            result.verticalSnapPosition = mVerticalSnapPosition;
hgs
parents:
diff changeset
   200
            extendHorizontalLine();
hgs
parents:
diff changeset
   201
            result.horizontalSnapLine = mHorizontalLine;
hgs
parents:
diff changeset
   202
        }
hgs
parents:
diff changeset
   203
    }
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
    return result;
hgs
parents:
diff changeset
   206
}
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
/*!
hgs
parents:
diff changeset
   209
    Check if the inactive rect being compared with moving rect lies above or below of moving rect.
hgs
parents:
diff changeset
   210
*/
hgs
parents:
diff changeset
   211
void HsSnapToLines::checkInactiveRectLieAboveOrBelowOfMovingRect()
hgs
parents:
diff changeset
   212
{
hgs
parents:
diff changeset
   213
    //Check if the inactive rect lies below or above of the moving rect
hgs
parents:
diff changeset
   214
    mRectLieAbove = false;
hgs
parents:
diff changeset
   215
    mVerticalDistance = 0.0;
hgs
parents:
diff changeset
   216
    //Inactive Rect lies above or at the save Y position as the Moving Rect
hgs
parents:
diff changeset
   217
    if (mInactiveRectToCompare.top() <= mMovingRect.top()) {
hgs
parents:
diff changeset
   218
        mRectLieAbove = true;
hgs
parents:
diff changeset
   219
        if (mInactiveRectToCompare.bottom() <= mMovingRect.top()) {
hgs
parents:
diff changeset
   220
            mVerticalDistance = mMovingRect.top() - mInactiveRectToCompare.bottom();
hgs
parents:
diff changeset
   221
        }
hgs
parents:
diff changeset
   222
        else {
hgs
parents:
diff changeset
   223
            mVerticalDistance = mMovingRect.top() - mInactiveRectToCompare.top();
hgs
parents:
diff changeset
   224
        }
hgs
parents:
diff changeset
   225
    }
hgs
parents:
diff changeset
   226
    //Inactive Rect lies below the Moving Rect
hgs
parents:
diff changeset
   227
    else {
hgs
parents:
diff changeset
   228
        mRectLieAbove = false;
hgs
parents:
diff changeset
   229
        if (mMovingRect.bottom() <= mInactiveRectToCompare.top()) {
hgs
parents:
diff changeset
   230
            mVerticalDistance = mInactiveRectToCompare.top() - mMovingRect.bottom();
hgs
parents:
diff changeset
   231
        }
hgs
parents:
diff changeset
   232
        else {
hgs
parents:
diff changeset
   233
            mVerticalDistance = mInactiveRectToCompare.bottom() - mMovingRect.bottom();
hgs
parents:
diff changeset
   234
        }
hgs
parents:
diff changeset
   235
    }
hgs
parents:
diff changeset
   236
}
hgs
parents:
diff changeset
   237
69
hgs
parents: 63
diff changeset
   238
/*!
hgs
parents: 63
diff changeset
   239
    Check if the Vertical edges (Left and Right Edges) of the inactive rect being compared
hgs
parents: 63
diff changeset
   240
    is in range of the snapping distance of the vertical edge of moving rect
hgs
parents: 63
diff changeset
   241
    \param movingRectVerticalEdgePosition Position of the Vertical edge(either left or right) of moving rect.
hgs
parents: 63
diff changeset
   242
*/
hgs
parents: 63
diff changeset
   243
void HsSnapToLines::checkInactiveRectVerticalEdgesInRange(qreal movingRectVerticalEdgePosition)
hgs
parents: 63
diff changeset
   244
{
hgs
parents: 63
diff changeset
   245
    mLeftInRange = false;
hgs
parents: 63
diff changeset
   246
    mRightInRange = false;
hgs
parents: 63
diff changeset
   247
hgs
parents: 63
diff changeset
   248
    //calculate the distance of the moving rect's vertical edge to the inactive rect's left and right edges
hgs
parents: 63
diff changeset
   249
    mVerticalEdgeToLeftOfInactiveRect = qAbs(mInactiveRectToCompare.left() - movingRectVerticalEdgePosition);
hgs
parents: 63
diff changeset
   250
    mVerticalEdgeToRightOfInactiveRect = qAbs(mInactiveRectToCompare.right() - movingRectVerticalEdgePosition);
hgs
parents: 63
diff changeset
   251
hgs
parents: 63
diff changeset
   252
    if (mVerticalEdgeToLeftOfInactiveRect <= mMinVerticalEdgesDistance 
hgs
parents: 63
diff changeset
   253
        && (mRectLieAbove && mInactiveSnapRectToCompare.isLeftSnapableForBelow
hgs
parents: 63
diff changeset
   254
        || !mRectLieAbove && mInactiveSnapRectToCompare.isLeftSnapableForAbove)) { 
hgs
parents: 63
diff changeset
   255
        mLeftInRange = true;
hgs
parents: 63
diff changeset
   256
    }
hgs
parents: 63
diff changeset
   257
    if (mVerticalEdgeToRightOfInactiveRect <= mMinVerticalEdgesDistance
hgs
parents: 63
diff changeset
   258
        && (mRectLieAbove && mInactiveSnapRectToCompare.isRightSnapableForBelow
hgs
parents: 63
diff changeset
   259
        || !mRectLieAbove && mInactiveSnapRectToCompare.isRightSnapableForAbove)) {
hgs
parents: 63
diff changeset
   260
        mRightInRange = true;
hgs
parents: 63
diff changeset
   261
    }
hgs
parents: 63
diff changeset
   262
}
hgs
parents: 63
diff changeset
   263
hgs
parents: 63
diff changeset
   264
/*!
hgs
parents: 63
diff changeset
   265
    Check if this inactive rect is better fit for Horizontal snapping
hgs
parents: 63
diff changeset
   266
    \param containerVerticalEdgeToInactiveRectVerticalEdge
hgs
parents: 63
diff changeset
   267
           difference between the vertical edge of the container and same vertical edge of inactive rect
hgs
parents: 63
diff changeset
   268
    \param containerOtherVerticalEdgeToInactiveRectOtherVerticalEdge
hgs
parents: 63
diff changeset
   269
           difference between the opposite vertical edges of continer and the inactive rect
hgs
parents: 63
diff changeset
   270
*/
hgs
parents: 63
diff changeset
   271
void HsSnapToLines::checkInactiveRectBetterFitForHorizontalSnapping(qreal containerVerticalEdgeToInactiveRectVerticalEdge,
hgs
parents: 63
diff changeset
   272
                                                                    qreal containerOtherVerticalEdgeToInactiveRectOtherVerticalEdge)
hgs
parents: 63
diff changeset
   273
{
hgs
parents: 63
diff changeset
   274
    //Check if the inactive rect is better fit or if it is inline with already selected position and hence is also a better fit
hgs
parents: 63
diff changeset
   275
    mIsBetterFitHorizontalSnap = false;
hgs
parents: 63
diff changeset
   276
    if (mLeftInRange || mRightInRange) {
hgs
parents: 63
diff changeset
   277
        if (mDistanceVerticalEdges < mMinVerticalEdgesDistance) {
hgs
parents: 63
diff changeset
   278
            mIsBetterFitHorizontalSnap = true;
hgs
parents: 63
diff changeset
   279
        }
hgs
parents: 63
diff changeset
   280
        else if (mDistanceVerticalEdges == mMinVerticalEdgesDistance) { //the distance in the vertical edges is same as from the previously selected rect
hgs
parents: 63
diff changeset
   281
            //check the position of rect with respect to Vertical line
hgs
parents: 63
diff changeset
   282
            checkInactiveRectPositionToVerticalLine();
hgs
parents: 63
diff changeset
   283
            //if horizontal snap position was previously found and the rect's edge is in line with Vertical line
hgs
parents: 63
diff changeset
   284
            if (mHorizontalSnapFound && mRectVerticalEdgeLiesInLineWithVerticalLine) {
hgs
parents: 63
diff changeset
   285
                if (mRectLieAboveVerticalLine || mRectLieBelowVerticalLine) {
hgs
parents: 63
diff changeset
   286
                    extendVerticalLineToIncludeInactiveRect();
hgs
parents: 63
diff changeset
   287
                }
hgs
parents: 63
diff changeset
   288
            }
hgs
parents: 63
diff changeset
   289
            //here the case is that moving rect lies exactly in middle of two same sides of two different inactive widgets.
hgs
parents: 63
diff changeset
   290
            else {
hgs
parents: 63
diff changeset
   291
                //Prioritize first on the fact if the inactive rect is closer to the moving rect in Y - direction.
hgs
parents: 63
diff changeset
   292
                if (mVerticalDistance < mVerticalDistanceFromSelectedRect) {
hgs
parents: 63
diff changeset
   293
                    mIsBetterFitHorizontalSnap = true;
hgs
parents: 63
diff changeset
   294
                }
hgs
parents: 63
diff changeset
   295
                else if (mVerticalDistance == mVerticalDistanceFromSelectedRect) {
hgs
parents: 63
diff changeset
   296
                    //Prioritize next if this Inactive rect's vertical edge is closer to the same vertical edge of the container rect, then the previously selected rect
hgs
parents: 63
diff changeset
   297
                    if (containerVerticalEdgeToInactiveRectVerticalEdge < mContainerVerticalEdgeDistance) {
hgs
parents: 63
diff changeset
   298
                        mIsBetterFitHorizontalSnap = true;
hgs
parents: 63
diff changeset
   299
                    }
hgs
parents: 63
diff changeset
   300
                    //Prioritize next if the Inactive rect's vertical edge lies near to same vertical edge of the container rect than the other pair
hgs
parents: 63
diff changeset
   301
                    else if (containerVerticalEdgeToInactiveRectVerticalEdge < containerOtherVerticalEdgeToInactiveRectOtherVerticalEdge) {
hgs
parents: 63
diff changeset
   302
                        mIsBetterFitHorizontalSnap = true;
hgs
parents: 63
diff changeset
   303
                    }
hgs
parents: 63
diff changeset
   304
                    else {
hgs
parents: 63
diff changeset
   305
                        //This else will happen if this rectangle being compared is exactly the same as the selected rectangle for snapping, but in opposite Y direction.
hgs
parents: 63
diff changeset
   306
                        //In that case it does not matter which is the selected rectangle. Hece we leave the already selected rectangle as the better fit.
hgs
parents: 63
diff changeset
   307
                    }
hgs
parents: 63
diff changeset
   308
                }
hgs
parents: 63
diff changeset
   309
            }
hgs
parents: 63
diff changeset
   310
        }
hgs
parents: 63
diff changeset
   311
    }
hgs
parents: 63
diff changeset
   312
}
62
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
/*!
hgs
parents:
diff changeset
   315
    Check if the left edge of moving rect is snappable to the incative rect's left or right edge.
hgs
parents:
diff changeset
   316
    The inactive rect's edge is only chosen if it is a better fit for horizontal snapping.
hgs
parents:
diff changeset
   317
*/
hgs
parents:
diff changeset
   318
void HsSnapToLines::compareLeftSideOfMovingRectForSnapping()
hgs
parents:
diff changeset
   319
{
hgs
parents:
diff changeset
   320
    checkInactiveRectLieAboveOrBelowOfMovingRect();
hgs
parents:
diff changeset
   321
69
hgs
parents: 63
diff changeset
   322
    checkInactiveRectVerticalEdgesInRange(mMovingRect.left());
62
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
    //calculate the distance of inactive rect's left edge and container rect's left edge
hgs
parents:
diff changeset
   325
    qreal differenceContainerLeftEdgeToInactiveRectLeftEdge = mInactiveRectToCompare.left() - mContainerRect.left();
hgs
parents:
diff changeset
   326
    //calculate the distance of inactive rect's right edge and container rect's right edge
hgs
parents:
diff changeset
   327
    qreal differenceContainerRightEdgeToInactiveRectRightEdge = mContainerRect.right() - mInactiveRectToCompare.right();
hgs
parents:
diff changeset
   328
    qreal xSnapGapAdjustment = 0.0;
69
hgs
parents: 63
diff changeset
   329
    mDistanceVerticalEdges = 0.0;
hgs
parents: 63
diff changeset
   330
    mMinDistancePosition = 0.0;
62
hgs
parents:
diff changeset
   331
hgs
parents:
diff changeset
   332
    //If only one edge of inactive rect is in snappable range, save that position
hgs
parents:
diff changeset
   333
    if ((mLeftInRange && !mRightInRange)
hgs
parents:
diff changeset
   334
        || !mLeftInRange && mRightInRange) {
hgs
parents:
diff changeset
   335
        if (mLeftInRange) {
69
hgs
parents: 63
diff changeset
   336
            mMinDistancePosition = mInactiveRectToCompare.left();
hgs
parents: 63
diff changeset
   337
            mDistanceVerticalEdges = mVerticalEdgeToLeftOfInactiveRect;
62
hgs
parents:
diff changeset
   338
            xSnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   339
        }
hgs
parents:
diff changeset
   340
        else {
69
hgs
parents: 63
diff changeset
   341
            mMinDistancePosition = mInactiveRectToCompare.right();
hgs
parents: 63
diff changeset
   342
            mDistanceVerticalEdges = mVerticalEdgeToRightOfInactiveRect;
62
hgs
parents:
diff changeset
   343
            xSnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   344
        }
hgs
parents:
diff changeset
   345
    }
hgs
parents:
diff changeset
   346
    //else both edges of inactive rect are in range, check which is a better fit
hgs
parents:
diff changeset
   347
    else if (mLeftInRange && mRightInRange) {
hgs
parents:
diff changeset
   348
        //if left edge of moving rect to the left of the inactive rect is closer than the left edge of moving rect to the right of the inactive rect
69
hgs
parents: 63
diff changeset
   349
        if (mVerticalEdgeToLeftOfInactiveRect < mVerticalEdgeToRightOfInactiveRect) {
hgs
parents: 63
diff changeset
   350
            mMinDistancePosition = mInactiveRectToCompare.left();
hgs
parents: 63
diff changeset
   351
            mDistanceVerticalEdges = mVerticalEdgeToLeftOfInactiveRect;
62
hgs
parents:
diff changeset
   352
            xSnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   353
            mRightInRange = false;
hgs
parents:
diff changeset
   354
        }
hgs
parents:
diff changeset
   355
        //if the left edge of inactive rect to left of moving rect is at the same distance as the right edge of inactive rect to the right of moving rect
69
hgs
parents: 63
diff changeset
   356
        else if (mVerticalEdgeToLeftOfInactiveRect == mVerticalEdgeToRightOfInactiveRect) {
62
hgs
parents:
diff changeset
   357
            //if inactive rect lies towards the left or middle of container rect, then the left edge is priortized as the selected edge for outside snapping 
hgs
parents:
diff changeset
   358
            if (differenceContainerLeftEdgeToInactiveRectLeftEdge <= differenceContainerRightEdgeToInactiveRectRightEdge) { 
69
hgs
parents: 63
diff changeset
   359
                mMinDistancePosition = mInactiveRectToCompare.left();
hgs
parents: 63
diff changeset
   360
                mDistanceVerticalEdges = mVerticalEdgeToLeftOfInactiveRect;
62
hgs
parents:
diff changeset
   361
                xSnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   362
                mRightInRange = false;
hgs
parents:
diff changeset
   363
            }
hgs
parents:
diff changeset
   364
            //else right of the inactive rect lies more close to the right of the container rect, and hence prioritize it for snapping.
hgs
parents:
diff changeset
   365
            else {
69
hgs
parents: 63
diff changeset
   366
                mMinDistancePosition = mInactiveRectToCompare.right();
hgs
parents: 63
diff changeset
   367
                mDistanceVerticalEdges = mVerticalEdgeToRightOfInactiveRect;
62
hgs
parents:
diff changeset
   368
                xSnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   369
                mLeftInRange = false;
hgs
parents:
diff changeset
   370
            }
hgs
parents:
diff changeset
   371
        }
hgs
parents:
diff changeset
   372
        //else right edge of inactive rect to the left of the moving rect is closer than the left edge of inactive rect to the left of the moving rect
hgs
parents:
diff changeset
   373
        else{
69
hgs
parents: 63
diff changeset
   374
            mMinDistancePosition = mInactiveRectToCompare.right();
hgs
parents: 63
diff changeset
   375
            mDistanceVerticalEdges = mVerticalEdgeToRightOfInactiveRect;
62
hgs
parents:
diff changeset
   376
            xSnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   377
            mLeftInRange = false;
hgs
parents:
diff changeset
   378
        }
hgs
parents:
diff changeset
   379
    }
hgs
parents:
diff changeset
   380
69
hgs
parents: 63
diff changeset
   381
    //Check if this inactive rect is better fit than the previous selected rect for Horizontal - snapping
hgs
parents: 63
diff changeset
   382
    checkInactiveRectBetterFitForHorizontalSnapping(differenceContainerLeftEdgeToInactiveRectLeftEdge,
hgs
parents: 63
diff changeset
   383
                                                    differenceContainerRightEdgeToInactiveRectRightEdge);
62
hgs
parents:
diff changeset
   384
69
hgs
parents: 63
diff changeset
   385
    if (mIsBetterFitHorizontalSnap) {
hgs
parents: 63
diff changeset
   386
        qreal proposedRightOfActiveRect = mMinDistancePosition + xSnapGapAdjustment + mActiveRectWidth;
62
hgs
parents:
diff changeset
   387
        if (qBound(mContainerRect.left(), proposedRightOfActiveRect, mContainerRect.right())
hgs
parents:
diff changeset
   388
            == proposedRightOfActiveRect) {
hgs
parents:
diff changeset
   389
            mHorizontalSnapFound = true;
69
hgs
parents: 63
diff changeset
   390
            mHorizontalSnapPosition = mMinDistancePosition + xSnapGapAdjustment;
hgs
parents: 63
diff changeset
   391
            mMinVerticalEdgesDistance = mDistanceVerticalEdges;
62
hgs
parents:
diff changeset
   392
            mVerticalDistanceFromSelectedRect = mVerticalDistance;
hgs
parents:
diff changeset
   393
            //Save the new distance of the Chosen Rectangle's left edge from Container's left edge
hgs
parents:
diff changeset
   394
            mContainerVerticalEdgeDistance = differenceContainerLeftEdgeToInactiveRectLeftEdge;
69
hgs
parents: 63
diff changeset
   395
            createVerticalLine();
62
hgs
parents:
diff changeset
   396
        }
hgs
parents:
diff changeset
   397
    }
hgs
parents:
diff changeset
   398
}
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
/*!
hgs
parents:
diff changeset
   401
    Check if the right edge of moving rect is snappable to the incative rect's left or right edge.
hgs
parents:
diff changeset
   402
    The inactive rect's edge is only chosen if it is a better fit for horizontal snapping.
hgs
parents:
diff changeset
   403
*/
hgs
parents:
diff changeset
   404
void HsSnapToLines::compareRightSideOfMovingRectForSnapping()
hgs
parents:
diff changeset
   405
{
hgs
parents:
diff changeset
   406
    checkInactiveRectLieAboveOrBelowOfMovingRect();
hgs
parents:
diff changeset
   407
69
hgs
parents: 63
diff changeset
   408
    checkInactiveRectVerticalEdgesInRange(mMovingRect.right());
62
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
    //calculate the distance of inactive rect's left edge and container rect's left edge
hgs
parents:
diff changeset
   411
    qreal differenceContainerLeftEdgeToInactiveRectLeftEdge = mInactiveRectToCompare.left() - mContainerRect.left();
hgs
parents:
diff changeset
   412
    //calculate the distance of inactive rect's right edge and container rect's right edge
hgs
parents:
diff changeset
   413
    qreal differenceContainerRightEdgeToInactiveRectRightEdge = mContainerRect.right() - mInactiveRectToCompare.right();
hgs
parents:
diff changeset
   414
    qreal xSnapGapAdjustment = 0.0;
69
hgs
parents: 63
diff changeset
   415
    mDistanceVerticalEdges = 0.0;
hgs
parents: 63
diff changeset
   416
    mMinDistancePosition = 0.0;
62
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
    //If only one edge of inactive rect is in snappable range, save that position
hgs
parents:
diff changeset
   419
    if ((mLeftInRange && !mRightInRange)
hgs
parents:
diff changeset
   420
        || !mLeftInRange && mRightInRange) {
hgs
parents:
diff changeset
   421
        if (mLeftInRange) {
69
hgs
parents: 63
diff changeset
   422
            mMinDistancePosition = mInactiveRectToCompare.left();
hgs
parents: 63
diff changeset
   423
            mDistanceVerticalEdges = mVerticalEdgeToLeftOfInactiveRect;
62
hgs
parents:
diff changeset
   424
            xSnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   425
        }
hgs
parents:
diff changeset
   426
        else {
69
hgs
parents: 63
diff changeset
   427
            mMinDistancePosition = mInactiveRectToCompare.right();
hgs
parents: 63
diff changeset
   428
            mDistanceVerticalEdges = mVerticalEdgeToRightOfInactiveRect;
62
hgs
parents:
diff changeset
   429
            xSnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   430
        }
hgs
parents:
diff changeset
   431
    }
hgs
parents:
diff changeset
   432
    //else both edges of inactive rect are in range, check which is a better fit
hgs
parents:
diff changeset
   433
    else if (mLeftInRange && mRightInRange) {
hgs
parents:
diff changeset
   434
        //if right edge of moving rect to the right of the inactive rect is closer than the right edge of moving rect to the left of inactive rect
69
hgs
parents: 63
diff changeset
   435
        if (mVerticalEdgeToRightOfInactiveRect < mVerticalEdgeToLeftOfInactiveRect) {
hgs
parents: 63
diff changeset
   436
            mMinDistancePosition = mInactiveRectToCompare.right();
hgs
parents: 63
diff changeset
   437
            mDistanceVerticalEdges = mVerticalEdgeToRightOfInactiveRect;
62
hgs
parents:
diff changeset
   438
            xSnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   439
            mLeftInRange = false;
hgs
parents:
diff changeset
   440
        }
hgs
parents:
diff changeset
   441
        //if the right edge of moving rect to right of inactive rect is at the same distance as the right edge of moving rect to the left of inactive rect
69
hgs
parents: 63
diff changeset
   442
        else if (mVerticalEdgeToRightOfInactiveRect == mVerticalEdgeToLeftOfInactiveRect) {
62
hgs
parents:
diff changeset
   443
            //if inactive rect lies towards the right of container rect, then the right edge is priortized as the selected edge for outside snapping
hgs
parents:
diff changeset
   444
            if (differenceContainerRightEdgeToInactiveRectRightEdge < differenceContainerLeftEdgeToInactiveRectLeftEdge ) { 
69
hgs
parents: 63
diff changeset
   445
                mMinDistancePosition = mInactiveRectToCompare.right();
hgs
parents: 63
diff changeset
   446
                mDistanceVerticalEdges = mVerticalEdgeToRightOfInactiveRect;
62
hgs
parents:
diff changeset
   447
                xSnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   448
                mLeftInRange = false;
hgs
parents:
diff changeset
   449
            }
hgs
parents:
diff changeset
   450
            //else left of the inactive rect lies more close to the left or middle of the container rect, and hence prioritize it
hgs
parents:
diff changeset
   451
            else {
69
hgs
parents: 63
diff changeset
   452
                mMinDistancePosition = mInactiveRectToCompare.left();
hgs
parents: 63
diff changeset
   453
                mDistanceVerticalEdges = mVerticalEdgeToLeftOfInactiveRect;
62
hgs
parents:
diff changeset
   454
                xSnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   455
                mRightInRange = false;
hgs
parents:
diff changeset
   456
            }
hgs
parents:
diff changeset
   457
        }
hgs
parents:
diff changeset
   458
        //else right edge of moving rect to the left of the inactive rect is closer than the right edge of moving rect to the right of the incoming rect
hgs
parents:
diff changeset
   459
        else{
69
hgs
parents: 63
diff changeset
   460
            mMinDistancePosition = mInactiveRectToCompare.left();
hgs
parents: 63
diff changeset
   461
            mDistanceVerticalEdges = mVerticalEdgeToLeftOfInactiveRect;
62
hgs
parents:
diff changeset
   462
            xSnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   463
            mRightInRange = false;
hgs
parents:
diff changeset
   464
        }
hgs
parents:
diff changeset
   465
    }
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
    //Check if this inactive rect is better fit than the previous selected rect 
69
hgs
parents: 63
diff changeset
   468
    checkInactiveRectBetterFitForHorizontalSnapping(differenceContainerRightEdgeToInactiveRectRightEdge,
hgs
parents: 63
diff changeset
   469
                                                    differenceContainerLeftEdgeToInactiveRectLeftEdge);
62
hgs
parents:
diff changeset
   470
69
hgs
parents: 63
diff changeset
   471
    if (mIsBetterFitHorizontalSnap) {
hgs
parents: 63
diff changeset
   472
        qreal proposedLeftOfActiveRect = mMinDistancePosition - mActiveRectWidth - xSnapGapAdjustment;
62
hgs
parents:
diff changeset
   473
        if (qBound(mContainerRect.left(), proposedLeftOfActiveRect, mContainerRect.right())
hgs
parents:
diff changeset
   474
            == proposedLeftOfActiveRect) {
hgs
parents:
diff changeset
   475
            mHorizontalSnapFound = true;
hgs
parents:
diff changeset
   476
            mHorizontalSnapPosition = proposedLeftOfActiveRect;
69
hgs
parents: 63
diff changeset
   477
            mMinVerticalEdgesDistance = mDistanceVerticalEdges;
62
hgs
parents:
diff changeset
   478
            mVerticalDistanceFromSelectedRect = mVerticalDistance;
hgs
parents:
diff changeset
   479
            //Save the new distance of the Chosen Rectangle's right edge from Container's right edge
hgs
parents:
diff changeset
   480
            mContainerVerticalEdgeDistance = differenceContainerRightEdgeToInactiveRectRightEdge;
69
hgs
parents: 63
diff changeset
   481
            createVerticalLine();
hgs
parents: 63
diff changeset
   482
        }
hgs
parents: 63
diff changeset
   483
    }
hgs
parents: 63
diff changeset
   484
}
62
hgs
parents:
diff changeset
   485
69
hgs
parents: 63
diff changeset
   486
/*!
hgs
parents: 63
diff changeset
   487
    Create the vertical line for horizontal snap guidance
hgs
parents: 63
diff changeset
   488
*/
hgs
parents: 63
diff changeset
   489
void HsSnapToLines::createVerticalLine()
hgs
parents: 63
diff changeset
   490
{
90
hgs
parents: 81
diff changeset
   491
    qreal top = qMin( mInactiveRectToCompare.top(), mMovingRect.top());
hgs
parents: 81
diff changeset
   492
    qreal bottom = qMax(mInactiveRectToCompare.bottom(), mMovingRect.bottom()); 
hgs
parents: 81
diff changeset
   493
    mVerticalLine.setP1(QPointF(mMinDistancePosition, top));
hgs
parents: 81
diff changeset
   494
    mVerticalLine.setP2(QPointF(mMinDistancePosition, bottom));
62
hgs
parents:
diff changeset
   495
}
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
/*!
hgs
parents:
diff changeset
   498
    Check if the inactive rect being compared with moving rect lies on left or right of moving rect.
hgs
parents:
diff changeset
   499
*/
hgs
parents:
diff changeset
   500
void HsSnapToLines::checkInactiveRectLieLeftOrRightOfMovingRect()
hgs
parents:
diff changeset
   501
{
hgs
parents:
diff changeset
   502
    mRectLieLeft = false;
hgs
parents:
diff changeset
   503
    mHorizontalDistance = 0.0;
hgs
parents:
diff changeset
   504
    //Inactive Rect lies left of the Moving Rect
hgs
parents:
diff changeset
   505
    if (mInactiveRectToCompare.left() < mMovingRect.left()) {
hgs
parents:
diff changeset
   506
        mRectLieLeft = true;
hgs
parents:
diff changeset
   507
        if (mInactiveRectToCompare.right() <= mMovingRect.left()) {
hgs
parents:
diff changeset
   508
            mHorizontalDistance = mMovingRect.left() - mInactiveRectToCompare.right();
hgs
parents:
diff changeset
   509
        }
hgs
parents:
diff changeset
   510
        else {
hgs
parents:
diff changeset
   511
            mHorizontalDistance = mMovingRect.left() - mInactiveRectToCompare.left();
hgs
parents:
diff changeset
   512
        }
hgs
parents:
diff changeset
   513
    }
hgs
parents:
diff changeset
   514
    //Inactive Rect lies right of the Moving Rect
hgs
parents:
diff changeset
   515
    else {
hgs
parents:
diff changeset
   516
        mRectLieLeft = false;
hgs
parents:
diff changeset
   517
        if (mMovingRect.right() <= mInactiveRectToCompare.left()) {
hgs
parents:
diff changeset
   518
            mHorizontalDistance = mInactiveRectToCompare.left() - mMovingRect.right();
hgs
parents:
diff changeset
   519
        }
hgs
parents:
diff changeset
   520
        else {
hgs
parents:
diff changeset
   521
            mHorizontalDistance = mInactiveRectToCompare.right() - mMovingRect.right();
hgs
parents:
diff changeset
   522
        }
hgs
parents:
diff changeset
   523
    }
hgs
parents:
diff changeset
   524
}
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
/*!
69
hgs
parents: 63
diff changeset
   527
    Check if the Horizontal edges (Top and Bottom Edges) of the inactive rect being compared
hgs
parents: 63
diff changeset
   528
    is in range of the snapping distance of the horizontal edge of moving rect
hgs
parents: 63
diff changeset
   529
    \param movingRectHorizontalEdgePosition Position of the Horizontal edge(either top or bottom) of moving rect.
62
hgs
parents:
diff changeset
   530
*/
69
hgs
parents: 63
diff changeset
   531
void HsSnapToLines::checkInactiveRectHorizontalEdgesInRange(qreal movingRectHorizontalEdgePosition)
62
hgs
parents:
diff changeset
   532
{
hgs
parents:
diff changeset
   533
    mTopInRange = false;
hgs
parents:
diff changeset
   534
    mBottomInRange = false;
hgs
parents:
diff changeset
   535
69
hgs
parents: 63
diff changeset
   536
    //calculate the distance of the moving rect's horizontal edge to the inactive rect's top and bottom edges
hgs
parents: 63
diff changeset
   537
    mHorizontalEdgeToTopOfInactiveRect = qAbs(mInactiveRectToCompare.top() - movingRectHorizontalEdgePosition);
hgs
parents: 63
diff changeset
   538
    mHorizontalEdgeToBottomOfInactiveRect = qAbs(mInactiveRectToCompare.bottom() - movingRectHorizontalEdgePosition);
hgs
parents: 63
diff changeset
   539
hgs
parents: 63
diff changeset
   540
    if (mHorizontalEdgeToTopOfInactiveRect <= mMinHorizontalEdgesDistance) {
62
hgs
parents:
diff changeset
   541
        if (mRectLieLeft && mInactiveSnapRectToCompare.isTopSnapableForRight
hgs
parents:
diff changeset
   542
         || !mRectLieLeft && mInactiveSnapRectToCompare.isTopSnapableForLeft) {
hgs
parents:
diff changeset
   543
            mTopInRange = true;
hgs
parents:
diff changeset
   544
        }
hgs
parents:
diff changeset
   545
    }
69
hgs
parents: 63
diff changeset
   546
    if (mHorizontalEdgeToBottomOfInactiveRect <= mMinHorizontalEdgesDistance) {
62
hgs
parents:
diff changeset
   547
        if (mRectLieLeft && mInactiveSnapRectToCompare.isBottomSnapableForRight
hgs
parents:
diff changeset
   548
         || !mRectLieLeft && mInactiveSnapRectToCompare.isBottomSnapableForLeft) {
hgs
parents:
diff changeset
   549
            mBottomInRange = true;
hgs
parents:
diff changeset
   550
        }
hgs
parents:
diff changeset
   551
    }
69
hgs
parents: 63
diff changeset
   552
}
62
hgs
parents:
diff changeset
   553
69
hgs
parents: 63
diff changeset
   554
/*!
hgs
parents: 63
diff changeset
   555
    Check if this inactive rect is better fit for Vertical snapping
hgs
parents: 63
diff changeset
   556
    \param containerHorizontalEdgeToInactiveRectHorizontalEdge
hgs
parents: 63
diff changeset
   557
           difference between the horizontal edge of the container and same horizontal edge of inactive rect
hgs
parents: 63
diff changeset
   558
    \param containerOtherHorizontalEdgeToInactiveRectOtherHorizontalEdge
hgs
parents: 63
diff changeset
   559
           difference between the opposite horizontal edges of continer and the inactive rect
hgs
parents: 63
diff changeset
   560
*/
hgs
parents: 63
diff changeset
   561
void HsSnapToLines::checkInactiveRectBetterFitForVerticalSnapping(qreal containerHorizontalEdgeToInactiveRectHorizontalEdge,
hgs
parents: 63
diff changeset
   562
                                                       qreal containerOtherHorizontalEdgeToInactiveRectOtherHorizontalEdge)
hgs
parents: 63
diff changeset
   563
{
hgs
parents: 63
diff changeset
   564
    mIsBetterFitVerticalSnap = false;
hgs
parents: 63
diff changeset
   565
    if (mTopInRange || mBottomInRange) {
hgs
parents: 63
diff changeset
   566
        if (mDistanceHorizontalEdges < mMinHorizontalEdgesDistance) {
hgs
parents: 63
diff changeset
   567
            mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   568
        }
69
hgs
parents: 63
diff changeset
   569
        else if (mDistanceHorizontalEdges == mMinHorizontalEdgesDistance) { //the distance in the horizontal edge is same as from the selected rectangle
62
hgs
parents:
diff changeset
   570
            //check the position of rect with respect to horizontal line
hgs
parents:
diff changeset
   571
            checkInactiveRectPositionToHorizontalLine();
hgs
parents:
diff changeset
   572
            //if vertical snap position was already found and this rect's horizontal edges lies in line with Horizontal snap line
hgs
parents:
diff changeset
   573
            if (mVerticalSnapFound && mRectHorizontalEdgeLiesInLineWithHorizontalLine) {
hgs
parents:
diff changeset
   574
                if (mRectLieLeftOfHorizontalLine || mRectLiesRightOfHorizontalLine) {
hgs
parents:
diff changeset
   575
                    extendHorizontalLineToIncludeInactiveRect();
hgs
parents:
diff changeset
   576
                }
hgs
parents:
diff changeset
   577
            }
hgs
parents:
diff changeset
   578
            else {
hgs
parents:
diff changeset
   579
                //Prioritize first on the fact if the inactive rect is closer to the moving rect in X - direction.
hgs
parents:
diff changeset
   580
                if (mHorizontalDistance < mHorizontalDistanceFromSelectedRect) {
69
hgs
parents: 63
diff changeset
   581
                    mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   582
                }
hgs
parents:
diff changeset
   583
                else if (mHorizontalDistance == mHorizontalDistanceFromSelectedRect) {
hgs
parents:
diff changeset
   584
                    //Prioritize next if this Inactive rect is closer to the top edge of the container rect, then the previously selected rect
69
hgs
parents: 63
diff changeset
   585
                    if (containerHorizontalEdgeToInactiveRectHorizontalEdge < mContainerHorizontalEdgeDistance) {
hgs
parents: 63
diff changeset
   586
                        mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   587
                    }
hgs
parents:
diff changeset
   588
                    //Prioritize next if the Inactive widget's top edge lies near to top edge of the container rect
69
hgs
parents: 63
diff changeset
   589
                    else if (containerHorizontalEdgeToInactiveRectHorizontalEdge < containerOtherHorizontalEdgeToInactiveRectOtherHorizontalEdge) {
hgs
parents: 63
diff changeset
   590
                        mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   591
                    }
hgs
parents:
diff changeset
   592
                    else {
hgs
parents:
diff changeset
   593
                        //This else will happen if this rectangle being compared is exactly the same as the selected rectangle for snapping, or in opposite X direction.
hgs
parents:
diff changeset
   594
                        //In that case it does not matter which is the selected rectangle. Hence we leave the already selected rectangle as the better fit.
hgs
parents:
diff changeset
   595
                    }
hgs
parents:
diff changeset
   596
                }
hgs
parents:
diff changeset
   597
            }
hgs
parents:
diff changeset
   598
        }
hgs
parents:
diff changeset
   599
    }
hgs
parents:
diff changeset
   600
69
hgs
parents: 63
diff changeset
   601
}
hgs
parents: 63
diff changeset
   602
hgs
parents: 63
diff changeset
   603
/*!
hgs
parents: 63
diff changeset
   604
    Check if the top edge of moving rect is snappable to the incative rect's top or bottom edge.
hgs
parents: 63
diff changeset
   605
    The inactive rect's edge is only chosen if it is a better fit for vertical snapping.
hgs
parents: 63
diff changeset
   606
*/
hgs
parents: 63
diff changeset
   607
void HsSnapToLines::compareTopOfMovingRectForSnapping()
hgs
parents: 63
diff changeset
   608
{
hgs
parents: 63
diff changeset
   609
    //Check if the inactive rect lies to the left or right of the moving rect
hgs
parents: 63
diff changeset
   610
    checkInactiveRectLieLeftOrRightOfMovingRect();
hgs
parents: 63
diff changeset
   611
hgs
parents: 63
diff changeset
   612
    checkInactiveRectHorizontalEdgesInRange(mMovingRect.top());
hgs
parents: 63
diff changeset
   613
hgs
parents: 63
diff changeset
   614
    //calculate the distance of inactive rect's top edge and container rect's top edge
hgs
parents: 63
diff changeset
   615
    qreal differenceContainerTopEdgeToInactiveRectTopEdge = mInactiveRectToCompare.top() - mContainerRect.top();
hgs
parents: 63
diff changeset
   616
    //calculate the distance of inactive rect's bottom edge and container rect's bottom edge
hgs
parents: 63
diff changeset
   617
    qreal differenceContainerBottomEdgeToInactiveRectBottomEdge = mContainerRect.bottom() - mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   618
    qreal ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   619
    mDistanceHorizontalEdges = 0.0;
hgs
parents: 63
diff changeset
   620
    mMinDistancePosition = 0.0;
hgs
parents: 63
diff changeset
   621
hgs
parents: 63
diff changeset
   622
    //If only one edge of inactive rect is in snappable range, save that position
hgs
parents: 63
diff changeset
   623
    if ((mTopInRange && !mBottomInRange)
hgs
parents: 63
diff changeset
   624
        || !mTopInRange && mBottomInRange) {
hgs
parents: 63
diff changeset
   625
        if (mTopInRange) {
hgs
parents: 63
diff changeset
   626
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   627
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
hgs
parents: 63
diff changeset
   628
            ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   629
        }
hgs
parents: 63
diff changeset
   630
        else {
hgs
parents: 63
diff changeset
   631
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   632
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
hgs
parents: 63
diff changeset
   633
            ySnapGapAdjustment = mSnapGap;
hgs
parents: 63
diff changeset
   634
        }
hgs
parents: 63
diff changeset
   635
    }
hgs
parents: 63
diff changeset
   636
    //else both edges of inactive rect are in range, check which is a better fit
hgs
parents: 63
diff changeset
   637
    else if (mTopInRange && mBottomInRange) {
hgs
parents: 63
diff changeset
   638
        //if top edge of moving rect to the top of the inactive rect is closer than the bottom edge of moving rect to the bottom of the inactive rect
hgs
parents: 63
diff changeset
   639
        if (mHorizontalEdgeToTopOfInactiveRect < mHorizontalEdgeToBottomOfInactiveRect) {
hgs
parents: 63
diff changeset
   640
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   641
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
hgs
parents: 63
diff changeset
   642
            ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   643
            mBottomInRange = false;
hgs
parents: 63
diff changeset
   644
        }
hgs
parents: 63
diff changeset
   645
        //if the top edge of moving rect to top of inactive rect is at the same distance as the top edge of moving rect to the bottom of inactive rect
hgs
parents: 63
diff changeset
   646
        else if (mHorizontalEdgeToTopOfInactiveRect == mHorizontalEdgeToBottomOfInactiveRect) {
hgs
parents: 63
diff changeset
   647
            //if inactive rect lies towards the top or middle of container rect, then the top edge is priortized as the selected edge for outside snapping
hgs
parents: 63
diff changeset
   648
            if (differenceContainerTopEdgeToInactiveRectTopEdge <= differenceContainerBottomEdgeToInactiveRectBottomEdge) { 
hgs
parents: 63
diff changeset
   649
                mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   650
                mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
hgs
parents: 63
diff changeset
   651
                ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   652
                mBottomInRange = false;
hgs
parents: 63
diff changeset
   653
            }
hgs
parents: 63
diff changeset
   654
            //else bottom of the inactive rect lies more close to the bottom of the container rect, and hence prioritize it for snapping.
hgs
parents: 63
diff changeset
   655
            else {
hgs
parents: 63
diff changeset
   656
                mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   657
                mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
hgs
parents: 63
diff changeset
   658
                ySnapGapAdjustment = mSnapGap;
hgs
parents: 63
diff changeset
   659
                mTopInRange = false;
hgs
parents: 63
diff changeset
   660
            }
hgs
parents: 63
diff changeset
   661
        }
hgs
parents: 63
diff changeset
   662
        //else top edge of moving rect to the bottom of the inactive rect is closer than the top edge of moving rect to the top of the inactive rect
hgs
parents: 63
diff changeset
   663
        else{
hgs
parents: 63
diff changeset
   664
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   665
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
hgs
parents: 63
diff changeset
   666
            ySnapGapAdjustment = mSnapGap;
hgs
parents: 63
diff changeset
   667
            mTopInRange = false;
hgs
parents: 63
diff changeset
   668
        }
hgs
parents: 63
diff changeset
   669
    }
hgs
parents: 63
diff changeset
   670
hgs
parents: 63
diff changeset
   671
    //Check if this inactive rect is better fit than the previous selected rect 
hgs
parents: 63
diff changeset
   672
    checkInactiveRectBetterFitForVerticalSnapping(differenceContainerTopEdgeToInactiveRectTopEdge,
hgs
parents: 63
diff changeset
   673
                                                  differenceContainerBottomEdgeToInactiveRectBottomEdge);
hgs
parents: 63
diff changeset
   674
hgs
parents: 63
diff changeset
   675
    if (mIsBetterFitVerticalSnap) {
hgs
parents: 63
diff changeset
   676
        qreal proposedBottomOfActiveRect = mMinDistancePosition + mActiveRectHeight + ySnapGapAdjustment;
62
hgs
parents:
diff changeset
   677
        if (qBound(mContainerRect.top(), proposedBottomOfActiveRect, mContainerRect.bottom())
hgs
parents:
diff changeset
   678
            == proposedBottomOfActiveRect) {
hgs
parents:
diff changeset
   679
            mVerticalSnapFound = true;
69
hgs
parents: 63
diff changeset
   680
            mVerticalSnapPosition = mMinDistancePosition + ySnapGapAdjustment;
hgs
parents: 63
diff changeset
   681
            mMinHorizontalEdgesDistance = mDistanceHorizontalEdges;
62
hgs
parents:
diff changeset
   682
            mHorizontalDistanceFromSelectedRect = mHorizontalDistance;
hgs
parents:
diff changeset
   683
            //Save the new distance of the Chosen Rectangle's top edge from Container's top edge
hgs
parents:
diff changeset
   684
            mContainerHorizontalEdgeDistance = differenceContainerTopEdgeToInactiveRectTopEdge;
69
hgs
parents: 63
diff changeset
   685
            createHorizontalLine();
62
hgs
parents:
diff changeset
   686
        }
hgs
parents:
diff changeset
   687
    }
hgs
parents:
diff changeset
   688
}
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
/*!
hgs
parents:
diff changeset
   691
    Check if the bottom edge of moving rect is snappable to the incative rect's top or bottom edge.
hgs
parents:
diff changeset
   692
    The inactive rect's edge is only chosen if it is a better fit for vertical snapping.
hgs
parents:
diff changeset
   693
*/
hgs
parents:
diff changeset
   694
void HsSnapToLines::compareBottomOfMovingRectForSnapping()
hgs
parents:
diff changeset
   695
{
hgs
parents:
diff changeset
   696
    //Check if the inactive rect lies to the left or right of the moving rect
hgs
parents:
diff changeset
   697
    checkInactiveRectLieLeftOrRightOfMovingRect();
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
    //calculate the distance of the moving rect's bottom edge to the inactive rect's top and bottom edges
69
hgs
parents: 63
diff changeset
   700
    checkInactiveRectHorizontalEdgesInRange(mMovingRect.bottom());
62
hgs
parents:
diff changeset
   701
hgs
parents:
diff changeset
   702
    //calculate the distance of inactive rect's top edge and container rect's top edge
hgs
parents:
diff changeset
   703
    qreal differenceContainerTopEdgeToInactiveRectTopEdge = mInactiveRectToCompare.top() - mContainerRect.top();
hgs
parents:
diff changeset
   704
    //calculate the distance of inactive rect's bottom edge and container rect's bottom edge
hgs
parents:
diff changeset
   705
    qreal differenceContainerBottomEdgeToInactiveRectBottomEdge = mContainerRect.bottom() - mInactiveRectToCompare.bottom();
hgs
parents:
diff changeset
   706
    qreal ySnapGapAdjustment = 0.0;
69
hgs
parents: 63
diff changeset
   707
    mDistanceHorizontalEdges = 0.0;
hgs
parents: 63
diff changeset
   708
    mMinDistancePosition = 0.0;
62
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
    //If only one edge of inactive rect is in snappable range, save that position
hgs
parents:
diff changeset
   711
    if ((mTopInRange && !mBottomInRange)
hgs
parents:
diff changeset
   712
        || !mTopInRange && mBottomInRange) {
hgs
parents:
diff changeset
   713
        if (mTopInRange) {
69
hgs
parents: 63
diff changeset
   714
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   715
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
62
hgs
parents:
diff changeset
   716
            ySnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   717
        }
hgs
parents:
diff changeset
   718
        else {
69
hgs
parents: 63
diff changeset
   719
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   720
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
62
hgs
parents:
diff changeset
   721
            ySnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   722
        }
hgs
parents:
diff changeset
   723
    }
hgs
parents:
diff changeset
   724
    //else both edges of inactive rect are in range, check which is a better fit
hgs
parents:
diff changeset
   725
    else if (mTopInRange && mBottomInRange) {
hgs
parents:
diff changeset
   726
        //if bottom edge of moving rect to the bottom of inactive rect is closer than the bottom edge of moving rect to the top of the inactive rect
69
hgs
parents: 63
diff changeset
   727
        if (mHorizontalEdgeToBottomOfInactiveRect < mHorizontalEdgeToTopOfInactiveRect ) {
hgs
parents: 63
diff changeset
   728
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   729
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
62
hgs
parents:
diff changeset
   730
            ySnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   731
            mTopInRange = false;
hgs
parents:
diff changeset
   732
        }
hgs
parents:
diff changeset
   733
        //if bottom edge of moving rect to the bottom of inactive rect is at the same distance as the bottom edge of moving rect to the top of inactive rect
69
hgs
parents: 63
diff changeset
   734
        else if (mHorizontalEdgeToBottomOfInactiveRect == mHorizontalEdgeToTopOfInactiveRect) {
62
hgs
parents:
diff changeset
   735
            //if inactive rect lies towards the bottom of container rect, then the bottom edge is priortized as the selected edge for snapping
hgs
parents:
diff changeset
   736
            //This is done for outside snapping
hgs
parents:
diff changeset
   737
            if (differenceContainerBottomEdgeToInactiveRectBottomEdge < differenceContainerTopEdgeToInactiveRectTopEdge) {
69
hgs
parents: 63
diff changeset
   738
                mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   739
                mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
62
hgs
parents:
diff changeset
   740
                ySnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   741
                mTopInRange = false;
hgs
parents:
diff changeset
   742
            }
hgs
parents:
diff changeset
   743
            //else top of the inactive rect lies more close to the top of the container rect or at the same distance, and hence prioritize it
hgs
parents:
diff changeset
   744
            else {
69
hgs
parents: 63
diff changeset
   745
                mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   746
                mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
62
hgs
parents:
diff changeset
   747
                ySnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   748
                mBottomInRange = false;
hgs
parents:
diff changeset
   749
            }
hgs
parents:
diff changeset
   750
        }
hgs
parents:
diff changeset
   751
        //else bottom edge of moving rect to the top of inactive rect is closer than the bottom edge of moving rect to the bottom of the inactive rect
hgs
parents:
diff changeset
   752
        else{
69
hgs
parents: 63
diff changeset
   753
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   754
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
62
hgs
parents:
diff changeset
   755
            ySnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   756
            mBottomInRange = false;
hgs
parents:
diff changeset
   757
        }
hgs
parents:
diff changeset
   758
    }
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
    //Check if this inactive rect is better fit than the previous selected rect 
69
hgs
parents: 63
diff changeset
   761
    checkInactiveRectBetterFitForVerticalSnapping(differenceContainerBottomEdgeToInactiveRectBottomEdge,
hgs
parents: 63
diff changeset
   762
                                                  differenceContainerTopEdgeToInactiveRectTopEdge);
62
hgs
parents:
diff changeset
   763
69
hgs
parents: 63
diff changeset
   764
    if (mIsBetterFitVerticalSnap) {
hgs
parents: 63
diff changeset
   765
        qreal proposedTopOfActiveRect = mMinDistancePosition - mActiveRectHeight - ySnapGapAdjustment;
62
hgs
parents:
diff changeset
   766
        if (qBound(mContainerRect.top(), proposedTopOfActiveRect, mContainerRect.bottom())
hgs
parents:
diff changeset
   767
            == proposedTopOfActiveRect) {
hgs
parents:
diff changeset
   768
            mVerticalSnapFound = true;
hgs
parents:
diff changeset
   769
            mVerticalSnapPosition = proposedTopOfActiveRect;
69
hgs
parents: 63
diff changeset
   770
            mMinHorizontalEdgesDistance = mDistanceHorizontalEdges;
62
hgs
parents:
diff changeset
   771
            mHorizontalDistanceFromSelectedRect = mHorizontalDistance;
hgs
parents:
diff changeset
   772
            //Save the new distance of the Selected Rectangle's bottom edge from Container's bottom edge
hgs
parents:
diff changeset
   773
            mContainerHorizontalEdgeDistance = differenceContainerBottomEdgeToInactiveRectBottomEdge;
69
hgs
parents: 63
diff changeset
   774
            createHorizontalLine();
hgs
parents: 63
diff changeset
   775
        }
hgs
parents: 63
diff changeset
   776
    }
hgs
parents: 63
diff changeset
   777
}
62
hgs
parents:
diff changeset
   778
69
hgs
parents: 63
diff changeset
   779
/*!
hgs
parents: 63
diff changeset
   780
    Create the horizontal line for vertical snap guidance
hgs
parents: 63
diff changeset
   781
*/
hgs
parents: 63
diff changeset
   782
void HsSnapToLines::createHorizontalLine()
hgs
parents: 63
diff changeset
   783
{
90
hgs
parents: 81
diff changeset
   784
    qreal left = qMin( mInactiveRectToCompare.left(), mMovingRect.left());
hgs
parents: 81
diff changeset
   785
    qreal right = qMax(mInactiveRectToCompare.right(), mMovingRect.right()); 
hgs
parents: 81
diff changeset
   786
    mHorizontalLine.setP1(QPointF(left, mMinDistancePosition));
hgs
parents: 81
diff changeset
   787
    mHorizontalLine.setP2(QPointF(right, mMinDistancePosition));
62
hgs
parents:
diff changeset
   788
}
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
/*!
hgs
parents:
diff changeset
   791
    Extend the Vertical line on both side of reference(snapping) rectancles.
hgs
parents:
diff changeset
   792
*/
hgs
parents:
diff changeset
   793
void HsSnapToLines::extendVerticalLine()
hgs
parents:
diff changeset
   794
{
hgs
parents:
diff changeset
   795
    if (mVerticalLine.y1() <= mVerticalLine.y2()) {
hgs
parents:
diff changeset
   796
        mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mVerticalLine.y1() - SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   797
        mVerticalLine.setP2(QPointF(mVerticalLine.x2(), mVerticalLine.y2() + SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   798
    }
hgs
parents:
diff changeset
   799
    else {
hgs
parents:
diff changeset
   800
        mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mVerticalLine.y1() + SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   801
        mVerticalLine.setP2(QPointF(mVerticalLine.x2(), mVerticalLine.y2() - SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   802
    }
hgs
parents:
diff changeset
   803
}
hgs
parents:
diff changeset
   804
hgs
parents:
diff changeset
   805
/*!
hgs
parents:
diff changeset
   806
    Extend the Horizontal line on both side of reference(snapping) rectancles.
hgs
parents:
diff changeset
   807
*/
hgs
parents:
diff changeset
   808
void HsSnapToLines::extendHorizontalLine()
hgs
parents:
diff changeset
   809
{
hgs
parents:
diff changeset
   810
    if (mHorizontalLine.x1() <= mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   811
        mHorizontalLine.setP1(QPointF(mHorizontalLine.x1() - SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y1()));
hgs
parents:
diff changeset
   812
        mHorizontalLine.setP2(QPointF(mHorizontalLine.x2() + SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y2()));
hgs
parents:
diff changeset
   813
    }
hgs
parents:
diff changeset
   814
    else {
hgs
parents:
diff changeset
   815
        mHorizontalLine.setP1(QPointF(mHorizontalLine.x1() + SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y1()));
hgs
parents:
diff changeset
   816
        mHorizontalLine.setP2(QPointF(mHorizontalLine.x2() - SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y2()));
hgs
parents:
diff changeset
   817
    }
hgs
parents:
diff changeset
   818
}
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
/*!
hgs
parents:
diff changeset
   821
    Check if the Vertical edge of the Rectangle lies out of the Vertical line.
hgs
parents:
diff changeset
   822
    Also check if the rectangle's edge lies out of the line.
hgs
parents:
diff changeset
   823
*/
hgs
parents:
diff changeset
   824
void HsSnapToLines::checkInactiveRectPositionToVerticalLine()
hgs
parents:
diff changeset
   825
{
hgs
parents:
diff changeset
   826
    mRectVerticalEdgeLiesInLineWithVerticalLine = false;
hgs
parents:
diff changeset
   827
    mRectLieAboveVerticalLine = false;
hgs
parents:
diff changeset
   828
    mRectLieBelowVerticalLine = false;
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
    //if rectangle vertical edge lies inline with Vertical line.
hgs
parents:
diff changeset
   831
    if ((mLeftInRange && mInactiveRectToCompare.left() == mVerticalLine.x1())
hgs
parents:
diff changeset
   832
        || (mRightInRange && mInactiveRectToCompare.right() == mVerticalLine.x1())) {
hgs
parents:
diff changeset
   833
        mRectVerticalEdgeLiesInLineWithVerticalLine = true;
hgs
parents:
diff changeset
   834
        //if the rectangle lies below the vertical line
hgs
parents:
diff changeset
   835
        if (mInactiveRectToCompare.bottom() > mVerticalLine.y1() && mInactiveRectToCompare.bottom() > mVerticalLine.y2()) {
hgs
parents:
diff changeset
   836
            mRectLieBelowVerticalLine = true;
hgs
parents:
diff changeset
   837
        }
hgs
parents:
diff changeset
   838
        //if the rectangle lies above the vertical line
hgs
parents:
diff changeset
   839
        if (mInactiveRectToCompare.top() < mVerticalLine.y1() && mInactiveRectToCompare.top() < mVerticalLine.y2()) {
hgs
parents:
diff changeset
   840
            mRectLieAboveVerticalLine = true;
hgs
parents:
diff changeset
   841
        }
hgs
parents:
diff changeset
   842
    }
hgs
parents:
diff changeset
   843
}
hgs
parents:
diff changeset
   844
hgs
parents:
diff changeset
   845
/*!
hgs
parents:
diff changeset
   846
    Increase the Vertical line to include the inactive rect whose vertical edge is inline with vertical line
hgs
parents:
diff changeset
   847
*/
hgs
parents:
diff changeset
   848
void HsSnapToLines::extendVerticalLineToIncludeInactiveRect()
hgs
parents:
diff changeset
   849
{
hgs
parents:
diff changeset
   850
    if (mRectLieAboveVerticalLine) {
hgs
parents:
diff changeset
   851
        if (mVerticalLine.y1() < mVerticalLine.y2()) {
hgs
parents:
diff changeset
   852
            mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.top()));
hgs
parents:
diff changeset
   853
        }
hgs
parents:
diff changeset
   854
        else {
hgs
parents:
diff changeset
   855
            mVerticalLine.setP2(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.top()));
hgs
parents:
diff changeset
   856
        }
hgs
parents:
diff changeset
   857
    }
hgs
parents:
diff changeset
   858
    if (mRectLieBelowVerticalLine) {
hgs
parents:
diff changeset
   859
        if (mVerticalLine.y1() < mVerticalLine.y2()) {
hgs
parents:
diff changeset
   860
            mVerticalLine.setP2(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.bottom()));
hgs
parents:
diff changeset
   861
        }
hgs
parents:
diff changeset
   862
        else {
hgs
parents:
diff changeset
   863
            mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.bottom()));
hgs
parents:
diff changeset
   864
        }
hgs
parents:
diff changeset
   865
    }
hgs
parents:
diff changeset
   866
}
hgs
parents:
diff changeset
   867
hgs
parents:
diff changeset
   868
/*!
hgs
parents:
diff changeset
   869
    Check if the Horizontal edge of the Rectangle lies inline with the Horizontal line.
hgs
parents:
diff changeset
   870
    Also check if the rectangle's edge lies out of the line.
hgs
parents:
diff changeset
   871
*/
hgs
parents:
diff changeset
   872
void HsSnapToLines::checkInactiveRectPositionToHorizontalLine()
hgs
parents:
diff changeset
   873
{
hgs
parents:
diff changeset
   874
    mRectHorizontalEdgeLiesInLineWithHorizontalLine = false;
hgs
parents:
diff changeset
   875
    mRectLieLeftOfHorizontalLine = false;
hgs
parents:
diff changeset
   876
    mRectLiesRightOfHorizontalLine = false;
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
    //if rectangle horizontal edge lies inline with Horizontal line.
hgs
parents:
diff changeset
   879
    if ((mTopInRange && mInactiveRectToCompare.top() == mHorizontalLine.y1())
hgs
parents:
diff changeset
   880
        || (mBottomInRange && mInactiveRectToCompare.bottom() == mHorizontalLine.y1())) {
hgs
parents:
diff changeset
   881
        mRectHorizontalEdgeLiesInLineWithHorizontalLine = true;
hgs
parents:
diff changeset
   882
        //if the rectangle lies left of the horizontal line
hgs
parents:
diff changeset
   883
        if (mInactiveRectToCompare.left() < mHorizontalLine.x1() && mInactiveRectToCompare.left() < mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   884
            mRectLieLeftOfHorizontalLine = true;
hgs
parents:
diff changeset
   885
        }
hgs
parents:
diff changeset
   886
        //if the rectangle lies right of the horizontal line
hgs
parents:
diff changeset
   887
        if (mInactiveRectToCompare.right() > mHorizontalLine.x1() && mInactiveRectToCompare.right() > mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   888
            mRectLiesRightOfHorizontalLine = true;
hgs
parents:
diff changeset
   889
        }
hgs
parents:
diff changeset
   890
    }
hgs
parents:
diff changeset
   891
}
hgs
parents:
diff changeset
   892
hgs
parents:
diff changeset
   893
/*!
hgs
parents:
diff changeset
   894
    Increase the Horizontal line to include the inactive rect whose horizontal edge is inline with horizontal line
hgs
parents:
diff changeset
   895
*/
hgs
parents:
diff changeset
   896
void HsSnapToLines::extendHorizontalLineToIncludeInactiveRect()
hgs
parents:
diff changeset
   897
{
hgs
parents:
diff changeset
   898
    if (mRectLieLeftOfHorizontalLine) {
hgs
parents:
diff changeset
   899
        if (mHorizontalLine.x1() < mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   900
            mHorizontalLine.setP1(QPointF(mInactiveRectToCompare.left(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   901
        }
hgs
parents:
diff changeset
   902
        else {
hgs
parents:
diff changeset
   903
            mHorizontalLine.setP2(QPointF(mInactiveRectToCompare.left(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   904
        }
hgs
parents:
diff changeset
   905
    }
hgs
parents:
diff changeset
   906
    if (mRectLiesRightOfHorizontalLine) {
hgs
parents:
diff changeset
   907
        if (mHorizontalLine.x1() < mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   908
            mHorizontalLine.setP2(QPointF(mInactiveRectToCompare.right(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   909
        }
hgs
parents:
diff changeset
   910
        else {
hgs
parents:
diff changeset
   911
            mHorizontalLine.setP1(QPointF(mInactiveRectToCompare.right(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   912
        }
hgs
parents:
diff changeset
   913
    }
hgs
parents:
diff changeset
   914
}