From c022bc825ec4f5c224fd5db6a113c1ba82cc689a Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 4 Oct 2017 17:54:53 +1000 Subject: [PATCH] [FEATURE][layouts] Add 'resize to square' action Resizes all selected items so that they are square --- python/core/layout/qgslayoutaligner.sip | 1 + src/app/layout/qgslayoutdesignerdialog.cpp | 5 +++++ src/core/layout/qgslayoutaligner.cpp | 15 ++++++++++++++- src/core/layout/qgslayoutaligner.h | 1 + src/ui/layout/qgslayoutdesignerbase.ui | 14 ++++++++++++++ tests/src/python/test_qgslayoutaligner.py | 11 +++++++++++ tests/src/python/test_qgslayoutview.py | 7 +++++++ 7 files changed, 53 insertions(+), 1 deletion(-) diff --git a/python/core/layout/qgslayoutaligner.sip b/python/core/layout/qgslayoutaligner.sip index d2a99de0ec3..ebb82666e3a 100644 --- a/python/core/layout/qgslayoutaligner.sip +++ b/python/core/layout/qgslayoutaligner.sip @@ -50,6 +50,7 @@ class QgsLayoutAligner ResizeWidest, ResizeShortest, ResizeTallest, + ResizeToSquare, }; static void alignItems( QgsLayout *layout, const QList< QgsLayoutItem * > &items, Alignment alignment ); diff --git a/src/app/layout/qgslayoutdesignerdialog.cpp b/src/app/layout/qgslayoutdesignerdialog.cpp index 4e2fe4bb8c6..e176276e59f 100644 --- a/src/app/layout/qgslayoutdesignerdialog.cpp +++ b/src/app/layout/qgslayoutdesignerdialog.cpp @@ -213,6 +213,7 @@ QgsLayoutDesignerDialog::QgsLayoutDesignerDialog( QWidget *parent, Qt::WindowFla resizeToolButton->addAction( mActionResizeWidest ); resizeToolButton->addAction( mActionResizeShortest ); resizeToolButton->addAction( mActionResizeTallest ); + resizeToolButton->addAction( mActionResizeToSquare ); resizeToolButton->setDefaultAction( mActionResizeNarrowest ); mActionsToolbar->addWidget( resizeToolButton ); @@ -318,6 +319,10 @@ QgsLayoutDesignerDialog::QgsLayoutDesignerDialog( QWidget *parent, Qt::WindowFla { mView->resizeSelectedItems( QgsLayoutAligner::ResizeTallest ); } ); + connect( mActionResizeToSquare, &QAction::triggered, this, [ = ] + { + mView->resizeSelectedItems( QgsLayoutAligner::ResizeToSquare ); + } ); connect( mActionAddPages, &QAction::triggered, this, &QgsLayoutDesignerDialog::addPages ); diff --git a/src/core/layout/qgslayoutaligner.cpp b/src/core/layout/qgslayoutaligner.cpp index d39bf0c3aec..39fe58914c8 100644 --- a/src/core/layout/qgslayoutaligner.cpp +++ b/src/core/layout/qgslayoutaligner.cpp @@ -178,7 +178,7 @@ void QgsLayoutAligner::distributeItems( QgsLayout *layout, const QList &items, QgsLayoutAligner::Resize resize ) { - if ( items.size() < 2 ) + if ( !( items.size() >= 2 || ( items.size() == 1 && resize == ResizeToSquare ) ) ) return; auto collectSize = [resize]( QgsLayoutItem * item )->double @@ -188,6 +188,7 @@ void QgsLayoutAligner::resizeItems( QgsLayout *layout, const QList newSize.height() ) + newSize.setHeight( newSize.width() ); + else + newSize.setWidth( newSize.height() ); + break; + } } // need to keep item units @@ -315,6 +326,8 @@ QString QgsLayoutAligner::undoText( QgsLayoutAligner::Resize resize ) return QObject::tr( "Resized items to shortest" ); case ResizeTallest: return QObject::tr( "Resized items to tallest" ); + case ResizeToSquare: + return QObject::tr( "Resized items to square" ); } return QString(); //no warnings } diff --git a/src/core/layout/qgslayoutaligner.h b/src/core/layout/qgslayoutaligner.h index 9343e6750c9..f0aa4026c87 100644 --- a/src/core/layout/qgslayoutaligner.h +++ b/src/core/layout/qgslayoutaligner.h @@ -67,6 +67,7 @@ class CORE_EXPORT QgsLayoutAligner ResizeWidest, //!< Resize width to match widest width ResizeShortest, //!< Resize height to match shortest height ResizeTallest, //!< Resize height to match tallest height + ResizeToSquare, //!< Resize items to square }; /** diff --git a/src/ui/layout/qgslayoutdesignerbase.ui b/src/ui/layout/qgslayoutdesignerbase.ui index f3ad852a158..a7e4b40c5e8 100644 --- a/src/ui/layout/qgslayoutdesignerbase.ui +++ b/src/ui/layout/qgslayoutdesignerbase.ui @@ -191,6 +191,8 @@ + + @@ -911,6 +913,18 @@ Del + + + + :/images/themes/default/mActionResizeTallest.svg:/images/themes/default/mActionResizeTallest.svg + + + To S&quare + + + Resizes items to squares + + diff --git a/tests/src/python/test_qgslayoutaligner.py b/tests/src/python/test_qgslayoutaligner.py index e7a04e1b7c5..e54a5352ef4 100644 --- a/tests/src/python/test_qgslayoutaligner.py +++ b/tests/src/python/test_qgslayoutaligner.py @@ -228,6 +228,17 @@ class TestQgsLayoutAligner(unittest.TestCase): self.assertEqual(item1.sizeWithUnits(), QgsLayoutSize(18, 16, QgsUnitTypes.LayoutMillimeters)) self.assertEqual(item2.sizeWithUnits(), QgsLayoutSize(10, 16, QgsUnitTypes.LayoutMillimeters)) self.assertEqual(item3.sizeWithUnits(), QgsLayoutSize(1.8, 1.6, QgsUnitTypes.LayoutCentimeters)) + l.undoStack().stack().undo() + + item2.attemptResize(QgsLayoutSize(10, 19, QgsUnitTypes.LayoutMillimeters)) + QgsLayoutAligner.resizeItems(l, [item1, item2, item3], QgsLayoutAligner.ResizeToSquare) + self.assertEqual(item1.sizeWithUnits(), QgsLayoutSize(18, 18, QgsUnitTypes.LayoutMillimeters)) + self.assertEqual(item2.sizeWithUnits(), QgsLayoutSize(19, 19, QgsUnitTypes.LayoutMillimeters)) + self.assertEqual(item3.sizeWithUnits(), QgsLayoutSize(1.8, 1.8, QgsUnitTypes.LayoutCentimeters)) + + l.undoStack().stack().undo() + QgsLayoutAligner.resizeItems(l, [item1], QgsLayoutAligner.ResizeToSquare) + self.assertEqual(item1.sizeWithUnits(), QgsLayoutSize(18, 18, QgsUnitTypes.LayoutMillimeters)) if __name__ == '__main__': diff --git a/tests/src/python/test_qgslayoutview.py b/tests/src/python/test_qgslayoutview.py index bb9a91d691b..cb8edeb9f95 100644 --- a/tests/src/python/test_qgslayoutview.py +++ b/tests/src/python/test_qgslayoutview.py @@ -626,6 +626,13 @@ class TestQgsLayoutView(unittest.TestCase): self.assertEqual(item1.sizeWithUnits(), QgsLayoutSize(18, 16, QgsUnitTypes.LayoutMillimeters)) self.assertEqual(item2.sizeWithUnits(), QgsLayoutSize(10, 16, QgsUnitTypes.LayoutMillimeters)) self.assertEqual(item3.sizeWithUnits(), QgsLayoutSize(1.8, 1.6, QgsUnitTypes.LayoutCentimeters)) + l.undoStack().stack().undo() + + item2.attemptResize(QgsLayoutSize(10, 19, QgsUnitTypes.LayoutMillimeters)) + view.resizeSelectedItems(QgsLayoutAligner.ResizeToSquare) + self.assertEqual(item1.sizeWithUnits(), QgsLayoutSize(18, 18, QgsUnitTypes.LayoutMillimeters)) + self.assertEqual(item2.sizeWithUnits(), QgsLayoutSize(19, 19, QgsUnitTypes.LayoutMillimeters)) + self.assertEqual(item3.sizeWithUnits(), QgsLayoutSize(1.8, 1.8, QgsUnitTypes.LayoutCentimeters)) if __name__ == '__main__':