diff --git a/include/lrglobal.h b/include/lrglobal.h index 8a312d8..5897f53 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -59,22 +59,29 @@ namespace Const{ int const DEFAULT_GRID_STEP = 1; int const RESIZE_HANDLE_SIZE = 5; int const SELECTION_PEN_SIZE = 1; - int const MINIMUM_ITEM_WIDTH = 2*RESIZE_HANDLE_SIZE; - int const MINIMUM_ITEM_HEIGHT = 2*RESIZE_HANDLE_SIZE; + int const MINIMUM_ITEM_WIDTH = 2 * RESIZE_HANDLE_SIZE; + int const MINIMUM_ITEM_HEIGHT = 2 * RESIZE_HANDLE_SIZE; double const RESIZE_ZONE_OPACITY = 0.5; double const SELECTED_RESIZE_ZONE_OPACITY = 0.6; Qt::GlobalColor const RESIZE_ZONE_COLOR = Qt::green; Qt::GlobalColor const SELECTION_COLOR = Qt::red; Qt::GlobalColor const JOIN_COLOR = Qt::blue; double const SELECTION_COLOR_OPACITY = 0.6; - const qreal fontFACTOR = 3.5; - const int mmFACTOR = 10; - const int itemPaleteIconSize = 24; - const qreal minSpaceBorder = 10; - const QString bandTAG = "band"; + const qreal FONT_FACTOR = 0.33; + const int STORAGE_MM_FACTOR = 10; + const int DESIGNER_MM_FACTOR = 5; + const int OLD_MM_FACTOR = 10; + const int DEFAULT_ITEM_WIDTH = 20; + const int DEFAULT_ITEM_HEIGHT = 5; + const int DEFAULT_BAND_HEIGHT = 10; + const int PPM_PERCENT_STEP = 20; + const int ITEM_PALETTE_ICON_SIZE = 24; + const qreal MIN_SPACE_BORDER = 10; + const QString BAND_TAG = "band"; const Qt::GlobalColor BAND_NAME_LABEL_COLOR = Qt::yellow; - const Qt::GlobalColor BAND_NAME_BORDER_COLOR = Qt::darkYellow; - const qreal BAND_MARKER_OPACITY = 1; + const Qt::GlobalColor BAND_NAME_BORDER_COLOR = Qt::darkGray; + const qreal BAND_MARKER_SELECTED_OPACITY = 1; + const qreal BAND_MARKER_OPACITY = 0.3; const qreal LAYOUT_MARKER_OPACITY = 0.3; const qreal BAND_NAME_AREA_OPACITY = 0.3; const qreal BAND_NAME_TEXT_OPACITY = 0.6; diff --git a/limereport/bands/lrdataband.cpp b/limereport/bands/lrdataband.cpp index 7119440..bf77e58 100644 --- a/limereport/bands/lrdataband.cpp +++ b/limereport/bands/lrdataband.cpp @@ -49,17 +49,17 @@ LimeReport::BaseDesignIntf * createFooter(QObject* owner, LimeReport::BaseDesign bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::Const::BAND_TAG), createBand ); bool VARIABLE_IS_NOT_USED registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagHeader, - LimeReport::ItemAttribs(QObject::tr("DataHeader"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("DataHeader"),LimeReport::Const::BAND_TAG), createHeader ); bool VARIABLE_IS_NOT_USED registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagFooter, - LimeReport::ItemAttribs(QObject::tr("DataFooter"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("DataFooter"),LimeReport::Const::BAND_TAG), createFooter ); diff --git a/limereport/bands/lrgroupbands.cpp b/limereport/bands/lrgroupbands.cpp index 6865ce5..81d10aa 100644 --- a/limereport/bands/lrgroupbands.cpp +++ b/limereport/bands/lrgroupbands.cpp @@ -42,7 +42,7 @@ LimeReport::BaseDesignIntf* createHeader(QObject* owner, LimeReport::BaseDesignI bool VARIABLE_IS_NOT_USED registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagHeader, - LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::Const::BAND_TAG), createHeader ); @@ -52,7 +52,7 @@ LimeReport::BaseDesignIntf * createFooter(QObject* owner, LimeReport::BaseDesign bool VARIABLE_IS_NOT_USED registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagFooter, - LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::Const::BAND_TAG), createFooter ); diff --git a/limereport/bands/lrpagefooter.cpp b/limereport/bands/lrpagefooter.cpp index 9793487..5b9b2d4 100644 --- a/limereport/bands/lrpagefooter.cpp +++ b/limereport/bands/lrpagefooter.cpp @@ -41,7 +41,7 @@ LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIn bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("Page Footer"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Page Footer"),LimeReport::Const::BAND_TAG), createBand ); } diff --git a/limereport/bands/lrpageheader.cpp b/limereport/bands/lrpageheader.cpp index 26fc9c6..9aa9405 100644 --- a/limereport/bands/lrpageheader.cpp +++ b/limereport/bands/lrpageheader.cpp @@ -44,7 +44,7 @@ LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIn bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("Page Header"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Page Header"),LimeReport::Const::BAND_TAG), createBand ); } diff --git a/limereport/bands/lrreportfooter.cpp b/limereport/bands/lrreportfooter.cpp index ead4e60..1b7d5a9 100644 --- a/limereport/bands/lrreportfooter.cpp +++ b/limereport/bands/lrreportfooter.cpp @@ -40,7 +40,7 @@ LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIn } bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("Report Footer"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Report Footer"),LimeReport::Const::BAND_TAG), createBand ); } diff --git a/limereport/bands/lrreportheader.cpp b/limereport/bands/lrreportheader.cpp index e08f418..ddb19c6 100644 --- a/limereport/bands/lrreportheader.cpp +++ b/limereport/bands/lrreportheader.cpp @@ -39,7 +39,7 @@ LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIn } bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("Report Header"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Report Header"),LimeReport::Const::BAND_TAG), createBand ); } diff --git a/limereport/bands/lrsubdetailband.cpp b/limereport/bands/lrsubdetailband.cpp index bfdcde3..43111c8 100644 --- a/limereport/bands/lrsubdetailband.cpp +++ b/limereport/bands/lrsubdetailband.cpp @@ -45,7 +45,7 @@ LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIn bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagBand, - LimeReport::ItemAttribs(QObject::tr("SubDetail"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("SubDetail"),LimeReport::Const::BAND_TAG), createBand ); @@ -55,7 +55,7 @@ LimeReport::BaseDesignIntf * createHeader(QObject* owner, LimeReport::BaseDesign bool VARIABLE_IS_NOT_USED registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagHeader, - LimeReport::ItemAttribs(QObject::tr("SubDetailHeader"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("SubDetailHeader"),LimeReport::Const::BAND_TAG), createHeader ); @@ -65,7 +65,7 @@ LimeReport::BaseDesignIntf * createFooter(QObject* owner, LimeReport::BaseDesign bool VARIABLE_IS_NOT_USED registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagFooter, - LimeReport::ItemAttribs(QObject::tr("SubDetailFooter"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("SubDetailFooter"),LimeReport::Const::BAND_TAG), createFooter ); diff --git a/limereport/bands/lrtearoffband.cpp b/limereport/bands/lrtearoffband.cpp index 6f854ab..22006f1 100644 --- a/limereport/bands/lrtearoffband.cpp +++ b/limereport/bands/lrtearoffband.cpp @@ -10,7 +10,7 @@ LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIn } bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("Tear-off Band"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Tear-off Band"),LimeReport::Const::BAND_TAG), createBand ); } diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp index 22d17a2..1882a42 100644 --- a/limereport/items/lrabstractlayout.cpp +++ b/limereport/items/lrabstractlayout.cpp @@ -218,10 +218,10 @@ void AbstractLayout::collectionLoadFinished(const QString& collectionName) } } -void AbstractLayout::objectLoadFinished() +void AbstractLayout::finishLoading() { layoutMarker()->setHeight(height()); - LayoutDesignIntf::objectLoadFinished(); + LayoutDesignIntf::finishLoading(); } bool AbstractLayout::isNeedUpdateSize(RenderPass pass) const diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 14ec715..be1f3dd 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -39,7 +39,7 @@ public: int childrenCount(); int layoutSpacing() const; void setLayoutSpacing(int layoutSpacing); - qreal layoutSpacingMM(){ return m_layoutSpacing * Const::mmFACTOR;} + qreal layoutSpacingMM(){ return m_layoutSpacing * ppm();} protected: void beforeDelete(); void childAddedEvent(BaseDesignIntf *child); @@ -47,7 +47,7 @@ protected: void initMode(ItemMode mode); void setBorderLinesFlags(BorderLines flags); void collectionLoadFinished(const QString &collectionName); - void objectLoadFinished(); + void finishLoading(); bool isNeedUpdateSize(RenderPass pass) const; QVariant itemChange(GraphicsItemChange change, const QVariant &value); void updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight); diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index f4f51ef..b41afb6 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -47,7 +47,7 @@ LimeReport::BaseDesignIntf *createHLayout(QObject *owner, LimeReport::BaseDesign } bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("HLayout"), LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("HLayout"), LimeReport::Const::BAND_TAG), createHLayout ); } diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 50de9d5..e3831ae 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -160,7 +160,6 @@ void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, Q Q_UNUSED(widget); Q_UNUSED(style); - TextPtr text = textDocument(); painter->save(); @@ -975,9 +974,9 @@ BaseDesignIntf *TextItem::cloneEmpty(int height, QObject *owner, QGraphicsItem * return empty; } -void TextItem::objectLoadFinished() +void TextItem::finishLoading() { - ItemDesignIntf::objectLoadFinished(); + ItemDesignIntf::finishLoading(); // if (itemMode() == DesignMode || !isNeedExpandContent()){ // if (autoHeight() && autoWidth()) // initTextSizes(); diff --git a/limereport/items/lrtextitem.h b/limereport/items/lrtextitem.h index fbd2bfd..748a2b9 100644 --- a/limereport/items/lrtextitem.h +++ b/limereport/items/lrtextitem.h @@ -121,7 +121,7 @@ public: BaseDesignIntf* cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent); BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); BaseDesignIntf* cloneEmpty(int height, QObject *owner, QGraphicsItem *parent); - void objectLoadFinished(); + void finishLoading(); void setTextItemFont(QFont value); QWidget* defaultEditor(); diff --git a/limereport/items/lrverticallayout.cpp b/limereport/items/lrverticallayout.cpp index 51cb533..3b01875 100644 --- a/limereport/items/lrverticallayout.cpp +++ b/limereport/items/lrverticallayout.cpp @@ -13,7 +13,7 @@ LimeReport::BaseDesignIntf *createVLayout(QObject *owner, LimeReport::BaseDesign } bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTag, - LimeReport::ItemAttribs(QObject::tr("VLayout"), LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("VLayout"), LimeReport::Const::BAND_TAG), createVLayout ); } diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 008e9a6..4bb1c2a 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -38,7 +38,10 @@ namespace LimeReport { BandMarker::BandMarker(BandDesignIntf *band, QGraphicsItem* parent) - :QGraphicsItem(parent),m_rect(0,0,30,30),m_band(band) + : QGraphicsItem(parent), + m_rect(0, 0, 3 * band->ppm(), 3 * band->ppm() ), + m_band(band), + m_isMoving(false) { setAcceptHoverEvents(true); } @@ -51,27 +54,34 @@ QRectF BandMarker::boundingRect() const void BandMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem* /**option*/, QWidget* /*widget*/) { painter->save(); - painter->setOpacity(Const::BAND_MARKER_OPACITY); - painter->fillRect(boundingRect(),m_color); + painter->setOpacity(Const::BAND_MARKER_SELECTED_OPACITY); + painter->fillRect(boundingRect(), m_color); painter->setOpacity(1); painter->setPen(QPen(QBrush(Qt::lightGray),2)); - painter->fillRect(QRectF( - boundingRect().bottomLeft().x(), - boundingRect().bottomLeft().y()-4, - boundingRect().width(),4), Qt::lightGray - ); - - painter->setRenderHint(QPainter::Antialiasing); - qreal size = (boundingRect().width()setBrush(Qt::white); - painter->setPen(Qt::white); - painter->drawEllipse(r.adjusted(5,5,-5,-5)); - if (m_band->isSelected()){ - painter->setBrush(LimeReport::Const::SELECTION_COLOR); - painter->drawEllipse(r.adjusted(7,7,-7,-7)); + if (m_band->ppm() >= 5){ + int startPos = (boundingRect().width() - 10) / 2; + for (int i = 0; i<3; i++){ + painter->fillRect(QRectF(startPos, boundingRect().height() - 6, 2, 2), Qt::white); + startPos += 4; + } + painter->setPen(Qt::white); + painter->drawLine(0, boundingRect().height()-1, boundingRect().width(), boundingRect().height()-1); + } else { + painter->fillRect(QRectF( + boundingRect().bottomLeft().x(), + boundingRect().bottomLeft().y() - 2, + boundingRect().width(),2), Qt::white + ); } + if (m_band->isSelected()){ + painter->setRenderHint(QPainter::Antialiasing); + qreal size = (boundingRect().width() < boundingRect().height()) ? boundingRect().width() : boundingRect().height(); + QRectF r = QRectF(0,0,size,size); + painter->setBrush(Qt::white); + painter->setPen(Qt::white); + painter->drawEllipse(r.adjusted(3,3,-3,-3)); + } painter->restore(); } @@ -106,6 +116,10 @@ void BandMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) m_band->scene()->clearSelection(); m_band->setSelected(true); m_oldBandPos = m_band->pos(); + if (!hasCursor()){ + m_isMoving = true; + m_band->setIsChangingPos(true); + } update(0,0,boundingRect().width(),boundingRect().width()); } } @@ -138,6 +152,8 @@ void BandMarker::mouseMoveEvent(QGraphicsSceneMouseEvent* event) void BandMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { Q_UNUSED(event) + m_isMoving = false; + m_band->setIsChangingPos(false); m_band->posChanged(m_band, m_band->pos(), m_oldBandPos); } @@ -168,7 +184,9 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q m_repeatOnEachRow(false), m_useAlternateBackgroundColor(false), m_bottomSpace(0), - m_shiftItems(0) + m_shiftItems(0), + m_paddingTop(0), + m_paddingBottom(0) { setPossibleResizeDirectionFlags(ResizeBottom); setPossibleMoveFlags(TopBotom); @@ -180,7 +198,7 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q setBackgroundMode(BaseDesignIntf::TransparentMode); setFillTransparentInDesignMode(false); - setHeight(100); + setHeight(Const::DEFAULT_BAND_HEIGHT * Const::STORAGE_MM_FACTOR); setFixedPos(true); setFlag(QGraphicsItem::ItemClipsChildrenToShape); m_bandMarker = new BandMarker(this); @@ -249,6 +267,12 @@ bool BandDesignIntf::isNeedUpdateSize(RenderPass pass) const{ return false; } +void BandDesignIntf::setPpm(int ppm) +{ + ItemsContainerDesignInft::setPpm(ppm); + updateBandMarkerGeometry(QRectF(pos(),size())); +} + void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { prepareRect(painter, option, widget); @@ -256,7 +280,7 @@ void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *op if (itemMode() & DesignMode){ painter->save(); QString bandText = bandTitle(); - QFont font("Arial", 7 * Const::fontFACTOR, -1, true); + QFont font("Arial", 6 * Const::FONT_FACTOR * ppm(), -1, true); QFontMetrics fontMetrics(font); QVector bandNameRects; @@ -272,10 +296,10 @@ void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *op for (int i=0;isetRenderHint(QPainter::Antialiasing); + //painter->setRenderHint(QPainter::Antialiasing); painter->setBrush(bandColor()); painter->setOpacity(Const::BAND_NAME_AREA_OPACITY); - painter->drawRoundedRect(labelRect,8,8); + painter->drawRect(labelRect); painter->setOpacity(Const::BAND_NAME_TEXT_OPACITY); painter->setPen(Qt::black); painter->drawText(bandNameRects[i],Qt::AlignHCenter,bandText); @@ -286,10 +310,10 @@ void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *op BaseDesignIntf::paint(painter,option,widget); } -QRectF BandDesignIntf::boundingRect() const -{ - return ItemsContainerDesignInft::boundingRect().adjusted(0,-4,0,4); -} +//QRectF BandDesignIntf::boundingRect() const +//{ +// return ItemsContainerDesignInft::boundingRect().adjusted(0,-4,0,4); +//} void BandDesignIntf::translateBandsName() { @@ -359,7 +383,7 @@ bool BandDesignIntf::isUnique() const void BandDesignIntf::setItemMode(BaseDesignIntf::ItemMode mode) { ItemsContainerDesignInft::setItemMode(mode); - updateBandMarkerGeometry(); + updateBandMarkerGeometry(QRectF(pos(),size())); } QString BandDesignIntf::datasourceName(){ @@ -741,10 +765,10 @@ void BandDesignIntf::parentObjectLoadFinished() setParentBand(findParentBand()); } -void BandDesignIntf::objectLoadFinished() +void BandDesignIntf::finishLoading() { m_bandMarker->setHeight(height()); - BaseDesignIntf::objectLoadFinished(); + BaseDesignIntf::finishLoading(); } void BandDesignIntf::emitBandRendered(BandDesignIntf* band) @@ -804,18 +828,19 @@ BandDesignIntf* BandDesignIntf::findParentBand() return 0; } -void BandDesignIntf::updateBandMarkerGeometry() +void BandDesignIntf::updateBandMarkerGeometry(QRectF geometry) { if (parentItem() && m_bandMarker){ - m_bandMarker->setPos(pos().x()-m_bandMarker->width(),pos().y()); - m_bandMarker->setHeight(rect().height()); + m_bandMarker->setWidth(3 * ppm()); + m_bandMarker->setHeight(geometry.height()); + m_bandMarker->setPos(geometry.x()-m_bandMarker->width(),geometry.y()); } } void BandDesignIntf::geometryChangedEvent(QRectF, QRectF ) { if (((itemMode()&DesignMode) || (itemMode()&EditMode))&&parentItem()){ - updateBandMarkerGeometry(); + updateBandMarkerGeometry(QRectF(pos(), size())); } foreach (BaseDesignIntf* item, childBaseItems()) { if (item->itemAlign()!=DesignedItemAlign){ @@ -827,10 +852,7 @@ void BandDesignIntf::geometryChangedEvent(QRectF, QRectF ) QVariant BandDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if ((change==ItemPositionChange)&&((itemMode()&DesignMode)||(itemMode()&EditMode))){ - if (m_bandMarker){ - m_bandMarker->setPos((value.toPointF().x()-m_bandMarker->boundingRect().width()), - value.toPointF().y()); - } + updateBandMarkerGeometry(QRectF(value.toPointF(),size())); } if (change==ItemSelectedChange){ if (m_bandMarker){ @@ -923,6 +945,31 @@ void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QStrin m_bandNameLabel->updateLabel(newName); } +int BandDesignIntf::paddingBottom() const +{ + return m_paddingBottom; +} + +void BandDesignIntf::setPaddingBottom(int paddingBottom) +{ + m_paddingBottom = paddingBottom; +} + +QRectF BandDesignIntf::boundingRect() const +{ + return ItemsContainerDesignInft::boundingRect().adjusted(0,0,0,1); +} + +int BandDesignIntf::paddingTop() const +{ + return m_paddingTop; +} + +void BandDesignIntf::setPaddingTop(int paddingTop) +{ + m_paddingTop = paddingTop; +} + int BandDesignIntf::shiftItems() const { return m_shiftItems; @@ -1120,7 +1167,7 @@ void BandDesignIntf::setKeepFooterTogether(bool value) void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { - qreal spaceBorder = 0; + qreal spaceBorder = m_paddingBottom+1; if (keepBottomSpace()) spaceBorder = bottomSpace(); spaceBorder = spaceBorder > 0 ? spaceBorder : 0; if (borderLines() != 0){ @@ -1134,7 +1181,7 @@ void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass p arrangeSubItems(pass, dataManager); if (autoHeight()){ if (!keepTopSpace()) { - qreal minTop = findMinTop() + m_shiftItems; + qreal minTop = findMinTop() + m_shiftItems - m_paddingTop; foreach (BaseDesignIntf* item, childBaseItems()) { item->setY(item->y() - minTop); } @@ -1183,14 +1230,14 @@ BandNameLabel::BandNameLabel(BandDesignIntf *band, QGraphicsItem *parent) void BandNameLabel::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->save(); - painter->setRenderHint(QPainter::Antialiasing); - painter->setFont(QFont("Arial",7*Const::fontFACTOR,-1,true)); + //painter->setRenderHint(QPainter::Antialiasing); + painter->setFont(QFont("Arial", 6 * Const::FONT_FACTOR * m_band->ppm(), -1, true)); painter->setOpacity(1); QPen pen(Const::BAND_NAME_BORDER_COLOR); //pen.setWidth(2); painter->setBrush(Qt::yellow); painter->setPen(pen); - painter->drawRoundedRect(m_rect,8,8); + painter->drawRect(m_rect); painter->setOpacity(0.8); painter->setPen(Qt::black); painter->drawText(m_rect,Qt::AlignCenter,m_band->bandTitle()); @@ -1206,13 +1253,13 @@ QRectF BandNameLabel::boundingRect() const void BandNameLabel::updateLabel(const QString& bandName) { - QFont font("Arial",7*Const::fontFACTOR,-1,true); + QFont font("Arial", 6 * Const::FONT_FACTOR * m_band->ppm(), -1, true); QFontMetrics fontMetrics(font); prepareGeometryChange(); m_rect = QRectF( - m_band->pos().x()+10, + m_band->pos().x()+6, m_band->pos().y()-(fontMetrics.height()+10), - fontMetrics.width(bandName)+20,fontMetrics.height()+10 + fontMetrics.width(bandName)+40,fontMetrics.height()+10 ); update(); } diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index d093831..8c8a541 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -53,6 +53,7 @@ class BandDesignIntf; class BandMarker : public QGraphicsItem{ public: + friend BandDesignIntf; explicit BandMarker(BandDesignIntf* band, QGraphicsItem *parent=0); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); @@ -64,7 +65,6 @@ public: protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); - void hoverMoveEvent(QGraphicsSceneHoverEvent* event); void mouseMoveEvent(QGraphicsSceneMouseEvent* event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); @@ -73,6 +73,7 @@ private: QColor m_color; BandDesignIntf* m_band; QPointF m_oldBandPos; + bool m_isMoving; }; class BandNameLabel : public QGraphicsItem{ @@ -114,6 +115,8 @@ class BandDesignIntf : public ItemsContainerDesignInft Q_PROPERTY(BGMode backgroundMode READ backgroundMode WRITE setBackgroundModeProperty) Q_PROPERTY(int backgroundOpacity READ opacity WRITE setBackgroundOpacity) Q_PROPERTY(int shiftItems READ shiftItems WRITE setShiftItems) + Q_PROPERTY(int paddingTop READ paddingTop WRITE setPaddingTop) + Q_PROPERTY(int paddingBottom READ paddingBottom WRITE setPaddingBottom) friend class BandMarker; friend class BandNameLabel; friend class ReportRender; @@ -148,7 +151,7 @@ public: ~BandDesignIntf(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); - QRectF boundingRect() const; + //QRectF boundingRect() const; void translateBandsName(); virtual BandsType bandType() const; virtual QString bandTitle() const; @@ -214,7 +217,7 @@ public: BaseDesignIntf* cloneUpperPart(int height, QObject* owner=0, QGraphicsItem* parent=0); BaseDesignIntf* cloneBottomPart(int height, QObject *owner=0, QGraphicsItem *parent=0); void parentObjectLoadFinished(); - void objectLoadFinished(); + void finishLoading(); void emitBandRendered(BandDesignIntf *band); bool isSplittable() const {return m_splitable;} @@ -266,11 +269,18 @@ public: void setBackgroundOpacity(int value); int bootomSpace() const; void setBootomSpace(int bootomSpace); - void updateBandMarkerGeometry(); + void updateBandMarkerGeometry(QRectF geometry); int shiftItems() const; void setShiftItems(int shiftItems); bool isNeedUpdateSize(RenderPass) const; + void setPpm(int ppm); + int paddingTop() const; + void setPaddingTop(int paddingTop); + int paddingBottom() const; + void setPaddingBottom(int paddingBottom); + + QRectF boundingRect() const; signals: void bandRendered(BandDesignIntf* band); void preparedForRender(); @@ -334,6 +344,8 @@ private: int m_bottomSpace; QMap m_bookmarks; int m_shiftItems; + int m_paddingTop; + int m_paddingBottom; }; class DataBandDesignIntf : public BandDesignIntf{ diff --git a/limereport/lrbandsmanager.cpp b/limereport/lrbandsmanager.cpp index 25ba344..59b73cd 100644 --- a/limereport/lrbandsmanager.cpp +++ b/limereport/lrbandsmanager.cpp @@ -51,7 +51,7 @@ QStringList BandsManager::bandNames() <(LimeReport::DesignElementsFactory::instance().objectCreator(identity)(owner,parent)); } diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 5df12fd..35f90b1 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -85,7 +85,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_fillTransparentInDesignMode(true), m_unitType(Millimeters), m_itemGeometryLocked(false), - m_isChangingPos(false) + m_isChangingPos(false), + m_ppm(Const::STORAGE_MM_FACTOR) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -98,13 +99,15 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q QRectF BaseDesignIntf::boundingRect() const { - qreal halfpw = pen().widthF() / 2; - halfpw += 2; - return rect().adjusted(-halfpw, -halfpw, halfpw, halfpw); + //qreal halfpw = pen().widthF() / 2; + // halfpw += 2; + //return rect().adjusted(-halfpw, -halfpw, halfpw, halfpw); + return rect(); } BaseDesignIntf::~BaseDesignIntf(void) { - + if (m_selectionMarker) + delete m_selectionMarker; } void BaseDesignIntf::setParentReportItem(const QString &value) @@ -253,7 +256,7 @@ QString BaseDesignIntf::setItemPosY(qreal yValue) QFont BaseDesignIntf::transformToSceneFont(const QFont& value) const { QFont f = value; - f.setPixelSize(f.pointSize()*Const::fontFACTOR); + f.setPixelSize(f.pointSize() * Const::FONT_FACTOR * ppm()); return f; } @@ -287,7 +290,7 @@ void BaseDesignIntf::setupPainter(QPainter *painter) const if (!painter) { return; } - painter->setFont(m_font); + painter->setFont(transformToSceneFont(m_font)); painter->setPen(m_fontColor); } @@ -335,17 +338,17 @@ QSizeF BaseDesignIntf::size() const QSizeF BaseDesignIntf::sizeMM() const { - return QSizeF(width() / Const::mmFACTOR, height() / Const::mmFACTOR); + return QSizeF(width() / ppm(), height() / ppm()); } qreal BaseDesignIntf::widthMM() const { - return width() / Const::mmFACTOR; + return width() / ppm(); } qreal BaseDesignIntf::heightMM() const { - return height() / Const::mmFACTOR; + return height() / ppm(); } //void BaseDesignIntf::setUnitFactor(qreal unitFactor) @@ -356,8 +359,8 @@ qreal BaseDesignIntf::heightMM() const qreal BaseDesignIntf::unitFactor() const { if (m_unitType == Millimeters) - return Const::mmFACTOR; - else return Const::mmFACTOR * 2.54; + return ppm(); + else return ppm() * 2.54; } void BaseDesignIntf::setUnitType(BaseDesignIntf::UnitType value) @@ -374,7 +377,7 @@ BaseDesignIntf::UnitType BaseDesignIntf::unitType() QPointF BaseDesignIntf::posMM() const { - return QPointF(pos().x() / Const::mmFACTOR, pos().y() / Const::mmFACTOR); + return QPointF(pos().x() / ppm(), pos().y() / ppm()); } QRectF BaseDesignIntf::rect() const @@ -515,7 +518,7 @@ void BaseDesignIntf::hoverLeaveEvent(QGraphicsSceneHoverEvent *) update(); } -void BaseDesignIntf::hoverEnterEvent(QGraphicsSceneHoverEvent /**event*/) +void BaseDesignIntf::hoverEnterEvent(QGraphicsSceneHoverEvent* /*event*/) { m_hovered = true; update(); @@ -676,8 +679,8 @@ QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){ BaseDesignIntf* parent = dynamic_cast(parentItem()); PageItemDesignIntf* parentPage = dynamic_cast(parentItem()); if (parent){ - qreal leftBorder = parentPage ? parentPage->leftMargin() * Const::mmFACTOR : 0; - qreal rightBorder = parentPage ? parentPage->rightMargin() * Const::mmFACTOR : 0; + qreal leftBorder = parentPage ? parentPage->leftMargin() * ppm() : 0; + qreal rightBorder = parentPage ? parentPage->rightMargin() * ppm() : 0; qreal avaibleSpace = parent->width()-(leftBorder+rightBorder); switch(m_itemAlign){ @@ -718,8 +721,8 @@ void BaseDesignIntf::updateItemAlign(){ PageItemDesignIntf* parentPage = dynamic_cast(parentItem()); m_changingItemAlign = true; if (parent){ - qreal leftBorder = parentPage ? parentPage->leftMargin() * Const::mmFACTOR : 0; - qreal rightBorder = parentPage ? parentPage->rightMargin() * Const::mmFACTOR : 0; + qreal leftBorder = parentPage ? parentPage->leftMargin() * ppm() : 0; + qreal rightBorder = parentPage ? parentPage->rightMargin() * ppm() : 0; qreal aviableSpace = parent->width()-(leftBorder+rightBorder); setPos(modifyPosForAlignedItem(pos())); if (m_itemAlign == ParentWidthItemAlign) @@ -745,6 +748,19 @@ void BaseDesignIntf::updatePossibleDirectionFlags(){ } } +int BaseDesignIntf::ppm() const +{ + return m_ppm; +} + +void BaseDesignIntf::setPpm(int ppm) +{ + if (m_ppm != ppm){ + m_ppm = ppm; + update(); + } +} + bool BaseDesignIntf::isChangingPos() const { return m_isChangingPos; @@ -833,7 +849,7 @@ void BaseDesignIntf::updateSelectionMarker() if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); if (parentItem()) { m_selectionMarker->setRect(rect()); - m_selectionMarker->setPos(0,0); + m_selectionMarker->setPos(mapToItem(parentItem(), QPoint(0,0))); } } } @@ -841,11 +857,12 @@ void BaseDesignIntf::updateSelectionMarker() void BaseDesignIntf::turnOnSelectionMarker(bool value) { if (value && !m_selectionMarker){ - m_selectionMarker = new SelectionMarker(this, this); + m_selectionMarker = new SelectionMarker(this->parentItem(), this); m_selectionMarker->setColor(selectionMarkerColor()); updateSelectionMarker(); m_selectionMarker->setVisible(true); } else { + scene()->removeItem(m_selectionMarker); delete m_selectionMarker; m_selectionMarker = 0; } @@ -1079,9 +1096,9 @@ void BaseDesignIntf::setGeometry(QRectF rect) m_bottomRect = QRectF(0-resizeHandleSize(), height() - resizeHandleSize(), width()+resizeHandleSize()*2, resizeHandleSize()*2); m_leftRect = QRectF(0-resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); m_rightRect = QRectF(width() - resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); - m_boundingRect = QRectF(); + //m_boundingRect = QRectF(); updateSelectionMarker(); - if (!isLoading()){ + if (!isLoading() && !isPpmChanging()){ geometryChangedEvent(geometry(), m_oldGeometry); emit geometryChanged(this, geometry(), m_oldGeometry); } @@ -1168,7 +1185,8 @@ QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, co if (change == QGraphicsItem::ItemPositionHasChanged) { updateSelectionMarker(); - emit geometryChanged(this, geometry(), geometry()); + if (!isLoading() && !isPpmChanging()) + emit geometryChanged(this, geometry(), geometry()); } if (change == QGraphicsItem::ItemSelectedChange) { @@ -1530,19 +1548,19 @@ BaseDesignIntf *BaseDesignIntf::cloneItemWOChild(ItemMode mode, QObject *owner, BaseDesignIntf *clone = createSameTypeItem(owner, parent); clone->setObjectName(this->objectName()); clone->setItemMode(mode); - clone->objectLoadStarted(); + clone->startLoading(); clone->setReportSettings(this->reportSettings()); for (int i = 0; i < clone->metaObject()->propertyCount(); i++) { if (clone->metaObject()->property(i).isWritable()) clone->setProperty(clone->metaObject()->property(i).name(), property(clone->metaObject()->property(i).name())); } - clone->objectLoadFinished(); + clone->finishLoading(); return clone; } void BaseDesignIntf::initFromItem(BaseDesignIntf *source) { - objectLoadStarted(); + startLoading(); for (int i = 0; i < metaObject()->propertyCount(); i++) { if (strcmp(metaObject()->property(i).name(),"objectName")!=0) if (source->property(metaObject()->property(i).name()).isValid()) { @@ -1550,7 +1568,7 @@ void BaseDesignIntf::initFromItem(BaseDesignIntf *source) setProperty(metaObject()->property(i).name(), source->property(metaObject()->property(i).name())); } } - objectLoadFinished(); + finishLoading(); } bool BaseDesignIntf::canBeSplitted(int height) const @@ -1569,19 +1587,41 @@ BaseDesignIntf *BaseDesignIntf::cloneEmpty(int height, QObject *owner, QGraphics {Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} -void BaseDesignIntf::objectLoadStarted() +void BaseDesignIntf::startLoading() { m_objectState = ObjectLoading; } -void BaseDesignIntf::objectLoadFinished() +void BaseDesignIntf::finishLoading() { m_objectState = ObjectLoaded; emit objectLoaded(this); } +void BaseDesignIntf::startSaving() +{ + m_objectState = ObjectSaving; +} + +void BaseDesignIntf::finishSaving() +{ + m_objectState = ObjectSaved; +} + +void BaseDesignIntf::startChangingPpm() +{ + m_objectState = ObjectPpmChanging; +} + +void BaseDesignIntf::finishChangingPpm() +{ + m_objectState = ObjectPpmChanged; +} + void BaseDesignIntf::parentObjectLoadFinished() -{} +{ + m_objectState = ObjectLoaded; +} QList BaseDesignIntf::childBaseItems() const { @@ -1683,9 +1723,9 @@ QRectF Marker::boundingRect() const void Marker::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*) { QPen pen; - const int markerSize = 5; + const int markerSize = 3; pen.setColor(color()); - pen.setWidth(2); + pen.setWidth(1); pen.setStyle(Qt::DotLine); painter->setPen(pen); painter->setOpacity(Const::SELECTION_COLOR_OPACITY); @@ -1750,7 +1790,6 @@ void SelectionMarker::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) void SelectionMarker::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - qDebug() << "mouse move"; if (owner()) owner()->mouseMoveEvent(event); } diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 07d4ed8..d5b3cd1 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -81,7 +81,9 @@ class DataSourceManager; class ReportRender; class BaseDesignIntf : - public QObject, public QGraphicsItem, public ICollectionContainer, public ObjectLoadingStateIntf { + public QObject, public QGraphicsItem, public ICollectionContainer, + public ObjectLoadingStateIntf, public ObjectSavingStateIntf +{ Q_OBJECT Q_INTERFACES(QGraphicsItem) Q_FLAGS(BorderLines) @@ -99,49 +101,65 @@ class BaseDesignIntf : public: enum BGMode { TransparentMode, OpaqueMode}; + enum BrushStyle{ + NoBrush, + SolidPattern, + Dense1Pattern, + Dense2Pattern, + Dense3Pattern, + Dense4Pattern, + Dense5Pattern, + Dense6Pattern, + Dense7Pattern, + HorPattern, + VerPattern, + CrossPattern, + BDiagPattern, + FDiagPattern + }; - enum BrushStyle{ NoBrush, - SolidPattern, - Dense1Pattern, - Dense2Pattern, - Dense3Pattern, - Dense4Pattern, - Dense5Pattern, - Dense6Pattern, - Dense7Pattern, - HorPattern, - VerPattern, - CrossPattern, - BDiagPattern, - FDiagPattern }; + enum ResizeFlags { + Fixed = 0, + ResizeLeft = 1, + ResizeRight = 2, + ResizeTop = 4, + ResizeBottom = 8, + AllDirections = 15 + }; - - enum ResizeFlags { Fixed = 0, - ResizeLeft = 1, - ResizeRight = 2, - ResizeTop = 4, - ResizeBottom = 8, - AllDirections = 15 - }; - - enum MoveFlags { None = 0, - LeftRight=1, - TopBotom=2, - All=3 - }; + enum MoveFlags { + None = 0, + LeftRight=1, + TopBotom=2, + All=3 + }; enum BorderSide { - NoLine = 0, - TopLine = 1, - BottomLine = 2, - LeftLine = 4, - RightLine = 8, - AllLines = 15 - }; + NoLine = 0, + TopLine = 1, + BottomLine = 2, + LeftLine = 4, + RightLine = 8, + AllLines = 15 + }; - enum ObjectState {ObjectLoading, ObjectLoaded, ObjectCreated}; + enum ObjectState { + ObjectLoading, + ObjectLoaded, + ObjectCreated, + ObjectSaving, + ObjectSaved, + ObjectPpmChanging, + ObjectPpmChanged + }; - enum ItemAlign {LeftItemAlign,RightItemAlign,CenterItemAlign,ParentWidthItemAlign,DesignedItemAlign}; + enum ItemAlign { + LeftItemAlign, + RightItemAlign, + CenterItemAlign, + ParentWidthItemAlign, + DesignedItemAlign + }; enum UnitType {Millimeters, Inches}; #if (QT_VERSION >= QT_VERSION_CHECK(5,5, 0)) @@ -258,10 +276,19 @@ public: virtual BaseDesignIntf* cloneBottomPart(int height, QObject* owner=0, QGraphicsItem* parent=0); virtual BaseDesignIntf* cloneEmpty(int height, QObject* owner=0, QGraphicsItem* parent=0); - bool isLoaded(){return m_objectState==ObjectLoaded;} - bool isLoading(){return m_objectState==ObjectLoading;} - void objectLoadStarted(); - void objectLoadFinished(); + bool isLoaded(){return m_objectState == ObjectLoaded;} + bool isLoading(){return m_objectState == ObjectLoading;} + bool isSaving(){return m_objectState == ObjectSaving;} + bool isSaved(){return m_objectState == ObjectSaved;} + bool isPpmChanging() {return m_objectState == ObjectPpmChanging;} + + void startLoading(); + void finishLoading(); + void startSaving(); + void finishSaving(); + void startChangingPpm(); + void finishChangingPpm(); + virtual void parentObjectLoadFinished(); virtual void beforeDelete(); @@ -334,6 +361,9 @@ public: bool isChangingPos() const; void setIsChangingPos(bool isChangingPos); + int ppm() const; + virtual void setPpm(int ppm); + protected: //ICollectionContainer @@ -346,7 +376,7 @@ protected: void mousePressEvent(QGraphicsSceneMouseEvent* event); void hoverMoveEvent(QGraphicsSceneHoverEvent* event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - void hoverEnterEvent(QGraphicsSceneHoverEvent); + void hoverEnterEvent(QGraphicsSceneHoverEvent* ); void mouseMoveEvent(QGraphicsSceneMouseEvent* event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); @@ -423,7 +453,7 @@ private: int m_borderLineSize; QRectF m_rect; - mutable QRectF m_boundingRect; + //mutable QRectF m_boundingRect; QRectF m_oldGeometry; BGMode m_BGMode; @@ -464,6 +494,7 @@ private: UnitType m_unitType; bool m_itemGeometryLocked; bool m_isChangingPos; + int m_ppm; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrfactoryinitializer.cpp b/limereport/lrfactoryinitializer.cpp index fef87c2..76acdd0 100644 --- a/limereport/lrfactoryinitializer.cpp +++ b/limereport/lrfactoryinitializer.cpp @@ -160,7 +160,7 @@ void initReportItems(){ DesignElementsFactory::instance().registerCreator( "HLayout", - LimeReport::ItemAttribs(QObject::tr("HLayout"), LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("HLayout"), LimeReport::Const::BAND_TAG), createHLayout ); DesignElementsFactory::instance().registerCreator( @@ -183,58 +183,58 @@ void initReportItems(){ ); DesignElementsFactory::instance().registerCreator( "Data", - LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::Const::BAND_TAG), createDataBand ); DesignElementsFactory::instance().registerCreator( "DataHeader", - LimeReport::ItemAttribs(QObject::tr("DataHeader"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("DataHeader"),LimeReport::Const::BAND_TAG), createHeaderDataBand ); DesignElementsFactory::instance().registerCreator( "DataFooter", - LimeReport::ItemAttribs(QObject::tr("DataFooter"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("DataFooter"),LimeReport::Const::BAND_TAG), createFooterDataBand ); DesignElementsFactory::instance().registerCreator( "GroupHeader", - LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::Const::BAND_TAG), createGroupHeaderBand ); DesignElementsFactory::instance().registerCreator( "GroupFooter", - LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::Const::BAND_TAG), createGroupFooterBand ); DesignElementsFactory::instance().registerCreator( "PageFooter", - LimeReport::ItemAttribs(QObject::tr("Page Footer"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Page Footer"),LimeReport::Const::BAND_TAG), createPageFooterBand ); DesignElementsFactory::instance().registerCreator( "PageHeader", - LimeReport::ItemAttribs(QObject::tr("Page Header"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Page Header"),LimeReport::Const::BAND_TAG), createPageHeaderBand ); DesignElementsFactory::instance().registerCreator( "SubDetail", - LimeReport::ItemAttribs(QObject::tr("SubDetail"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("SubDetail"),LimeReport::Const::BAND_TAG), createSubDetailBand ); DesignElementsFactory::instance().registerCreator( "SubDetailHeader", - LimeReport::ItemAttribs(QObject::tr("SubDetailHeader"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("SubDetailHeader"),LimeReport::Const::BAND_TAG), createSubDetailHeaderBand ); DesignElementsFactory::instance().registerCreator( "SubDetailFooter", - LimeReport::ItemAttribs(QObject::tr("SubDetailFooter"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("SubDetailFooter"),LimeReport::Const::BAND_TAG), createSubDetailFooterBand ); DesignElementsFactory::instance().registerCreator( "TearOffBand", - LimeReport::ItemAttribs(QObject::tr("Tear-off Band"),LimeReport::Const::bandTAG), + LimeReport::ItemAttribs(QObject::tr("Tear-off Band"),LimeReport::Const::BAND_TAG), createTearOffBand ); diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 8a312d8..5897f53 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -59,22 +59,29 @@ namespace Const{ int const DEFAULT_GRID_STEP = 1; int const RESIZE_HANDLE_SIZE = 5; int const SELECTION_PEN_SIZE = 1; - int const MINIMUM_ITEM_WIDTH = 2*RESIZE_HANDLE_SIZE; - int const MINIMUM_ITEM_HEIGHT = 2*RESIZE_HANDLE_SIZE; + int const MINIMUM_ITEM_WIDTH = 2 * RESIZE_HANDLE_SIZE; + int const MINIMUM_ITEM_HEIGHT = 2 * RESIZE_HANDLE_SIZE; double const RESIZE_ZONE_OPACITY = 0.5; double const SELECTED_RESIZE_ZONE_OPACITY = 0.6; Qt::GlobalColor const RESIZE_ZONE_COLOR = Qt::green; Qt::GlobalColor const SELECTION_COLOR = Qt::red; Qt::GlobalColor const JOIN_COLOR = Qt::blue; double const SELECTION_COLOR_OPACITY = 0.6; - const qreal fontFACTOR = 3.5; - const int mmFACTOR = 10; - const int itemPaleteIconSize = 24; - const qreal minSpaceBorder = 10; - const QString bandTAG = "band"; + const qreal FONT_FACTOR = 0.33; + const int STORAGE_MM_FACTOR = 10; + const int DESIGNER_MM_FACTOR = 5; + const int OLD_MM_FACTOR = 10; + const int DEFAULT_ITEM_WIDTH = 20; + const int DEFAULT_ITEM_HEIGHT = 5; + const int DEFAULT_BAND_HEIGHT = 10; + const int PPM_PERCENT_STEP = 20; + const int ITEM_PALETTE_ICON_SIZE = 24; + const qreal MIN_SPACE_BORDER = 10; + const QString BAND_TAG = "band"; const Qt::GlobalColor BAND_NAME_LABEL_COLOR = Qt::yellow; - const Qt::GlobalColor BAND_NAME_BORDER_COLOR = Qt::darkYellow; - const qreal BAND_MARKER_OPACITY = 1; + const Qt::GlobalColor BAND_NAME_BORDER_COLOR = Qt::darkGray; + const qreal BAND_MARKER_SELECTED_OPACITY = 1; + const qreal BAND_MARKER_OPACITY = 0.3; const qreal LAYOUT_MARKER_OPACITY = 0.3; const qreal BAND_NAME_AREA_OPACITY = 0.3; const qreal BAND_NAME_TEXT_OPACITY = 0.6; diff --git a/limereport/lrgraphicsviewzoom.cpp b/limereport/lrgraphicsviewzoom.cpp index 89ae87e..f6942fa 100644 --- a/limereport/lrgraphicsviewzoom.cpp +++ b/limereport/lrgraphicsviewzoom.cpp @@ -3,6 +3,8 @@ #include #include +#include "lrpagedesignintf.h" + namespace LimeReport{ GraphicsViewZoomer::GraphicsViewZoomer(QGraphicsView* view) @@ -15,7 +17,13 @@ GraphicsViewZoomer::GraphicsViewZoomer(QGraphicsView* view) } void GraphicsViewZoomer::gentleZoom(double factor) { - m_view->scale(factor, factor); + PageDesignIntf* page = dynamic_cast(m_view->scene()); + if (page){ + if(factor > 1) + page->pageItem()->zoomIn(); + else + page->pageItem()->zoomOut(); + } m_view->centerOn(m_targetScenePos); QPointF delta_viewport_pos = m_targetViewportPos - QPointF(m_view->viewport()->width() / 2.0, m_view->viewport()->height() / 2.0); @@ -25,7 +33,7 @@ void GraphicsViewZoomer::gentleZoom(double factor) { } void GraphicsViewZoomer::setModifiers(Qt::KeyboardModifiers modifiers) { - m_modifiers = modifiers; + m_modifiers = modifiers; } void GraphicsViewZoomer::setZoomFactorBase(double value) { diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index b767128..a5657b7 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -239,11 +239,16 @@ void PageDesignIntf::startInsertMode(const QString &ItemType) emit insertModeStarted(); m_insertMode = true; m_insertItemType = ItemType; - m_itemInsertRect = this->addRect(0, 0, 200, 50); - m_itemInsertRect->setVisible(false); + PageItemDesignIntf* page = pageItem() ? pageItem() : getCurrentPage(); - if (page) + if (page){ + m_itemInsertRect = this->addRect(0, 0, + Const::DEFAULT_ITEM_WIDTH * page->ppm(), + Const::DEFAULT_ITEM_HEIGHT * page->ppm() + ); + m_itemInsertRect->setVisible(false); m_itemInsertRect->setParentItem(page); + } } void PageDesignIntf::startEditMode() @@ -268,10 +273,10 @@ void PageDesignIntf::setPageItem(PageItemDesignIntf::Ptr pageItem) } m_pageItem = pageItem; m_pageItem->setItemMode(itemMode()); - setSceneRect(pageItem->rect().adjusted(-10 * Const::mmFACTOR, - -10 * Const::mmFACTOR, - 10 * Const::mmFACTOR, - 10 * Const::mmFACTOR)); + setSceneRect(pageItem->rect().adjusted(-10 * pageItem->ppm(), + -10 * pageItem->ppm(), + 10 * pageItem->ppm(), + 10 * pageItem->ppm())); addItem(m_pageItem.data()); registerItem(m_pageItem.data()); } @@ -295,10 +300,11 @@ void PageDesignIntf::setPageItems(QList pages) curHeight+=pageItem->height()+20; if (curWidthwidth()) curWidth=pageItem->width(); } - setSceneRect(QRectF( 0, 0, curWidth,curHeight).adjusted( -10 * Const::mmFACTOR, - -10 * Const::mmFACTOR, - 10 * Const::mmFACTOR, - 10 * Const::mmFACTOR)); + if (!pages.isEmpty()) + setSceneRect(QRectF( 0, 0, curWidth,curHeight).adjusted( -10 * pages.at(0)->ppm(), + -10 * pages.at(0)->ppm(), + 10 * pages.at(0)->ppm(), + 10 * pages.at(0)->ppm())); if (m_reportPages.count()>0) m_currentPage = m_reportPages.at(0).data(); @@ -314,9 +320,19 @@ void PageDesignIntf::removePageItem(PageItemDesignIntf::Ptr pageItem) void PageDesignIntf::mousePressEvent(QGraphicsSceneMouseEvent *event) { - if (m_insertMode) { + if (m_insertMode && pageItem()) { finalizeInsertMode(); - CommandIf::Ptr command = InsertItemCommand::create(this, m_insertItemType, event->scenePos(), QSize(200, 50)); + CommandIf::Ptr command = InsertItemCommand::create( + this, m_insertItemType, + QPointF( + (event->scenePos().x()/pageItem()->ppm())*Const::STORAGE_MM_FACTOR, + (event->scenePos().y()/pageItem()->ppm())*Const::STORAGE_MM_FACTOR + ), + QSize( + Const::DEFAULT_ITEM_WIDTH * Const::STORAGE_MM_FACTOR, + Const::DEFAULT_ITEM_HEIGHT * Const::STORAGE_MM_FACTOR + ) + ); saveCommand(command); emit itemInserted(this, event->scenePos(), m_insertItemType); } @@ -470,6 +486,8 @@ BaseDesignIntf *PageDesignIntf::internalAddBand(T bandType) band->setObjectName(genObjectName(*band)); band->setItemTypeName("Band"); + band->setHeight((band->height()/Const::STORAGE_MM_FACTOR)*pageItem()->ppm()); + band->setPpm(pageItem()->ppm()); BandDesignIntf* pb = 0; if (selectedItems().count() > 0) { @@ -721,12 +739,12 @@ bool PageDesignIntf::isLoading() return m_isLoading; } -void PageDesignIntf::objectLoadStarted() +void PageDesignIntf::startLoading() { m_isLoading=true; } -void PageDesignIntf::objectLoadFinished() +void PageDesignIntf::finishLoading() { m_isLoading=false; } @@ -767,7 +785,8 @@ void PageDesignIntf::dropEvent(QGraphicsSceneDragDropEvent* event) (event->mimeData()->text().indexOf("variable:")==0)) ){ bool isVar = event->mimeData()->text().indexOf("variable:")==0; - BaseDesignIntf* item = addReportItem("TextItem",event->scenePos(),QSize(250, 50)); + BaseDesignIntf* item = addReportItem("TextItem",event->scenePos(),QSize(25 * Const::DESIGNER_MM_FACTOR, 5 * Const::DESIGNER_MM_FACTOR)); + item->setPpm(pageItem()->ppm()); TextItem* ti = dynamic_cast(item); QString data = event->mimeData()->text().remove(0,event->mimeData()->text().indexOf(":")+1); if (isVar) data = data.remove(QRegExp(" \\[.*\\]")); @@ -1109,6 +1128,30 @@ void PageDesignIntf::setCurrentPage(PageItemDesignIntf* currentPage) } } +void PageDesignIntf::setPpm(int ppm) +{ + int curHeight = 0; + int curWidth = 0; + + foreach(PageItemDesignIntf::Ptr page, m_reportPages){ + page->setPpm(ppm); + curHeight += page->height()+ 2 * ppm; + if (curWidth < page->width()) curWidth = page->width(); + + } + + if (!m_reportPages.isEmpty()) + setSceneRect( + QRectF( 0, 0, curWidth,curHeight) + .adjusted( + -10 * ppm, + -10 * ppm, + 10 * ppm, + 10 * ppm + ) + ); +} + ReportSettings *PageDesignIntf::getReportSettings() const { return m_reportSettings; @@ -1931,7 +1974,9 @@ CommandIf::Ptr InsertItemCommand::create(PageDesignIntf *page, const QString &it bool InsertItemCommand::doIt() { - BaseDesignIntf *item = page()->addReportItem(m_itemType, m_pos, m_size); + QRectF rect = page()->pageItem()->transformFromStorageToScenePpm(QRectF(m_pos,m_size)); + BaseDesignIntf *item = page()->addReportItem(m_itemType, QPoint(rect.x(),rect.y()), rect.size()); + item->setPpm(page()->pageItem()->ppm()); if (item) m_itemName = item->objectName(); return item != 0; } @@ -1942,21 +1987,16 @@ void InsertItemCommand::undoIt() if (item){ page()->removeReportItem(item,false); } -// page()->removeItem(item); -// delete item; } CommandIf::Ptr DeleteItemCommand::create(PageDesignIntf *page, BaseDesignIntf *item) { DeleteItemCommand *command = new DeleteItemCommand(); - //QScopedPointer writer(new XMLWriter()); - //writer->putItem(item); command->setPage(page); command->setItem(item); LayoutDesignIntf* layout = dynamic_cast(item->parent()); if (layout) command->m_layoutName = layout->objectName(); - //command->m_itemXML = writer->saveToString(); return CommandIf::Ptr(command); } diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 1256c7a..3c6fe9d 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -179,7 +179,7 @@ namespace LimeReport { PageItemDesignIntf* getCurrentPage() const; void setCurrentPage(PageItemDesignIntf* currentPage); - + void setPpm(int ppm); protected: virtual void keyPressEvent(QKeyEvent *event); @@ -199,8 +199,8 @@ namespace LimeReport { bool isExistsObjectName (const QString& objectName, QList &itemsList) const; bool isLoading(); - void objectLoadStarted(); - void objectLoadFinished(); + void startLoading(); + void finishLoading(); HorizontalLayout* internalAddHLayout(); VerticalLayout* internalAddVLayout(); diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 42a1b71..84dd06c 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -350,6 +350,46 @@ void PageItemDesignIntf::setPrintBehavior(const PrintBehavior &printBehavior) m_printBehavior = printBehavior; } +QRectF PageItemDesignIntf::transformFromStorageToScenePpm(const QRectF &rect) +{ + return changeRectPpm(rect, Const::STORAGE_MM_FACTOR, ppm()); +} + +void PageItemDesignIntf::zoomIn() +{ + setPpm(ppm()+1); +} + +void PageItemDesignIntf::zoomOut() +{ + if (ppm() > 1) + setPpm(ppm()-1); +} + +void PageItemDesignIntf::setPpm(int ppm) +{ + if (this->ppm() != ppm){ + startChangingPpm(); + QRectF rect = changeRectPpm(QRectF(this->pos(), this->size()), this->ppm(), ppm); + setPos(rect.topLeft()); + setSize(rect.size()); + foreach(QGraphicsItem * item, allChildBaseItems()) { + BaseDesignIntf *ri = dynamic_cast(item); + if (ri) { + rect = changeRectPpm(QRectF(ri->pos(), ri->size()), ri->ppm(), ppm); + ri->startChangingPpm(); + ri->setPos(rect.topLeft()); + ri->setSize(rect.size()); + ri->setPpm(ppm); + ri->finishChangingPpm(); + } + } + BaseDesignIntf::setPpm(ppm); + updateMarginRect(); + finishChangingPpm(); + } +} + PageItemDesignIntf::PrintBehavior PageItemDesignIntf::printBehavior() const { return m_printBehavior; @@ -682,8 +722,8 @@ QSizeF PageItemDesignIntf::getRectByPageSize(const PageSize& size) printer.setOutputFormat(QPrinter::PdfFormat); printer.setOrientation((QPrinter::Orientation)pageOrientation()); printer.setPaperSize((QPrinter::PageSize)size); - return QSizeF(printer.paperSize(QPrinter::Millimeter).width() * 10, - printer.paperSize(QPrinter::Millimeter).height() * 10); + return QSizeF(printer.paperSize(QPrinter::Millimeter).width() * ppm(), + printer.paperSize(QPrinter::Millimeter).height() * ppm()); } else { @@ -913,6 +953,8 @@ void PageItemDesignIntf::bandPositionChanged(QObject* object, QPointF newPos, QP void PageItemDesignIntf::bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry) { bandPositionChanged(object, newGeometry.topLeft(), oldGeometry.topLeft()); + if (newGeometry.size() != oldGeometry.size()) + relocateBands(); } void PageItemDesignIntf::setUnitTypeProperty(BaseDesignIntf::UnitType value) @@ -927,6 +969,16 @@ void PageItemDesignIntf::setUnitTypeProperty(BaseDesignIntf::UnitType value) } } +QRectF PageItemDesignIntf::changeRectPpm(const QRectF &rect, int oldPpm, int newPpm) +{ + return QRectF( + (rect.x()/oldPpm)*newPpm, + (rect.y()/oldPpm)*newPpm, + (rect.width()/oldPpm)*newPpm, + (rect.height()/oldPpm)*newPpm + ); +} + void PageItemDesignIntf::collectionLoadFinished(const QString &collectionName) { if (collectionName.compare("children",Qt::CaseInsensitive)==0){ @@ -948,10 +1000,10 @@ void PageItemDesignIntf::collectionLoadFinished(const QString &collectionName) void PageItemDesignIntf::updateMarginRect() { m_pageRect = rect(); - m_pageRect.adjust( leftMargin() * Const::mmFACTOR, - topMargin() * Const::mmFACTOR, - -rightMargin() * Const::mmFACTOR, - -bottomMargin() * Const::mmFACTOR + m_pageRect.adjust( leftMargin() * ppm(), + topMargin() * ppm(), + -rightMargin() * ppm(), + -bottomMargin() * ppm() ); foreach(BandDesignIntf* band,m_bands){ @@ -972,26 +1024,26 @@ void PageItemDesignIntf::paintGrid(QPainter *ppainter, QRectF rect) ppainter->setPen(QPen(gridColor())); ppainter->setOpacity(0.5); for (int i = 0; i <= (rect.height() - 5 * unitFactor()) / (10 * unitFactor()); ++i){ - if (i * 10 * unitFactor() + 5 * unitFactor() >= topMargin() * Const::mmFACTOR) - ppainter->drawLine(rect.x(), (i * 10 * unitFactor()) + ( (rect.y() + 5 * unitFactor()) - (topMargin() * Const::mmFACTOR)), - rect.right(), i * 10 * unitFactor() +( (rect.y() + 5 * unitFactor()) - (topMargin() * Const::mmFACTOR))); + if (i * 10 * unitFactor() + 5 * unitFactor() >= topMargin() * ppm()) + ppainter->drawLine(rect.x(), (i * 10 * unitFactor()) + ( (rect.y() + 5 * unitFactor()) - (topMargin() * ppm())), + rect.right(), i * 10 * unitFactor() +( (rect.y() + 5 * unitFactor()) - (topMargin() * ppm()))); }; for (int i=0; i<=((rect.width() - 5 * unitFactor()) / (10 * unitFactor())); ++i){ - if (i * 10 * unitFactor() + 5 * unitFactor() >= leftMargin() * Const::mmFACTOR) - ppainter->drawLine(i * 10 * unitFactor() + ((rect.x() + 5 * unitFactor()) - (leftMargin() * Const::mmFACTOR)), rect.y(), - i * 10 * unitFactor() + ((rect.x() + 5 * unitFactor()) - (leftMargin() * Const::mmFACTOR)), rect.bottom()); + if (i * 10 * unitFactor() + 5 * unitFactor() >= leftMargin() * ppm()) + ppainter->drawLine(i * 10 * unitFactor() + ((rect.x() + 5 * unitFactor()) - (leftMargin() * ppm())), rect.y(), + i * 10 * unitFactor() + ((rect.x() + 5 * unitFactor()) - (leftMargin() * ppm())), rect.bottom()); }; ppainter->setPen(QPen(gridColor())); ppainter->setOpacity(1); for (int i = 0; i <= (rect.width() / (10 * unitFactor())); ++i){ - if (i * 10 * unitFactor() >= leftMargin() * Const::mmFACTOR) - ppainter->drawLine(i * 10 * unitFactor() + (rect.x() - (leftMargin() * Const::mmFACTOR)), rect.y(), - i * 10 * unitFactor() + (rect.x() - (leftMargin() * Const::mmFACTOR)), rect.bottom()); + if (i * 10 * unitFactor() >= leftMargin() * ppm()) + ppainter->drawLine(i * 10 * unitFactor() + (rect.x() - (leftMargin() * ppm())), rect.y(), + i * 10 * unitFactor() + (rect.x() - (leftMargin() * ppm())), rect.bottom()); }; for (int i = 0; i <= rect.height() / (10 * unitFactor()); ++i){ - if (i * 10 * unitFactor() >= topMargin() * Const::mmFACTOR) - ppainter->drawLine(rect.x(), i * 10 * unitFactor() + (rect.y() - (topMargin() * Const::mmFACTOR)), - rect.right(), i * 10 * unitFactor() + (rect.y() - (topMargin() * Const::mmFACTOR))); + if (i * 10 * unitFactor() >= topMargin() * ppm()) + ppainter->drawLine(rect.x(), i * 10 * unitFactor() + (rect.y() - (topMargin() * ppm())), + rect.right(), i * 10 * unitFactor() + (rect.y() - (topMargin() * ppm()))); }; ppainter->drawRect(rect); ppainter->restore(); @@ -1016,9 +1068,9 @@ int PageItemDesignIntf::gridStep() else return Const::DEFAULT_GRID_STEP; } -void PageItemDesignIntf::objectLoadFinished() +void PageItemDesignIntf::finishLoading() { - BaseDesignIntf::objectLoadFinished(); + BaseDesignIntf::finishLoading(); updateMarginRect(); } diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 3d968d1..d9db8a9 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -136,7 +136,7 @@ public: QList& bands(); void setGridStep(int value); int gridStep(); - void objectLoadFinished(); + void finishLoading(); bool fullPage() const; void setFullPage(bool fullPage); @@ -177,6 +177,10 @@ public: PrintBehavior printBehavior() const; void setPrintBehavior(const PrintBehavior &printBehavior); + void setPpm(int ppm); + QRectF transformFromStorageToScenePpm(const QRectF& rect); + void zoomIn(); + void zoomOut(); signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -186,6 +190,7 @@ protected slots: void bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void setUnitTypeProperty(BaseDesignIntf::UnitType value); protected: + QRectF changeRectPpm(const QRectF& rect, int oldPpm, int newPpm); void collectionLoadFinished(const QString& collectionName); QRectF& pageRect(){return m_pageRect;} void updateMarginRect(); diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index f37f829..37bd96f 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -160,14 +160,14 @@ void PreviewReportWidget::setErrorsMesagesVisible(bool visible) void PreviewReportWidget::zoomIn() { - d_ptr->m_scalePercent = (d_ptr->m_scalePercent / 10) * 10 + 10; + d_ptr->m_scalePercent = (d_ptr->m_scalePercent / 20) * 20 + Const::PPM_PERCENT_STEP; setScalePercent(d_ptr->m_scalePercent); } void PreviewReportWidget::zoomOut() { - if (d_ptr->m_scalePercent>0) - d_ptr->m_scalePercent = (d_ptr->m_scalePercent / 10) * 10 - 10; + if (d_ptr->m_scalePercent > 20) + d_ptr->m_scalePercent = (d_ptr->m_scalePercent / 20) * 20 - Const::PPM_PERCENT_STEP; setScalePercent(d_ptr->m_scalePercent); } @@ -311,8 +311,21 @@ void PreviewReportWidget::setScalePercent(int percent) { ui->graphicsView->resetMatrix(); d_ptr->m_scalePercent = percent; - qreal scaleSize = percent/100.0; - ui->graphicsView->scale(scaleSize, scaleSize); + + PageDesignIntf* page = dynamic_cast(ui->graphicsView->scene()); + if ((percent % Const::PPM_PERCENT_STEP) == 0){ + if (page){ + ui->graphicsView->scale(1,1); + page->setPpm(percent / Const::PPM_PERCENT_STEP); + } + } else { + if (page){ + page->setPpm(Const::DESIGNER_MM_FACTOR); + } + qreal scaleSize = percent/100.0; + ui->graphicsView->scale(scaleSize, scaleSize); + } + emit scalePercentChanged(percent); if (percent == 100){ m_scaleType = OneToOne; diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h index d7dc719..42b830e 100644 --- a/limereport/lrpreviewreportwidget_p.h +++ b/limereport/lrpreviewreportwidget_p.h @@ -14,7 +14,7 @@ class PreviewReportWidgetPrivate public: PreviewReportWidgetPrivate(PreviewReportWidget* previewReportWidget): m_previewPage(NULL), m_report(NULL), m_zoomer(NULL), - m_currentPage(1), m_changingPage(false), m_priorScrolValue(0), m_scalePercent(50), + m_currentPage(1), m_changingPage(false), m_priorScrolValue(0), m_scalePercent(100), q_ptr(previewReportWidget), m_previePageColor(Qt::white) {} bool pageIsVisible(); QRectF calcPageShift(); diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 6517b78..1257fc3 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -420,7 +420,7 @@ ItemsReaderIntf *PreviewReportWindow::reader() void PreviewReportWindow::initPercentCombobox() { - for (int i = 10; i<310; i+=10){ + for (int i = 20; i<320; i+=20){ m_scalePercent->addItem(QString("%1%").arg(i)); } m_scalePercent->setCurrentIndex(4); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index acd6298..3ad0dee 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -293,7 +293,7 @@ PageView* ReportDesignWidget::createPageView(PageDesignIntf* page){ view->setFrameShape(QFrame::NoFrame); view->setScene(page); view->setPageItem(page->pageItem()); - view->scale(0.5, 0.5); + page->pageItem()->setPpm(5); view->centerOn(0, 0); return view; } @@ -513,12 +513,6 @@ bool ReportDesignWidget::save() bool ReportDesignWidget::loadFromFile(const QString &fileName) { if (m_report->loadFromFile(fileName,false)){ -// QByteArray editorState = m_scriptEditor->saveState(); -// createTabs(); -// m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); -// m_scriptEditor->restoreState(editorState); -// emit loaded(); -// m_dialogChanged = false; return true; } else { QMessageBox::critical(this,tr("Error"),tr("Wrong file format")); @@ -526,10 +520,22 @@ bool ReportDesignWidget::loadFromFile(const QString &fileName) } } -void ReportDesignWidget::scale(qreal sx, qreal sy) +void ReportDesignWidget::zoomIn() { - //m_view->scale(sx,sy); - if (activeView()) activeView()->scale(sx,sy); + if (activeView()) { + PageDesignIntf* page = dynamic_cast(activeView()->scene()); + if (page) + page->pageItem()->zoomIn(); + } +} + +void ReportDesignWidget::zoomOut() +{ + if (activeView()) { + PageDesignIntf* page = dynamic_cast(activeView()->scene()); + if (page) + page->pageItem()->zoomOut(); + } } QString ReportDesignWidget::reportFileName() @@ -1058,8 +1064,10 @@ bool ReportDesignWidget::eventFilter(QObject *target, QEvent *event) if (event->type() == QEvent::Wheel){ QWheelEvent* we = dynamic_cast(event); if (QApplication::keyboardModifiers()==Qt::ControlModifier){ - if(we->delta()<0) scale(1.2,1.2); - else scale(1/1.2,1/1.2); + //if(we->delta()<0) scale(1.2,1.2); + //else scale(1/1.2,1/1.2); + if (we->delta() < 0) zoomIn(); + else zoomOut(); } } return QWidget::eventFilter(target,event); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index ef3b81b..50565ec 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -144,7 +144,10 @@ public: QGraphicsView* activeView(); QList selectedItems(); QStringList datasourcesNames(); - void scale( qreal sx, qreal sy); + //void scale( qreal sx, qreal sy); + void zoomIn(); + void zoomOut(); + ReportEnginePrivateInterface* report(){return m_report;} QString reportFileName(); bool isNeedToSave(); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index d863ee9..433e9ed 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -1189,12 +1189,12 @@ void ReportDesignWindow::slotLoadReport() void ReportDesignWindow::slotZoomIn() { - m_reportDesignWidget->scale(1.2,1.2); + m_reportDesignWidget->zoomIn(); } void ReportDesignWindow::slotZoomOut() { - m_reportDesignWidget->scale(1/1.2,1/1.2); + m_reportDesignWidget->zoomOut(); } void ReportDesignWindow::slotEditMode() diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 52aba2c..1e4ef03 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -687,6 +687,7 @@ bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName) reader->setPassPhrase(m_passPhrase); if (reader->first()){ if (reader->readItem(this)){ + m_fileName=fileName; QFileInfo fi(fileName); m_reportName = fi.fileName(); @@ -706,6 +707,7 @@ bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName) EASY_BLOCK("Connect auto connections") dataManager()->connectAutoConnections(); EASY_END_BLOCK; + dropChanges(); if ( hasActivePreview() ) @@ -1240,7 +1242,7 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai BaseDesignIntf* ReportEnginePrivate::createWatermark(PageDesignIntf* page, WatermarkSetting watermarkSetting) { - WatermarkHelper watermarkHelper(watermarkSetting); + WatermarkHelper watermarkHelper(watermarkSetting, page->pageItem()->ppm()); BaseDesignIntf* watermark = page->addReportItem("TextItem", watermarkHelper.mapToPage(*page->pageItem()), watermarkHelper.sceneSize()); if (watermark){ @@ -1283,7 +1285,6 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender->setScriptContext(scriptContext()); clearRenderingPages(); foreach (PageDesignIntf* page, m_pages) { - QVector watermarks; if (!m_watermarks.isEmpty()){ foreach(WatermarkSetting watermarkSetting, m_watermarks){ @@ -1291,14 +1292,17 @@ ReportPages ReportEnginePrivate::renderToPages() } } + int savePpm = page->pageItem()->ppm(); + page->pageItem()->setPpm(Const::STORAGE_MM_FACTOR); PageItemDesignIntf* rp = createRenderingPage(page->pageItem()); - + page->pageItem()->setPpm(savePpm); qDeleteAll(watermarks.begin(),watermarks.end()); watermarks.clear(); m_renderingPages.append(rp); scriptContext()->baseDesignIntfToScript(rp->objectName(), rp); + } scriptContext()->qobjectToScript("engine",this); @@ -1802,6 +1806,8 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) QPointF backupPagePos = page->pos(); page->setPos(0,0); + int currentPpm = page->ppm(); + page->setPpm(Const::STORAGE_MM_FACTOR); m_renderPage.setPageItem(page); m_renderPage.setSceneRect(m_renderPage.pageItem()->mapToScene(m_renderPage.pageItem()->rect()).boundingRect()); initPrinter(m_renderPage.pageItem()); @@ -1849,6 +1855,7 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) m_renderPage.render(m_painter); } page->setPos(backupPagePos); + page->setPpm(currentPpm); m_renderPage.removePageItem(page); if (backupPage) backupPage->reactivatePageItem(page); return true; @@ -2051,7 +2058,7 @@ qreal WatermarkHelper::valueToPixels(qreal value) { switch (m_watermark.geometry().type()) { case LimeReport::ItemGeometry::Millimeters: - return value * Const::mmFACTOR; + return value * m_ppm; case LimeReport::ItemGeometry::Pixels: return value; } diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index d49743e..dca38c5 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -59,8 +59,8 @@ class ReportExporterInterface; class WatermarkHelper{ public: - WatermarkHelper(const WatermarkSetting& watermark) - : m_watermark(watermark){} + WatermarkHelper(const WatermarkSetting& watermark, int ppm) + : m_watermark(watermark), m_ppm(ppm){} qreal sceneX(); qreal sceneY(); qreal sceneWidth(); @@ -72,6 +72,7 @@ private: qreal valueToPixels(qreal value); private: const WatermarkSetting& m_watermark; + int m_ppm; }; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 65e39c9..1ca7feb 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1300,7 +1300,7 @@ void ReportRender::startNewPage(bool isFirst) m_renderPageItem->setObjectName(QLatin1String("ReportPage")+QString::number(m_pageCount)); m_maxHeightByColumn[m_currentColumn] = m_renderPageItem->pageRect().height(); - m_currentStartDataPos[m_currentColumn] = m_patternPageItem->topMargin() * Const::mmFACTOR; + m_currentStartDataPos[m_currentColumn] = m_patternPageItem->topMargin() * m_patternPageItem->ppm(); m_currentIndex = 0; if (isFirst) { @@ -1537,7 +1537,7 @@ void ReportRender::savePage(bool isLast) pageHeight += band->height(); } m_renderPageItem->setHeight(pageHeight + 10 + - (m_patternPageItem->topMargin() + m_patternPageItem->bottomMargin()) * Const::mmFACTOR); + (m_patternPageItem->topMargin() + m_patternPageItem->bottomMargin()) * m_patternPageItem->ppm()); } } diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index 6664f63..60a2385 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -31,7 +31,7 @@ 0 0 503 - 301 + 317 @@ -90,7 +90,7 @@ - 10 + 5 @@ -104,7 +104,7 @@ - 10 + 5 @@ -216,7 +216,7 @@ 0 0 503 - 301 + 317 @@ -305,7 +305,7 @@ 0 0 503 - 301 + 317 diff --git a/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp b/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp index 66bbc25..0c79bd1 100644 --- a/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp @@ -39,7 +39,7 @@ QString MarginPropItem::displayValue() const return QString("%1 %2").arg(propertyValue().toDouble(), 0, 'f', 2) .arg(QObject::tr("mm")); case LimeReport::BaseDesignIntf::Inches: - return QString("%1 %2").arg((propertyValue().toDouble() * Const::mmFACTOR) / (item->unitFactor() * 10), 0, 'f', 2) + return QString("%1 %2").arg((propertyValue().toDouble() * item->ppm()) / (item->unitFactor() * 10), 0, 'f', 2) .arg(QObject::tr("''")); } } @@ -72,7 +72,7 @@ qreal MarginPropItem::valueInUnits(qreal value) const case LimeReport::BaseDesignIntf::Millimeters: return value; case LimeReport::BaseDesignIntf::Inches: - return (value * Const::mmFACTOR) / (item->unitFactor() * 10); + return (value * item->ppm()) / (item->unitFactor() * 10); } } @@ -83,8 +83,7 @@ qreal MarginPropItem::valueInReportUnits(qreal value) const case LimeReport::BaseDesignIntf::Millimeters: return value; case LimeReport::BaseDesignIntf::Inches: - return (value * (item->unitFactor() * 10)) / Const::mmFACTOR; - + return (value * (item->unitFactor() * 10)) / item->ppm(); } } diff --git a/limereport/serializators/lrstorageintf.h b/limereport/serializators/lrstorageintf.h index 74b83ef..43c57ac 100644 --- a/limereport/serializators/lrstorageintf.h +++ b/limereport/serializators/lrstorageintf.h @@ -40,8 +40,15 @@ namespace LimeReport{ class ObjectLoadingStateIntf{ public: virtual bool isLoading() = 0; - virtual void objectLoadStarted() = 0; - virtual void objectLoadFinished() = 0; + virtual void startLoading() = 0; + virtual void finishLoading() = 0; +}; + +class ObjectSavingStateIntf{ +public: + virtual bool isSaving() = 0; + virtual void startSaving() = 0; + virtual void finishSaving() = 0; }; class ItemsWriterIntf diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 7439fc4..85a8124 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -116,7 +116,7 @@ void XMLReader::readItemFromNode(QObject* item,QDomElement *node) { EASY_BLOCK("readItemFromNode"); ObjectLoadingStateIntf* lf = dynamic_cast(item); - if(lf) lf->objectLoadStarted(); + if(lf) lf->startLoading(); for (int i=0;ichildNodes().count();i++){ QDomElement currentNode =node->childNodes().at(i).toElement(); if (currentNode.attribute("Type")=="Object"){ @@ -128,7 +128,7 @@ void XMLReader::readItemFromNode(QObject* item,QDomElement *node) readTranslation(item,¤tNode); } else readProperty(item,¤tNode); } - if (lf) lf->objectLoadFinished(); + if (lf) lf->finishLoading(); BaseDesignIntf* baseObj = dynamic_cast(item); if(baseObj) {