mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-04 00:06:15 -04:00
Caused by internal Qt bug when multiple QSortFilterProxyModels used by widgets are attached to a parent model which calls beginMoveRows. Adds some tests, but none reproduce the crash. Not reproducable on Qt5 builds.
636 lines
25 KiB
C++
636 lines
25 KiB
C++
/***************************************************************************
|
|
testqgscomposermodel.cpp
|
|
-----------------------
|
|
begin : July 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 "qgscomposition.h"
|
|
#include "qgscomposermodel.h"
|
|
#include "qgscomposerlabel.h"
|
|
#include "qgsapplication.h"
|
|
#include "qgsmapsettings.h"
|
|
#include "qgsproject.h"
|
|
|
|
#include <QObject>
|
|
#include "qgstest.h"
|
|
#include <QList>
|
|
|
|
class TestQgsComposerModel : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
TestQgsComposerModel()
|
|
: mComposition( 0 )
|
|
, mItem1( 0 )
|
|
, mItem2( 0 )
|
|
, mItem3( 0 )
|
|
{}
|
|
|
|
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 creation(); //check that model has been created
|
|
void addItems(); //add some items to the composition and test model
|
|
void zList(); //check model z order list
|
|
void clear(); //check clearing the model
|
|
void addItemDirectly(); //add an item directly to the model
|
|
void rebuildZList(); //test rebuilding the z list from the current composer stacking
|
|
void removeItem(); //test removing an item from the model
|
|
void reorderUp(); //test reordering an item up
|
|
void reorderDown(); //test reordering an item down
|
|
void reorderTop(); //test reordering an item to top
|
|
void reorderBottom(); //test reordering an item to bottom
|
|
void getComposerItemAbove(); //test getting composer item above
|
|
void getComposerItemBelow(); //test getting composer item below
|
|
void setItemRemoved(); //test setting an item as removed
|
|
void rebuildZListWithRemoved(); //test rebuilding z list with removed items
|
|
void reorderUpWithRemoved(); //test reordering up with removed items
|
|
void reorderDownWithRemoved(); //test reordering down with removed items
|
|
void reorderToTopWithRemoved(); //test reordering to top with removed items
|
|
void reorderToBottomWithRemoved(); //test reordering to bottom with removed items
|
|
|
|
void proxyCrash();
|
|
|
|
private:
|
|
QgsComposition *mComposition = nullptr;
|
|
QgsComposerLabel *mItem1 = nullptr;
|
|
QgsComposerLabel *mItem2 = nullptr;
|
|
QgsComposerLabel *mItem3 = nullptr;
|
|
};
|
|
|
|
void TestQgsComposerModel::initTestCase()
|
|
{
|
|
QgsApplication::init();
|
|
QgsApplication::initQgis();
|
|
|
|
mComposition = new QgsComposition( QgsProject::instance() );
|
|
|
|
mComposition->setPaperSize( 297, 210 ); //A4 landscape
|
|
}
|
|
|
|
void TestQgsComposerModel::cleanupTestCase()
|
|
{
|
|
delete mItem1;
|
|
delete mItem2;
|
|
delete mItem3;
|
|
delete mComposition;
|
|
QgsApplication::exitQgis();
|
|
}
|
|
|
|
void TestQgsComposerModel::init()
|
|
{
|
|
|
|
}
|
|
|
|
void TestQgsComposerModel::cleanup()
|
|
{
|
|
|
|
}
|
|
|
|
void TestQgsComposerModel::creation()
|
|
{
|
|
QVERIFY( mComposition->itemsModel() );
|
|
//check some basic things
|
|
QCOMPARE( mComposition->itemsModel()->columnCount(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 0 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 0 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 0 );
|
|
}
|
|
|
|
void TestQgsComposerModel::addItems()
|
|
{
|
|
//add some items to the composition
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 0 );
|
|
mItem1 = new QgsComposerLabel( mComposition );
|
|
mComposition->addItem( mItem1 );
|
|
mItem2 = new QgsComposerLabel( mComposition );
|
|
mComposition->addItem( mItem2 );
|
|
mItem3 = new QgsComposerLabel( mComposition );
|
|
mComposition->addItem( mItem3 );
|
|
//check that these items have been added to the model
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 3 );
|
|
//and the scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
}
|
|
|
|
void TestQgsComposerModel::zList()
|
|
{
|
|
//check z list for items added by TestQgsComposerModel::addItems()
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 2 ), mItem1 );
|
|
}
|
|
|
|
void TestQgsComposerModel::clear()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 0 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 0 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 0 );
|
|
}
|
|
|
|
void TestQgsComposerModel::addItemDirectly()
|
|
{
|
|
//create some items not attached to the composition
|
|
QgsComposerLabel *bottomItem = new QgsComposerLabel( 0 );
|
|
QgsComposerLabel *topItem = new QgsComposerLabel( 0 );
|
|
|
|
mComposition->itemsModel()->clear();
|
|
|
|
mComposition->itemsModel()->addItemAtTop( bottomItem );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 1 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 1 );
|
|
|
|
mComposition->itemsModel()->addItemAtTop( topItem );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 2 );
|
|
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), topItem );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), bottomItem );
|
|
|
|
//also check scene list (these items are treated by the model as belonging to the scene,
|
|
//as they will have isRemoved() as false
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), topItem );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), bottomItem );
|
|
|
|
mComposition->itemsModel()->clear();
|
|
delete bottomItem;
|
|
delete topItem;
|
|
}
|
|
|
|
void TestQgsComposerModel::rebuildZList()
|
|
{
|
|
//start with an empty model
|
|
mComposition->itemsModel()->clear();
|
|
|
|
//some items are in composition, added by TestQgsComposerModel::addItems
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check that these items have been added to the model
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 3 );
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 2 ), mItem1 );
|
|
}
|
|
|
|
void TestQgsComposerModel::removeItem()
|
|
{
|
|
//start with an empty model
|
|
mComposition->itemsModel()->clear();
|
|
|
|
QgsComposerLabel *item1 = new QgsComposerLabel( 0 );
|
|
QgsComposerLabel *item2 = new QgsComposerLabel( 0 );
|
|
|
|
//add one item to the model
|
|
mComposition->itemsModel()->addItemAtTop( item1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 1 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 1 );
|
|
|
|
//also check scene list (this item is treated by the model as belonging to the scene,
|
|
//as it has isRemoved() as false
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), item1 );
|
|
|
|
//try removing a missing item
|
|
mComposition->itemsModel()->removeItem( 0 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 1 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 1 );
|
|
|
|
//try removing an item not in the model
|
|
mComposition->itemsModel()->removeItem( item2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 1 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 1 );
|
|
|
|
//remove the item which is in the model
|
|
mComposition->itemsModel()->removeItem( item1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 0 );
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 0 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 0 );
|
|
|
|
delete item1;
|
|
delete item2;
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderUp()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//try reordering some bad items
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemUp( 0 ) );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemUp( label ) );
|
|
|
|
//trying to reorder up the topmost item should fail
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemUp( mItem3 ) );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemUp( mItem2 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 2 ), mItem1 );
|
|
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderDown()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//try reordering some bad items
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemDown( 0 ) );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemDown( label ) );
|
|
|
|
//trying to reorder down the bottommost item should fail
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemDown( mItem1 ) );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemDown( mItem2 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem2 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 2 ), mItem2 );
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderTop()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//try reordering some bad items
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemToTop( 0 ) );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemToTop( label ) );
|
|
|
|
//trying to reorder up the topmost item should fail
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemToTop( mItem3 ) );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemToTop( mItem1 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem2 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 2 ), mItem2 );
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderBottom()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//try reordering some bad items
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemToBottom( 0 ) );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemToBottom( label ) );
|
|
|
|
//trying to reorder down the bottommost item should fail
|
|
QVERIFY( ! mComposition->itemsModel()->reorderItemToBottom( mItem1 ) );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemToBottom( mItem3 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem3 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 2 ), mItem3 );
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::getComposerItemAbove()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//try getting item above some bad items
|
|
QVERIFY( ! mComposition->itemsModel()->getComposerItemAbove( 0 ) );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
QVERIFY( ! mComposition->itemsModel()->getComposerItemAbove( label ) );
|
|
|
|
//trying to get item above topmost item should fail
|
|
QVERIFY( ! mComposition->itemsModel()->getComposerItemAbove( mItem3 ) );
|
|
|
|
//try using a good item
|
|
QCOMPARE( mComposition->itemsModel()->getComposerItemAbove( mItem2 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->getComposerItemAbove( mItem1 ), mItem2 );
|
|
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::getComposerItemBelow()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//try getting item below some bad items
|
|
QVERIFY( ! mComposition->itemsModel()->getComposerItemBelow( 0 ) );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
QVERIFY( ! mComposition->itemsModel()->getComposerItemBelow( label ) );
|
|
|
|
//trying to get item below bottom most item should fail
|
|
QVERIFY( ! mComposition->itemsModel()->getComposerItemBelow( mItem1 ) );
|
|
|
|
//try using a good item
|
|
QCOMPARE( mComposition->itemsModel()->getComposerItemBelow( mItem3 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->getComposerItemBelow( mItem2 ), mItem1 );
|
|
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::setItemRemoved()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 3 );
|
|
|
|
//try marking some bad items as removed
|
|
mComposition->itemsModel()->setItemRemoved( 0 );
|
|
QgsComposerLabel *label = new QgsComposerLabel( 0 );
|
|
mComposition->itemsModel()->setItemRemoved( label );
|
|
QVERIFY( !label->isRemoved() );
|
|
|
|
//try using a good item
|
|
mComposition->itemsModel()->setItemRemoved( mItem3 );
|
|
QVERIFY( mItem3->isRemoved() );
|
|
|
|
//item should still be in z-list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//but not in scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
delete label;
|
|
}
|
|
|
|
void TestQgsComposerModel::rebuildZListWithRemoved()
|
|
{
|
|
QVERIFY( mItem3->isRemoved() );
|
|
|
|
//start with an empty model
|
|
mComposition->itemsModel()->clear();
|
|
|
|
//rebuild z list
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check that only items in the scene are shown by the model
|
|
QCOMPARE( mComposition->itemsModel()->rowCount(), 2 );
|
|
|
|
//check z list contains ALL items
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
//check that scene list is missing removed item
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderUpWithRemoved()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemUp( mItem1 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem2 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem2 );
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderDownWithRemoved()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemDown( mItem2 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem2 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem2 );
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderToTopWithRemoved()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemToTop( mItem1 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem2 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem2 );
|
|
}
|
|
|
|
void TestQgsComposerModel::reorderToBottomWithRemoved()
|
|
{
|
|
mComposition->itemsModel()->clear();
|
|
mComposition->itemsModel()->rebuildZList();
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem1 );
|
|
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem1 );
|
|
|
|
//try reorder a good item, should succeed
|
|
QVERIFY( mComposition->itemsModel()->reorderItemToBottom( mItem2 ) );
|
|
|
|
//check z list
|
|
QCOMPARE( mComposition->itemsModel()->zOrderListSize(), 3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 0 ), mItem3 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 1 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->zOrderList()->at( 2 ), mItem2 );
|
|
//also check scene list
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.size(), 2 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 0 ), mItem1 );
|
|
QCOMPARE( mComposition->itemsModel()->mItemsInScene.at( 1 ), mItem2 );
|
|
}
|
|
|
|
void TestQgsComposerModel::proxyCrash()
|
|
{
|
|
// test for a possible crash when using QgsComposerProxyModel and reordering items
|
|
QgsComposition *composition = new QgsComposition( QgsProject::instance() );
|
|
|
|
// create a proxy - it's not used, but will be watching...
|
|
QgsComposerProxyModel *proxy = new QgsComposerProxyModel( composition );
|
|
Q_UNUSED( proxy );
|
|
|
|
// add some items to composition
|
|
QgsComposerLabel *item1 = new QgsComposerLabel( composition );
|
|
composition->addItem( item1 );
|
|
QgsComposerLabel *item2 = new QgsComposerLabel( composition );
|
|
composition->addItem( item2 );
|
|
QgsComposerLabel *item3 = new QgsComposerLabel( composition );
|
|
composition->addItem( item3 );
|
|
|
|
// reorder items - expect no crash!
|
|
composition->itemsModel()->reorderItemUp( item1 );
|
|
}
|
|
|
|
QGSTEST_MAIN( TestQgsComposerModel )
|
|
#include "testqgscomposermodel.moc"
|