Files
qt-creator/share/qtcreator/qmljsdebugger/editor/movemanipulator.cpp
Lasse Holmstedt 4558477b01 Moved qmljsdebugger to share & debugger lib support for qml app wizard
Reviewed-by: Alessandro Portale
2010-08-06 17:48:01 +02:00

361 lines
13 KiB
C++

/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#include "movemanipulator.h"
#include "qdeclarativedesignview.h"
//#include "layeritem.h"
#include <QPointF>
#include <QtDebug>
#include <QColor>
#include <QPen>
#include <QApplication>
#include <limits>
namespace QmlViewer {
MoveManipulator::MoveManipulator(/*LayerItem *layerItem, */QDeclarativeDesignView *view)
: //m_layerItem(layerItem),
m_view(view),
m_isActive(false)
{
}
MoveManipulator::~MoveManipulator()
{
deleteSnapLines();
}
QPointF MoveManipulator::beginPoint() const
{
return m_beginPoint;
}
QList<QGraphicsItem*> MoveManipulator::itemList() const
{
return m_itemList;
}
void MoveManipulator::setItem(QGraphicsItem* item)
{
QList<QGraphicsItem*> itemList;
itemList.append(item);
setItems(itemList);
}
void MoveManipulator::setItems(const QList<QGraphicsItem*> &itemList)
{
m_itemList = itemList;
foreach (QGraphicsItem* item, m_itemList) {
//QPointF positionInParentSpace = m_snapper.containerQGraphicsItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item));
//m_beginItemRectHash[item].translate(positionInParentSpace - m_beginPositionHash.value(item));
qDebug() << item << item->pos();
m_beginPositionHash.insert(item, item->pos());
}
// if (!m_itemList.isEmpty()) {
// if (m_itemList.first()->parentItem())
// m_snapper.setContainerQGraphicsItem(m_itemList.first()->parentItem());
// else
// m_snapper.setContainerQGraphicsItem(m_itemList.first());
// m_snapper.setTransformtionSpaceQGraphicsItem(m_snapper.containerQGraphicsItem());
// }
}
void MoveManipulator::updateHashes()
{
// foreach (QGraphicsItem* item, m_itemList)
// m_beginItemRectHash[item] = item->mapRectToParent(item->qmlItemNode().instanceBoundingRect());
// foreach (QGraphicsItem* item, m_itemList) {
// QPointF positionInParentSpace = m_snapper.containerQGraphicsItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item));
// m_beginItemRectHash[item].translate(positionInParentSpace - m_beginPositionHash.value(item));
// m_beginPositionHash.insert(item, positionInParentSpace);
// }
}
bool MoveManipulator::itemsCanReparented() const
{
return true;
}
void MoveManipulator::begin(const QPointF &beginPoint)
{
m_isActive = true;
//m_snapper.updateSnappingLines(m_itemList);
// foreach (QGraphicsItem* item, m_itemList)
// m_beginItemRectHash.insert(item, m_snapper.containerQGraphicsItem()->mapRectFromItem(item, item->qmlItemNode().instanceBoundingRect()));
// foreach (QGraphicsItem* item, m_itemList) {
// QPointF positionInParentSpace(item->qmlItemNode().instancePosition());
// QPointF positionInScenesSpace = m_snapper.containerQGraphicsItem()->mapToScene(positionInParentSpace);
// m_beginPositionInSceneSpaceHash.insert(item, positionInScenesSpace);
// }
// foreach (QGraphicsItem* item, m_itemList) {
// QPointF positionInParentSpace = m_snapper.containerQGraphicsItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item));
// m_beginPositionHash.insert(item, positionInParentSpace);
// QmlAnchors anchors(item->qmlItemNode().anchors());
// m_beginTopMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Top));
// m_beginLeftMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Left));
// m_beginRightMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Right));
// m_beginBottomMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Bottom));
// m_beginHorizontalCenterHash.insert(item, anchors.instanceMargin(AnchorLine::HorizontalCenter));
// m_beginVerticalCenterHash.insert(item, anchors.instanceMargin(AnchorLine::VerticalCenter));
// }
m_beginPoint = beginPoint;
}
//QPointF MoveManipulator::findSnappingOffset(const QList<QRectF> &boundingRectList)
//{
// QPointF offset;
// QMap<double, double> verticalOffsetMap;
// foreach (const QRectF &boundingRect, boundingRectList) {
// double verticalOffset = m_snapper.snappedVerticalOffset(boundingRect);
// if (verticalOffset < std::numeric_limits<double>::max())
// verticalOffsetMap.insert(qAbs(verticalOffset), verticalOffset);
// }
// if (!verticalOffsetMap.isEmpty())
// offset.rx() = verticalOffsetMap.begin().value();
// QMap<double, double> horizontalOffsetMap;
// foreach (const QRectF &boundingRect, boundingRectList) {
// double horizontalOffset = m_snapper.snappedHorizontalOffset(boundingRect);
// if (horizontalOffset < std::numeric_limits<double>::max())
// horizontalOffsetMap.insert(qAbs(horizontalOffset), horizontalOffset);
// }
// if (!horizontalOffsetMap.isEmpty())
// offset.ry() = horizontalOffsetMap.begin().value();
// return offset;
//}
//void MoveManipulator::generateSnappingLines(const QList<QRectF> &boundingRectList)
//{
// m_graphicsLineList = m_snapper.generateSnappingLines(boundingRectList,
// m_layerItem.data(),
// m_snapper.transformtionSpaceQGraphicsItem()->sceneTransform());
//}
QList<QRectF> MoveManipulator::translatedBoundingRects(const QList<QRectF> &boundingRectList, const QPointF& offsetVector)
{
QList<QRectF> translatedBoundingRectList;
foreach (const QRectF &boundingRect, boundingRectList)
translatedBoundingRectList.append(boundingRect.translated(offsetVector));
return translatedBoundingRectList;
}
/*
/brief updates the position of the items.
*/
void MoveManipulator::update(const QPointF& updatePoint, Snapping /*useSnapping*/, State /*stateToBeManipulated*/)
{
//deleteSnapLines(); //Since they position is changed and the item is moved the snapping lines are
//are obsolete. The new updated snapping lines (color and visibility) will be
//calculated in snapPoint() called in moveNode() later
if (m_itemList.isEmpty()) {
return;
} else {
//QPointF updatePointInContainerSpace(m_snapper.containerQGraphicsItem()->mapFromScene(updatePoint));
//QPointF beginPointInContainerSpace(m_snapper.containerQGraphicsItem()->mapFromScene(m_beginPoint));
QPointF offsetVector(updatePoint - m_beginPoint);
// if (useSnapping == UseSnapping || useSnapping == UseSnappingAndAnchoring) {
// offsetVector -= findSnappingOffset(translatedBoundingRects(m_beginItemRectHash.values(), offsetVector));
// //generateSnappingLines(translatedBoundingRects(m_beginItemRectHash.values(), offsetVector));
// }
foreach (QGraphicsItem* item, m_itemList) {
//qDebug() << "offset:" << m_beginPositionHash.value(item) << offsetVector;
QPointF positionInContainerSpace(m_beginPositionHash.value(item) + offsetVector);
// don't support anchors for base state because it is not needed by the droptool
// if (stateToBeManipulated == UseActualState) {
// QmlAnchors anchors(item->qmlItemNode().anchors());
// if (anchors.instanceHasAnchor(AnchorLine::Top)) {
// anchors.setMargin(AnchorLine::Top, m_beginTopMarginHash.value(item) + offsetVector.y());
// }
// if (anchors.instanceHasAnchor(AnchorLine::Left)) {
// anchors.setMargin(AnchorLine::Left, m_beginLeftMarginHash.value(item) + offsetVector.x());
// }
// if (anchors.instanceHasAnchor(AnchorLine::Bottom)) {
// anchors.setMargin(AnchorLine::Bottom, m_beginBottomMarginHash.value(item) - offsetVector.y());
// }
// if (anchors.instanceHasAnchor(AnchorLine::Right)) {
// anchors.setMargin(AnchorLine::Right, m_beginRightMarginHash.value(item) - offsetVector.x());
// }
// if (anchors.instanceHasAnchor(AnchorLine::HorizontalCenter)) {
// anchors.setMargin(AnchorLine::HorizontalCenter, m_beginHorizontalCenterHash.value(item) + offsetVector.x());
// }
// if (anchors.instanceHasAnchor(AnchorLine::VerticalCenter)) {
// anchors.setMargin(AnchorLine::VerticalCenter, m_beginVerticalCenterHash.value(item) + offsetVector.y());
// }
// item->setPos(positionInContainerSpace);
// } else {
// item->qmlItemNode().modelNode().variantProperty("x").setValue(qRound(positionInContainerSpace.x()));
// item->qmlItemNode().modelNode().variantProperty("y").setValue(qRound(positionInContainerSpace.y()));
// }
item->setPos(positionInContainerSpace);
}
}
}
void MoveManipulator::clear()
{
deleteSnapLines();
m_beginItemRectHash.clear();
m_beginPositionHash.clear();
m_beginPositionInSceneSpaceHash.clear();
m_itemList.clear();
m_beginTopMarginHash.clear();
m_beginLeftMarginHash.clear();
m_beginRightMarginHash.clear();
m_beginBottomMarginHash.clear();
m_beginHorizontalCenterHash.clear();
m_beginVerticalCenterHash.clear();
}
void MoveManipulator::reparentTo(QGraphicsItem *newParent)
{
deleteSnapLines();
if (!newParent)
return;
if (!itemsCanReparented())
return;
// foreach (QGraphicsItem* item, m_itemList) {
// QmlItemNode parent(newParent->qmlItemNode());
// if (parent.isValid()) {
// item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty("data"));
// }
// }
// m_snapper.setContainerQGraphicsItem(newParent);
// m_snapper.setTransformtionSpaceQGraphicsItem(m_snapper.containerQGraphicsItem());
// m_snapper.updateSnappingLines(m_itemList);
updateHashes();
}
void MoveManipulator::end(const QPointF &/*endPoint*/)
{
m_isActive = false;
deleteSnapLines();
clear();
}
void MoveManipulator::moveBy(double deltaX, double deltaY)
{
foreach (QGraphicsItem* item, m_itemList) {
// QmlAnchors anchors(item->qmlItemNode().anchors());
// if (anchors.instanceHasAnchor(AnchorLine::Top)) {
// anchors.setMargin(AnchorLine::Top, anchors.instanceMargin(AnchorLine::Top) + deltaY);
// }
// if (anchors.instanceHasAnchor(AnchorLine::Left)) {
// anchors.setMargin(AnchorLine::Left, anchors.instanceMargin(AnchorLine::Left) + deltaX);
// }
// if (anchors.instanceHasAnchor(AnchorLine::Bottom)) {
// anchors.setMargin(AnchorLine::Bottom, anchors.instanceMargin(AnchorLine::Bottom) - deltaY);
// }
// if (anchors.instanceHasAnchor(AnchorLine::Right)) {
// anchors.setMargin(AnchorLine::Right, anchors.instanceMargin(AnchorLine::Right) - deltaX);
// }
// if (anchors.instanceHasAnchor(AnchorLine::HorizontalCenter)) {
// anchors.setMargin(AnchorLine::HorizontalCenter, anchors.instanceMargin(AnchorLine::HorizontalCenter) + deltaX);
// }
// if (anchors.instanceHasAnchor(AnchorLine::VerticalCenter)) {
// anchors.setMargin(AnchorLine::VerticalCenter, anchors.instanceMargin(AnchorLine::VerticalCenter) + deltaY);
// }
item->moveBy(deltaX, deltaY);
}
}
void MoveManipulator::setOpacityForAllElements(qreal opacity)
{
foreach (QGraphicsItem* item, m_itemList)
item->setOpacity(opacity);
}
void MoveManipulator::deleteSnapLines()
{
// if (m_layerItem) {
// foreach (QGraphicsItem *item, m_graphicsLineList)
// m_layerItem->scene()->removeItem(item);
// }
// m_graphicsLineList.clear();
// m_view->scene()->update();
}
bool MoveManipulator::isActive() const
{
return m_isActive;
}
}