20 #include <QSvgRenderer>
28 , mMarkerMode( DefaultMarker )
29 , mArrowColor( QColor( 0, 0, 0 ) )
36 , mStartPoint( startPoint )
37 , mStopPoint( stopPoint )
38 , mMarkerMode( DefaultMarker )
39 , mArrowColor( QColor( 0, 0, 0 ) )
53 mPen.setColor( QColor( 0, 0, 0 ) );
57 setPen( QPen( QColor( 255, 255, 255, 0 ) ) );
58 setBrush( QBrush( QColor( 255, 255, 255, 0 ) ) );
72 arrowPen.setCapStyle( Qt::FlatCap );
74 painter->setPen( arrowPen );
98 double startPointXPos = (
mStartPoint.x() - transform().dx() ) / rect().width();
99 double startPointYPos = (
mStartPoint.y() - transform().dy() ) / rect().height();
100 double stopPointXPos = (
mStopPoint.x() - transform().dx() ) / rect().width();
101 double stopPointYPos = (
mStopPoint.y() - transform().dy() ) / rect().height();
103 mStartPoint.setX( rectangle.left() + startPointXPos * rectangle.width() );
104 mStartPoint.setY( rectangle.top() + startPointYPos * rectangle.height() );
105 mStopPoint.setX( rectangle.left() + stopPointXPos * rectangle.width() );
106 mStopPoint.setY( rectangle.top() + stopPointYPos * rectangle.height() );
113 QBrush arrowBrush = p->brush();
115 p->setBrush( arrowBrush );
123 double arrowHeadHeight;
134 int dpi = ( p->device()->logicalDpiX() + p->device()->logicalDpiY() ) / 2;
137 int imageHeight = arrowHeadHeight / 25.4 * dpi;
142 imageWidth *= qMin( viewScaleFactor, 10.0 );
143 imageHeight *= qMin( viewScaleFactor, 10.0 );
145 QImage markerImage( imageWidth, imageHeight, QImage::Format_ARGB32 );
146 QColor markerBG( 255, 255, 255, 0 );
147 markerImage.fill( markerBG.rgba() );
149 QPointF imageFixPoint;
160 imageFixPoint.setY( 0 );
184 fixPoint.setX( 0 ); fixPoint.setY( arrowHeadHeight / 2.0 );
188 fixPoint.setX( 0 ); fixPoint.setY( -arrowHeadHeight / 2.0 );
190 QPointF rotatedFixPoint;
191 double angleRad = ang / 180 *
M_PI;
192 rotatedFixPoint.setX( fixPoint.x() * cos( angleRad ) + fixPoint.y() * -sin( angleRad ) );
193 rotatedFixPoint.setY( fixPoint.x() * sin( angleRad ) + fixPoint.y() * cos( angleRad ) );
196 QPainter imagePainter( &markerImage );
197 r.render( &imagePainter );
200 p->translate( canvasPoint.x() - rotatedFixPoint.x() , canvasPoint.y() - rotatedFixPoint.y() );
204 p->drawImage( QRectF( 0, 0,
mArrowHeadWidth, arrowHeadHeight ), markerImage, QRectF( 0, 0, imageWidth, imageHeight ) );
213 if ( !r.load( svgPath ) )
221 QRect viewBox = r.viewBox();
229 if ( !r.load( svgPath ) )
237 QRect viewBox = r.viewBox();
244 mPen.setWidthF( width );
268 enlarge =
mPen.widthF() / 2.0;
276 rect.adjust( -enlarge, -enlarge, enlarge, enlarge );
282 QDomElement composerArrowElem = doc.createElement(
"ComposerArrow" );
283 composerArrowElem.setAttribute(
"outlineWidth",
outlineWidth() );
285 composerArrowElem.setAttribute(
"markerMode",
mMarkerMode );
287 composerArrowElem.setAttribute(
"endMarkerFile",
mEndMarkerFile );
290 QDomElement arrowColorElem = doc.createElement(
"ArrowColor" );
291 arrowColorElem.setAttribute(
"red",
mArrowColor.red() );
292 arrowColorElem.setAttribute(
"green",
mArrowColor.green() );
293 arrowColorElem.setAttribute(
"blue",
mArrowColor.blue() );
294 arrowColorElem.setAttribute(
"alpha",
mArrowColor.alpha() );
295 composerArrowElem.appendChild( arrowColorElem );
298 QDomElement startPointElem = doc.createElement(
"StartPoint" );
299 startPointElem.setAttribute(
"x",
mStartPoint.x() );
300 startPointElem.setAttribute(
"y",
mStartPoint.y() );
301 composerArrowElem.appendChild( startPointElem );
304 QDomElement stopPointElem = doc.createElement(
"StopPoint" );
305 stopPointElem.setAttribute(
"x",
mStopPoint.x() );
306 stopPointElem.setAttribute(
"y",
mStopPoint.y() );
307 composerArrowElem.appendChild( stopPointElem );
309 elem.appendChild( composerArrowElem );
310 return _writeXML( composerArrowElem, doc );
315 mArrowHeadWidth = itemElem.attribute(
"arrowHeadWidth",
"2.0" ).toDouble();
316 mPen.setWidthF( itemElem.attribute(
"outlineWidth",
"1.0" ).toDouble() );
318 setEndMarker( itemElem.attribute(
"endMarkerFile",
"" ) );
322 QDomNodeList arrowColorList = itemElem.elementsByTagName(
"ArrowColor" );
323 if ( arrowColorList.size() > 0 )
325 QDomElement arrowColorElem = arrowColorList.at( 0 ).toElement();
326 int red = arrowColorElem.attribute(
"red",
"0" ).toInt();
327 int green = arrowColorElem.attribute(
"green",
"0" ).toInt();
328 int blue = arrowColorElem.attribute(
"blue",
"0" ).toInt();
329 int alpha = arrowColorElem.attribute(
"alpha",
"255" ).toInt();
335 QDomNodeList composerItemList = itemElem.elementsByTagName(
"ComposerItem" );
336 if ( composerItemList.size() > 0 )
338 QDomElement composerItemElem = composerItemList.at( 0 ).toElement();
343 QDomNodeList startPointList = itemElem.elementsByTagName(
"StartPoint" );
344 if ( startPointList.size() > 0 )
346 QDomElement startPointElem = startPointList.at( 0 ).toElement();
347 mStartPoint.setX( startPointElem.attribute(
"x",
"0.0" ).toDouble() );
348 mStartPoint.setY( startPointElem.attribute(
"y",
"0.0" ).toDouble() );
352 QDomNodeList stopPointList = itemElem.elementsByTagName(
"StopPoint" );
353 if ( stopPointList.size() > 0 )
355 QDomElement stopPointElem = stopPointList.at( 0 ).toElement();
356 mStopPoint.setX( stopPointElem.attribute(
"x",
"0.0" ).toDouble() );
357 mStopPoint.setY( stopPointElem.attribute(
"y",
"0.0" ).toDouble() );