diff --git a/common.pri b/common.pri index e239ecd..c439321 100644 --- a/common.pri +++ b/common.pri @@ -105,7 +105,7 @@ RCC_DIR = $${ARCH_DIR}/$${BUILD_TYPE}/rcc LIMEREPORT_VERSION_MAJOR = 1 LIMEREPORT_VERSION_MINOR = 4 -LIMEREPORT_VERSION_RELEASE = 95 +LIMEREPORT_VERSION_RELEASE = 96 LIMEREPORT_VERSION = '$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}' DEFINES *= LIMEREPORT_VERSION_STR=\\\"$${LIMEREPORT_VERSION}\\\" diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index f3cf433..5c85b86 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -2398,7 +2398,7 @@ bool BandSwapCommand::doIt() { BandDesignIntf* band = dynamic_cast(page()->reportItemByName(bandName)); BandDesignIntf* bandToSwap = dynamic_cast(page()->reportItemByName(bandToSwapName)); - if (band && bandToSwap){ + if (page() && band && bandToSwap){ page()->pageItem()->swapBands(band, bandToSwap); return true; } @@ -2409,9 +2409,32 @@ void BandSwapCommand::undoIt() { BandDesignIntf* band = dynamic_cast(page()->reportItemByName(bandName)); BandDesignIntf* bandToSwap = dynamic_cast(page()->reportItemByName(bandToSwapName)); - if (band && bandToSwap) + if (page() && band && bandToSwap) page()->pageItem()->swapBands(bandToSwap, band); } +CommandIf::Ptr BandMoveFromToCommand::create(PageDesignIntf* page, int from, int to) +{ + BandMoveFromToCommand* command = new BandMoveFromToCommand(); + command->setPage(page); + command->from = from; + command->to = to; + return CommandIf::Ptr(command); +} + +bool BandMoveFromToCommand::doIt() +{ + if (page() && from != to) { + page()->pageItem()->moveBandFromTo(from, to); + return true; + } + return false; +} + +void BandMoveFromToCommand::undoIt() +{ + if (page()) page()->pageItem()->moveBandFromTo(to, from); +} + } diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index ff7490f..37eb7b1 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -462,6 +462,17 @@ namespace LimeReport { QString bandToSwapName; }; + class BandMoveFromToCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, int from, int to); + bool doIt(); + void undoIt(); + private: + int from; + int to; + }; + + class SizeChangedCommand : public AbstractPageCommand{ public: static CommandIf::Ptr create(PageDesignIntf* page, QVector& oldSize, QVector& newSize); diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index ff3fce4..e653177 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -711,7 +711,7 @@ void PageItemDesignIntf::swapBands(BandDesignIntf* band, BandDesignIntf* bandToS QList bandToMove; foreach(BandDesignIntf* curBand, m_bands){ if ( curBand->bandIndex() > moveIndex && curBand->bandIndex() < secondIndex && - curBand->bandType() == BandDesignIntf::Data && + curBand->bandType() == band->bandType() && curBand != band && curBand != bandToSwap ) bandToMove.append(curBand); @@ -721,7 +721,9 @@ void PageItemDesignIntf::swapBands(BandDesignIntf* band, BandDesignIntf* bandToS firstMoveBand->changeBandIndex(firstIndex, true); moveIndex = firstMoveBand->maxChildIndex() + 1; + moveIndex = firstIndex; qSort(bandToMove.begin(), bandToMove.end(), bandIndexLessThen); + foreach(BandDesignIntf* curBand, bandToMove){ curBand->changeBandIndex(moveIndex,true); moveIndex = curBand->maxChildIndex() + 1; @@ -736,16 +738,63 @@ void PageItemDesignIntf::swapBands(BandDesignIntf* band, BandDesignIntf* bandToS } +void PageItemDesignIntf::moveBandFromTo(int from, int to) +{ + BandDesignIntf* firstBand = 0; + BandDesignIntf* secondBand = 0; + + int firstIndex = std::min(from,to); + int secondIndex = std::max(from,to); + QList bandsToMove; + int moveIndex = 0; + + foreach(BandDesignIntf* band, bands()){ + if (band->bandIndex() == from){ + firstBand = band; + } + if (band->bandIndex() == to){ + secondBand = band; + bandsToMove.append(band); + } + } + + foreach(BandDesignIntf* curBand, m_bands){ + if ( curBand->bandIndex() > firstIndex && curBand->bandIndex() < secondIndex && + curBand->bandType() == firstBand->bandType() && + curBand != firstBand + ) + bandsToMove.append(curBand); + } + qSort(bandsToMove.begin(), bandsToMove.end(), bandIndexLessThen); + + + if (from > to){ + firstBand->changeBandIndex(secondBand->minChildIndex(), true); + moveIndex = firstBand->maxChildIndex()+1; + } else { + moveIndex = firstBand->minChildIndex(); + firstBand->changeBandIndex(secondBand->minChildIndex(), true); + } + + foreach(BandDesignIntf* curBand, bandsToMove){ + curBand->changeBandIndex(moveIndex,true); + moveIndex = curBand->maxChildIndex() + 1; + } + + relocateBands(); + +} + void PageItemDesignIntf::bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry) { BandDesignIntf* band = dynamic_cast(object); int curIndex = band->bandIndex(); BandDesignIntf* bandToSwap = 0; foreach(BandDesignIntf* curBand, bands()){ - if (newGeometry.y()>oldGeometry.y()) { + if (newGeometry.y() > oldGeometry.y()) { if (curBand->bandType() == band->bandType() - && curIndexbandIndex() - && (curBand->pos().y()+(curBand->height()/2))bandIndex() + && (curBand->pos().y() + (curBand->height()/2)) < newGeometry.y() && curBand->parentBand() == band->parentBand()) { curIndex = curBand->bandIndex(); @@ -754,7 +803,7 @@ void PageItemDesignIntf::bandGeometryChanged(QObject* object, QRectF newGeometry } else { if (curBand->bandType() == band->bandType() && curIndex>curBand->bandIndex() - && (curBand->pos().y()+(curBand->height()/2))>newGeometry.y() + && (curBand->pos().y() + (curBand->height()/2)) > newGeometry.y() && curBand->parentBand() == band->parentBand()) { curIndex = curBand->bandIndex(); @@ -763,10 +812,9 @@ void PageItemDesignIntf::bandGeometryChanged(QObject* object, QRectF newGeometry } } if (curIndex != band->bandIndex()){ - //swapBands(band, bandToSwap); - page()->saveCommand(BandSwapCommand::create(page(), band->objectName(), bandToSwap->objectName()), true); - + //page()->saveCommand(BandSwapCommand::create(page(), band->objectName(), bandToSwap->objectName()), true); + page()->saveCommand(BandMoveFromToCommand::create(page(), band->bandIndex(), bandToSwap->bandIndex()), true); } relocateBands(); } diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 037b06a..719d0e7 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -124,7 +124,8 @@ public: bool resetPageNumber() const; void setResetPageNumber(bool resetPageNumber); void updateSubItemsSize(RenderPass pass, DataSourceManager *dataManager); - void swapBands(BandDesignIntf *band, BandDesignIntf *bandToSwap); + void swapBands(BandDesignIntf *band, BandDesignIntf *bandToSwap); + void moveBandFromTo(int from, int to); bool isExtendedInDesignMode() const; void setExtendedInDesignMode(bool isExtendedInDesignMode);