bool RectangleShape::loadOdf(const KoXmlElement &element, KoShapeLoadingContext &context) { loadOdfAttributes(element, context, OdfMandatories | OdfGeometry | OdfAdditionalAttributes | OdfCommonChildElements); if (element.hasAttributeNS(KoXmlNS::svg, "rx") && element.hasAttributeNS(KoXmlNS::svg, "ry")) { qreal rx = KoUnit::parseValue(element.attributeNS(KoXmlNS::svg, "rx", "0")); qreal ry = KoUnit::parseValue(element.attributeNS(KoXmlNS::svg, "ry", "0")); m_cornerRadiusX = rx / (0.5 * size().width()) * 100; m_cornerRadiusY = ry / (0.5 * size().height()) * 100; } else { QString cornerRadius = element.attributeNS(KoXmlNS::draw, "corner-radius", ""); if (! cornerRadius.isEmpty()) { qreal radius = KoUnit::parseValue(cornerRadius); m_cornerRadiusX = qMin<qreal>(radius / (0.5 * size().width()) * 100, qreal(100)); m_cornerRadiusY = qMin<qreal>(radius / (0.5 * size().height()) * 100, qreal(100)); } } updatePath(size()); updateHandles(); loadOdfAttributes(element, context, OdfTransformation); loadText(element, context); return true; }
void RectangleShape::setCornerRadiusY(qreal radius) { if (radius >= 0.0 && radius <= 100.0) { m_cornerRadiusY = radius; updatePath(size()); updateHandles(); } }
void Ellipse::updateData() { Element *elem = this; if (m_data->aspectType == CIRCLE_ASPECT){ float size = elem->height() < elem->width() ? elem->height() : elem->width(); elem->setWidth(size); elem->setHeight(size); } updateHandles(); }
void RectangleShape::moveHandleAction(int handleId, const QPointF & point, Qt::KeyboardModifiers modifiers) { Q_UNUSED(modifiers); QPointF p(point); qreal width2 = size().width() / 2.0; qreal height2 = size().height() / 2.0; switch (handleId) { case 0: if (p.x() < width2) { p.setX(width2); } else if (p.x() > size().width()) { p.setX(size().width()); } p.setY(0); m_cornerRadiusX = (size().width() - p.x()) / width2 * 100.0; if (! (modifiers & Qt::ControlModifier)) m_cornerRadiusY = (size().width() - p.x()) / height2 * 100.0; break; case 1: if (p.y() < 0) { p.setY(0); } else if (p.y() > height2) { p.setY(height2); } p.setX(size().width()); m_cornerRadiusY = p.y() / height2 * 100.0; if (!(modifiers & Qt::ControlModifier)) m_cornerRadiusX = p.y() / width2 * 100.0; break; } // this is needed otherwise undo/redo might not end in the same result if (100 - m_cornerRadiusX < 1e-10) m_cornerRadiusX = 100; if (100 - m_cornerRadiusY < 1e-10) m_cornerRadiusY = 100; updateHandles(); }
void Ellipse::selectf(Point *clickedPoint, GraphRenderer *interactiveRenderer) { updateHandles(); }
void RegionGrabber::paintEvent( QPaintEvent* e ) { Q_UNUSED( e ); if ( grabbing ) // grabWindow() should just get the background return; QPainter painter( this ); QPalette pal(QToolTip::palette()); QFont font = QToolTip::font(); QColor handleColor = pal.color( QPalette::Active, QPalette::Highlight ); handleColor.setAlpha( 160 ); QColor overlayColor( 0, 0, 0, 160 ); QColor textColor = pal.color( QPalette::Active, QPalette::Text ); QColor textBackgroundColor = pal.color( QPalette::Active, QPalette::Base ); painter.drawPixmap(0, 0, pixmap); painter.setFont(font); QRect r = selection; if ( !selection.isNull() ) { QRegion grey( rect() ); grey = grey.subtracted( r ); painter.setClipRegion( grey ); painter.setPen( Qt::NoPen ); painter.setBrush( overlayColor ); painter.drawRect( rect() ); painter.setClipRect( rect() ); drawRect( &painter, r, handleColor ); } if ( showHelp ) { painter.setPen( textColor ); painter.setBrush( textBackgroundColor ); QString helpText = "Select a region using the mouse. To take the snapshot, press the Enter key or double click. Press Esc to quit."; helpTextRect = painter.boundingRect( rect().adjusted( 2, 2, -2, -2 ), Qt::TextWordWrap, helpText ); helpTextRect.adjust( -2, -2, 4, 2 ); drawRect( &painter, helpTextRect, textColor, textBackgroundColor ); painter.drawText( helpTextRect.adjusted( 3, 3, -3, -3 ), helpText ); } if ( selection.isNull() ) { return; } // The grabbed region is everything which is covered by the drawn // rectangles (border included). This means that there is no 0px // selection, since a 0px wide rectangle will always be drawn as a line. QString txt = QString( "%1x%2" ).arg( selection.width() ) .arg( selection.height() ); QRect textRect = painter.boundingRect( rect(), Qt::AlignLeft, txt ); QRect boundingRect = textRect.adjusted( -4, 0, 0, 0); if ( textRect.width() < r.width() - 2*handleSize && textRect.height() < r.height() - 2*handleSize && ( r.width() > 100 && r.height() > 100 ) ) // center, unsuitable for small selections { boundingRect.moveCenter( r.center() ); textRect.moveCenter( r.center() ); } else if ( r.y() - 3 > textRect.height() && r.x() + textRect.width() < rect().right() ) // on top, left aligned { boundingRect.moveBottomLeft( QPoint( r.x(), r.y() - 3 ) ); textRect.moveBottomLeft( QPoint( r.x() + 2, r.y() - 3 ) ); } else if ( r.x() - 3 > textRect.width() ) // left, top aligned { boundingRect.moveTopRight( QPoint( r.x() - 3, r.y() ) ); textRect.moveTopRight( QPoint( r.x() - 5, r.y() ) ); } else if ( r.bottom() + 3 + textRect.height() < rect().bottom() && r.right() > textRect.width() ) // at bottom, right aligned { boundingRect.moveTopRight( QPoint( r.right(), r.bottom() + 3 ) ); textRect.moveTopRight( QPoint( r.right() - 2, r.bottom() + 3 ) ); } else if ( r.right() + textRect.width() + 3 < rect().width() ) // right, bottom aligned { boundingRect.moveBottomLeft( QPoint( r.right() + 3, r.bottom() ) ); textRect.moveBottomLeft( QPoint( r.right() + 5, r.bottom() ) ); } // if the above didn't catch it, you are running on a very tiny screen... drawRect( &painter, boundingRect, textColor, textBackgroundColor ); painter.drawText( textRect, txt ); if ( ( r.height() > handleSize*2 && r.width() > handleSize*2 ) || !mouseDown ) { updateHandles(); painter.setPen( Qt::NoPen ); painter.setBrush( handleColor ); painter.setClipRegion( handleMask( StrokeMask ) ); painter.drawRect( rect() ); handleColor.setAlpha( 60 ); painter.setBrush( handleColor ); painter.setClipRegion( handleMask( FillMask ) ); painter.drawRect( rect() ); } }
void RegionGrab::paintEvent(QPaintEvent *event) { Q_UNUSED( event ); if (m_grabbing) return; QPainter painter( this ); QPalette pal(QToolTip::palette()); QFont font = QToolTip::font(); QColor handleColor = pal.color(QPalette::Active, QPalette::Highlight); handleColor.setAlpha(160); QColor overlayColor(0, 0, 0, 100); QColor textColor = pal.color(QPalette::Active, QPalette::Text); QColor textBackgroundColor = pal.color(QPalette::Active, QPalette::Base); painter.drawPixmap(0, 0, m_pixmap); painter.setFont(font); const QRect& r = m_selection; if (r.isNull()) { painter.setClipRegion(QRegion(rect())); painter.setPen(Qt::NoPen); painter.setBrush(overlayColor); painter.drawRect(rect()); } else { painter.setClipRegion(QRegion(rect()).subtracted(r)); painter.setPen(Qt::NoPen); painter.setBrush(overlayColor); painter.drawRect(rect()); painter.setClipRect(rect()); drawRect(&painter, r, handleColor); } // \bug Подсказка центрируется не правильно в многомониторной конфигурации. if (m_showHelp) { painter.setPen(textColor); painter.setBrush(textBackgroundColor); QString helpText = tr("Select a region using the mouse. To take the snapshot, press the Enter key or double click. Press Esc to quit."); QRect scrRect = QApplication::desktop()->screenGeometry(QApplication::desktop()->primaryScreen()); m_helpTextRect = painter.boundingRect(scrRect.adjusted(20, 20, -20, -20), Qt::AlignHCenter, helpText); m_helpTextRect.adjust(-4, -4, 8, 4); drawRect(&painter, m_helpTextRect, textColor, textBackgroundColor); painter.drawText(m_helpTextRect.adjusted(3, 3, -3, -3), helpText); } if (r.isNull()) return; // The grabbed region is everything which is covered by the drawn // rectangles (border included). This means that there is no 0px // selection, since a 0px wide rectangle will always be drawn as a line. QString txt = QString("%1x%2").arg(r.width()).arg(r.height()); QRect textRect = painter.boundingRect(rect(), Qt::AlignLeft, txt); QRect boundingRect = textRect.adjusted(-4, 0, 0, 0); // center, unsuitable for small selections if (textRect.width() < r.width() - 2 * m_handleSize && textRect.height() < r.height() - 2 * m_handleSize && (r.width() > 100 && r.height() > 100)) { boundingRect.moveCenter(r.center()); textRect.moveCenter(r.center()); } // on top, left aligned else if (r.y() - 3 > textRect.height() && r.x() + textRect.width() < rect().right()) { boundingRect.moveBottomLeft(QPoint(r.x(), r.y() - 3)); textRect.moveBottomLeft(QPoint(r.x() + 2, r.y() - 3)); } // left, top aligned else if (r.x() - 3 > textRect.width()) { boundingRect.moveTopRight(QPoint(r.x() - 3, r.y())); textRect.moveTopRight(QPoint(r.x() - 5, r.y())); } // at bottom, right aligned else if (r.bottom() + 3 + textRect.height() < rect().bottom() && r.right() > textRect.width()) { boundingRect.moveTopRight(QPoint(r.right(), r.bottom() + 3)); textRect.moveTopRight(QPoint(r.right() - 2, r.bottom() + 3)); } // right, bottom aligned else if (r.right() + textRect.width() + 3 < rect().width()) { boundingRect.moveBottomLeft(QPoint(r.right() + 3, r.bottom())); textRect.moveBottomLeft(QPoint(r.right() + 5, r.bottom())); } // if the above didn't catch it, you are running on a very tiny screen... drawRect(&painter, boundingRect, textColor, textBackgroundColor); painter.drawText(textRect, txt); if ((r.height() > m_handleSize * 2 && r.width() > m_handleSize * 2) || !m_mouseDown) { updateHandles(); painter.setPen(Qt::NoPen); painter.setBrush(handleColor); painter.setClipRegion(handleMask(StrokeMask)); painter.drawRect(rect()); handleColor.setAlpha(60); painter.setBrush(handleColor); painter.setClipRegion(handleMask(FillMask)); painter.drawRect(rect()); } }
void RectTool::updateGraphicsItems() { updateHandles(); updateFrameRect(); }
void AreaDialog::paintEvent(QPaintEvent* e) { Q_UNUSED(e); if (mGrabbing) // grabWindow() should just get the background return; QPainter painter(this); QPalette pal = palette(); QFont font = QToolTip::font(); QColor handleColor(85, 160, 188, 220); QColor overlayColor(0, 0, 0, mOverlayAlpha); QColor textColor = pal.color(QPalette::Active, QPalette::Text); QColor textBackgroundColor = pal.color(QPalette::Active, QPalette::Base); painter.drawPixmap(0, 0, mScreenshot->pixmap()); painter.setFont(font); QRect r = mSelection.normalized().adjusted(0, 0, -1, -1); QRegion grey(rect()); grey = grey.subtracted(r); painter.setPen(handleColor); painter.setBrush(overlayColor); painter.setClipRegion(grey); painter.drawRect(-1, -1, rect().width() + 1, rect().height() + 1); painter.setClipRect(rect()); painter.setBrush(Qt::NoBrush); painter.drawRect(r); if (mShowHelp) { //Drawing the explanatory text. QRect helpRect = qApp->desktop()->screenGeometry(qApp->desktop()->primaryScreen()); QString helpTxt = tr("Lightscreen area mode:\nUse your mouse to draw a rectangle to capture.\nPress any key or right click to exit."); helpRect.setHeight(qRound((float)(helpRect.height() / 10))); // We get a decently sized rect where the text should be drawn (centered) // We draw the white contrasting background for the text, using the same text and options to get the boundingRect that the text will have. painter.setPen(QPen(Qt::white)); painter.setBrush(QBrush(QColor(255, 255, 255, 180), Qt::SolidPattern)); QRectF bRect = painter.boundingRect(helpRect, Qt::AlignCenter, helpTxt); // These four calls provide padding for the rect bRect.setWidth(bRect.width() + 12); bRect.setHeight(bRect.height() + 10); bRect.setX(bRect.x() - 12); bRect.setY(bRect.y() - 10); painter.drawRoundedRect(bRect, 8, 8); // Draw the text: painter.setPen(QPen(Qt::black)); painter.drawText(helpRect, Qt::AlignCenter, helpTxt); } if (!mSelection.isNull()) { // The grabbed region is everything which is covered by the drawn // rectangles (border included). This means that there is no 0px // selection, since a 0px wide rectangle will always be drawn as a line. QString txt = QString("%1x%2").arg(mSelection.width() == 0 ? 2 : mSelection.width()) .arg(mSelection.height() == 0 ? 2 : mSelection.height()); QRect textRect = painter.boundingRect(rect(), Qt::AlignLeft, txt); QRect boundingRect = textRect.adjusted(-4, 0, 0, 0); if (textRect.width() < r.width() - 2*mHandleSize && textRect.height() < r.height() - 2*mHandleSize && (r.width() > 100 && r.height() > 100)) // center, unsuitable for small selections { boundingRect.moveCenter(r.center()); textRect.moveCenter(r.center()); } else if (r.y() - 3 > textRect.height() && r.x() + textRect.width() < rect().right()) // on top, left aligned { boundingRect.moveBottomLeft(QPoint(r.x(), r.y() - 3)); textRect.moveBottomLeft(QPoint(r.x() + 2, r.y() - 3)); } else if (r.x() - 3 > textRect.width()) // left, top aligned { boundingRect.moveTopRight(QPoint(r.x() - 3, r.y())); textRect.moveTopRight(QPoint(r.x() - 5, r.y())); } else if (r.bottom() + 3 + textRect.height() < rect().bottom() && r.right() > textRect.width()) // at bottom, right aligned { boundingRect.moveTopRight(QPoint(r.right(), r.bottom() + 3)); textRect.moveTopRight(QPoint(r.right() - 2, r.bottom() + 3)); } else if (r.right() + textRect.width() + 3 < rect().width()) // right, bottom aligned { boundingRect.moveBottomLeft(QPoint(r.right() + 3, r.bottom())); textRect.moveBottomLeft(QPoint(r.right() + 5, r.bottom())); } // if the above didn't catch it, you are running on a very tiny screen... painter.setPen(textColor); painter.setBrush(textBackgroundColor); painter.drawRect(boundingRect); painter.drawText(textRect, txt); if ((r.height() > mHandleSize*2 && r.width() > mHandleSize*2) || !mMouseDown) { updateHandles(); painter.setPen(handleColor); handleColor.setAlpha(80); painter.setBrush(handleColor); painter.drawRects(handleMask().rects()); } } if (!mScreenshot->options().magnify) return; // Drawing the magnified version QPoint magStart, magEnd, drawPosition; QRect newRect; QRect pixmapRect = mScreenshot->pixmap().rect(); if (mMouseMagnifier) { drawPosition = mMousePos - QPoint(100, 100); magStart = mMousePos - QPoint(50, 50); magEnd = mMousePos + QPoint(50, 50); newRect = QRect(magStart, magEnd); } else { // So pretty.. oh so pretty. if (mMouseOverHandle == &mTLHandle) magStart = mSelection.topLeft(); else if (mMouseOverHandle == &mTRHandle) magStart = mSelection.topRight(); else if (mMouseOverHandle == &mBLHandle) magStart = mSelection.bottomLeft(); else if (mMouseOverHandle == &mBRHandle) magStart = mSelection.bottomRight(); else if (mMouseOverHandle == &mLHandle) magStart = QPoint(mSelection.left(), mSelection.center().y()); else if (mMouseOverHandle == &mTHandle) magStart = QPoint(mSelection.center().x(), mSelection.top()); else if (mMouseOverHandle == &mRHandle) magStart = QPoint(mSelection.right(), mSelection.center().y()); else if (mMouseOverHandle == &mBHandle) magStart = QPoint(mSelection.center().x(), mSelection.bottom()); else if (mMouseOverHandle == 0) magStart = mMousePos; magEnd = magStart; drawPosition = mSelection.bottomRight(); magStart -= QPoint(50, 50); magEnd += QPoint(50, 50); newRect = QRect(magStart, magEnd); if ((drawPosition.x()+newRect.width()*2) > pixmapRect.width()) drawPosition.setX(drawPosition.x()-newRect.width()*2); if ((drawPosition.y()+newRect.height()*2) > pixmapRect.height()) drawPosition.setY(drawPosition.y()-newRect.height()*2); if (drawPosition.y() == mSelection.bottomRight().y()-newRect.height()*2 && drawPosition.x() == mSelection.bottomRight().x()-newRect.width()*2) painter.setOpacity(0.7); } if (!pixmapRect.contains(newRect, true) || drawPosition.x() <= 0 || drawPosition.y() <= 0) { return; } QPixmap magnified = mScreenshot->pixmap().copy(newRect).scaled(QSize(newRect.width()*2, newRect.height()*2)); QPainter magPainter(&magnified); magPainter.setPen(QPen(QBrush(QColor(35, 35, 35)), 2)); // Same border pen magPainter.drawRect(magnified.rect()); if (!mMouseMagnifier) { magPainter.drawText(magnified.rect().center()-QPoint(4, -4), "+"); //Center minus the 4 pixels wide and across of the "+" -- TODO: Test alternative DPI settings. } painter.drawPixmap(drawPosition, magnified); }