// Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "svgview.h" #include #include SvgView::SvgView(QWidget *parent) : QWidget(parent) , m_background(Background::Chequered) { connect(&m_renderer, &QSvgRenderer::repaintNeeded, this, qOverload<>(&QWidget::update)); // Prepare background check-board pattern m_chequered = QPixmap(64, 64); m_chequered.fill(Qt::white); QPainter chequeredPainter(&m_chequered); QColor color(220, 220, 220); chequeredPainter.fillRect(0, 0, 32, 32, color); chequeredPainter.fillRect(32, 32, 32, 32, color); } void SvgView::paintEvent(QPaintEvent *event) { Q_UNUSED(event) const QSize svgSize = m_renderer.defaultSize() * m_scale; const QSize widgetSize = QSize(parentWidget()->width(), parentWidget()->height()); setFixedSize(svgSize.expandedTo(widgetSize)); QPainter painter(this); switch (m_background) { case Black: painter.fillRect(0, 0, width(), height(), QBrush(QColor(33, 33, 33, 255))); break; case White: painter.fillRect(0, 0, width(), height(), QBrush(Qt::white)); break; case Chequered: painter.fillRect(0, 0, width(), height(), QBrush(m_chequered)); break; } painter.save(); const QRect bounds = QRect((widgetSize.width() - svgSize.width()) / 2, (widgetSize.height() - svgSize.height()) / 2, svgSize.width(), svgSize.height()); painter.setClipRect(bounds); m_renderer.render(&painter, bounds); painter.restore(); if (m_outline) { QBrush penBrush; if (m_background == Background::Black) penBrush = QBrush(Qt::white); else penBrush = QBrush(QColor(33, 33, 33, 255)); QPen outline(penBrush, 2, Qt::DashLine); outline.setCosmetic(true); painter.setPen(outline); painter.drawRect(bounds); } } QImage SvgView::renderAsImage(QSize imageSize) { QImage image(imageSize, QImage::Format_ARGB32); image.fill(Qt::transparent); QPainter painter(&image); m_renderer.render(&painter, QRectF(QPointF(), QSizeF(imageSize))); return image; } void SvgView::setBackgroundType(Background type) { if (m_background == type) return; m_background = type; update(); } void SvgView::setOutline(bool enable) { if (m_outline == enable) return; m_outline = enable; update(); } void SvgView::setAnimations(bool enable) { m_renderer.setAnimationEnabled(enable); } void SvgView::setFeature(Feature feature) { QtSvg::Options options = m_renderer.options(); if (feature == Feature::Tiny_12) options.setFlag(QtSvg::Tiny12FeaturesOnly, true); else options.setFlag(QtSvg::Tiny12FeaturesOnly, false); m_renderer.setOptions(options); if (m_renderer.isValid()) m_renderer.load(m_fileName); } void SvgView::restartAnimations() { m_renderer.setCurrentFrame(0); } void SvgView::setAssumeTrustedSource(bool enable) { QtSvg::Options options = m_renderer.options(); options.setFlag(QtSvg::AssumeTrustedSource, enable); m_renderer.setOptions(options); if (m_renderer.isValid()) m_renderer.load(m_fileName); } void SvgView::load(QStringView fileName) { m_fileName = fileName.toString(); m_renderer.load(m_fileName); update(); } void SvgView::reload() { if (!m_renderer.isValid()) return; m_renderer.load(m_fileName); update(); } QStringView SvgView::currentFile() const { return m_fileName; } void SvgView::setScale(qreal scale) { if (m_scale == scale) return; m_scale = scale; update(); } QSize SvgView::fileSize() const { return m_renderer.isValid() ? m_renderer.defaultSize() : QSize(); } QSize SvgView::sizeHint() const { return m_renderer.isValid() ? m_renderer.defaultSize() * m_scale : QSize(1, 1); }