/*! \class HsAnchorPointInBottomRight \brief Diagonal widget positioning algorithm. Sets widget's lower right corner to follow content area's diagonal. Widgets are positioned to certain offset to each other. */ HsWidgetPositioningOnWidgetAdd::Result HsAnchorPointInBottomRight::convert( const QRectF &contentArea, const QList<QRectF> &existingRects, const QList<QRectF> &newRects, const QPointF &startPoint) { Q_UNUSED(existingRects); HsWidgetPositioningOnWidgetAdd::Result result; QList<QRectF> toGeometries; //Offset for widgets' bottom right position to each other qreal k = contentArea.height()/contentArea.width(); //slope of the diagonal qreal offset_x = offset/(sqrt(k + 1)); qreal offset_y = k*offset_x; QPointF offsetPoint(offset_x, offset_y); QPointF anchorPoint; if(startPoint.isNull()){ QLineF diagonal(contentArea.topLeft(), contentArea.bottomRight()); QLineF widgetRightSide(contentArea.center().x()+ newRects.at(0).width()/2, contentArea.top(), contentArea.center().x()+ newRects.at(0).width()/2, contentArea.bottom()); // right side line intersection with diagonal will be bottom right position // for the first rect if(QLineF::BoundedIntersection != diagonal.intersect(widgetRightSide, &anchorPoint)) { result.calculatedRects = newRects; return result; //Return original since undefined error. //In this case widget's must be wider than the content area. } } else { anchorPoint = startPoint - offsetPoint; } QRectF widgetRect; for(int i=0;i<newRects.count();++i) { widgetRect = newRects.at(i); widgetRect.moveBottomRight(anchorPoint); //if widget rect doesn't fit, try to move it if(!contentArea.contains(widgetRect)) { /*! precondition is that widget's max height < content area height widget's max widht < content area width */ widgetRect.moveBottomRight(contentArea.bottomRight()); // anchorPoin is always previous bottom right anchorPoint = widgetRect.bottomRight(); } toGeometries << widgetRect; anchorPoint -= offsetPoint; } result.calculatedRects = toGeometries; return result; }
void OnMonitorRectItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(widget) Q_UNUSED(option) painter->setPen(pen()); //painter->setClipRect(option->rect); const QRectF r = rect(); painter->drawRect(r); QRectF handle = painter->worldTransform().inverted().mapRect(QRectF(0, 0, 6, 6)); if (isEnabled()) { handle.moveTopLeft(r.topLeft()); painter->fillRect(handle, QColor(Qt::yellow)); handle.moveTopRight(r.topRight()); painter->fillRect(handle, QColor(Qt::yellow)); handle.moveBottomLeft(r.bottomLeft()); painter->fillRect(handle, QColor(Qt::yellow)); handle.moveBottomRight(r.bottomRight()); painter->fillRect(handle, QColor(Qt::yellow)); } // Draw cross at center QPointF center = r.center(); painter->drawLine(center + QPointF(-handle.width(), 0), center + QPointF(handle.width(), 0)); painter->drawLine(center + QPointF(0, handle.height()), center + QPointF(0, -handle.height())); }
void LabelItemDialog::saveDimensions(ViewItem *viewitem) { Q_ASSERT(viewitem); LabelItem *item = qobject_cast<LabelItem*>(viewitem); Q_ASSERT(item); QPointF xy(_labelDimensionsTab->x(),_labelDimensionsTab->y()); qreal theta = _labelDimensionsTab->rotation(); bool fix_left = _labelDimensionsTab->fixLeft(); if (_labelDimensionsTab->lockPosToData() && item->dataPosLockable()) { QRectF dr = item->dataRelativeRect(); if (fix_left) { dr.moveTopLeft(xy); item->setFixLeft(true); } else { dr.moveBottomRight(xy); item->setFixLeft(false); } item->setDataRelativeRect(dr); bool lockPosToData = _labelDimensionsTab->lockPosToDataDirty() ? _labelDimensionsTab->lockPosToData() : item->lockPosToData(); item->setLockPosToData(lockPosToData); item->applyDataLockedDimensions(); } else { QRectF parentRect = item->parentRect(); qreal parentWidth = parentRect.width(); qreal parentHeight = parentRect.height(); qreal parentX = parentRect.x(); qreal parentY = parentRect.y(); bool lockPosToData = _labelDimensionsTab->lockPosToDataDirty() ? _labelDimensionsTab->lockPosToData() : item->lockPosToData(); item->setLockPosToData(lockPosToData); qreal width = item->rect().width(); qreal height = item->rect().height(); item->setPos(parentX + xy.x()*parentWidth, parentY + xy.y()*parentHeight); if (fix_left) { item->setViewRect(0,-height, width, height); item->setFixLeft(true); } else { item->setViewRect(-width,-height, width, height); item->setFixLeft(false); } } QTransform transform; transform.rotate(theta); item->setTransform(transform); item->updateRelativeSize(true); if (_saveAsDefault->isChecked()) { _dialogDefaults->setValue(item->staticDefaultsGroupName()+"/fixLeft",_labelDimensionsTab->fixLeft()); } }
void TransformableGraphicsGuide::update() { if (isVisible()) { FigureEditor::EditMode mode = editor->mode(); bool scaleMode( mode == FigureEditor::Scale ); topRightRect.setVisible(scaleMode); topLeftRect.setVisible(scaleMode); bottomRightRect.setVisible(scaleMode); bottomLeftRect.setVisible(scaleMode); if (scaleMode) { QPointF cen; QPolygonF poly; if (editor->hasSelection()) { QGraphicsPolygonItem* item = editor->selection(); if (item == 0) return; cen = mapFromScene(editor->selectionTransformPos()); poly = mapFromScene(item->polygon()); } else { QGraphicsPolygonItem* item = dynamic_cast<QGraphicsPolygonItem*>(parentItem()); cen = editor->triangleTransformPos(); poly = item->polygon(); } QRectF f( poly.boundingRect() ); qreal xmax = qMax(qAbs(f.left() - cen.x()), qAbs(f.right() - cen.x())); qreal ymax = qMax(qAbs(f.top() - cen.y()), qAbs(f.bottom() - cen.y())); QPointF pmax(xmax, ymax); QRectF r(pmax, -pmax); r.moveCenter(cen); outerRect = r; QRectF l = parentItem()->mapRectFromScene(QRectF(QPointF(0.0, 0.0), QSizeF(10, 10))); QPen pen( editor->guideColor() ); l.moveBottomLeft(r.topRight()); topRightRect.setPen(pen); topRightRect.setRect(l); l.moveBottomRight(r.topLeft()); topLeftRect.setPen(pen); topLeftRect.setRect(l); l.moveTopLeft(r.bottomRight()); bottomRightRect.setPen(pen); bottomRightRect.setRect(l); l.moveTopRight(r.bottomLeft()); bottomLeftRect.setPen(pen); bottomLeftRect.setRect(l); } else if (mode == FigureEditor::Rotate) { QGraphicsPolygonItem* item; QPointF cen; QPolygonF poly; if (editor->hasSelection()) { item = editor->selection(); if (item == 0) return; cen = mapFromScene(editor->selectionTransformPos()); poly = mapFromScene(item->polygon()); } else { item = dynamic_cast<QGraphicsPolygonItem*>(parentItem()); poly = item->polygon(); cen = editor->triangleTransformPos(); } qreal rmax = 0.0; foreach (QPointF p, poly) { QLineF l(p, cen); qreal len(l.length()); if (len > rmax) rmax = len; } qreal height = rmax * 2.0; outerRect = QRectF(cen.x() - rmax, cen.y() - rmax, height, height); }