11#include <QQuickWindow>
17#include "managedtexturenode.h"
21#include <Kirigami/Platform/PlatformTheme>
28 , m_textureChanged(false)
33 connect(m_svg, &Svg::repaintNeeded,
this, &SvgItem::updateNeeded);
34 connect(m_svg, &Svg::repaintNeeded,
this, &SvgItem::naturalSizeChanged);
35 connect(m_svg, &Svg::sizeChanged,
this, &SvgItem::naturalSizeChanged);
36 connect(m_svg, &Svg::repaintNeeded,
this, &SvgItem::elementRectChanged);
37 connect(m_svg, &Svg::sizeChanged,
this, &SvgItem::elementRectChanged);
44void SvgItem::componentComplete()
46 m_kirigamiTheme = qobject_cast<Kirigami::Platform::PlatformTheme *>(qmlAttachedPropertiesObject<Kirigami::Platform::PlatformTheme>(
this,
true));
47 if (!m_kirigamiTheme) {
48 qCWarning(LOG_KSVGQML) <<
"No theme!" << qmlAttachedPropertiesObject<Kirigami::Platform::PlatformTheme>(
this,
true) <<
this;
52 auto checkApplyTheme = [
this]() {
53 if (!m_svg->imageSet()->filePath(QStringLiteral(
"colors")).isEmpty()) {
54 m_svg->clearColorOverrides();
57 auto applyTheme = [
this]() {
61 if (!m_svg->imageSet()->filePath(QStringLiteral(
"colors")).isEmpty()) {
62 m_svg->clearColorOverrides();
65 m_svg->setColor(Svg::Text, m_kirigamiTheme->textColor());
66 m_svg->setColor(Svg::Background, m_kirigamiTheme->backgroundColor());
67 m_svg->setColor(Svg::Highlight, m_kirigamiTheme->highlightColor());
68 m_svg->setColor(Svg::HighlightedText, m_kirigamiTheme->highlightedTextColor());
69 m_svg->setColor(Svg::PositiveText, m_kirigamiTheme->positiveTextColor());
70 m_svg->setColor(Svg::NeutralText, m_kirigamiTheme->neutralTextColor());
71 m_svg->setColor(Svg::NegativeText, m_kirigamiTheme->negativeTextColor());
74 connect(m_kirigamiTheme, &Kirigami::Platform::PlatformTheme::colorsChanged,
this, applyTheme);
75 connect(m_svg->imageSet(), &ImageSet::imageSetChanged,
this, checkApplyTheme);
76 connect(m_svg, &Svg::imageSetChanged,
this, checkApplyTheme);
81void SvgItem::setImagePath(
const QString &path)
83 if (!m_svg || m_svg->imagePath() == path) {
87 updateDevicePixelRatio();
88 m_svg->setImagePath(path);
90 Q_EMIT imagePathChanged();
92 if (isComponentComplete()) {
97QString SvgItem::imagePath()
const
99 return m_svg->imagePath();
102void SvgItem::setElementId(
const QString &elementID)
104 if (elementID == m_elementID) {
108 if (implicitWidth() <= 0) {
109 setImplicitWidth(naturalSize().width());
111 if (implicitHeight() <= 0) {
112 setImplicitHeight(naturalSize().height());
115 m_elementID = elementID;
116 Q_EMIT elementIdChanged();
117 Q_EMIT naturalSizeChanged();
118 Q_EMIT elementRectChanged();
120 scheduleImageUpdate();
123QString SvgItem::elementId()
const
131 disconnect(m_svg.data(),
nullptr,
this,
nullptr);
136 connect(svg, &Svg::repaintNeeded,
this, &SvgItem::updateNeeded);
137 connect(svg, &Svg::repaintNeeded,
this, &SvgItem::naturalSizeChanged);
138 connect(svg, &Svg::repaintNeeded,
this, &SvgItem::elementRectChanged);
139 connect(svg, &Svg::sizeChanged,
this, &SvgItem::naturalSizeChanged);
140 connect(svg, &Svg::sizeChanged,
this, &SvgItem::elementRectChanged);
143 if (implicitWidth() <= 0) {
144 setImplicitWidth(naturalSize().width());
146 if (implicitHeight() <= 0) {
147 setImplicitHeight(naturalSize().height());
150 scheduleImageUpdate();
153 Q_EMIT naturalSizeChanged();
154 Q_EMIT elementRectChanged();
155 Q_EMIT imagePathChanged();
163QSizeF SvgItem::naturalSize()
const
167 }
else if (!m_elementID.isEmpty()) {
168 return m_svg->elementSize(m_elementID);
171 return m_svg->size();
174QRectF SvgItem::elementRect()
const
178 }
else if (!m_elementID.isEmpty()) {
179 return m_svg->elementRect(m_elementID);
185QSGNode *SvgItem::updatePaintNode(
QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData)
187 Q_UNUSED(updatePaintNodeData);
188 if (!
window() || !m_svg) {
194 if (width() == 0.0 || height() == 0.0) {
199 ManagedTextureNode *textureNode =
static_cast<ManagedTextureNode *
>(oldNode);
201 textureNode =
new ManagedTextureNode;
202 m_textureChanged =
true;
213 if (m_image.isNull()) {
219 textureNode->setTexture(texture);
220 m_textureChanged =
false;
222 textureNode->
setRect(0, 0, width(), height());
230void SvgItem::updateNeeded()
232 if (implicitWidth() <= 0) {
233 setImplicitWidth(naturalSize().width());
235 if (implicitHeight() <= 0) {
236 setImplicitHeight(naturalSize().height());
238 scheduleImageUpdate();
241void SvgItem::scheduleImageUpdate()
247void SvgItem::updatePolish()
253 m_textureChanged =
true;
254 m_svg->setContainsMultipleImages(!m_elementID.isEmpty());
255 m_image = m_svg->image(
QSize(width(), height()), m_elementID);
259void SvgItem::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
261 if (newGeometry.
size() != oldGeometry.
size() && newGeometry.
isValid()) {
262 scheduleImageUpdate();
268void SvgItem::updateDevicePixelRatio()
272 const auto newDevicePixelRatio = std::max<qreal>(1.0, floor(
window() ?
window()->devicePixelRatio() : qApp->devicePixelRatio()));
274 if (newDevicePixelRatio != m_svg->devicePixelRatio()) {
275 m_svg->setDevicePixelRatio(newDevicePixelRatio);
276 m_textureChanged =
true;
282 if (change == ItemSceneChange && value.window) {
283 updateDevicePixelRatio();
285 updateDevicePixelRatio();
293#include "moc_svgitem.cpp"
A theme aware image-centric SVG class.
void update(Part *part, const QByteArray &data, qint64 dataSize)
KGUIADDONS_EXPORT QWindow * window(QObject *job)
virtual void componentComplete() override
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
virtual void itemChange(ItemChange change, const ItemChangeData &value)
virtual void updatePolish()
bool isValid() const const
QSizeF size() const const
void setFiltering(QSGTexture::Filtering filtering)
void setRect(const QRectF &r)
QSGTexture * texture() const const
virtual QSize textureSize() const const=0
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)