3 SVGViewer::SVGViewer(QWidget
*parent
) : QGraphicsView(parent
) {
5 setScene(new QGraphicsScene(this));
6 setTransformationAnchor(QGraphicsView::AnchorUnderMouse
);
7 setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate
);
8 setOptimizationFlag(QGraphicsView::DontSavePainterState
, true);
11 void SVGViewer::paintEvent(QPaintEvent
*event
) {
12 QGraphicsView::paintEvent(event
);
15 QString
SVGViewer::SVGRemoveWhitespace(QString text
) {
16 /* Remove whitespace according to SVG spec.
21 text
= text
.remove('\n');
22 /* Replace tabs by spaces */
23 text
.replace("\t", " ");
24 text
.replace("\v", " ");
25 /* Remove leading and traling spaces */
27 for(i
=0; i
<text
.length(); i
++) {
28 if(!(text
[i
] == ' ')) {
33 for(i
=text
.length()-1; i
>=0; i
--) {
34 if(!(text
[i
] == ' ')) {
39 /* Squash consecutive spaces into a single space */
40 int len
= text
.length();
44 text
.replace(" ", " ");
45 newlen
= text
.length();
50 QString
SVGViewer::SVGPreserveWhitespace(QString text
) {
51 /* Preserve whitespace according to SVG spec.
52 (xml:space="preserve") */
54 /* Replace newlines and tabs by spaces */
55 text
.replace("\n", " ");
56 text
.replace("\t", " ");
57 text
.replace("\v", " ");
62 QString
SVGViewer::SVGReadText(QXmlStreamReader
* reader
, bool keepWhitespace
) {
64 return SVGPreserveWhitespace(reader
->text().toString());
66 return SVGRemoveWhitespace(reader
->text().toString());
70 bool SVGViewer::openFile(QString fileName
) {
71 /* Read SVG's XML to gather some metadata and settings. */
72 /* FIXME: Only works for non-compressed SVGs */
73 QFile
xmlFile(fileName
);
74 if (!xmlFile
.open(QFile::ReadOnly
)) {
75 QMessageBox::critical(this, tr("Error"), tr("The file could not be opened."));
78 QByteArray bytes
= xmlFile
.readAll();
80 QXmlStreamReader
* xmlReader
= new QXmlStreamReader();
81 xmlReader
->addData(bytes
);
83 /* Default values for various settings according to SVG spec. */
88 /* Waiter variables remember element names */
89 bool waiterTitle
= false;
90 bool waiterDesc
= false;
91 bool keepWhitespace
= false;
93 while(!xmlReader
->atEnd()) {
94 if(xmlReader
->readNext()) {
95 if(xmlReader
->tokenType() == QXmlStreamReader::StartElement
) {
96 if(xmlReader
->namespaceUri() == "http://www.w3.org/2000/svg") {
97 if(xmlReader
->name() == "svg") {
98 QString
s(xmlReader
->attributes().value("zoomAndPan").toString());
99 /* Check if zooming and pan in XML is disabled */
103 } else if(xmlReader
->name() == "title") {
105 } else if(xmlReader
->name() == "desc") {
108 if(xmlReader
->attributes().value("xml:space").toString() == "preserve") {
109 keepWhitespace
= true;
111 keepWhitespace
= false;
114 } else if(xmlReader
->tokenType() == QXmlStreamReader::Characters
) {
115 if(waiterTitle
&& title
.isNull()) {
116 title
= SVGReadText(xmlReader
, keepWhitespace
);
118 } else if(waiterDesc
&& desc
.isNull()) {
119 desc
= SVGReadText(xmlReader
, keepWhitespace
);
126 /* Create SVG item and load the file */
127 svgItem
= new QGraphicsSvgItem(fileName
);
128 svgRenderer
= svgItem
->renderer();
130 /* Reject invalid SVG documents */
131 if (!svgRenderer
->isValid()) {
132 /* TODO: Also show details in error message */
133 QMessageBox::critical(this, tr("Invalid SVG document"),
134 tr("The selected file is not a valid SVG document and could not be opened."));
140 setDragMode(ScrollHandDrag
);
148 svgItem
->setFlags(QGraphicsItem::ItemClipsToShape
);
149 svgItem
->setCacheMode(QGraphicsItem::NoCache
);
152 scene()->addItem(svgItem
);
156 void SVGViewer::closeFile() {
159 /* Reset view parameters */
165 void SVGViewer::zoomIn() {
166 if(zoomAndPan
&& svgItem
!= NULL
) {
170 void SVGViewer::zoomOut() {
171 if(zoomAndPan
&& svgItem
!= NULL
) {
175 void SVGViewer::zoomReset() {
176 if(zoomAndPan
&& svgItem
!= NULL
) {
181 void SVGViewer::zoomSet(qreal factor
) {
182 if(zoomAndPan
&& svgItem
!= NULL
) {
188 void SVGViewer::zoomChange(qreal factor
) {
189 if(zoomAndPan
&& svgItem
!= NULL
) {
190 scale(factor
, factor
);
194 #ifndef QT_NO_WHEELEVENT
195 void SVGViewer::wheelEvent(QWheelEvent
*event
) {
196 /* Change zoom on using the mouse wheel */
197 qreal factor
= qPow(1.2, event
->delta() / 240.0);
203 bool SVGViewer::getZoomAndPan() {
207 bool SVGViewer::getAnim() {
208 if(svgItem
!= NULL
) {
209 return svgRenderer
->animated();
215 QString
SVGViewer::getTitle() {
219 QString
SVGViewer::getDesc() {
223 QSize
SVGViewer::getImageSize() {
224 if(svgItem
!= NULL
) {
225 return svgRenderer
->defaultSize();