File indexing completed on 2024-04-28 11:21:04

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2012 Martin Kuettler <martin.kuettler@gmail.com>
0004 */
0005 
0006 #include "worksheetimageitem.h"
0007 #include "worksheet.h"
0008 
0009 #include <QGraphicsSceneContextMenuEvent>
0010 #include <QMenu>
0011 #include <QPainter>
0012 #include <QStyleOptionGraphicsItem>
0013 
0014 WorksheetImageItem::WorksheetImageItem(QGraphicsObject* parent)
0015     : QGraphicsObject(parent)
0016 {
0017     setFlag(QGraphicsItem::ItemIsFocusable, true);
0018     connect(this, SIGNAL(menuCreated(QMenu*,QPointF)), parent,
0019             SLOT(populateMenu(QMenu*,QPointF)), Qt::DirectConnection);
0020 }
0021 
0022 WorksheetImageItem::~WorksheetImageItem()
0023 {
0024     if (worksheet())
0025         worksheet()->removeRequestedWidth(this);
0026 }
0027 
0028 int WorksheetImageItem::type() const
0029 {
0030     return Type;
0031 }
0032 
0033 bool WorksheetImageItem::imageIsValid()
0034 {
0035     return !m_pixmap.isNull();
0036 }
0037 
0038 qreal WorksheetImageItem::setGeometry(qreal x, qreal y, qreal w, bool centered)
0039 {
0040     if (width() <= w && centered)
0041         setPos(x + w/2 - width()/2, y);
0042     else
0043         setPos(x, y);
0044 
0045     worksheet()->setRequestedWidth(this, scenePos().x() + width());
0046 
0047     return height();
0048 }
0049 
0050 qreal WorksheetImageItem::height() const
0051 {
0052     return m_size.height();
0053 }
0054 
0055 qreal WorksheetImageItem::width() const
0056 {
0057     return m_size.width();
0058 }
0059 
0060 QSizeF WorksheetImageItem::size()
0061 {
0062     return m_size;
0063 }
0064 
0065 void WorksheetImageItem::setSize(QSizeF size)
0066 {
0067     m_size = size;
0068 
0069     qreal width = scenePos().x() + size.width();
0070     worksheet()->setRequestedWidth(this, width);
0071 }
0072 
0073 QSize WorksheetImageItem::imageSize()
0074 {
0075     return m_pixmap.size();
0076 }
0077 
0078 QRectF WorksheetImageItem::boundingRect() const
0079 {
0080     return QRectF(QPointF(0, 0), m_size);
0081 }
0082 
0083 void WorksheetImageItem::paint(QPainter *painter,
0084                                const QStyleOptionGraphicsItem *option,
0085                                QWidget *widget)
0086 {
0087     Q_UNUSED(option);
0088     Q_UNUSED(widget);
0089     painter->drawPixmap(QRectF(QPointF(0,0), m_size), m_pixmap,
0090                         m_pixmap.rect());
0091     if (hasFocus())
0092     {
0093         painter->setPen(Qt::DashLine);
0094         painter->drawRect(0, 0, width(), height());
0095     }
0096 }
0097 
0098 void WorksheetImageItem::setEps(const QUrl& url)
0099 {
0100     const QImage img = worksheet()->renderer()->renderToImage(url, Cantor::Renderer::EPS, &m_size);
0101     m_pixmap = QPixmap::fromImage(img.convertToFormat(QImage::Format_ARGB32));
0102 }
0103 
0104 void WorksheetImageItem::setImage(QImage img)
0105 {
0106     m_pixmap = QPixmap::fromImage(img);
0107     setSize(m_pixmap.size());
0108 }
0109 
0110 void WorksheetImageItem::setImage(QImage img, QSize displaySize)
0111 {
0112     m_pixmap = QPixmap::fromImage(img);
0113     setSize(displaySize);
0114 }
0115 
0116 void WorksheetImageItem::setPixmap(QPixmap pixmap)
0117 {
0118     m_pixmap = pixmap;
0119 }
0120 
0121 QPixmap WorksheetImageItem::pixmap() const
0122 {
0123     return m_pixmap;
0124 }
0125 
0126 void WorksheetImageItem::populateMenu(QMenu* menu, QPointF pos)
0127 {
0128     emit menuCreated(menu, mapToParent(pos));
0129 }
0130 
0131 void WorksheetImageItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
0132 {
0133     QMenu *menu = worksheet()->createContextMenu();
0134     populateMenu(menu, event->pos());
0135 
0136     menu->popup(event->screenPos());
0137 }
0138 
0139 Worksheet* WorksheetImageItem::worksheet()
0140 {
0141     return qobject_cast<Worksheet*>(scene());
0142 }