2022-06-19 16:17:38 +08:00
|
|
|
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
2019-09-29 15:52:35 +08:00
|
|
|
#include "graphicsscene.h"
|
|
|
|
|
|
|
|
#include <QGraphicsSceneMouseEvent>
|
|
|
|
#include <QMimeData>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QGraphicsItem>
|
|
|
|
#include <QUrl>
|
2019-09-29 23:53:29 +08:00
|
|
|
#include <QGraphicsSvgItem>
|
2019-09-30 13:11:43 +08:00
|
|
|
#include <QMovie>
|
|
|
|
#include <QLabel>
|
2020-01-01 14:51:46 +08:00
|
|
|
#include <QPainter>
|
2019-09-29 15:52:35 +08:00
|
|
|
|
2021-06-20 14:59:44 +08:00
|
|
|
class PGraphicsPixmapItem : public QGraphicsPixmapItem
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PGraphicsPixmapItem(const QPixmap &pixmap, QGraphicsItem *parent = nullptr)
|
|
|
|
: QGraphicsPixmapItem(pixmap, parent)
|
|
|
|
{}
|
|
|
|
|
|
|
|
void setScaleHint(float scaleHint) {
|
|
|
|
m_scaleHint = scaleHint;
|
|
|
|
}
|
|
|
|
|
2022-04-03 19:08:14 +08:00
|
|
|
const QPixmap & scaledPixmap(float scaleHint) {
|
|
|
|
if (qFuzzyCompare(scaleHint, m_cachedScaleHint)) return m_cachedPixmap;
|
|
|
|
QSizeF resizedScale(boundingRect().size());
|
|
|
|
resizedScale *= scaleHint;
|
|
|
|
m_cachedPixmap = pixmap().scaled(
|
|
|
|
resizedScale.toSize(),
|
|
|
|
Qt::KeepAspectRatio,
|
|
|
|
Qt::SmoothTransformation);
|
|
|
|
m_cachedScaleHint = scaleHint;
|
|
|
|
return m_cachedPixmap;
|
|
|
|
}
|
|
|
|
|
2021-06-20 14:59:44 +08:00
|
|
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
|
|
QWidget *widget) override
|
|
|
|
{
|
|
|
|
if (transformationMode() == Qt::FastTransformation) {
|
|
|
|
return QGraphicsPixmapItem::paint(painter, option, widget);
|
|
|
|
} else {
|
|
|
|
// painter->setRenderHints(QPainter::Antialiasing);
|
|
|
|
painter->drawPixmap(QRectF(offset(), boundingRect().size()).toRect(),
|
2022-04-03 19:08:14 +08:00
|
|
|
scaledPixmap(m_scaleHint));
|
2021-06-20 14:59:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
float m_scaleHint = 1;
|
2022-04-03 19:08:14 +08:00
|
|
|
float m_cachedScaleHint = -1;
|
|
|
|
QPixmap m_cachedPixmap;
|
2021-06-20 14:59:44 +08:00
|
|
|
};
|
|
|
|
|
2019-09-29 15:52:35 +08:00
|
|
|
GraphicsScene::GraphicsScene(QObject *parent)
|
|
|
|
: QGraphicsScene(parent)
|
|
|
|
{
|
2019-10-06 17:31:27 +08:00
|
|
|
showText(tr("Drag image here"));
|
2019-09-29 15:52:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
GraphicsScene::~GraphicsScene()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void GraphicsScene::showImage(const QPixmap &pixmap)
|
|
|
|
{
|
|
|
|
this->clear();
|
2021-06-20 14:59:44 +08:00
|
|
|
PGraphicsPixmapItem * pixmapItem = new PGraphicsPixmapItem(pixmap);
|
|
|
|
this->addItem(pixmapItem);
|
2020-09-26 10:47:28 +08:00
|
|
|
pixmapItem->setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
|
|
|
|
m_theThing = pixmapItem;
|
2019-09-29 15:52:35 +08:00
|
|
|
this->setSceneRect(m_theThing->boundingRect());
|
|
|
|
}
|
|
|
|
|
|
|
|
void GraphicsScene::showText(const QString &text)
|
|
|
|
{
|
|
|
|
this->clear();
|
|
|
|
QGraphicsTextItem * textItem = this->addText(text);
|
|
|
|
textItem->setDefaultTextColor(QColor("White"));
|
|
|
|
m_theThing = textItem;
|
|
|
|
this->setSceneRect(m_theThing->boundingRect());
|
|
|
|
}
|
2019-09-29 23:53:29 +08:00
|
|
|
|
|
|
|
void GraphicsScene::showSvg(const QString &filepath)
|
|
|
|
{
|
|
|
|
this->clear();
|
|
|
|
QGraphicsSvgItem * svgItem = new QGraphicsSvgItem(filepath);
|
|
|
|
this->addItem(svgItem);
|
|
|
|
m_theThing = svgItem;
|
|
|
|
this->setSceneRect(m_theThing->boundingRect());
|
|
|
|
}
|
2019-09-30 13:11:43 +08:00
|
|
|
|
2021-04-15 00:00:18 +08:00
|
|
|
void GraphicsScene::showAnimated(const QString &filepath)
|
2019-09-30 13:11:43 +08:00
|
|
|
{
|
|
|
|
this->clear();
|
|
|
|
QLabel * label = new QLabel;
|
2021-05-21 00:04:22 +08:00
|
|
|
QMovie * movie = new QMovie(filepath, QByteArray(), label);
|
2019-10-01 10:37:14 +08:00
|
|
|
label->setStyleSheet("background-color:rgba(225,255,255,0);");
|
2019-09-30 13:11:43 +08:00
|
|
|
label->setMovie(movie);
|
|
|
|
this->addWidget(label);
|
|
|
|
movie->start();
|
2019-10-02 22:53:13 +08:00
|
|
|
m_theThing = this->addRect(QRect(QPoint(0, 0), label->sizeHint()),
|
|
|
|
QPen(Qt::transparent));
|
2019-09-30 13:11:43 +08:00
|
|
|
this->setSceneRect(m_theThing->boundingRect());
|
|
|
|
}
|
2020-01-01 14:51:46 +08:00
|
|
|
|
2021-06-20 14:59:44 +08:00
|
|
|
bool GraphicsScene::trySetTransformationMode(Qt::TransformationMode mode, float scaleHint)
|
2020-02-13 19:45:14 +08:00
|
|
|
{
|
2021-06-20 14:59:44 +08:00
|
|
|
PGraphicsPixmapItem * pixmapItem = qgraphicsitem_cast<PGraphicsPixmapItem *>(m_theThing);
|
2020-02-13 19:45:14 +08:00
|
|
|
if (pixmapItem) {
|
|
|
|
pixmapItem->setTransformationMode(mode);
|
2021-06-20 14:59:44 +08:00
|
|
|
pixmapItem->setScaleHint(scaleHint);
|
2020-02-13 19:45:14 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-01-01 14:51:46 +08:00
|
|
|
QPixmap GraphicsScene::renderToPixmap()
|
|
|
|
{
|
2021-07-06 13:25:53 +08:00
|
|
|
PGraphicsPixmapItem * pixmapItem = qgraphicsitem_cast<PGraphicsPixmapItem *>(m_theThing);
|
|
|
|
if (pixmapItem) {
|
|
|
|
return pixmapItem->pixmap();
|
|
|
|
}
|
|
|
|
|
2020-01-01 14:51:46 +08:00
|
|
|
QPixmap pixmap(sceneRect().toRect().size());
|
2020-01-05 14:38:39 +08:00
|
|
|
pixmap.fill(Qt::transparent);
|
2020-01-01 14:51:46 +08:00
|
|
|
QPainter p(&pixmap);
|
|
|
|
render(&p, sceneRect());
|
|
|
|
|
|
|
|
return pixmap;
|
|
|
|
}
|