diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index fdd0bf4..55aed88 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -69,8 +69,6 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_storageTypeName(storageTypeName), m_itemMode(DesignMode), m_objectState(ObjectCreated), - m_selectionMarker(0), - m_joinMarker(0), m_backgroundBrushStyle(SolidPattern), m_backgroundColor(Qt::white), m_margin(4), @@ -82,7 +80,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_patternItem(0), m_fillInSecondPass(false), m_watermark(false), - m_hovered(false) + m_hovered(false), + m_joinMarkerOn(false) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -106,7 +105,7 @@ QRectF BaseDesignIntf::boundingRect() const BaseDesignIntf::~BaseDesignIntf(void) { //delete m_selectionMarker; - delete m_joinMarker; + //delete m_joinMarker; } void BaseDesignIntf::setParentReportItem(const QString &value) @@ -391,10 +390,13 @@ void BaseDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *o { Q_UNUSED(option); Q_UNUSED(widget); + ppainter->save(); setupPainter(ppainter); drawBorder(ppainter, rect()); - if (isSelected()) {drawSelection(ppainter, rect());} + if (m_joinMarkerOn) { drawMarker(ppainter, Const::JOIN_COLOR);} + if (isSelected() && !m_joinMarkerOn) {drawMarker(ppainter, Const::SELECTION_COLOR);} drawResizeZone(ppainter); + ppainter->restore(); // if (m_hovered) ppainter->drawImage( // QRectF(QPointF(rect().topRight().x()-24, rect().bottomLeft().y()-24), // QSizeF(24, 24)),QImage(":/items/images/settings.png")); @@ -573,6 +575,7 @@ void BaseDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) moveSelectedItems(tmpPos - pos()); if (page()->selectedItems().count()==1 && (page()->magneticMovement())) page()->itemMoved(this); + } } } @@ -673,15 +676,17 @@ QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){ void BaseDesignIntf::turnOnJoinMarker(bool value) { - if (value){ - m_joinMarker = new Marker(this); - m_joinMarker->setColor(Const::JOIN_COLOR); - m_joinMarker->setRect(rect()); - m_joinMarker->setVisible(true); - } else { - delete m_joinMarker; - m_joinMarker = 0; - } + m_joinMarkerOn = value; + update(); +// if (value){ +// m_joinMarker = new Marker(this); +// m_joinMarker->setColor(Const::JOIN_COLOR); +// m_joinMarker->setRect(rect()); +// m_joinMarker->setVisible(true); +// } else { +// delete m_joinMarker; +// m_joinMarker = 0; +// } } void BaseDesignIntf::updateItemAlign(){ @@ -717,20 +722,6 @@ void BaseDesignIntf::updatePossibleDirectionFlags(){ } } -void BaseDesignIntf::turnOnSelectionMarker(bool value) -{ - if (value && !m_selectionMarker){ - m_selectionMarker = new SelectionMarker(this); - m_selectionMarker->setColor(selectionMarkerColor()); - m_selectionMarker->setZValue(zValue()-1); - updateSelectionMarker(); - m_selectionMarker->setVisible(true); - } else { - delete m_selectionMarker; - m_selectionMarker = 0; - } -} - bool BaseDesignIntf::fillInSecondPass() const { return m_fillInSecondPass; @@ -988,7 +979,6 @@ void BaseDesignIntf::setGeometry(QRectF rect) 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(); - updateSelectionMarker(); if (!isLoading()){ geometryChangedEvent(geometry(), m_oldGeometry); emit geometryChanged(this, geometry(), m_oldGeometry); @@ -1074,11 +1064,9 @@ void BaseDesignIntf::initMode(ItemMode mode) QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemPositionHasChanged) { - updateSelectionMarker(); } if (change == QGraphicsItem::ItemSelectedChange) { - turnOnSelectionMarker(value.toBool()); emit itemSelectedHasBeenChanged(this, value.toBool()); } if (change == QGraphicsItem::ItemParentHasChanged) { @@ -1118,24 +1106,13 @@ QPainterPath BaseDesignIntf::shape() const return path; } -void BaseDesignIntf::drawSelection(QPainter *painter, QRectF /*rect*/) const +void BaseDesignIntf::drawMarker(QPainter *painter, QColor color) const { painter->save(); - // painter->setPen(QPen(Qt::red,m_selectionPenSize)); - // painter->drawLine(QPointF(m_resizeHandleSize,0),QPointF(0,0)); - // painter->drawLine(QPointF(0,m_resizeHandleSize),QPointF(0,0)); - // painter->drawLine(rect.right()-m_resizeHandleSize,0,rect.right(),0); - // painter->drawLine(rect.right(),m_resizeHandleSize,rect.right(),0); - // painter->drawLine(0,rect.bottom(),0,rect.bottom()-10); - // painter->drawLine(0,rect.bottom(),m_resizeHandleSize,rect.bottom()); - // painter->drawLine(rect.right()-m_resizeHandleSize,rect.bottom(),rect.right(),rect.bottom()); - // painter->drawLine(rect.right(),rect.bottom()-m_resizeHandleSize,rect.right(),rect.bottom()); - // painter->setOpacity(Consts::SELECTION_COLOR_OPACITY); - // painter->fillRect(rect,selectionColor()); - QPen pen(Qt::red,m_selectionPenSize); + QPen pen(color, m_selectionPenSize); painter->setPen(pen); - painter->setBrush(QBrush(Qt::red)); + painter->setBrush(QBrush(color)); painter->setOpacity(1); const int markerSize = Const::RESIZE_HANDLE_SIZE; painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); @@ -1202,7 +1179,6 @@ void BaseDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) QRectF newGeometry = geometry(); if (newGeometry != m_oldGeometry) { geometryChangedEvent(newGeometry, m_oldGeometry); - updateSelectionMarker(); emit(posChanged(this, newGeometry.topLeft(), m_oldGeometry.topLeft())); } QGraphicsItem::mouseReleaseEvent(event); @@ -1332,17 +1308,6 @@ void BaseDesignIntf::setMarginSize(int value) } } -void BaseDesignIntf::updateSelectionMarker() -{ -// if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { -// if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); -// if (parentItem()) { -// m_selectionMarker->setRect(rect()); -// m_selectionMarker->setPos(0,0); -// } -// } -} - void BaseDesignIntf::drawResizeZone(QPainter* /*painter*/) { @@ -1585,103 +1550,6 @@ void BaseDesignIntf::notify(const QVector& propertyNames) emit propertyesChanged(propertyNames); } -SelectionMarker::SelectionMarker(QGraphicsItem *parent)//, QGraphicsScene *scene) - : Marker(parent) -{ - setAcceptHoverEvents(true); -} - -void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->hoverMoveEvent(event); -} - -void SelectionMarker::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if (baseItem) baseItem->hoverLeaveEvent(event); -} - -void SelectionMarker::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if (baseItem) baseItem->hoverEnterEvent(event); -} - -void SelectionMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - parentItem()->setSelected(true); - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mousePressEvent(event); - QGraphicsItem::mousePressEvent(event); -} - -void SelectionMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mouseReleaseEvent(event); -} - -void SelectionMarker::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mouseDoubleClickEvent(event); - QGraphicsItem::mouseDoubleClickEvent(event); -} - -void SelectionMarker::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mouseMoveEvent(event); -} - -QRectF Marker::boundingRect() const -{ - return m_rect.adjusted(-15,-15,15,15); -} - -void Marker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) -{ - QPen pen; - const int markerSize = Const::RESIZE_HANDLE_SIZE; - pen.setColor(color()); - pen.setWidth(2); - pen.setStyle(Qt::DotLine); - painter->setPen(pen); - painter->setOpacity(Const::SELECTION_COLOR_OPACITY); - painter->drawRect(rect()); - painter->setBrush(color()); - painter->setPen(Qt::transparent); - painter->setOpacity(1); - painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().bottom()-markerSize,markerSize*2,markerSize*2)); -} - -QRectF Marker::rect() const -{ - return m_rect; -} - -QColor Marker::color() const -{ - return m_color; -} - -BaseDesignIntf *Marker::object() const -{ - return m_object; -} QMap BaseDesignIntf::getStringForTranslation(){ return QMap(); diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 9b7d599..becf95a 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -47,37 +47,6 @@ enum ItemModes{ DesignMode=1, PreviewMode=2, PrintMode=4, EditMode=8, LayoutEdit class ReportEnginePrivate; class PageDesignIntf; -class BaseDesignIntf; - -class Marker : public QGraphicsItem{ -public: - Marker(QGraphicsItem* parent=0):QGraphicsItem(parent),m_object(NULL){} - QRectF boundingRect() const; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); - void setRect(QRectF rect){prepareGeometryChange();m_rect=rect;} - void setColor(QColor color){m_color=color;} - QRectF rect() const; - QColor color() const; - BaseDesignIntf *object() const; -private: - QRectF m_rect; - QColor m_color; - BaseDesignIntf* m_object; -}; - -class SelectionMarker : public Marker{ -public: - SelectionMarker(QGraphicsItem* parent=0); -protected: - void hoverMoveEvent(QGraphicsSceneHoverEvent *event); - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - void hoverEnterEvent(QGraphicsSceneHoverEvent *event); - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -}; - class DataSourceManager; class ReportRender; @@ -334,7 +303,7 @@ protected: void drawDesignModeBorder(QPainter* painter, QRectF rect) const; void drawRenderModeBorder(QPainter *painter, QRectF rect) const; void drawResizeZone(QPainter*); - void drawSelection(QPainter* painter, QRectF) const; + void drawMarker(QPainter* painter, QColor color) const; void drawPinArea(QPainter* painter) const; void initResizeZones(); @@ -361,12 +330,10 @@ protected: qreal calcAbsolutePosX(qreal currentOffset, BaseDesignIntf* item); private: - void updateSelectionMarker(); int resizeDirectionFlags(QPointF position); void moveSelectedItems(QPointF delta); Qt::CursorShape getPossibleCursor(int cursorFlags); void updatePossibleDirectionFlags(); - void turnOnSelectionMarker(bool value); private: QPointF m_startPos; int m_resizeHandleSize; @@ -401,8 +368,6 @@ private: ItemMode m_itemMode; ObjectState m_objectState; - SelectionMarker* m_selectionMarker; - Marker* m_joinMarker; BrushStyle m_backgroundBrushStyle; QColor m_backgroundColor; @@ -419,6 +384,7 @@ private: bool m_fillInSecondPass; bool m_watermark; bool m_hovered; + bool m_joinMarkerOn; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 1bb5558..b8a164c 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -339,6 +339,15 @@ void PageDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) qreal posY = div(pageItem()->mapFromScene(event->scenePos()).y(), verticalGridStep()).quot * verticalGridStep(); qreal posX = div(pageItem()->mapFromScene(event->scenePos()).x(), verticalGridStep()).quot * horizontalGridStep(); m_itemInsertRect->setPos(posX,posY); + if (magneticMovement()){ + rectMoved( + QRectF(m_itemInsertRect->pos().x(), + m_itemInsertRect->pos().y(), + m_itemInsertRect->boundingRect().width(), + m_itemInsertRect->boundingRect().height() + ) + ); + } } else { if (m_insertMode) m_itemInsertRect->setVisible(false); } @@ -1102,9 +1111,53 @@ void PageDesignIntf::endUpdate() emit pageUpdateFinished(this); } + +void PageDesignIntf::activateItemToJoin(QRectF itemRect, QList& items){ + QRectF r1(itemRect.x(), itemRect.y()-50, itemRect.width(), itemRect.height()+100); + QRectF r2(itemRect.x()-50, itemRect.y(), itemRect.width()+100, itemRect.height()); + qreal maxSquare = 0; + + if (m_joinItem) { + m_joinItem->turnOnJoinMarker(false); + m_joinItem = 0; + } + + foreach(ItemProjections p, items){ + qreal tmpSquare = qMax(p.square(r1)/itemRect.width(),p.square(r2)/itemRect.height()); + if (tmpSquare>maxSquare) { + maxSquare = tmpSquare; + m_joinItem = p.item(); + if (p.square(r1)/itemRect.width() > p.square(r2) / itemRect.height()) + m_joinType = Width; + else + m_joinType = Height; + } + } + + if (m_joinItem) m_joinItem->turnOnJoinMarker(true); +} + +void PageDesignIntf::rectMoved(QRectF itemRect, BaseDesignIntf* container){ + if (!container){ + container = bandAt(QPointF(itemRect.topLeft())); + if (!container) container = this->pageItem(); + } + + if (container){ + m_projections.clear(); + foreach(BaseDesignIntf* bi, container->childBaseItems()){ + m_projections.append(ItemProjections(bi)); + } + } + + activateItemToJoin(itemRect, m_projections); + +} + void PageDesignIntf::itemMoved(BaseDesignIntf *item) { if (m_movedItem!=item){ + m_movedItem = item; BaseDesignIntf* curItem = dynamic_cast(item->parentItem()); ; while (curItem){ m_movedItemContainer = dynamic_cast(curItem); @@ -1122,28 +1175,29 @@ void PageDesignIntf::itemMoved(BaseDesignIntf *item) } } - QRectF r1(item->pos().x(),item->pos().y()-50,item->width(),item->height()+100); - QRectF r2(item->pos().x()-50,item->pos().y(),item->width()+100,item->height()); - qreal maxSquare = 0; + activateItemToJoin(item->geometry(), m_projections); +// QRectF r1(item->pos().x(),item->pos().y()-50,item->width(),item->height()+100); +// QRectF r2(item->pos().x()-50,item->pos().y(),item->width()+100,item->height()); +// qreal maxSquare = 0; - if (m_joinItem) { - m_joinItem->turnOnJoinMarker(false); - m_joinItem = 0; - } +// if (m_joinItem) { +// m_joinItem->turnOnJoinMarker(false); +// m_joinItem = 0; +// } - foreach(ItemProjections p, m_projections){ - qreal tmpSquare = qMax(p.square(r1)/item->width(),p.square(r2)/item->height()); - if (tmpSquare>maxSquare) { - maxSquare = tmpSquare; - m_joinItem = p.item(); - if (p.square(r1)/item->width()>p.square(r2)/item->height()) - m_joinType = Width; - else - m_joinType = Height; - } - } +// foreach(ItemProjections p, m_projections){ +// qreal tmpSquare = qMax(p.square(r1)/item->width(),p.square(r2)/item->height()); +// if (tmpSquare>maxSquare) { +// maxSquare = tmpSquare; +// m_joinItem = p.item(); +// if (p.square(r1)/item->width()>p.square(r2)/item->height()) +// m_joinType = Width; +// else +// m_joinType = Height; +// } +// } - if (m_joinItem) m_joinItem->turnOnJoinMarker(true); +// if (m_joinItem) m_joinItem->turnOnJoinMarker(true); } diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 901ddbc..49f8031 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -166,6 +166,7 @@ namespace LimeReport { bool isUpdating(){return m_updating;} void endUpdate(); + void rectMoved(QRectF itemRect, BaseDesignIntf* container = 0); void itemMoved(BaseDesignIntf* item); bool magneticMovement() const; void setMagneticMovement(bool magneticMovement); @@ -175,6 +176,7 @@ namespace LimeReport { void setPropertyToSelectedItems(const char *name, const QVariant &value); + protected: virtual void keyPressEvent(QKeyEvent *event); @@ -272,7 +274,7 @@ namespace LimeReport { const QVariant& oldPropertyValue, const QVariant& newPropertyValue); void changeSelectedGroupProperty(const QString& name,const QVariant& value); - + void activateItemToJoin(QRectF itemRect, QList& items); private: enum JoinType{Width, Height}; LimeReport::PageItemDesignIntf::Ptr m_pageItem; @@ -312,6 +314,7 @@ namespace LimeReport { JoinType m_joinType; bool m_magneticMovement; ReportSettings* m_reportSettings; + }; class AbstractPageCommand : public CommandIf{ diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index c3ad3cb..d0f949e 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -479,7 +479,7 @@ void PageItemDesignIntf::relocateBands() { if (isLoading()) return; - int bandSpace = (itemMode() & DesignMode)?4:0; + int bandSpace = (itemMode() & DesignMode)?0:0; QVector posByColumn;