/* * 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 2 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 "UBGraphicsPixmapItem.h" #include #include #include #include "UBGraphicsScene.h" #include "UBGraphicsItemDelegate.h" #include "core/memcheck.h" UBGraphicsPixmapItem::UBGraphicsPixmapItem(QGraphicsItem* parent) : QGraphicsPixmapItem(parent) { mDelegate = new UBGraphicsItemDelegate(this, 0, true, true); mDelegate->init(); mDelegate->setFlippable(true); setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object); setTransformationMode(Qt::SmoothTransformation); setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setUuid(QUuid::createUuid()); //more logical solution is in creating uuid for element in element's constructor } UBGraphicsPixmapItem::~UBGraphicsPixmapItem() { if (mDelegate) delete mDelegate; } QVariant UBGraphicsPixmapItem::itemChange(GraphicsItemChange change, const QVariant &value) { QVariant newValue = mDelegate->itemChange(change, value); return QGraphicsPixmapItem::itemChange(change, newValue); } void UBGraphicsPixmapItem::setUuid(const QUuid &pUuid) { UBItem::setUuid(pUuid); setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); } void UBGraphicsPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { QMimeData* pMime = new QMimeData(); pMime->setImageData(pixmap().toImage()); mDelegate->setMimeData(pMime); int k = pixmap().width() / 100; QSize newSize(pixmap().width() / k, pixmap().height() / k); mDelegate->setDragPixmap(pixmap().scaled(newSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); if (mDelegate->mousePressEvent(event)) { //NOOP } else { // QGraphicsPixmapItem::mousePressEvent(event); } } void UBGraphicsPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (mDelegate->mouseMoveEvent(event)) { // NOOP; } else { QGraphicsPixmapItem::mouseMoveEvent(event); } } void UBGraphicsPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { mDelegate->mouseReleaseEvent(event); QGraphicsPixmapItem::mouseReleaseEvent(event); } void UBGraphicsPixmapItem::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; QGraphicsPixmapItem::paint(painter, &styleOption, widget); } UBItem* UBGraphicsPixmapItem::deepCopy() const { UBGraphicsPixmapItem* copy = new UBGraphicsPixmapItem(); copy->setPixmap(this->pixmap()); copy->setPos(this->pos()); 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 pixmaps are immutable - copy->setSourceUrl(this->sourceUrl()); // TODO UB 4.7 ... complete all members ? return copy; } UBGraphicsScene* UBGraphicsPixmapItem::scene() { return qobject_cast(QGraphicsItem::scene()); } void UBGraphicsPixmapItem::remove() { if (mDelegate) mDelegate->remove(true); } void UBGraphicsPixmapItem::setOpacity(qreal op) { QGraphicsPixmapItem::setOpacity(op); } qreal UBGraphicsPixmapItem::opacity() const { return QGraphicsPixmapItem::opacity(); }