void KstTopLevelView::pressMoveLayoutModeEndPoint(const QPoint& pos, bool maintainAspect) { // FIXME: remove this!! Should not know about any specific type // for now we only know how to deal with lines QRect bounds = _pressTarget->_parent->geometry(); QPoint npos = pos; //pos must be inside the parent npos.setX(QMAX(npos.x(), bounds.left())); npos.setX(QMIN(npos.x(), bounds.right())); npos.setY(QMIN(npos.y(), bounds.bottom())); npos.setY(QMAX(npos.y(), bounds.top())); if (KstViewLinePtr line = kst_cast<KstViewLine>(_pressTarget)) { QPoint movePoint, anchorPoint; QPoint *fromPoint, *toPoint; if (_pressDirection & UP) { // UP means we are on the start endpoint movePoint = line->from(); anchorPoint = line->to(); fromPoint = &movePoint; toPoint = &anchorPoint; } else { // (_pressDirection & DOWN) // DOWN means we are on the end endpoint movePoint = line->to(); anchorPoint = line->from(); fromPoint = &anchorPoint; toPoint = &movePoint; } if (maintainAspect) { movePoint = KstGfxMouseHandlerUtils::findNearestPtOnLine(anchorPoint, movePoint, npos, bounds); } else { movePoint = npos; // already enforced pos inside parent. } const QRect old(_prevBand); _prevBand.setTopLeft(*fromPoint); _prevBand.setBottomRight(*toPoint); if (old != _prevBand) { KstPainter p; p.begin(_w); p.setPen(QPen(Qt::black, 0, Qt::DotLine)); p.setRasterOp(Qt::NotROP); if (old.topLeft() != QPoint(-1, -1)) { p.drawLine(old.topLeft(), old.bottomRight()); } p.drawLine(_prevBand.topLeft(), _prevBand.bottomRight()); p.end(); } } }
void KstViewLine::paintSelf(KstPainter& p, const QRegion& bounds) { p.save(); if (p.type() != KstPainter::P_PRINT && p.type() != KstPainter::P_EXPORT) { if (p.makingMask()) { p.setRasterOp(Qt::SetROP); KstViewObject::paintSelf(p, geometry()); } else { const QRegion clip(clipRegion()); KstViewObject::paintSelf(p, bounds - clip); p.setClipRegion(bounds & clip); } } // figure out which direction to draw the line const int w(_width * p.lineWidthAdjustmentFactor()); QPen pen(_foregroundColor, w); pen.setCapStyle(_capStyle); pen.setStyle(_penStyle); p.setPen(pen); const QRect geom(geometry()); int u = 0, v = 0; // Adjust for large widths. We don't want the line clipped because it goes // out of the bounding box. if (w > 1 && geom.height() > 0) { double theta = atan(geom.width()/geom.height()); if (theta >= 0 && theta <= M_PI/4) { u = int(fabs((w / 2.0) * (sin(theta) + cos(theta)))); v = int(fabs((w / 2.0) * (1.5*sin(theta) + 0.5*cos(theta)))); } else { u = int(fabs((w / 2.0) * (1.5*sin(theta) + 0.5*cos(theta)))); v = int(fabs((w / 2.0) * (sin(theta) + cos(theta)))); } } switch (_orientation) { case UpLeft: case DownRight: p.drawLine(geom.bottomRight() + QPoint(-u, -v), geom.topLeft() + QPoint(u, v)); break; case UpRight: case DownLeft: p.drawLine(geom.bottomLeft() + QPoint(u, -v), geom.topRight() + QPoint(-u, v)); break; } p.restore(); }
void KstViewLine::drawShadow(KstPainter& p, const QPoint& pos) { QPoint point1, point2; QRect rect = geometry(); rect.moveTopLeft(pos); if (_orientation == UpLeft || _orientation == DownRight) { point1 = pos; point2 = rect.bottomRight(); } else { point1 = rect.topRight(); point2 = rect.bottomLeft(); } p.drawLine(point1, point2); }
void KstViewPicture::paintSelf(KstPainter& p, const QRegion& bounds) { p.save(); if (p.type() != KstPainter::P_PRINT && p.type() != KstPainter::P_EXPORT) { if (p.makingMask()) { p.setRasterOp(Qt::OrROP); } else { const QRegion clip(clipRegion()); KstBorderedViewObject::paintSelf(p, bounds - _myClipMask); p.setClipRegion(bounds & clip); } } else { KstBorderedViewObject::paintSelf(p, bounds); } const QRect cr(contentsRectForDevice(p)); if (_image.isNull()) { // fill with X p.setBrush(QBrush(Qt::gray, Qt::SolidPattern)); p.setPen(QPen(Qt::black, 0, Qt::SolidLine)); p.drawRect(cr); p.drawLine(cr.topLeft(), cr.bottomRight()); p.drawLine(cr.topRight(), cr.bottomLeft()); } else { assert(!cr.isNull()); // Null view objects are not allowed. I want to see // how this happens so it can be fixed. if (_iCache.isNull() || _iCache.size() != cr.size()) { _iCache = _image.copy(); if (!_iCache.isNull()) { _iCache = _iCache.smoothScale(cr.size()); } } if (!_iCache.isNull()) { if (p.makingMask()) { // which indicates clipping / BW mode if (_iCache.hasAlphaBuffer()) { p.drawImage(cr.topLeft(), _iCache.createAlphaMask()); } else { p.setBrush(Qt::color1); p.drawRect(cr); } } else { p.drawImage(cr.topLeft(), _iCache); } } } p.restore(); }