1 /*
2     SPDX-License-Identifier: GPL-2.0-or-later
3     SPDX-FileCopyrightText: 2012 Martin Kuettler <martin.kuettler@gmail.com>
4 */
5 
6 #include "worksheetimageitem.h"
7 #include "worksheet.h"
8 
9 #include <QMovie>
10 #include <QImage>
11 #include <QGraphicsSceneContextMenuEvent>
12 #include <QUrl>
13 #include <QMenu>
14 #include <QDebug>
15 #include <QPainter>
16 
WorksheetImageItem(QGraphicsObject * parent)17 WorksheetImageItem::WorksheetImageItem(QGraphicsObject* parent)
18     : QGraphicsObject(parent)
19 {
20     setFlag(QGraphicsItem::ItemIsFocusable, true);
21     connect(this, SIGNAL(menuCreated(QMenu*,QPointF)), parent,
22             SLOT(populateMenu(QMenu*,QPointF)), Qt::DirectConnection);
23 }
24 
~WorksheetImageItem()25 WorksheetImageItem::~WorksheetImageItem()
26 {
27     if (worksheet())
28         worksheet()->removeRequestedWidth(this);
29 }
30 
type() const31 int WorksheetImageItem::type() const
32 {
33     return Type;
34 }
35 
imageIsValid()36 bool WorksheetImageItem::imageIsValid()
37 {
38     return !m_pixmap.isNull();
39 }
40 
setGeometry(qreal x,qreal y,qreal w,bool centered)41 qreal WorksheetImageItem::setGeometry(qreal x, qreal y, qreal w, bool centered)
42 {
43     if (width() <= w && centered) {
44         setPos(x + w/2 - width()/2, y);
45     } else {
46         setPos(x, y);
47     }
48     worksheet()->setRequestedWidth(this, scenePos().x() + width());
49 
50     return height();
51 }
52 
height() const53 qreal WorksheetImageItem::height() const
54 {
55     return m_size.height();
56 }
57 
width() const58 qreal WorksheetImageItem::width() const
59 {
60     return m_size.width();
61 }
62 
size()63 QSizeF WorksheetImageItem::size()
64 {
65     return m_size;
66 }
67 
setSize(QSizeF size)68 void WorksheetImageItem::setSize(QSizeF size)
69 {
70     m_size = size;
71 
72     qreal width = scenePos().x() + size.width();
73     worksheet()->setRequestedWidth(this, width);
74 }
75 
imageSize()76 QSize WorksheetImageItem::imageSize()
77 {
78     return m_pixmap.size();
79 }
80 
boundingRect() const81 QRectF WorksheetImageItem::boundingRect() const
82 {
83     return QRectF(QPointF(0, 0), m_size);
84 }
85 
86 #include <QStyleOptionGraphicsItem>
87 
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)88 void WorksheetImageItem::paint(QPainter *painter,
89                                const QStyleOptionGraphicsItem *option,
90                                QWidget *widget)
91 {
92     Q_UNUSED(option);
93     Q_UNUSED(widget);
94     painter->drawPixmap(QRectF(QPointF(0,0), m_size), m_pixmap,
95                         m_pixmap.rect());
96     if (hasFocus())
97     {
98         painter->setPen(Qt::DashLine);
99         painter->drawRect(0, 0, width(), height());
100     }
101 }
102 
setEps(const QUrl & url)103 void WorksheetImageItem::setEps(const QUrl& url)
104 {
105     const QImage img = worksheet()->renderer()->renderToImage(url, Cantor::Renderer::EPS, &m_size);
106     m_pixmap = QPixmap::fromImage(img.convertToFormat(QImage::Format_ARGB32));
107 }
108 
setImage(QImage img)109 void WorksheetImageItem::setImage(QImage img)
110 {
111     m_pixmap = QPixmap::fromImage(img);
112     setSize(m_pixmap.size());
113 }
114 
setImage(QImage img,QSize displaySize)115 void WorksheetImageItem::setImage(QImage img, QSize displaySize)
116 {
117     m_pixmap = QPixmap::fromImage(img);
118     setSize(displaySize);
119 }
120 
setPixmap(QPixmap pixmap)121 void WorksheetImageItem::setPixmap(QPixmap pixmap)
122 {
123     m_pixmap = pixmap;
124 }
125 
pixmap() const126 QPixmap WorksheetImageItem::pixmap() const
127 {
128     return m_pixmap;
129 }
130 
populateMenu(QMenu * menu,QPointF pos)131 void WorksheetImageItem::populateMenu(QMenu* menu, QPointF pos)
132 {
133     emit menuCreated(menu, mapToParent(pos));
134 }
135 
contextMenuEvent(QGraphicsSceneContextMenuEvent * event)136 void WorksheetImageItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
137 {
138     QMenu *menu = worksheet()->createContextMenu();
139     populateMenu(menu, event->pos());
140 
141     menu->popup(event->screenPos());
142 }
143 
worksheet()144 Worksheet* WorksheetImageItem::worksheet()
145 {
146     return qobject_cast<Worksheet*>(scene());
147 }
148 
149 
150 
151