mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-18 00:03:05 -04:00
Fix resizing items with non-top-left reference point using mouse handles
This commit is contained in:
parent
1c735d59ee
commit
ab4e6c11ed
@ -235,13 +235,20 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem, QgsLayoutUndoObjectInt
|
|||||||
.. seealso:: sizeWithUnits()
|
.. seealso:: sizeWithUnits()
|
||||||
%End
|
%End
|
||||||
|
|
||||||
virtual void attemptMove( const QgsLayoutPoint &point );
|
virtual void attemptMove( const QgsLayoutPoint &point, bool useReferencePoint = true );
|
||||||
%Docstring
|
%Docstring
|
||||||
Attempts to move the item to a specified ``point``. This method respects the item's
|
Attempts to move the item to a specified ``point``.
|
||||||
|
|
||||||
|
If ``useReferencePoint`` is true, this method will respect the item's
|
||||||
reference point, in that the item will be moved so that its current reference
|
reference point, in that the item will be moved so that its current reference
|
||||||
point is placed at the specified target point.
|
point is placed at the specified target point.
|
||||||
|
|
||||||
|
If ``useReferencePoint`` is false, the item will be moved so that ``point``
|
||||||
|
falls at the top-left corner of the item.
|
||||||
|
|
||||||
Note that the final position of the item may not match the specified target position,
|
Note that the final position of the item may not match the specified target position,
|
||||||
as data defined item position may override the specified value.
|
as data defined item position may override the specified value.
|
||||||
|
|
||||||
.. seealso:: attemptResize()
|
.. seealso:: attemptResize()
|
||||||
.. seealso:: referencePoint()
|
.. seealso:: referencePoint()
|
||||||
.. seealso:: positionWithUnits()
|
.. seealso:: positionWithUnits()
|
||||||
@ -575,7 +582,7 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem, QgsLayoutUndoObjectInt
|
|||||||
QPointF adjustPointForReferencePosition( const QPointF &point, const QSizeF &size, const ReferencePoint &reference ) const;
|
QPointF adjustPointForReferencePosition( const QPointF &point, const QSizeF &size, const ReferencePoint &reference ) const;
|
||||||
%Docstring
|
%Docstring
|
||||||
Adjusts the specified ``point`` at which a ``reference`` position of the item
|
Adjusts the specified ``point`` at which a ``reference`` position of the item
|
||||||
sits and returns the top left corner of the item, if reference point where placed at the specified position.
|
sits and returns the top left corner of the item, if reference point were placed at the specified position.
|
||||||
:rtype: QPointF
|
:rtype: QPointF
|
||||||
%End
|
%End
|
||||||
|
|
||||||
@ -585,6 +592,13 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem, QgsLayoutUndoObjectInt
|
|||||||
:rtype: QPointF
|
:rtype: QPointF
|
||||||
%End
|
%End
|
||||||
|
|
||||||
|
QgsLayoutPoint topLeftToReferencePoint( const QgsLayoutPoint &point ) const;
|
||||||
|
%Docstring
|
||||||
|
Returns the position for the reference point of the item, if the top-left of the item
|
||||||
|
was placed at the specified ``point``.
|
||||||
|
:rtype: QgsLayoutPoint
|
||||||
|
%End
|
||||||
|
|
||||||
virtual bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
|
virtual bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
|
||||||
%Docstring
|
%Docstring
|
||||||
Stores item state within an XML DOM element.
|
Stores item state within an XML DOM element.
|
||||||
|
@ -62,7 +62,7 @@ class QgsLayoutItemGroup: QgsLayoutItem
|
|||||||
virtual void setVisibility( const bool visible );
|
virtual void setVisibility( const bool visible );
|
||||||
|
|
||||||
|
|
||||||
virtual void attemptMove( const QgsLayoutPoint &point );
|
virtual void attemptMove( const QgsLayoutPoint &point, bool useReferencePoint = true );
|
||||||
|
|
||||||
virtual void attemptResize( const QgsLayoutSize &size );
|
virtual void attemptResize( const QgsLayoutSize &size );
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ void QgsLayoutItem::attemptResize( const QgsLayoutSize &size )
|
|||||||
emit sizePositionChanged();
|
emit sizePositionChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLayoutItem::attemptMove( const QgsLayoutPoint &point )
|
void QgsLayoutItem::attemptMove( const QgsLayoutPoint &point, bool useReferencePoint )
|
||||||
{
|
{
|
||||||
if ( !mLayout )
|
if ( !mLayout )
|
||||||
{
|
{
|
||||||
@ -360,7 +360,13 @@ void QgsLayoutItem::attemptMove( const QgsLayoutPoint &point )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsLayoutPoint evaluatedPoint = applyDataDefinedPosition( point );
|
QgsLayoutPoint evaluatedPoint = point;
|
||||||
|
if ( !useReferencePoint )
|
||||||
|
{
|
||||||
|
evaluatedPoint = topLeftToReferencePoint( point );
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluatedPoint = applyDataDefinedPosition( evaluatedPoint );
|
||||||
QPointF evaluatedPointLayoutUnits = mLayout->convertToLayoutUnits( evaluatedPoint );
|
QPointF evaluatedPointLayoutUnits = mLayout->convertToLayoutUnits( evaluatedPoint );
|
||||||
QPointF topLeftPointLayoutUnits = adjustPointForReferencePosition( evaluatedPointLayoutUnits, rect().size(), mReferencePoint );
|
QPointF topLeftPointLayoutUnits = adjustPointForReferencePosition( evaluatedPointLayoutUnits, rect().size(), mReferencePoint );
|
||||||
if ( topLeftPointLayoutUnits == scenePos() && point.units() == mItemPosition.units() )
|
if ( topLeftPointLayoutUnits == scenePos() && point.units() == mItemPosition.units() )
|
||||||
@ -737,6 +743,13 @@ QPointF QgsLayoutItem::positionAtReferencePoint( const QgsLayoutItem::ReferenceP
|
|||||||
return mapToScene( pointWithinItem );
|
return mapToScene( pointWithinItem );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QgsLayoutPoint QgsLayoutItem::topLeftToReferencePoint( const QgsLayoutPoint &point ) const
|
||||||
|
{
|
||||||
|
QPointF topLeft = mLayout->convertToLayoutUnits( point );
|
||||||
|
QPointF refPoint = topLeft + itemPositionAtReferencePoint( mReferencePoint, rect().size() );
|
||||||
|
return mLayout->convertFromLayoutUnits( refPoint, point.units() );
|
||||||
|
}
|
||||||
|
|
||||||
bool QgsLayoutItem::writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const
|
bool QgsLayoutItem::writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const
|
||||||
{
|
{
|
||||||
element.setAttribute( QStringLiteral( "uuid" ), mUuid );
|
element.setAttribute( QStringLiteral( "uuid" ), mUuid );
|
||||||
|
@ -250,16 +250,23 @@ class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectIt
|
|||||||
virtual void attemptResize( const QgsLayoutSize &size );
|
virtual void attemptResize( const QgsLayoutSize &size );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to move the item to a specified \a point. This method respects the item's
|
* Attempts to move the item to a specified \a point.
|
||||||
|
*
|
||||||
|
* If \a useReferencePoint is true, this method will respect the item's
|
||||||
* reference point, in that the item will be moved so that its current reference
|
* reference point, in that the item will be moved so that its current reference
|
||||||
* point is placed at the specified target point.
|
* point is placed at the specified target point.
|
||||||
|
*
|
||||||
|
* If \a useReferencePoint is false, the item will be moved so that \a point
|
||||||
|
* falls at the top-left corner of the item.
|
||||||
|
*
|
||||||
* Note that the final position of the item may not match the specified target position,
|
* Note that the final position of the item may not match the specified target position,
|
||||||
* as data defined item position may override the specified value.
|
* as data defined item position may override the specified value.
|
||||||
|
*
|
||||||
* \see attemptResize()
|
* \see attemptResize()
|
||||||
* \see referencePoint()
|
* \see referencePoint()
|
||||||
* \see positionWithUnits()
|
* \see positionWithUnits()
|
||||||
*/
|
*/
|
||||||
virtual void attemptMove( const QgsLayoutPoint &point );
|
virtual void attemptMove( const QgsLayoutPoint &point, bool useReferencePoint = true );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the item's current position, including units. The position returned
|
* Returns the item's current position, including units. The position returned
|
||||||
@ -572,7 +579,7 @@ class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectIt
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Adjusts the specified \a point at which a \a reference position of the item
|
* Adjusts the specified \a point at which a \a reference position of the item
|
||||||
* sits and returns the top left corner of the item, if reference point where placed at the specified position.
|
* sits and returns the top left corner of the item, if reference point were placed at the specified position.
|
||||||
*/
|
*/
|
||||||
QPointF adjustPointForReferencePosition( const QPointF &point, const QSizeF &size, const ReferencePoint &reference ) const;
|
QPointF adjustPointForReferencePosition( const QPointF &point, const QSizeF &size, const ReferencePoint &reference ) const;
|
||||||
|
|
||||||
@ -581,6 +588,12 @@ class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectIt
|
|||||||
*/
|
*/
|
||||||
QPointF positionAtReferencePoint( const ReferencePoint &reference ) const;
|
QPointF positionAtReferencePoint( const ReferencePoint &reference ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the position for the reference point of the item, if the top-left of the item
|
||||||
|
* was placed at the specified \a point.
|
||||||
|
*/
|
||||||
|
QgsLayoutPoint topLeftToReferencePoint( const QgsLayoutPoint &point ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores item state within an XML DOM element.
|
* Stores item state within an XML DOM element.
|
||||||
* \param element is the DOM element to store the item's properties in
|
* \param element is the DOM element to store the item's properties in
|
||||||
|
@ -127,7 +127,7 @@ void QgsLayoutItemGroup::setVisibility( const bool visible )
|
|||||||
mLayout->undoStack()->endMacro();
|
mLayout->undoStack()->endMacro();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLayoutItemGroup::attemptMove( const QgsLayoutPoint &point )
|
void QgsLayoutItemGroup::attemptMove( const QgsLayoutPoint &point, bool useReferencePoint )
|
||||||
{
|
{
|
||||||
if ( !mLayout )
|
if ( !mLayout )
|
||||||
return;
|
return;
|
||||||
|
@ -69,7 +69,7 @@ class CORE_EXPORT QgsLayoutItemGroup: public QgsLayoutItem
|
|||||||
void setVisibility( const bool visible ) override;
|
void setVisibility( const bool visible ) override;
|
||||||
|
|
||||||
//overridden to move child items
|
//overridden to move child items
|
||||||
void attemptMove( const QgsLayoutPoint &point ) override;
|
void attemptMove( const QgsLayoutPoint &point, bool useReferencePoint = true ) override;
|
||||||
void attemptResize( const QgsLayoutSize &size ) override;
|
void attemptResize( const QgsLayoutSize &size ) override;
|
||||||
|
|
||||||
bool writeXml( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context ) const override;
|
bool writeXml( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context ) const override;
|
||||||
|
@ -657,13 +657,13 @@ void QgsLayoutMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent *event )
|
|||||||
itemRect = itemRect.normalized();
|
itemRect = itemRect.normalized();
|
||||||
QPointF newPos = mapToScene( itemRect.topLeft() );
|
QPointF newPos = mapToScene( itemRect.topLeft() );
|
||||||
|
|
||||||
// translate new position to current item units
|
|
||||||
QgsLayoutPoint itemPos = mLayout->convertFromLayoutUnits( newPos, item->positionWithUnits().units() );
|
|
||||||
item->attemptMove( itemPos );
|
|
||||||
|
|
||||||
QgsLayoutSize itemSize = mLayout->convertFromLayoutUnits( itemRect.size(), item->sizeWithUnits().units() );
|
QgsLayoutSize itemSize = mLayout->convertFromLayoutUnits( itemRect.size(), item->sizeWithUnits().units() );
|
||||||
item->attemptResize( itemSize );
|
item->attemptResize( itemSize );
|
||||||
|
|
||||||
|
// translate new position to current item units
|
||||||
|
QgsLayoutPoint itemPos = mLayout->convertFromLayoutUnits( newPos, item->positionWithUnits().units() );
|
||||||
|
item->attemptMove( itemPos, false );
|
||||||
|
|
||||||
command->saveAfterState();
|
command->saveAfterState();
|
||||||
mLayout->undoStack()->stack()->push( command.release() );
|
mLayout->undoStack()->stack()->push( command.release() );
|
||||||
}
|
}
|
||||||
|
@ -1139,7 +1139,24 @@ void TestQgsLayoutItem::move()
|
|||||||
|
|
||||||
l.setUnits( QgsUnitTypes::LayoutMillimeters );
|
l.setUnits( QgsUnitTypes::LayoutMillimeters );
|
||||||
|
|
||||||
//TODO - reference points
|
//reference points
|
||||||
|
item->attemptMove( QgsLayoutPoint( 5, 9 ) );
|
||||||
|
item->attemptResize( QgsLayoutSize( 4, 6 ) );
|
||||||
|
item->setReferencePoint( QgsLayoutItem::LowerRight );
|
||||||
|
QCOMPARE( item->positionWithUnits().x(), 9.0 );
|
||||||
|
QCOMPARE( item->positionWithUnits().y(), 15.0 );
|
||||||
|
|
||||||
|
item->attemptMove( QgsLayoutPoint( 11, 13 ) );
|
||||||
|
QCOMPARE( item->positionWithUnits().x(), 11.0 );
|
||||||
|
QCOMPARE( item->positionWithUnits().y(), 13.0 );
|
||||||
|
QCOMPARE( item->scenePos().x(), 7.0 );
|
||||||
|
QCOMPARE( item->scenePos().y(), 7.0 );
|
||||||
|
|
||||||
|
item->attemptMove( QgsLayoutPoint( 10, 12 ), false );
|
||||||
|
QCOMPARE( item->positionWithUnits().x(), 14.0 );
|
||||||
|
QCOMPARE( item->positionWithUnits().y(), 18.0 );
|
||||||
|
QCOMPARE( item->scenePos().x(), 10.0 );
|
||||||
|
QCOMPARE( item->scenePos().y(), 12.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestQgsLayoutItem::rotation()
|
void TestQgsLayoutItem::rotation()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user