Splittable band has been fixed

This commit is contained in:
Arin Alexander 2017-08-14 22:39:38 +03:00
parent 2338c9d8b7
commit 103ce472aa
6 changed files with 40 additions and 18 deletions

View File

@ -74,6 +74,7 @@ public:
bool isEmpty() const; bool isEmpty() const;
LayoutType layoutType() const; LayoutType layoutType() const;
void setLayoutType(const LayoutType &layoutType); void setLayoutType(const LayoutType &layoutType);
bool isSplittable() const { return true;}
protected: protected:
void collectionLoadFinished(const QString &collectionName); void collectionLoadFinished(const QString &collectionName);
void objectLoadFinished(); void objectLoadFinished();

View File

@ -794,7 +794,7 @@ QString TextItem::getTextPart(int height, int skipHeight){
int textPos = 0; int textPos = 0;
TextPtr text = textDocument(); TextPtr text = textDocument();
text->documentLayout();
QTextBlock curBlock = text->begin(); QTextBlock curBlock = text->begin();
QString resultText = ""; QString resultText = "";

View File

@ -123,7 +123,8 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q
m_startFromNewPage(false), m_startFromNewPage(false),
m_printAlways(false), m_printAlways(false),
m_repeatOnEachRow(false), m_repeatOnEachRow(false),
m_useAlternateBackgroundColor(false) m_useAlternateBackgroundColor(false),
m_bottomSpace()
{ {
setPossibleResizeDirectionFlags(ResizeBottom); setPossibleResizeDirectionFlags(ResizeBottom);
setPossibleMoveFlags(TopBotom); setPossibleMoveFlags(TopBotom);
@ -502,7 +503,8 @@ BaseDesignIntf* BandDesignIntf::cloneUpperPart(int height, QObject *owner, QGrap
{ {
int maxBottom = 0; int maxBottom = 0;
BandDesignIntf* upperPart = dynamic_cast<BandDesignIntf*>(createSameTypeItem(owner,parent)); BandDesignIntf* upperPart = dynamic_cast<BandDesignIntf*>(createSameTypeItem(owner,parent));
BaseDesignIntf* upperItem; upperPart->m_bottomSpace = this->bottomSpace();
BaseDesignIntf* upperItem = 0;
upperPart->initFromItem(this); upperPart->initFromItem(this);
@ -548,6 +550,7 @@ bool itemLessThen(QGraphicsItem* i1, QGraphicsItem* i2){
BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent)
{ {
BandDesignIntf* bottomPart = dynamic_cast<BandDesignIntf*>(createSameTypeItem(owner,parent)); BandDesignIntf* bottomPart = dynamic_cast<BandDesignIntf*>(createSameTypeItem(owner,parent));
bottomPart->m_bottomSpace = this->bottomSpace();
bottomPart->initFromItem(this); bottomPart->initFromItem(this);
QList<QGraphicsItem*> bandItems; QList<QGraphicsItem*> bandItems;
@ -564,17 +567,16 @@ BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGra
} }
else if ((item->geometry().top()<height) && (item->geometry().bottom()>height)){ else if ((item->geometry().top()<height) && (item->geometry().bottom()>height)){
int sliceHeight = height-item->geometry().top(); int sliceHeight = height-item->geometry().top();
if (item->canBeSplitted(sliceHeight)) { if (item->isSplittable() && item->canBeSplitted(sliceHeight)) {
BaseDesignIntf* tmpItem=item->cloneBottomPart(sliceHeight,bottomPart,bottomPart); BaseDesignIntf* tmpItem=item->cloneBottomPart(sliceHeight,bottomPart,bottomPart);
tmpItem->setPos(tmpItem->pos().x(),0); tmpItem->setPos(tmpItem->pos().x(),0);
if (tmpItem->pos().y()<0) tmpItem->setPos(tmpItem->pos().x(),0); if (tmpItem->pos().y()<0) tmpItem->setPos(tmpItem->pos().x(),0);
qreal sizeOffset = (m_slicedItems.value(tmpItem->objectName())->height()+tmpItem->height()) - item->height(); BaseDesignIntf* slicedItem = m_slicedItems.value(tmpItem->objectName());
qreal bottomOffset = (height - m_slicedItems.value(tmpItem->objectName())->pos().y())-m_slicedItems.value(tmpItem->objectName())->height(); if (slicedItem){
moveItemsDown(item->pos().y()+item->height(), sizeOffset + bottomOffset); qreal sizeOffset = (slicedItem->height()+tmpItem->height()) - item->height();
} qreal bottomOffset = (height - slicedItem->pos().y())-m_slicedItems.value(tmpItem->objectName())->height();
else if (item->isSplittable()){ moveItemsDown(item->pos().y()+item->height(), sizeOffset + bottomOffset);
BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); }
tmpItem->setPos(tmpItem->pos().x(),0);
} else { } else {
if ((item->geometry().bottom()-height)>height){ if ((item->geometry().bottom()-height)>height){
BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart);
@ -765,6 +767,11 @@ void BandDesignIntf::setAlternateBackgroundColor(const QColor &alternateBackgrou
} }
} }
qreal BandDesignIntf::bottomSpace() const
{
return m_bottomSpace.isValid() ? m_bottomSpace.value() : height()-findMaxBottom();
}
void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName) void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName)
{ {
update(); update();
@ -906,7 +913,7 @@ void BandDesignIntf::setKeepFooterTogether(bool value)
void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight)
{ {
qreal spaceBorder=0; qreal spaceBorder=0;
if (keepBottomSpaceOption()) spaceBorder=height()-findMaxBottom(); if (keepBottomSpaceOption()) spaceBorder = bottomSpace();
if (borderLines()!=0){ if (borderLines()!=0){
spaceBorder += borderLineSize(); spaceBorder += borderLineSize();
} }

View File

@ -82,6 +82,18 @@ private:
BandDesignIntf* m_band; BandDesignIntf* m_band;
}; };
class InitializedValue{
public:
InitializedValue(): m_value(-1), m_isInitialized(false){}
InitializedValue(qreal value): m_value(value), m_isInitialized(true){}
qreal value() const { return m_value;}
void setValue( qreal value){ m_value = value; m_isInitialized = true;}
bool isValid() const{ return m_isInitialized;}
private:
qreal m_value;
bool m_isInitialized;
};
class BandDesignIntf : public ItemsContainerDesignInft class BandDesignIntf : public ItemsContainerDesignInft
{ {
Q_OBJECT Q_OBJECT
@ -225,6 +237,7 @@ public:
bool useAlternateBackgroundColor() const; bool useAlternateBackgroundColor() const;
void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor); void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor);
void replaceGroupsFunction(BandDesignIntf *band); void replaceGroupsFunction(BandDesignIntf *band);
qreal bottomSpace() const;
signals: signals:
void bandRendered(BandDesignIntf* band); void bandRendered(BandDesignIntf* band);
protected: protected:
@ -279,8 +292,9 @@ private:
bool m_printAlways; bool m_printAlways;
bool m_repeatOnEachRow; bool m_repeatOnEachRow;
QMap<QString,BaseDesignIntf*> m_slicedItems; QMap<QString,BaseDesignIntf*> m_slicedItems;
QColor m_alternateBackgroundColor; QColor m_alternateBackgroundColor;
bool m_useAlternateBackgroundColor; bool m_useAlternateBackgroundColor;
InitializedValue m_bottomSpace;
}; };
class DataBandDesignIntf : public BandDesignIntf{ class DataBandDesignIntf : public BandDesignIntf{

View File

@ -91,7 +91,7 @@ void ItemsContainerDesignInft::arrangeSubItems(RenderPass pass, DataSourceManage
} }
} }
qreal ItemsContainerDesignInft::findMaxBottom() qreal ItemsContainerDesignInft::findMaxBottom() const
{ {
qreal maxBottom=0; qreal maxBottom=0;
foreach(QGraphicsItem* item,childItems()){ foreach(QGraphicsItem* item,childItems()){
@ -103,7 +103,7 @@ qreal ItemsContainerDesignInft::findMaxBottom()
return maxBottom; return maxBottom;
} }
qreal ItemsContainerDesignInft::findMaxHeight() qreal ItemsContainerDesignInft::findMaxHeight() const
{ {
qreal maxHeight=0; qreal maxHeight=0;
foreach(QGraphicsItem* item,childItems()){ foreach(QGraphicsItem* item,childItems()){

View File

@ -44,8 +44,8 @@ public:
protected: protected:
void snapshotItemsLayout(); void snapshotItemsLayout();
void arrangeSubItems(RenderPass pass, DataSourceManager *dataManager, ArrangeType type = AsNeeded); void arrangeSubItems(RenderPass pass, DataSourceManager *dataManager, ArrangeType type = AsNeeded);
qreal findMaxBottom(); qreal findMaxBottom() const;
qreal findMaxHeight(); qreal findMaxHeight() const;
private: private:
QVector<PItemSortContainer> m_containerItems; QVector<PItemSortContainer> m_containerItems;