aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickvectorimage/generator/qquickitemgenerator.cpp
blob: e2974c91c04d3a08059a63511270c358431aa1ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "qquickitemgenerator_p.h"
#include "utils_p.h"
#include "qquicknodeinfo_p.h"

#include <private/qsgcurveprocessor_p.h>
#include <private/qquickshape_p.h>
#include <private/qquadpath_p.h>
#include <private/qquickitem_p.h>
#include <private/qquickimagebase_p_p.h>
#include <private/qquickanimation_p.h>
#include <private/qquicktext_p.h>
#include <private/qquicktranslate_p.h>
#include <private/qquickimage_p.h>

#include <QtCore/qloggingcategory.h>
#include <QtCore/qstandardpaths.h>
#include <QtQml/qqmlcomponent.h>

QT_BEGIN_NAMESPACE

QQuickItemGenerator::QQuickItemGenerator(const QString fileName,
                                         QQuickVectorImageGenerator::GeneratorFlags flags,
                                         QQuickItem *parentItem,
                                         QQmlContext *ctx)
    : QQuickQmlGenerator(fileName, flags, QString{})
    , m_parentItem(parentItem)
    , m_qmlContext(ctx)
{
    setRetainFilePaths(true);

    QString tmpDir = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
    setAssetFileDirectory(tmpDir);
    setAssetFilePrefix(QStringLiteral("_qt_vectorimage_"));
    setUrlPrefix(QStringLiteral("file:"));
}

QQuickItemGenerator::~QQuickItemGenerator()
{
}

bool QQuickItemGenerator::generateRootNode(const StructureNodeInfo &info)
{
    bool cont = QQuickQmlGenerator::generateRootNode(info);
    if (info.stage == StructureNodeStage::End) {
        if (m_qmlContext == nullptr) {
            qCWarning(lcQuickVectorImage) << "QQuickItemGenerator::generateRootItem: Requires QML context";
            return false;
        }

        QQmlEngine *engine = m_qmlContext->engine();
        if (engine == nullptr) {
            qCWarning(lcQuickVectorImage) << "QQuickItemGenerator::generateRootItem: Requires QML engine";
            return false;
        }

        QQmlComponent component(engine);
        component.setData(m_result.data(), QUrl{});
        QObject *obj = component.create(m_qmlContext);
        QQuickItem *rootItem = qobject_cast<QQuickItem *>(obj);
        if (rootItem == nullptr) {
            delete obj;

            qCWarning(lcQuickVectorImage) << "QQuickItemGenerator::generateRootItem: Root item not a QQuickItem: " << component.errorString();
            return false;
        }

        m_parentItem->setImplicitWidth(rootItem->width());
        m_parentItem->setImplicitHeight(rootItem->height());

        rootItem->setParent(m_parentItem);
        rootItem->setParentItem(m_parentItem);
    }

    return cont;
}

QT_END_NAMESPACE