You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/ksvg/test/external/SVGTestWidget.cpp

205 lines
4.9 KiB

// Very small test app to look at ksvg performance without konqueror overhead (Rob)
#include "SVGTestWidget.moc"
#include "DocumentFactory.h"
#include "CanvasFactory.h"
#include "SVGCircleElement.h"
#include "SVGAnimatedLength.h"
#include "SVGLength.h"
#include "SVGSVGElement.h"
#include "SVGEventImpl.h"
#include "KSVGCanvas.h"
#include "CanvasItem.h"
#include <kcursor.h>
using namespace KSVG;
SVGTestWidget::SVGTestWidget(const KURL &url)
{
setBackgroundColor(TQt::white);
setMouseTracking(true);
setFocusPolicy(TQWidget::WheelFocus);
m_doc = DocumentFactory::self()->requestDocument(TQT_TQOBJECT(this), TQT_SLOT(slotRenderingFinished()));
if(!m_doc)
return;
resize(450, 450);
m_canvas = CanvasFactory::self()->loadCanvas(450, 450);
if(!m_canvas)
return;
m_canvas->setup(TQT_TQPAINTDEVICE(this), TQT_TQPAINTDEVICE(this));
if(!DocumentFactory::self()->attachCanvas(m_canvas, m_doc))
return;
if(!DocumentFactory::self()->startParsing(m_doc, url))
return;
}
SVGTestWidget::~SVGTestWidget()
{
delete m_canvas;
delete m_doc;
}
void SVGTestWidget::slotRenderingFinished()
{
TQRect rect(0, 0, width(), height());
m_canvas->blit(rect, true);
SVGElement test = m_doc->rootElement().getElementById("test");
if(test.nodeName() == "circle")
{
SVGCircleElement c = dom_cast(SVGCircleElement, test);
c.r().baseVal().setValue(150);
c.setAttribute("fill", "blue");
}
}
void SVGTestWidget::paintEvent(TQPaintEvent *event)
{
m_canvas->update();
m_canvas->blit(event->rect(), true);
}
void SVGTestWidget::resizeEvent(TQResizeEvent *event)
{
int w = event->size().width();
int h = event->size().height();
m_canvas->resize(w, h);
resize(w, h);
m_canvas->blit();
}
/*
KSVG::SVGMouseEventImpl *newMouseEvent(SVGDocument *doc, KSVG::SVGEventImpl::EventId id, TQMouseEvent *event)
{
DOM::AbstractView temp;
int clientX = event->x();
int clientY = event->y();
if(doc && doc->rootElement())
{
clientX = int(clientX / doc->rootElement()->currentScale());
clientY = int(clientY / doc->rootElement()->currentScale());
}
int button = 0;
if(event->stateAfter() & Qt::LeftButton)
button = 1;
else if(event->stateAfter() & Qt::MidButton)
button = 2;
else if(event->stateAfter() & Qt::RightButton)
button = 3;
KSVG::SVGMouseEventImpl *mev = new KSVG::SVGMouseEventImpl(id, // type
true, // canBubbleArg
true, // cancelableArg
temp, // view
0, // detail
event->globalX(), //screenXArg
event->globalY(), // screenYArg,
clientX, // clientXArg
clientY, // clientYArg
(event->state() & TQt::ControlButton), // ctrlKeyArg
(event->state() & TQt::AltButton), // altKeyArg
(event->state() & TQt::ShiftButton), // shiftKeyArg
(event->state() & TQt::MetaButton), // metaKeyArg
button, // buttonArg
0);
mev->ref();
return mev;
}
void SVGTestWidget::mouseMoveEvent(TQMouseEvent *event)
{
if(event->state() & TQMouseEvent::ControlButton && event->state() & TQMouseEvent::LeftButton)
{
if(m_panningPos.isNull())
m_panningPos = event->pos();
else
{
TQPoint panPoint = m_oldPanningPos - (m_panningPos - event->pos());
m_doc->rootElement()->setCurrentTranslate(panPoint);
// m_doc->syncCachedMatrices(); FIXME
m_canvas->update(panPoint);
}
return;
}
else if(event->state() & TQMouseEvent::ControlButton)
return;
}
void SVGTestWidget::mousePressEvent(TQMouseEvent *event)
{
if(event->state() & TQMouseEvent::ControlButton)
return;
KSVG::SVGMouseEventImpl *mev = newMouseEvent(m_doc, KSVG::SVGEventImpl::MOUSEDOWN_EVENT, event);
if(m_doc && m_doc->rootElement())
m_doc->rootElement()->prepareMouseEvent(event->pos(), event->pos(), mev);
mev->deref();
}
void SVGTestWidget::mouseReleaseEvent(TQMouseEvent *event)
{
if(!m_panningPos.isNull())
{
m_oldPanningPos = m_oldPanningPos - (m_panningPos - event->pos());
m_panningPos.setX(0);
m_panningPos.setY(0);
}
if(event->state() & TQMouseEvent::ControlButton)
return;
// only simulate mouse clicks for now
KSVG::SVGMouseEventImpl *mev = newMouseEvent(m_doc, KSVG::SVGEventImpl::MOUSEUP_EVENT, event);
if(m_doc && m_doc->rootElement())
m_doc->rootElement()->prepareMouseEvent(event->pos(), event->pos(), mev);
mev->deref();
}
void SVGTestWidget::keyPressEvent(TQKeyEvent *event)
{
if(event->stateAfter() & TQMouseEvent::ControlButton)
{
setCursor(KCursor::sizeAllCursor());
return;
}
}
void SVGTestWidget::keyReleaseEvent(TQKeyEvent *event)
{
if(event->state() & TQMouseEvent::ControlButton)
{
setCursor(KCursor::arrowCursor());
return;
}
SVGSVGElementImpl *root = m_doc->rootElement();
if(!root) return;
if(event->key() == TQt::Key_Minus)
{
erase(0, 0, m_canvas->width(), m_canvas->height());
float zoomFactor = root->currentScale() / 1.2;
root->setCurrentScale(zoomFactor);
m_doc->syncCachedMatrices();
m_canvas->update(zoomFactor);
}
else if(event->key() == TQt::Key_Plus)
{
float zoomFactor = root->currentScale() * 1.2;
root->setCurrentScale(zoomFactor);
m_doc->syncCachedMatrices();
m_canvas->update(zoomFactor);
}
}
*/