/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "UBGraphicsSvgItem.h" #include #include "UBGraphicsScene.h" #include "UBGraphicsItemDelegate.h" #include "UBGraphicsPixmapItem.h" #include "core/memcheck.h" UBGraphicsSvgItem::UBGraphicsSvgItem(const QString& pFilePath, QGraphicsItem* parent) : QGraphicsSvgItem(pFilePath, parent) { init(); QFile f(pFilePath); if (f.open(QIODevice::ReadOnly)) { mFileData = f.readAll(); f.close(); } } UBGraphicsSvgItem::UBGraphicsSvgItem(const QByteArray& pFileData, QGraphicsItem* parent) : QGraphicsSvgItem(parent) { init(); QSvgRenderer* renderer = new QSvgRenderer(pFileData, this); setSharedRenderer(renderer); mFileData = pFileData; } void UBGraphicsSvgItem::init() { setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object); mDelegate = new UBGraphicsItemDelegate(this, 0, true, true); mDelegate->init(); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setCacheMode(QGraphicsItem::DeviceCoordinateCache); setMaximumCacheSize(boundingRect().size().toSize() * UB_MAX_ZOOM); } UBGraphicsSvgItem::~UBGraphicsSvgItem() { if (mDelegate) delete mDelegate; } QByteArray UBGraphicsSvgItem::fileData() const { return mFileData; } QVariant UBGraphicsSvgItem::itemChange(GraphicsItemChange change, const QVariant &value) { QVariant newValue = mDelegate->itemChange(change, value); return QGraphicsSvgItem::itemChange(change, newValue); } void UBGraphicsSvgItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (mDelegate->mousePressEvent(event)) { //NOOP } else { QGraphicsSvgItem::mousePressEvent(event); } } void UBGraphicsSvgItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (mDelegate->mouseMoveEvent(event)) { // NOOP; } else { QGraphicsSvgItem::mouseMoveEvent(event); } } void UBGraphicsSvgItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { mDelegate->mouseReleaseEvent(event); QGraphicsSvgItem::mouseReleaseEvent(event); } void UBGraphicsSvgItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { // Never draw the rubber band, we draw our custom selection with the DelegateFrame QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option); styleOption.state &= ~QStyle::State_Selected; QGraphicsSvgItem::paint(painter, &styleOption, widget); } UBItem* UBGraphicsSvgItem::deepCopy() const { UBGraphicsSvgItem* copy = new UBGraphicsSvgItem(this->fileData()); copy->setPos(this->pos()); copy->setZValue(this->zValue()); copy->setTransform(this->transform()); copy->setFlag(QGraphicsItem::ItemIsMovable, true); copy->setFlag(QGraphicsItem::ItemIsSelectable, true); copy->setData(UBGraphicsItemData::ItemLayerType, this->data(UBGraphicsItemData::ItemLayerType)); copy->setData(UBGraphicsItemData::ItemLocked, this->data(UBGraphicsItemData::ItemLocked)); copy->setUuid(this->uuid()); // this is OK for now as long as SVG are imutable copy->setSourceUrl(this->sourceUrl()); // TODO UB 4.7... complete all members ? return copy; } void UBGraphicsSvgItem::setRenderingQuality(RenderingQuality pRenderingQuality) { UBItem::setRenderingQuality(pRenderingQuality); if (pRenderingQuality == RenderingQualityHigh) { setCacheMode(QGraphicsItem::NoCache); } else { setCacheMode(QGraphicsItem::DeviceCoordinateCache); } } UBGraphicsScene* UBGraphicsSvgItem::scene() { return qobject_cast(QGraphicsItem::scene()); } void UBGraphicsSvgItem::remove() { if (mDelegate) mDelegate->remove(true); } UBGraphicsPixmapItem* UBGraphicsSvgItem::toPixmapItem() const { QImage image(renderer()->viewBox().size(), QImage::Format_ARGB32); QPainter painter(&image); renderer()->render(&painter); UBGraphicsPixmapItem *pixmapItem = new UBGraphicsPixmapItem(); pixmapItem->setPixmap(QPixmap::fromImage(image)); pixmapItem->setPos(this->pos()); pixmapItem->setZValue(this->zValue()); pixmapItem->setTransform(this->transform()); pixmapItem->setFlag(QGraphicsItem::ItemIsMovable, true); pixmapItem->setFlag(QGraphicsItem::ItemIsSelectable, true); pixmapItem->setData(UBGraphicsItemData::ItemLayerType, this->data(UBGraphicsItemData::ItemLayerType)); return pixmapItem; }