0
0
mirror of https://github.com/fralx/LimeReport.git synced 2024-12-23 16:22:58 +03:00
LimeReport/limereport/items/lrsvgitem.cpp
Андрей Лухнов 0fca7169d3 Define code style and format all source file using clang-format-14
except those placed in 3rdparty directories.
2024-09-19 21:09:38 +03:00

185 lines
5.7 KiB
C++

#include "lrsvgitem.h"
#include "lrdesignelementsfactory.h"
#include "lrimageitemeditor.h"
#include "lrpagedesignintf.h"
#include <QtSvg>
namespace {
const QString xmlTag = "SVGItem";
LimeReport::BaseDesignIntf* createSVGItem(QObject* owner, LimeReport::BaseDesignIntf* parent)
{
return new LimeReport::SVGItem(owner, parent);
}
bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator(
xmlTag, LimeReport::ItemAttribs(QObject::tr("SVG Item"), "Item"), createSVGItem);
} // namespace
namespace LimeReport {
SVGItem::SVGItem(QObject* owner, QGraphicsItem* parent): ItemDesignIntf(xmlTag, owner, parent) { }
void SVGItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->save();
if (isSelected())
painter->setOpacity(Const::SELECTION_OPACITY);
else
painter->setOpacity(qreal(opacity()) / 100);
if (m_image.isNull() && itemMode() == DesignMode) {
QString text;
painter->setFont(transformToSceneFont(QFont("Arial", 10)));
painter->setPen(Qt::black);
if (!datasource().isEmpty() && !field().isEmpty())
text = datasource() + "." + field();
else
text = tr("SVG Image");
painter->drawText(rect().adjusted(4, 4, -4, -4), Qt::AlignCenter, text);
} else if (!m_image.isEmpty()) {
QSvgRenderer render;
render.load(m_image);
render.render(painter, option->rect);
}
ItemDesignIntf::paint(painter, option, widget);
painter->restore();
}
QByteArray SVGItem::imageAsByteArray() const { return m_image; }
void SVGItem::setImageAsByteArray(QByteArray image) { setImage(image); }
QString SVGItem::fileFilter() const { return tr("SVG (*.svg)"); }
void SVGItem::preparePopUpMenu(QMenu& menu)
{
QAction* editAction = menu.addAction(QIcon(":/report/images/edit_pecil2.png"), tr("Edit"));
menu.insertAction(menu.actions().at(0), editAction);
menu.insertSeparator(menu.actions().at(1));
menu.addSeparator();
QAction* action = menu.addAction(tr("Watermark"));
action->setCheckable(true);
action->setChecked(isWatermark());
}
void SVGItem::processPopUpAction(QAction* action)
{
if (action->text().compare(tr("Watermark")) == 0) {
page()->setPropertyToSelectedItems("watermark", action->isChecked());
}
if (action->text().compare(tr("Edit")) == 0) {
this->showEditorDialog();
}
ItemDesignIntf::processPopUpAction(action);
}
QWidget* SVGItem::defaultEditor()
{
ImageItemEditor* editor = new ImageItemEditor(this);
editor->setAttribute(Qt::WA_DeleteOnClose);
return editor;
};
BaseDesignIntf* SVGItem::createSameTypeItem(QObject* owner, QGraphicsItem* parent)
{
return new SVGItem(owner, parent);
}
void SVGItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight)
{
Q_UNUSED(maxHeight)
if (m_image.isEmpty()) {
if (!m_datasource.isEmpty() && !m_field.isEmpty()) {
IDataSource* ds = dataManager->dataSource(m_datasource);
if (ds) {
QVariant data = ds->data(m_field);
m_image = data.value<QByteArray>();
}
} else if (!m_resourcePath.isEmpty()) {
m_resourcePath
= expandUserVariables(m_resourcePath, pass, NoEscapeSymbols, dataManager);
m_resourcePath = expandDataFields(m_resourcePath, NoEscapeSymbols, dataManager);
m_image = imageFromResource(m_resourcePath);
} else if (!m_variable.isEmpty()) {
// TODO: Migrate to QMetaType
QVariant data = dataManager->variable(m_variable);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
if (data.typeId() == QMetaType::QString) {
#else
if (data.type() == QVariant::String) {
#endif
m_image = imageFromResource(data.toString());
} else {
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
if (data.typeId() == QMetaType::QByteArray) {
#else
if (data.type() == QVariant::ByteArray) {
#endif
m_image = data.value<QByteArray>();
}
}
}
}
}
QByteArray SVGItem::imageFromResource(QString resourcePath)
{
QFile file(resourcePath);
if (file.open(QIODevice::ReadOnly)) {
return file.readAll();
}
return QByteArray();
}
QString SVGItem::variable() const { return m_variable; }
void SVGItem::setVariable(const QString& variable)
{
if (m_variable != variable) {
QString oldValue = m_variable;
m_variable = variable;
update();
notify("variable", oldValue, m_variable);
}
m_variable = variable;
}
bool SVGItem::isNeedUpdateSize(RenderPass) const { return m_image.isNull(); }
QString SVGItem::resourcePath() const { return m_resourcePath; }
void SVGItem::setResourcePath(const QString& resourcePath)
{
if (m_resourcePath != resourcePath) {
QString oldValue = m_resourcePath;
m_resourcePath = resourcePath;
QFile file(resourcePath);
if (file.open(QIODevice::ReadOnly)) {
m_image = file.readAll();
}
update();
notify("resourcePath", oldValue, resourcePath);
}
}
QByteArray SVGItem::image() const { return m_image; }
void SVGItem::setImage(const QByteArray& image)
{
if (m_image != image) {
QByteArray oldValue = m_image;
m_image = image;
update();
notify("image", oldValue, image);
}
}
QString SVGItem::datasource() const { return m_datasource; }
void SVGItem::setDatasource(const QString& datasource) { m_datasource = datasource; }
QString SVGItem::field() const { return m_field; }
void SVGItem::setField(const QString& field) { m_field = field; };
} // namespace LimeReport