Skip to content

Commit

Permalink
[composer] Move code for creating groups to QgsComposition
Browse files Browse the repository at this point in the history
Previously this code was located in QgsComposerView. Moving it to
QgsComposition simplifies grouping items for plugins. Also start
a new unit test for QgsComposerItemGroup.
  • Loading branch information
nyalldawson committed Oct 19, 2014
1 parent 71fbe9c commit 993f0dc
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 11 deletions.
12 changes: 11 additions & 1 deletion python/core/composer/qgscomposition.sip
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,13 @@ class QgsComposition : QGraphicsScene
void lockSelectedItems();
/**Unlock all items*/
void unlockAllItems();

/**Creates a new group from a list of composer items and adds it to the composition.
* @param items items to include in group
* @returns QgsComposerItemGroup of grouped items, if grouping was possible
* @note added in QGIS 2.6
*/
QgsComposerItemGroup* groupItems( QList<QgsComposerItem*> items );

/**Sorts the zList. The only time where this function needs to be called is from QgsComposer
* after reading all the items from xml file
Expand Down Expand Up @@ -521,7 +528,10 @@ class QgsComposition : QGraphicsScene
QImage printPageAsRaster( int page );

/**Render a page to a paint device
@note added in version 1.9*/
* @param p destination painter
* @param page page number, 0 based such that the first page is page 0
* @note added in version 1.9
*/
void renderPage( QPainter* p, int page );

/** Compute world file parameters */
Expand Down
20 changes: 20 additions & 0 deletions src/core/composer/qgscomposition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1791,6 +1791,26 @@ void QgsComposition::unlockAllItems()
QgsProject::instance()->dirty( true );
}

QgsComposerItemGroup *QgsComposition::groupItems( QList<QgsComposerItem *> items )
{
if ( items.size() < 2 )
{
//not enough items for a group
return 0;
}

QgsComposerItemGroup* itemGroup = new QgsComposerItemGroup( this );

QList<QgsComposerItem*>::iterator itemIter = items.begin();
for ( ; itemIter != items.end(); ++itemIter )
{
itemGroup->addItem( *itemIter );
}

addItem( itemGroup );
return itemGroup;
}

void QgsComposition::updateZValues( const bool addUndoCommands )
{
int counter = mItemsModel->zOrderListSize();
Expand Down
12 changes: 11 additions & 1 deletion src/core/composer/qgscomposition.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class QgsComposerMouseHandles;
class QgsComposerHtml;
class QgsComposerTableV2;
class QgsComposerItem;
class QgsComposerItemGroup;
class QgsComposerLabel;
class QgsComposerLegend;
class QgsComposerMap;
Expand Down Expand Up @@ -470,6 +471,13 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene
/**Unlock all items*/
void unlockAllItems();

/**Creates a new group from a list of composer items and adds it to the composition.
* @param items items to include in group
* @returns QgsComposerItemGroup of grouped items, if grouping was possible
* @note adde in QGIS 2.6
*/
QgsComposerItemGroup* groupItems( QList<QgsComposerItem*> items );

/**Sorts the zList. The only time where this function needs to be called is from QgsComposer
* after reading all the items from xml file
* @deprecated use refreshZList instead
Expand Down Expand Up @@ -583,7 +591,9 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene
QImage printPageAsRaster( int page );

/**Render a page to a paint device
@note added in version 1.9*/
* @param p destination painter
* @param page page number, 0 based such that the first page is page 0
* @note added in version 1.9*/
void renderPage( QPainter* p, int page );

/** Compute world file parameters */
Expand Down
14 changes: 5 additions & 9 deletions src/gui/qgscomposerview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1777,20 +1777,16 @@ void QgsComposerView::groupItems()
return;
}

//group selected items
QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems();
if ( selectionList.size() < 2 )
{
return; //not enough items for a group
}
QgsComposerItemGroup* itemGroup = new QgsComposerItemGroup( composition() );
QgsComposerItemGroup* itemGroup = composition()->groupItems( selectionList );

QList<QgsComposerItem*>::iterator itemIter = selectionList.begin();
for ( ; itemIter != selectionList.end(); ++itemIter )
if ( !itemGroup )
{
itemGroup->addItem( *itemIter );
//group could not be created
return;
}

composition()->addItem( itemGroup );
itemGroup->setSelected( true );
emit selectedItemChanged( itemGroup );
}
Expand Down
1 change: 1 addition & 0 deletions tests/src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ ADD_QGIS_TEST(composerutils testqgscomposerutils.cpp)
ADD_QGIS_TEST(compositiontest testqgscomposition.cpp)
ADD_QGIS_TEST(composermodel testqgscomposermodel.cpp)
ADD_QGIS_TEST(composermultiframetest testqgscomposermultiframe.cpp)
ADD_QGIS_TEST(composergrouptest testqgscomposergroup.cpp)
ADD_QGIS_TEST(composerpapertest testqgscomposerpaper.cpp)
ADD_QGIS_TEST(composermaptest testqgscomposermap.cpp)
ADD_QGIS_TEST(composermapgridtest testqgscomposermapgrid.cpp)
Expand Down
116 changes: 116 additions & 0 deletions tests/src/core/testqgscomposergroup.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/***************************************************************************
testqgscomposergroup.cpp
-----------------------
begin : October 2014
copyright : (C) 2014 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgscomposeritemgroup.h"
#include "qgscomposerlabel.h"
#include "qgscomposition.h"
#include "qgscompositionchecker.h"
#include <QObject>
#include <QtTest>

class TestQgsComposerGroup: public QObject
{
Q_OBJECT;
private slots:
void initTestCase();// will be called before the first testfunction is executed.
void cleanupTestCase();// will be called after the last testfunction was executed.
void init();// will be called before each testfunction is executed.
void cleanup();// will be called after every testfunction.
void createGroup(); //test grouping items
void ungroup(); //test ungrouping items
void deleteGroup(); //test deleting group works
void undoRedo(); //test that group/ungroup undo/redo commands don't crash

private:
QgsComposition* mComposition;
QgsMapSettings mMapSettings;
QgsComposerLabel* mItem1;
QgsComposerLabel* mItem2;
QString mReport;
};

void TestQgsComposerGroup::initTestCase()
{
mComposition = new QgsComposition( mMapSettings );
mComposition->setPaperSize( 297, 210 ); //A4 landscape

//create some items
mItem1 = new QgsComposerLabel( mComposition );
mComposition->addItem( mItem1 );
mItem2 = new QgsComposerLabel( mComposition );
mComposition->addItem( mItem2 );

mReport = "<h1>Composer Grouped Item Tests</h1>\n";
}

void TestQgsComposerGroup::cleanupTestCase()
{
delete mComposition;

QString myReportFile = QDir::tempPath() + QDir::separator() + "qgistest.html";
QFile myFile( myReportFile );
if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
{
QTextStream myQTextStream( &myFile );
myQTextStream << mReport;
myFile.close();
}
}

void TestQgsComposerGroup::init()
{

}

void TestQgsComposerGroup::cleanup()
{

}

void TestQgsComposerGroup::createGroup()
{
//group items
QList<QgsComposerItem*> items;
items << mItem1 << mItem2;
QgsComposerItemGroup* group = mComposition->groupItems( items );

//check result
QVERIFY( group );
QCOMPARE( group->items().size(), 2 );
QVERIFY( group->items().contains( mItem1 ) );
QVERIFY( group->items().contains( mItem2 ) );
QVERIFY( mItem1->isGroupMember() );
QVERIFY( mItem2->isGroupMember() );
}

void TestQgsComposerGroup::ungroup()
{

}

void TestQgsComposerGroup::deleteGroup()
{

}

void TestQgsComposerGroup::undoRedo()
{

}

QTEST_MAIN( TestQgsComposerGroup )
#include "moc_testqgscomposergroup.cxx"

0 comments on commit 993f0dc

Please sign in to comment.