35
37
#include "document/documentfactory.h"
38
#include <qgraphicssceneevent.h>
44
SvgImageView::SvgImageView(QGraphicsItem* parent)
45
: AbstractImageView(parent)
46
, mSvgItem(new QGraphicsSvgItem(this))
50
void SvgImageView::loadFromDocument()
52
QSvgRenderer* renderer = document()->svgRenderer();
54
kWarning() << "No SVG renderer. This should not happen!";
57
mSvgItem->setSharedRenderer(renderer);
60
void SvgImageView::onZoomChanged()
62
mSvgItem->setScale(zoom());
66
void SvgImageView::onImageOffsetChanged()
71
void SvgImageView::onScrollPosChanged(const QPointF& /* oldPos */)
76
void SvgImageView::adjustItemPos()
78
mSvgItem->setPos(imageOffset() - scrollPos());
81
//// SvgViewAdapter ////
40
82
struct SvgViewAdapterPrivate {
41
QSvgRenderer* mRenderer;
42
QGraphicsScene* mScene;
45
Document::Ptr mDocument;
46
QGraphicsSvgItem* mItem;
51
SvgViewAdapter::SvgViewAdapter(QWidget* parent)
52
: AbstractDocumentViewAdapter(parent)
53
, d(new SvgViewAdapterPrivate) {
54
d->mRenderer = new QSvgRenderer(this);
55
d->mScene = new QGraphicsScene(this);
56
d->mView = new QGraphicsView(d->mScene, parent);
57
d->mView->setFrameStyle(QFrame::NoFrame);
58
d->mView->setDragMode(QGraphicsView::ScrollHandDrag);
59
d->mView->viewport()->installEventFilter(this);
68
void SvgViewAdapter::installEventFilterOnViewWidgets(QObject* object) {
69
d->mView->viewport()->installEventFilter(object);
70
// Necessary to receive key{Press,Release} events
71
d->mView->installEventFilter(object);
75
SvgViewAdapter::~SvgViewAdapter() {
80
QCursor SvgViewAdapter::cursor() const {
81
return d->mView->viewport()->cursor();
85
void SvgViewAdapter::setCursor(const QCursor& cursor) {
86
d->mView->viewport()->setCursor(cursor);
90
void SvgViewAdapter::setDocument(Document::Ptr doc) {
92
connect(d->mDocument.data(), SIGNAL(loaded(const KUrl&)),
93
SLOT(loadFromDocument()));
98
void SvgViewAdapter::loadFromDocument() {
102
if (!d->mRenderer->load(d->mDocument->rawData())) {
103
kWarning() << "Decoding SVG failed";
106
d->mItem = new QGraphicsSvgItem();
107
d->mItem->setSharedRenderer(d->mRenderer);
108
d->mScene->addItem(d->mItem);
111
setZoom(computeZoomToFit());
116
Document::Ptr SvgViewAdapter::document() const {
121
void SvgViewAdapter::setZoomToFit(bool on) {
122
if (d->mZoomToFit == on) {
127
setZoom(computeZoomToFit());
129
zoomToFitChanged(on);
133
bool SvgViewAdapter::zoomToFit() const {
134
return d->mZoomToFit;
138
qreal SvgViewAdapter::zoom() const {
139
return d->mView->matrix().m11();
143
void SvgViewAdapter::setZoom(qreal zoom, const QPoint& /*center*/) {
145
matrix.scale(zoom, zoom);
146
d->mView->setMatrix(matrix);
147
emit zoomChanged(zoom);
151
qreal SvgViewAdapter::computeZoomToFit() const {
152
return qMin(computeZoomToFitWidth(), computeZoomToFitHeight());
156
qreal SvgViewAdapter::computeZoomToFitWidth() const {
157
int width = d->mScene->width();
158
return width != 0 ? (qreal(d->mView->viewport()->width()) / width) : 1;
162
qreal SvgViewAdapter::computeZoomToFitHeight() const {
163
int height = d->mScene->height();
164
return height != 0 ? (qreal(d->mView->viewport()->height()) / height) : 1;
168
bool SvgViewAdapter::eventFilter(QObject*, QEvent* event) {
169
if (event->type() == QEvent::Resize) {
171
setZoom(computeZoomToFit());
86
SvgViewAdapter::SvgViewAdapter()
87
: d(new SvgViewAdapterPrivate)
89
d->mView = new SvgImageView;
91
connect(d->mView, SIGNAL(zoomChanged(qreal)), SIGNAL(zoomChanged(qreal)));
92
connect(d->mView, SIGNAL(zoomToFitChanged(bool)), SIGNAL(zoomToFitChanged(bool)));
93
connect(d->mView, SIGNAL(scrollPosChanged()), SIGNAL(scrollPosChanged()));
96
SvgViewAdapter::~SvgViewAdapter()
101
QCursor SvgViewAdapter::cursor() const
103
return widget()->cursor();
106
void SvgViewAdapter::setCursor(const QCursor& cursor)
108
widget()->setCursor(cursor);
111
void SvgViewAdapter::setDocument(Document::Ptr doc)
113
d->mView->setDocument(doc);
116
Document::Ptr SvgViewAdapter::document() const
118
return d->mView->document();
121
void SvgViewAdapter::setZoomToFit(bool on)
123
d->mView->setZoomToFit(on);
126
bool SvgViewAdapter::zoomToFit() const
128
return d->mView->zoomToFit();
131
qreal SvgViewAdapter::zoom() const
133
return d->mView->zoom();
136
void SvgViewAdapter::setZoom(qreal zoom, const QPointF& center)
138
d->mView->setZoom(zoom, center);
141
qreal SvgViewAdapter::computeZoomToFit() const
143
return d->mView->computeZoomToFit();
146
QPointF SvgViewAdapter::scrollPos() const
148
return d->mView->scrollPos();
151
void SvgViewAdapter::setScrollPos(const QPointF& pos)
153
d->mView->setScrollPos(pos);