homescreenapp/hsutils/src/hswidgetpositioningonwidgetmove.cpp
author hgs
Wed, 18 Aug 2010 10:33:57 +0300
changeset 81 7dd137878ff8
parent 69 87476091b3f5
child 90 3ac3aaebaee5
permissions -rw-r--r--
201033
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
{
hgs
parents: 63
diff changeset
   491
    if (mRectLieAbove) {
hgs
parents: 63
diff changeset
   492
        mVerticalLine.setP1(QPointF(mMinDistancePosition, mInactiveRectToCompare.top()));
hgs
parents: 63
diff changeset
   493
        mVerticalLine.setP2(QPointF(mMinDistancePosition, mMovingRect.bottom()));
hgs
parents: 63
diff changeset
   494
    }
hgs
parents: 63
diff changeset
   495
    else {
hgs
parents: 63
diff changeset
   496
        mVerticalLine.setP1(QPointF(mMinDistancePosition, mInactiveRectToCompare.bottom()));
hgs
parents: 63
diff changeset
   497
        mVerticalLine.setP2(QPointF(mMinDistancePosition, mMovingRect.top()));
62
hgs
parents:
diff changeset
   498
    }
hgs
parents:
diff changeset
   499
}
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
/*!
hgs
parents:
diff changeset
   502
    Check if the inactive rect being compared with moving rect lies on left or right of moving rect.
hgs
parents:
diff changeset
   503
*/
hgs
parents:
diff changeset
   504
void HsSnapToLines::checkInactiveRectLieLeftOrRightOfMovingRect()
hgs
parents:
diff changeset
   505
{
hgs
parents:
diff changeset
   506
    mRectLieLeft = false;
hgs
parents:
diff changeset
   507
    mHorizontalDistance = 0.0;
hgs
parents:
diff changeset
   508
    //Inactive Rect lies left of the Moving Rect
hgs
parents:
diff changeset
   509
    if (mInactiveRectToCompare.left() < mMovingRect.left()) {
hgs
parents:
diff changeset
   510
        mRectLieLeft = true;
hgs
parents:
diff changeset
   511
        if (mInactiveRectToCompare.right() <= mMovingRect.left()) {
hgs
parents:
diff changeset
   512
            mHorizontalDistance = mMovingRect.left() - mInactiveRectToCompare.right();
hgs
parents:
diff changeset
   513
        }
hgs
parents:
diff changeset
   514
        else {
hgs
parents:
diff changeset
   515
            mHorizontalDistance = mMovingRect.left() - mInactiveRectToCompare.left();
hgs
parents:
diff changeset
   516
        }
hgs
parents:
diff changeset
   517
    }
hgs
parents:
diff changeset
   518
    //Inactive Rect lies right of the Moving Rect
hgs
parents:
diff changeset
   519
    else {
hgs
parents:
diff changeset
   520
        mRectLieLeft = false;
hgs
parents:
diff changeset
   521
        if (mMovingRect.right() <= mInactiveRectToCompare.left()) {
hgs
parents:
diff changeset
   522
            mHorizontalDistance = mInactiveRectToCompare.left() - mMovingRect.right();
hgs
parents:
diff changeset
   523
        }
hgs
parents:
diff changeset
   524
        else {
hgs
parents:
diff changeset
   525
            mHorizontalDistance = mInactiveRectToCompare.right() - mMovingRect.right();
hgs
parents:
diff changeset
   526
        }
hgs
parents:
diff changeset
   527
    }
hgs
parents:
diff changeset
   528
}
hgs
parents:
diff changeset
   529
hgs
parents:
diff changeset
   530
/*!
69
hgs
parents: 63
diff changeset
   531
    Check if the Horizontal edges (Top and Bottom Edges) of the inactive rect being compared
hgs
parents: 63
diff changeset
   532
    is in range of the snapping distance of the horizontal edge of moving rect
hgs
parents: 63
diff changeset
   533
    \param movingRectHorizontalEdgePosition Position of the Horizontal edge(either top or bottom) of moving rect.
62
hgs
parents:
diff changeset
   534
*/
69
hgs
parents: 63
diff changeset
   535
void HsSnapToLines::checkInactiveRectHorizontalEdgesInRange(qreal movingRectHorizontalEdgePosition)
62
hgs
parents:
diff changeset
   536
{
hgs
parents:
diff changeset
   537
    mTopInRange = false;
hgs
parents:
diff changeset
   538
    mBottomInRange = false;
hgs
parents:
diff changeset
   539
69
hgs
parents: 63
diff changeset
   540
    //calculate the distance of the moving rect's horizontal edge to the inactive rect's top and bottom edges
hgs
parents: 63
diff changeset
   541
    mHorizontalEdgeToTopOfInactiveRect = qAbs(mInactiveRectToCompare.top() - movingRectHorizontalEdgePosition);
hgs
parents: 63
diff changeset
   542
    mHorizontalEdgeToBottomOfInactiveRect = qAbs(mInactiveRectToCompare.bottom() - movingRectHorizontalEdgePosition);
hgs
parents: 63
diff changeset
   543
hgs
parents: 63
diff changeset
   544
    if (mHorizontalEdgeToTopOfInactiveRect <= mMinHorizontalEdgesDistance) {
62
hgs
parents:
diff changeset
   545
        if (mRectLieLeft && mInactiveSnapRectToCompare.isTopSnapableForRight
hgs
parents:
diff changeset
   546
         || !mRectLieLeft && mInactiveSnapRectToCompare.isTopSnapableForLeft) {
hgs
parents:
diff changeset
   547
            mTopInRange = true;
hgs
parents:
diff changeset
   548
        }
hgs
parents:
diff changeset
   549
    }
69
hgs
parents: 63
diff changeset
   550
    if (mHorizontalEdgeToBottomOfInactiveRect <= mMinHorizontalEdgesDistance) {
62
hgs
parents:
diff changeset
   551
        if (mRectLieLeft && mInactiveSnapRectToCompare.isBottomSnapableForRight
hgs
parents:
diff changeset
   552
         || !mRectLieLeft && mInactiveSnapRectToCompare.isBottomSnapableForLeft) {
hgs
parents:
diff changeset
   553
            mBottomInRange = true;
hgs
parents:
diff changeset
   554
        }
hgs
parents:
diff changeset
   555
    }
69
hgs
parents: 63
diff changeset
   556
}
62
hgs
parents:
diff changeset
   557
69
hgs
parents: 63
diff changeset
   558
/*!
hgs
parents: 63
diff changeset
   559
    Check if this inactive rect is better fit for Vertical snapping
hgs
parents: 63
diff changeset
   560
    \param containerHorizontalEdgeToInactiveRectHorizontalEdge
hgs
parents: 63
diff changeset
   561
           difference between the horizontal edge of the container and same horizontal edge of inactive rect
hgs
parents: 63
diff changeset
   562
    \param containerOtherHorizontalEdgeToInactiveRectOtherHorizontalEdge
hgs
parents: 63
diff changeset
   563
           difference between the opposite horizontal edges of continer and the inactive rect
hgs
parents: 63
diff changeset
   564
*/
hgs
parents: 63
diff changeset
   565
void HsSnapToLines::checkInactiveRectBetterFitForVerticalSnapping(qreal containerHorizontalEdgeToInactiveRectHorizontalEdge,
hgs
parents: 63
diff changeset
   566
                                                       qreal containerOtherHorizontalEdgeToInactiveRectOtherHorizontalEdge)
hgs
parents: 63
diff changeset
   567
{
hgs
parents: 63
diff changeset
   568
    mIsBetterFitVerticalSnap = false;
hgs
parents: 63
diff changeset
   569
    if (mTopInRange || mBottomInRange) {
hgs
parents: 63
diff changeset
   570
        if (mDistanceHorizontalEdges < mMinHorizontalEdgesDistance) {
hgs
parents: 63
diff changeset
   571
            mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   572
        }
69
hgs
parents: 63
diff changeset
   573
        else if (mDistanceHorizontalEdges == mMinHorizontalEdgesDistance) { //the distance in the horizontal edge is same as from the selected rectangle
62
hgs
parents:
diff changeset
   574
            //check the position of rect with respect to horizontal line
hgs
parents:
diff changeset
   575
            checkInactiveRectPositionToHorizontalLine();
hgs
parents:
diff changeset
   576
            //if vertical snap position was already found and this rect's horizontal edges lies in line with Horizontal snap line
hgs
parents:
diff changeset
   577
            if (mVerticalSnapFound && mRectHorizontalEdgeLiesInLineWithHorizontalLine) {
hgs
parents:
diff changeset
   578
                if (mRectLieLeftOfHorizontalLine || mRectLiesRightOfHorizontalLine) {
hgs
parents:
diff changeset
   579
                    extendHorizontalLineToIncludeInactiveRect();
hgs
parents:
diff changeset
   580
                }
hgs
parents:
diff changeset
   581
            }
hgs
parents:
diff changeset
   582
            else {
hgs
parents:
diff changeset
   583
                //Prioritize first on the fact if the inactive rect is closer to the moving rect in X - direction.
hgs
parents:
diff changeset
   584
                if (mHorizontalDistance < mHorizontalDistanceFromSelectedRect) {
69
hgs
parents: 63
diff changeset
   585
                    mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   586
                }
hgs
parents:
diff changeset
   587
                else if (mHorizontalDistance == mHorizontalDistanceFromSelectedRect) {
hgs
parents:
diff changeset
   588
                    //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
   589
                    if (containerHorizontalEdgeToInactiveRectHorizontalEdge < mContainerHorizontalEdgeDistance) {
hgs
parents: 63
diff changeset
   590
                        mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   591
                    }
hgs
parents:
diff changeset
   592
                    //Prioritize next if the Inactive widget's top edge lies near to top edge of the container rect
69
hgs
parents: 63
diff changeset
   593
                    else if (containerHorizontalEdgeToInactiveRectHorizontalEdge < containerOtherHorizontalEdgeToInactiveRectOtherHorizontalEdge) {
hgs
parents: 63
diff changeset
   594
                        mIsBetterFitVerticalSnap = true;
62
hgs
parents:
diff changeset
   595
                    }
hgs
parents:
diff changeset
   596
                    else {
hgs
parents:
diff changeset
   597
                        //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
   598
                        //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
   599
                    }
hgs
parents:
diff changeset
   600
                }
hgs
parents:
diff changeset
   601
            }
hgs
parents:
diff changeset
   602
        }
hgs
parents:
diff changeset
   603
    }
hgs
parents:
diff changeset
   604
69
hgs
parents: 63
diff changeset
   605
}
hgs
parents: 63
diff changeset
   606
hgs
parents: 63
diff changeset
   607
/*!
hgs
parents: 63
diff changeset
   608
    Check if the top edge of moving rect is snappable to the incative rect's top or bottom edge.
hgs
parents: 63
diff changeset
   609
    The inactive rect's edge is only chosen if it is a better fit for vertical snapping.
hgs
parents: 63
diff changeset
   610
*/
hgs
parents: 63
diff changeset
   611
void HsSnapToLines::compareTopOfMovingRectForSnapping()
hgs
parents: 63
diff changeset
   612
{
hgs
parents: 63
diff changeset
   613
    //Check if the inactive rect lies to the left or right of the moving rect
hgs
parents: 63
diff changeset
   614
    checkInactiveRectLieLeftOrRightOfMovingRect();
hgs
parents: 63
diff changeset
   615
hgs
parents: 63
diff changeset
   616
    checkInactiveRectHorizontalEdgesInRange(mMovingRect.top());
hgs
parents: 63
diff changeset
   617
hgs
parents: 63
diff changeset
   618
    //calculate the distance of inactive rect's top edge and container rect's top edge
hgs
parents: 63
diff changeset
   619
    qreal differenceContainerTopEdgeToInactiveRectTopEdge = mInactiveRectToCompare.top() - mContainerRect.top();
hgs
parents: 63
diff changeset
   620
    //calculate the distance of inactive rect's bottom edge and container rect's bottom edge
hgs
parents: 63
diff changeset
   621
    qreal differenceContainerBottomEdgeToInactiveRectBottomEdge = mContainerRect.bottom() - mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   622
    qreal ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   623
    mDistanceHorizontalEdges = 0.0;
hgs
parents: 63
diff changeset
   624
    mMinDistancePosition = 0.0;
hgs
parents: 63
diff changeset
   625
hgs
parents: 63
diff changeset
   626
    //If only one edge of inactive rect is in snappable range, save that position
hgs
parents: 63
diff changeset
   627
    if ((mTopInRange && !mBottomInRange)
hgs
parents: 63
diff changeset
   628
        || !mTopInRange && mBottomInRange) {
hgs
parents: 63
diff changeset
   629
        if (mTopInRange) {
hgs
parents: 63
diff changeset
   630
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   631
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
hgs
parents: 63
diff changeset
   632
            ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   633
        }
hgs
parents: 63
diff changeset
   634
        else {
hgs
parents: 63
diff changeset
   635
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   636
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
hgs
parents: 63
diff changeset
   637
            ySnapGapAdjustment = mSnapGap;
hgs
parents: 63
diff changeset
   638
        }
hgs
parents: 63
diff changeset
   639
    }
hgs
parents: 63
diff changeset
   640
    //else both edges of inactive rect are in range, check which is a better fit
hgs
parents: 63
diff changeset
   641
    else if (mTopInRange && mBottomInRange) {
hgs
parents: 63
diff changeset
   642
        //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
   643
        if (mHorizontalEdgeToTopOfInactiveRect < mHorizontalEdgeToBottomOfInactiveRect) {
hgs
parents: 63
diff changeset
   644
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   645
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
hgs
parents: 63
diff changeset
   646
            ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   647
            mBottomInRange = false;
hgs
parents: 63
diff changeset
   648
        }
hgs
parents: 63
diff changeset
   649
        //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
   650
        else if (mHorizontalEdgeToTopOfInactiveRect == mHorizontalEdgeToBottomOfInactiveRect) {
hgs
parents: 63
diff changeset
   651
            //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
   652
            if (differenceContainerTopEdgeToInactiveRectTopEdge <= differenceContainerBottomEdgeToInactiveRectBottomEdge) { 
hgs
parents: 63
diff changeset
   653
                mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   654
                mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
hgs
parents: 63
diff changeset
   655
                ySnapGapAdjustment = 0.0;
hgs
parents: 63
diff changeset
   656
                mBottomInRange = false;
hgs
parents: 63
diff changeset
   657
            }
hgs
parents: 63
diff changeset
   658
            //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
   659
            else {
hgs
parents: 63
diff changeset
   660
                mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   661
                mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
hgs
parents: 63
diff changeset
   662
                ySnapGapAdjustment = mSnapGap;
hgs
parents: 63
diff changeset
   663
                mTopInRange = false;
hgs
parents: 63
diff changeset
   664
            }
hgs
parents: 63
diff changeset
   665
        }
hgs
parents: 63
diff changeset
   666
        //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
   667
        else{
hgs
parents: 63
diff changeset
   668
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   669
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
hgs
parents: 63
diff changeset
   670
            ySnapGapAdjustment = mSnapGap;
hgs
parents: 63
diff changeset
   671
            mTopInRange = false;
hgs
parents: 63
diff changeset
   672
        }
hgs
parents: 63
diff changeset
   673
    }
hgs
parents: 63
diff changeset
   674
hgs
parents: 63
diff changeset
   675
    //Check if this inactive rect is better fit than the previous selected rect 
hgs
parents: 63
diff changeset
   676
    checkInactiveRectBetterFitForVerticalSnapping(differenceContainerTopEdgeToInactiveRectTopEdge,
hgs
parents: 63
diff changeset
   677
                                                  differenceContainerBottomEdgeToInactiveRectBottomEdge);
hgs
parents: 63
diff changeset
   678
hgs
parents: 63
diff changeset
   679
    if (mIsBetterFitVerticalSnap) {
hgs
parents: 63
diff changeset
   680
        qreal proposedBottomOfActiveRect = mMinDistancePosition + mActiveRectHeight + ySnapGapAdjustment;
62
hgs
parents:
diff changeset
   681
        if (qBound(mContainerRect.top(), proposedBottomOfActiveRect, mContainerRect.bottom())
hgs
parents:
diff changeset
   682
            == proposedBottomOfActiveRect) {
hgs
parents:
diff changeset
   683
            mVerticalSnapFound = true;
69
hgs
parents: 63
diff changeset
   684
            mVerticalSnapPosition = mMinDistancePosition + ySnapGapAdjustment;
hgs
parents: 63
diff changeset
   685
            mMinHorizontalEdgesDistance = mDistanceHorizontalEdges;
62
hgs
parents:
diff changeset
   686
            mHorizontalDistanceFromSelectedRect = mHorizontalDistance;
hgs
parents:
diff changeset
   687
            //Save the new distance of the Chosen Rectangle's top edge from Container's top edge
hgs
parents:
diff changeset
   688
            mContainerHorizontalEdgeDistance = differenceContainerTopEdgeToInactiveRectTopEdge;
69
hgs
parents: 63
diff changeset
   689
            createHorizontalLine();
62
hgs
parents:
diff changeset
   690
        }
hgs
parents:
diff changeset
   691
    }
hgs
parents:
diff changeset
   692
}
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
/*!
hgs
parents:
diff changeset
   695
    Check if the bottom edge of moving rect is snappable to the incative rect's top or bottom edge.
hgs
parents:
diff changeset
   696
    The inactive rect's edge is only chosen if it is a better fit for vertical snapping.
hgs
parents:
diff changeset
   697
*/
hgs
parents:
diff changeset
   698
void HsSnapToLines::compareBottomOfMovingRectForSnapping()
hgs
parents:
diff changeset
   699
{
hgs
parents:
diff changeset
   700
    //Check if the inactive rect lies to the left or right of the moving rect
hgs
parents:
diff changeset
   701
    checkInactiveRectLieLeftOrRightOfMovingRect();
hgs
parents:
diff changeset
   702
hgs
parents:
diff changeset
   703
    //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
   704
    checkInactiveRectHorizontalEdgesInRange(mMovingRect.bottom());
62
hgs
parents:
diff changeset
   705
hgs
parents:
diff changeset
   706
    //calculate the distance of inactive rect's top edge and container rect's top edge
hgs
parents:
diff changeset
   707
    qreal differenceContainerTopEdgeToInactiveRectTopEdge = mInactiveRectToCompare.top() - mContainerRect.top();
hgs
parents:
diff changeset
   708
    //calculate the distance of inactive rect's bottom edge and container rect's bottom edge
hgs
parents:
diff changeset
   709
    qreal differenceContainerBottomEdgeToInactiveRectBottomEdge = mContainerRect.bottom() - mInactiveRectToCompare.bottom();
hgs
parents:
diff changeset
   710
    qreal ySnapGapAdjustment = 0.0;
69
hgs
parents: 63
diff changeset
   711
    mDistanceHorizontalEdges = 0.0;
hgs
parents: 63
diff changeset
   712
    mMinDistancePosition = 0.0;
62
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
    //If only one edge of inactive rect is in snappable range, save that position
hgs
parents:
diff changeset
   715
    if ((mTopInRange && !mBottomInRange)
hgs
parents:
diff changeset
   716
        || !mTopInRange && mBottomInRange) {
hgs
parents:
diff changeset
   717
        if (mTopInRange) {
69
hgs
parents: 63
diff changeset
   718
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   719
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
62
hgs
parents:
diff changeset
   720
            ySnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   721
        }
hgs
parents:
diff changeset
   722
        else {
69
hgs
parents: 63
diff changeset
   723
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   724
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
62
hgs
parents:
diff changeset
   725
            ySnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   726
        }
hgs
parents:
diff changeset
   727
    }
hgs
parents:
diff changeset
   728
    //else both edges of inactive rect are in range, check which is a better fit
hgs
parents:
diff changeset
   729
    else if (mTopInRange && mBottomInRange) {
hgs
parents:
diff changeset
   730
        //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
   731
        if (mHorizontalEdgeToBottomOfInactiveRect < mHorizontalEdgeToTopOfInactiveRect ) {
hgs
parents: 63
diff changeset
   732
            mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   733
            mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
62
hgs
parents:
diff changeset
   734
            ySnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   735
            mTopInRange = false;
hgs
parents:
diff changeset
   736
        }
hgs
parents:
diff changeset
   737
        //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
   738
        else if (mHorizontalEdgeToBottomOfInactiveRect == mHorizontalEdgeToTopOfInactiveRect) {
62
hgs
parents:
diff changeset
   739
            //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
   740
            //This is done for outside snapping
hgs
parents:
diff changeset
   741
            if (differenceContainerBottomEdgeToInactiveRectBottomEdge < differenceContainerTopEdgeToInactiveRectTopEdge) {
69
hgs
parents: 63
diff changeset
   742
                mMinDistancePosition = mInactiveRectToCompare.bottom();
hgs
parents: 63
diff changeset
   743
                mDistanceHorizontalEdges = mHorizontalEdgeToBottomOfInactiveRect;
62
hgs
parents:
diff changeset
   744
                ySnapGapAdjustment = 0.0;
hgs
parents:
diff changeset
   745
                mTopInRange = false;
hgs
parents:
diff changeset
   746
            }
hgs
parents:
diff changeset
   747
            //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
   748
            else {
69
hgs
parents: 63
diff changeset
   749
                mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   750
                mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
62
hgs
parents:
diff changeset
   751
                ySnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   752
                mBottomInRange = false;
hgs
parents:
diff changeset
   753
            }
hgs
parents:
diff changeset
   754
        }
hgs
parents:
diff changeset
   755
        //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
   756
        else{
69
hgs
parents: 63
diff changeset
   757
            mMinDistancePosition = mInactiveRectToCompare.top();
hgs
parents: 63
diff changeset
   758
            mDistanceHorizontalEdges = mHorizontalEdgeToTopOfInactiveRect;
62
hgs
parents:
diff changeset
   759
            ySnapGapAdjustment = mSnapGap;
hgs
parents:
diff changeset
   760
            mBottomInRange = false;
hgs
parents:
diff changeset
   761
        }
hgs
parents:
diff changeset
   762
    }
hgs
parents:
diff changeset
   763
hgs
parents:
diff changeset
   764
    //Check if this inactive rect is better fit than the previous selected rect 
69
hgs
parents: 63
diff changeset
   765
    checkInactiveRectBetterFitForVerticalSnapping(differenceContainerBottomEdgeToInactiveRectBottomEdge,
hgs
parents: 63
diff changeset
   766
                                                  differenceContainerTopEdgeToInactiveRectTopEdge);
62
hgs
parents:
diff changeset
   767
69
hgs
parents: 63
diff changeset
   768
    if (mIsBetterFitVerticalSnap) {
hgs
parents: 63
diff changeset
   769
        qreal proposedTopOfActiveRect = mMinDistancePosition - mActiveRectHeight - ySnapGapAdjustment;
62
hgs
parents:
diff changeset
   770
        if (qBound(mContainerRect.top(), proposedTopOfActiveRect, mContainerRect.bottom())
hgs
parents:
diff changeset
   771
            == proposedTopOfActiveRect) {
hgs
parents:
diff changeset
   772
            mVerticalSnapFound = true;
hgs
parents:
diff changeset
   773
            mVerticalSnapPosition = proposedTopOfActiveRect;
69
hgs
parents: 63
diff changeset
   774
            mMinHorizontalEdgesDistance = mDistanceHorizontalEdges;
62
hgs
parents:
diff changeset
   775
            mHorizontalDistanceFromSelectedRect = mHorizontalDistance;
hgs
parents:
diff changeset
   776
            //Save the new distance of the Selected Rectangle's bottom edge from Container's bottom edge
hgs
parents:
diff changeset
   777
            mContainerHorizontalEdgeDistance = differenceContainerBottomEdgeToInactiveRectBottomEdge;
69
hgs
parents: 63
diff changeset
   778
            createHorizontalLine();
hgs
parents: 63
diff changeset
   779
        }
hgs
parents: 63
diff changeset
   780
    }
hgs
parents: 63
diff changeset
   781
}
62
hgs
parents:
diff changeset
   782
69
hgs
parents: 63
diff changeset
   783
/*!
hgs
parents: 63
diff changeset
   784
    Create the horizontal line for vertical snap guidance
hgs
parents: 63
diff changeset
   785
*/
hgs
parents: 63
diff changeset
   786
void HsSnapToLines::createHorizontalLine()
hgs
parents: 63
diff changeset
   787
{
hgs
parents: 63
diff changeset
   788
    if (mRectLieLeft) {
hgs
parents: 63
diff changeset
   789
        //save the points for the Horizontal line
hgs
parents: 63
diff changeset
   790
        mHorizontalLine.setP1(QPointF(mInactiveRectToCompare.left(), mMinDistancePosition));
hgs
parents: 63
diff changeset
   791
        mHorizontalLine.setP2(QPointF(mMovingRect.right(), mMinDistancePosition));
hgs
parents: 63
diff changeset
   792
    }
hgs
parents: 63
diff changeset
   793
    else {
hgs
parents: 63
diff changeset
   794
        //save the points for the Horizontal line
hgs
parents: 63
diff changeset
   795
        mHorizontalLine.setP1(QPointF(mInactiveRectToCompare.right(), mMinDistancePosition));
hgs
parents: 63
diff changeset
   796
        mHorizontalLine.setP2(QPointF(mMovingRect.left(), mMinDistancePosition));
62
hgs
parents:
diff changeset
   797
    }
hgs
parents:
diff changeset
   798
}
hgs
parents:
diff changeset
   799
hgs
parents:
diff changeset
   800
/*!
hgs
parents:
diff changeset
   801
    Extend the Vertical line on both side of reference(snapping) rectancles.
hgs
parents:
diff changeset
   802
*/
hgs
parents:
diff changeset
   803
void HsSnapToLines::extendVerticalLine()
hgs
parents:
diff changeset
   804
{
hgs
parents:
diff changeset
   805
    if (mVerticalLine.y1() <= mVerticalLine.y2()) {
hgs
parents:
diff changeset
   806
        mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mVerticalLine.y1() - SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   807
        mVerticalLine.setP2(QPointF(mVerticalLine.x2(), mVerticalLine.y2() + SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   808
    }
hgs
parents:
diff changeset
   809
    else {
hgs
parents:
diff changeset
   810
        mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mVerticalLine.y1() + SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   811
        mVerticalLine.setP2(QPointF(mVerticalLine.x2(), mVerticalLine.y2() - SNAP_LINE_EXTEND_VALUE));
hgs
parents:
diff changeset
   812
    }
hgs
parents:
diff changeset
   813
}
hgs
parents:
diff changeset
   814
hgs
parents:
diff changeset
   815
/*!
hgs
parents:
diff changeset
   816
    Extend the Horizontal line on both side of reference(snapping) rectancles.
hgs
parents:
diff changeset
   817
*/
hgs
parents:
diff changeset
   818
void HsSnapToLines::extendHorizontalLine()
hgs
parents:
diff changeset
   819
{
hgs
parents:
diff changeset
   820
    if (mHorizontalLine.x1() <= mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   821
        mHorizontalLine.setP1(QPointF(mHorizontalLine.x1() - SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y1()));
hgs
parents:
diff changeset
   822
        mHorizontalLine.setP2(QPointF(mHorizontalLine.x2() + SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y2()));
hgs
parents:
diff changeset
   823
    }
hgs
parents:
diff changeset
   824
    else {
hgs
parents:
diff changeset
   825
        mHorizontalLine.setP1(QPointF(mHorizontalLine.x1() + SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y1()));
hgs
parents:
diff changeset
   826
        mHorizontalLine.setP2(QPointF(mHorizontalLine.x2() - SNAP_LINE_EXTEND_VALUE, mHorizontalLine.y2()));
hgs
parents:
diff changeset
   827
    }
hgs
parents:
diff changeset
   828
}
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
/*!
hgs
parents:
diff changeset
   831
    Check if the Vertical edge of the Rectangle lies out of the Vertical line.
hgs
parents:
diff changeset
   832
    Also check if the rectangle's edge lies out of the line.
hgs
parents:
diff changeset
   833
*/
hgs
parents:
diff changeset
   834
void HsSnapToLines::checkInactiveRectPositionToVerticalLine()
hgs
parents:
diff changeset
   835
{
hgs
parents:
diff changeset
   836
    mRectVerticalEdgeLiesInLineWithVerticalLine = false;
hgs
parents:
diff changeset
   837
    mRectLieAboveVerticalLine = false;
hgs
parents:
diff changeset
   838
    mRectLieBelowVerticalLine = false;
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
    //if rectangle vertical edge lies inline with Vertical line.
hgs
parents:
diff changeset
   841
    if ((mLeftInRange && mInactiveRectToCompare.left() == mVerticalLine.x1())
hgs
parents:
diff changeset
   842
        || (mRightInRange && mInactiveRectToCompare.right() == mVerticalLine.x1())) {
hgs
parents:
diff changeset
   843
        mRectVerticalEdgeLiesInLineWithVerticalLine = true;
hgs
parents:
diff changeset
   844
        //if the rectangle lies below the vertical line
hgs
parents:
diff changeset
   845
        if (mInactiveRectToCompare.bottom() > mVerticalLine.y1() && mInactiveRectToCompare.bottom() > mVerticalLine.y2()) {
hgs
parents:
diff changeset
   846
            mRectLieBelowVerticalLine = true;
hgs
parents:
diff changeset
   847
        }
hgs
parents:
diff changeset
   848
        //if the rectangle lies above the vertical line
hgs
parents:
diff changeset
   849
        if (mInactiveRectToCompare.top() < mVerticalLine.y1() && mInactiveRectToCompare.top() < mVerticalLine.y2()) {
hgs
parents:
diff changeset
   850
            mRectLieAboveVerticalLine = true;
hgs
parents:
diff changeset
   851
        }
hgs
parents:
diff changeset
   852
    }
hgs
parents:
diff changeset
   853
}
hgs
parents:
diff changeset
   854
hgs
parents:
diff changeset
   855
/*!
hgs
parents:
diff changeset
   856
    Increase the Vertical line to include the inactive rect whose vertical edge is inline with vertical line
hgs
parents:
diff changeset
   857
*/
hgs
parents:
diff changeset
   858
void HsSnapToLines::extendVerticalLineToIncludeInactiveRect()
hgs
parents:
diff changeset
   859
{
hgs
parents:
diff changeset
   860
    if (mRectLieAboveVerticalLine) {
hgs
parents:
diff changeset
   861
        if (mVerticalLine.y1() < mVerticalLine.y2()) {
hgs
parents:
diff changeset
   862
            mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.top()));
hgs
parents:
diff changeset
   863
        }
hgs
parents:
diff changeset
   864
        else {
hgs
parents:
diff changeset
   865
            mVerticalLine.setP2(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.top()));
hgs
parents:
diff changeset
   866
        }
hgs
parents:
diff changeset
   867
    }
hgs
parents:
diff changeset
   868
    if (mRectLieBelowVerticalLine) {
hgs
parents:
diff changeset
   869
        if (mVerticalLine.y1() < mVerticalLine.y2()) {
hgs
parents:
diff changeset
   870
            mVerticalLine.setP2(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.bottom()));
hgs
parents:
diff changeset
   871
        }
hgs
parents:
diff changeset
   872
        else {
hgs
parents:
diff changeset
   873
            mVerticalLine.setP1(QPointF(mVerticalLine.x1(), mInactiveRectToCompare.bottom()));
hgs
parents:
diff changeset
   874
        }
hgs
parents:
diff changeset
   875
    }
hgs
parents:
diff changeset
   876
}
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
/*!
hgs
parents:
diff changeset
   879
    Check if the Horizontal edge of the Rectangle lies inline with the Horizontal line.
hgs
parents:
diff changeset
   880
    Also check if the rectangle's edge lies out of the line.
hgs
parents:
diff changeset
   881
*/
hgs
parents:
diff changeset
   882
void HsSnapToLines::checkInactiveRectPositionToHorizontalLine()
hgs
parents:
diff changeset
   883
{
hgs
parents:
diff changeset
   884
    mRectHorizontalEdgeLiesInLineWithHorizontalLine = false;
hgs
parents:
diff changeset
   885
    mRectLieLeftOfHorizontalLine = false;
hgs
parents:
diff changeset
   886
    mRectLiesRightOfHorizontalLine = false;
hgs
parents:
diff changeset
   887
hgs
parents:
diff changeset
   888
    //if rectangle horizontal edge lies inline with Horizontal line.
hgs
parents:
diff changeset
   889
    if ((mTopInRange && mInactiveRectToCompare.top() == mHorizontalLine.y1())
hgs
parents:
diff changeset
   890
        || (mBottomInRange && mInactiveRectToCompare.bottom() == mHorizontalLine.y1())) {
hgs
parents:
diff changeset
   891
        mRectHorizontalEdgeLiesInLineWithHorizontalLine = true;
hgs
parents:
diff changeset
   892
        //if the rectangle lies left of the horizontal line
hgs
parents:
diff changeset
   893
        if (mInactiveRectToCompare.left() < mHorizontalLine.x1() && mInactiveRectToCompare.left() < mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   894
            mRectLieLeftOfHorizontalLine = true;
hgs
parents:
diff changeset
   895
        }
hgs
parents:
diff changeset
   896
        //if the rectangle lies right of the horizontal line
hgs
parents:
diff changeset
   897
        if (mInactiveRectToCompare.right() > mHorizontalLine.x1() && mInactiveRectToCompare.right() > mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   898
            mRectLiesRightOfHorizontalLine = true;
hgs
parents:
diff changeset
   899
        }
hgs
parents:
diff changeset
   900
    }
hgs
parents:
diff changeset
   901
}
hgs
parents:
diff changeset
   902
hgs
parents:
diff changeset
   903
/*!
hgs
parents:
diff changeset
   904
    Increase the Horizontal line to include the inactive rect whose horizontal edge is inline with horizontal line
hgs
parents:
diff changeset
   905
*/
hgs
parents:
diff changeset
   906
void HsSnapToLines::extendHorizontalLineToIncludeInactiveRect()
hgs
parents:
diff changeset
   907
{
hgs
parents:
diff changeset
   908
    if (mRectLieLeftOfHorizontalLine) {
hgs
parents:
diff changeset
   909
        if (mHorizontalLine.x1() < mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   910
            mHorizontalLine.setP1(QPointF(mInactiveRectToCompare.left(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   911
        }
hgs
parents:
diff changeset
   912
        else {
hgs
parents:
diff changeset
   913
            mHorizontalLine.setP2(QPointF(mInactiveRectToCompare.left(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   914
        }
hgs
parents:
diff changeset
   915
    }
hgs
parents:
diff changeset
   916
    if (mRectLiesRightOfHorizontalLine) {
hgs
parents:
diff changeset
   917
        if (mHorizontalLine.x1() < mHorizontalLine.x2()) {
hgs
parents:
diff changeset
   918
            mHorizontalLine.setP2(QPointF(mInactiveRectToCompare.right(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   919
        }
hgs
parents:
diff changeset
   920
        else {
hgs
parents:
diff changeset
   921
            mHorizontalLine.setP1(QPointF(mInactiveRectToCompare.right(), mHorizontalLine.y1()));
hgs
parents:
diff changeset
   922
        }
hgs
parents:
diff changeset
   923
    }
hgs
parents:
diff changeset
   924
}