QRegion KstViewArrow::clipRegion() { if (_clipMask.isNull()) { _myClipMask = QRegion(); QBitmap bm1(_geom.bottomRight().x(), _geom.bottomRight().y(), true); if (!bm1.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm1); p.setViewXForm(true); KstViewLine::paintSelf(p, QRegion()); p.end(); _clipMask = QRegion(bm1); } QBitmap bm2(_geom.bottomRight().x(), _geom.bottomRight().y(), true); if (!bm2.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm2); p.setViewXForm(true); paintSelf(p, QRegion()); p.end(); _myClipMask = QRegion(bm2); } } return _myClipMask | _clipMask; }
QRegion KstViewPicture::clipRegion() { if (_clipMask.isNull()) { _myClipMask = QRegion(); QBitmap bm1(_geom.bottomRight().x() + 1, _geom.bottomRight().y() + 1, true); if (!bm1.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm1); p.setViewXForm(true); KstBorderedViewObject::paintSelf(p, QRegion()); p.flush(); p.end(); _clipMask = QRegion(bm1); } QBitmap bm2(_geom.bottomRight().x() + 1, _geom.bottomRight().y() + 1, true); if (!bm2.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm2); p.setViewXForm(true); paintSelf(p, QRegion()); p.flush(); p.end(); _myClipMask = QRegion(bm2); } } return _myClipMask | _clipMask; }
QRegion KstViewLegend::clipRegion() { if (!_transparent) { return KstBorderedViewObject::clipRegion(); } if (_clipMask.isNull() && _myClipMask.isNull()) { const QRect cr(contentsRect()); QBitmap bm = _backBuffer.buffer().createHeuristicMask(false); // slow but preserves antialiasing... _myClipMask = QRegion(bm); _myClipMask.translate(cr.topLeft().x(), cr.topLeft().y()); QBitmap bm1(_geom.bottomRight().x() + 1, _geom.bottomRight().y() + 1, true); if (!bm1.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm1); p.setViewXForm(true); KstBorderedViewObject::paintSelf(p, QRegion()); p.end(); _clipMask = QRegion(bm1); } } return _clipMask | _myClipMask; }
void KstTopLevelView::pressMoveLayoutModeMove(const QPoint& pos, bool shift) { Q_UNUSED(shift) const QRect old(_prevBand); QRect r(_pressTarget->geometry()); for (KstViewObjectList::ConstIterator i = _selectionList.begin(); i != _selectionList.end(); ++i) { r = r.unite((*i)->geometry()); } const QPoint originalTopLeft(r.topLeft()); QPoint topLeft(pos - _moveOffset - _pressTarget->geometry().topLeft() + r.topLeft()); r.moveTopLeft(topLeft); _moveOffsetSticky = QPoint(0, 0); int xMin = STICKY_THRESHOLD; int yMin = STICKY_THRESHOLD; snapToBorders(&xMin, &yMin, _selectionList, _pressTarget, r); if (labs(xMin) < STICKY_THRESHOLD) { _moveOffsetSticky.setX(xMin); topLeft.setX(topLeft.x() - xMin); } if (labs(yMin) < STICKY_THRESHOLD) { _moveOffsetSticky.setY(yMin); topLeft.setY(topLeft.y() - yMin); } r.moveTopLeft(topLeft); if (!_geom.contains(r, true)) { slideInto(_geom, r); } _prevBand = r; if (_prevBand != old) { KstPainter p; p.begin(_w); p.setRasterOp(Qt::NotROP); p.setPen(QPen(Qt::black, 0, Qt::DotLine)); if (_selectionList.isEmpty()) { if (old.topLeft() != QPoint(-1, -1)) { _pressTarget->drawShadow(p, old.topLeft()); } _pressTarget->drawShadow(p, r.topLeft()); } else { for (KstViewObjectList::Iterator iter = _selectionList.begin(); iter != _selectionList.end(); ++iter) { if (old.topLeft() != QPoint(-1, -1)) { (*iter)->drawShadow(p, old.topLeft() + (*iter)->geometry().topLeft() - originalTopLeft); } (*iter)->drawShadow(p, r.topLeft() + (*iter)->geometry().topLeft() - originalTopLeft); } } p.end(); } }
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 KstViewLegend::drawToBuffer() { setDirty(false); _backBuffer.buffer().resize(contentsRect().size()); _backBuffer.buffer().fill(backgroundColor()); KstPainter p; p.begin(&_backBuffer.buffer()); QPen pen; pen.setColor(foregroundColor()); p.setPen(pen); drawToPainter(p); p.end(); }
void KstTopLevelView::pressMoveLayoutModeResize(const QPoint& pos, bool maintainAspect) { const QRect old(_prevBand); _prevBand = newSize(_pressTarget->geometry(), _pressTarget->_parent->geometry(), _pressDirection, pos, maintainAspect); if (_prevBand != old) { KstPainter p; p.begin(_w); p.setRasterOp(Qt::NotROP); p.setPen(QPen(Qt::black, 0, Qt::DotLine)); if (old.topLeft() != QPoint(-1, -1)) { p.drawRect(old); } p.drawRect(_prevBand); p.end(); } }
void KstTopLevelView::updateFocus(const QPoint& pos) { if (_activeHandler) { _activeHandler->updateFocus(this, pos); return; } if (_mode == DisplayMode || _mode == Unknown || tracking()) { return; } //TODO: make this work better with click-select mode KstViewObjectPtr p = findDeepestChild(pos, false); if (p) { KstViewObjectPtr p2 = p; while (p2->_parent && p2->_parent->_container) { p2 = p2->_parent; } if (p2->_parent && !p2->_parent->_container) { p = p2->_parent; } } if (p) { if (p->focused()) { setCursorFor(pos, p); _focusOn = true; // just in case - seems to be false on occasion return; } p->setFocus(true); if (_focusOn) { // something else has the focus, clear it clearFocus(); } setCursorFor(pos, p); KstPainter painter; painter.begin(_w); painter.setRasterOp(Qt::NotROP); painter.setPen(QPen(Qt::black, 0, Qt::SolidLine)); painter.setBrush(Qt::NoBrush); p->drawFocusRect(painter); painter.end(); _focusOn = true; _hoverFocus = p; } else { clearFocus(); } }
void KstTopLevelView::pressMoveLayoutModeSelect(const QPoint& pos, bool shift) { Q_UNUSED(shift) const QRect old(_prevBand); QRect r; r.setTopLeft(_moveOffset); r.setBottomRight(pos); _prevBand = r.normalize().intersect(_geom); if (old != _prevBand) { KstPainter p; p.begin(_w); p.setRasterOp(Qt::NotROP); p.drawWinFocusRect(old); p.drawWinFocusRect(_prevBand); p.end(); } KstApp::inst()->slotUpdateDataMsg(QString::null); }
void KstTopLevelView::pressMoveLayoutModeCenteredResize(const QPoint& pos, bool maintainAspect) { //centered resize means that the center of the object stays constant const QRect old(_prevBand); _prevBand = newSizeCentered(_pressTarget->geometry(), _pressTarget->_parent->geometry(), pos, maintainAspect); if (_prevBand != old) { KstPainter p; p.begin(_w); p.setPen(QPen(Qt::black, 0, Qt::DotLine)); p.setRasterOp(Qt::NotROP); if (old.topLeft() != QPoint(-1, -1)) { p.drawEllipse(old); } p.drawEllipse(_prevBand); p.end(); } }
void KstTopLevelView::clearFocus() { if (_focusOn) { _pressDirection = -1; _moveOffset = QPoint(-1, -1); _moveOffsetSticky = QPoint(0, 0); _w->unsetCursor(); _focusOn = false; //recursively<bool>(&KstViewObject::setFocus, false); if (_hoverFocus) { KstPainter p; p.begin(_w); p.setViewXForm(true); _hoverFocus->setFocus(false); p.setRasterOp(Qt::NotROP); p.setPen(QPen(Qt::black, 0, Qt::SolidLine)); p.setBrush(Qt::NoBrush); _hoverFocus->drawFocusRect(p); p.end(); _hoverFocus = 0L; } } }