diff --git a/common.pri b/common.pri index f10eaf8..65d5fed 100644 --- a/common.pri +++ b/common.pri @@ -77,7 +77,7 @@ RCC_DIR = $${ARCH_DIR}/$${BUILD_TYPE}/rcc LIMEREPORT_VERSION_MAJOR = 1 LIMEREPORT_VERSION_MINOR = 4 -LIMEREPORT_VERSION_RELEASE = 123 +LIMEREPORT_VERSION_RELEASE = 124 LIMEREPORT_VERSION = '\\"$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}\\"' DEFINES += LIMEREPORT_VERSION_STR=\"$${LIMEREPORT_VERSION}\" @@ -103,5 +103,3 @@ lessThan(QT_MAJOR_VERSION, 5){ DEFINES += HAVE_UI_LOADER } } - - diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index fbef4f0..1619f58 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -379,10 +379,23 @@ int BandDesignIntf::maxChildIndex(QSet ignoredBands) return curIndex; } +int BandDesignIntf::rootIndex(BandDesignIntf* parentBand) +{ + return rootBand(parentBand)->bandIndex(); +} + +BandDesignIntf *BandDesignIntf::rootBand(BandDesignIntf* parentBand) +{ + BandDesignIntf* currentBand = this; + while (currentBand->parentBand() && currentBand->parentBand() != parentBand) + currentBand = currentBand->parentBand(); + return currentBand; +} + int BandDesignIntf::minChildIndex(BandDesignIntf::BandsType bandType){ int curIndex = bandIndex(); foreach(BandDesignIntf* childBand, childBands()){ - if (curIndex>childBand->bandIndex() && (childBand->bandType()>bandType)){ + if (curIndex > childBand->bandIndex() && (childBand->bandType() > bandType)){ curIndex = childBand->bandIndex(); } } @@ -394,7 +407,7 @@ int BandDesignIntf::minChildIndex(QSet ignoredBands) int curIndex = bandIndex(); foreach(BandDesignIntf* childBand, childBands()){ if (!ignoredBands.contains(childBand->bandType()) && childBand->bandIndex() < bandIndex()){ - curIndex = std::min(curIndex, childBand->maxChildIndex(ignoredBands)); + curIndex = std::min(curIndex, childBand->minChildIndex(ignoredBands)); } } return curIndex; diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index b8f47c5..68dd3dd 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -171,6 +171,8 @@ public: int maxChildIndex(BandDesignIntf::BandsType bandType) const; int maxChildIndex(QSet ignoredBands = QSet()) const; + int rootIndex(BandDesignIntf *parentBand); + BandDesignIntf* rootBand(BandDesignIntf *parentBand); BandDesignIntf* parentBand() const {return m_parentBand;} diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index a241adc..9c3ff53 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -2284,15 +2284,20 @@ CommandIf::Ptr BandMoveFromToCommand::create(PageDesignIntf* page, int from, int bool BandMoveFromToCommand::doIt() { if (page() && from != to) { - page()->pageItem()->moveBandFromTo(from, to); - return true; + BandDesignIntf* fromBand = page()->pageItem()->bandByIndex(from); + reverceTo = fromBand->minChildIndex(); + if (fromBand){ + page()->pageItem()->moveBandFromTo(from, to); + reverceFrom = fromBand->bandIndex(); + return true; + } } return false; } void BandMoveFromToCommand::undoIt() { - if (page()) page()->pageItem()->moveBandFromTo(to, from); + if (page()) page()->pageItem()->moveBandFromTo(reverceFrom, reverceTo); } } diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 7688838..844e1b2 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -433,6 +433,8 @@ namespace LimeReport { private: int from; int to; + int reverceFrom; + int reverceTo; }; diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 21e9c81..ccb52ec 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -621,47 +621,68 @@ void PageItemDesignIntf::swapBands(BandDesignIntf* band, BandDesignIntf* bandToS } +QList PageItemDesignIntf::createBandGroup(int beginIndex, int endIndex) +{ + QList result; + foreach(BandDesignIntf* curBand, m_bands){ + if ( curBand->bandIndex() >= beginIndex && curBand->bandIndex() <= endIndex) + result.append(curBand); + } + qSort(result.begin(), result.end(), bandIndexLessThen); + return result; +} + 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; + BandDesignIntf* fromBand = 0; + BandDesignIntf* toBand = 0; foreach(BandDesignIntf* band, bands()){ if (band->bandIndex() == from){ - firstBand = band; + fromBand = band->rootBand(band->parentBand()); } if (band->bandIndex() == to){ - secondBand = band; - bandsToMove.append(band); + toBand = band->rootBand(band->parentBand()); } + if (fromBand && toBand) break; } - 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 (!fromBand || !toBand) return; - - if (from > to){ - firstBand->changeBandIndex(secondBand->minChildIndex(), true); - moveIndex = firstBand->maxChildIndex()+1; + int beginIndex = 0; + int endIndex = 0; + if (from < to){ + beginIndex = fromBand->maxChildIndex()+1; + endIndex = toBand->maxChildIndex(); } else { - moveIndex = firstBand->minChildIndex(); - firstBand->changeBandIndex(secondBand->minChildIndex(), true); + beginIndex = toBand->minChildIndex(); + endIndex = fromBand->minChildIndex()-1; } - foreach(BandDesignIntf* curBand, bandsToMove){ - curBand->changeBandIndex(moveIndex,true); - moveIndex = curBand->maxChildIndex() + 1; + QList firstGroup = createBandGroup(fromBand->minChildIndex(), fromBand->maxChildIndex()); + QList secondGroup = createBandGroup(beginIndex, endIndex); + + if (from < to){ + int currentIndex = fromBand->minChildIndex(); + foreach(BandDesignIntf* band, secondGroup){ + band->setBandIndex(currentIndex); + currentIndex++; + } + foreach(BandDesignIntf* band, firstGroup){ + band->setBandIndex(currentIndex); + currentIndex++; + } + } else { + int currentIndex = toBand->minChildIndex(); + foreach(BandDesignIntf* band, firstGroup){ + band->setBandIndex(currentIndex); + currentIndex++; + } + foreach(BandDesignIntf* band, secondGroup){ + band->setBandIndex(currentIndex); + currentIndex++; + } } relocateBands(); diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index e24556a..2c7ff19 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -128,6 +128,8 @@ public: void swapBands(BandDesignIntf *band, BandDesignIntf *bandToSwap); void moveBandFromTo(int from, int to); + QList createBandGroup(int beginIndex, int endIndex); + protected slots: void bandDeleted(QObject* band); void bandPositionChanged(QObject* object, QPointF newPos, QPointF oldPos);