File: previewwidget.cpp

package info (click to toggle)
qt6-declarative 6.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 308,920 kB
  • sloc: cpp: 775,911; javascript: 514,247; xml: 10,855; python: 2,806; ansic: 2,253; java: 810; sh: 262; makefile: 41; php: 27
file content (93 lines) | stat: -rw-r--r-- 2,636 bytes parent folder | download | duplicates (2)
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
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

#include "previewwidget.h"
#include "../states/statecontroller.h"

#include <QQmlContext>
#include <QQmlEngine>
#include <QQuickView>
#include <QQuickWidget>
#include <QSplitter>
#include <QVBoxLayout>

PreviewWidget::PreviewWidget(QWidget *parent)
    : QWidget{parent}
    , m_errorListModel{this}
    , m_errorListWidget{new QQuickWidget}
    , m_quickView{new QQuickView}
{
    initUI();
    setupConnections();
}

QString PreviewWidget::sourcePath() const
{
    return m_quickView->source().toString();
}

void PreviewWidget::setSourcePath(const QString &path)
{
    m_quickView->engine()->clearComponentCache();
    m_quickView->setSource(QUrl::fromLocalFile(path));
}

void PreviewWidget::initUI()
{
    qmlRegisterType<ErrorListModel>("ErrorListModel", 1, 0, "ErrorListModel");
    m_errorListWidget->rootContext()->setContextProperty("errorModel", &m_errorListModel);
    m_errorListWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
    m_errorListWidget->setSource(QUrl::fromLocalFile(":/resources/ErrorListView.qml"));

    m_quickView->setResizeMode(QQuickView::SizeRootObjectToView);

    QWidget *container = QWidget::createWindowContainer(m_quickView);
    container->setMinimumSize(m_quickView->size());
    container->setFocusPolicy(Qt::TabFocus);

    QSplitter *splitter = new QSplitter{this};
    splitter->setOrientation(Qt::Vertical);
    splitter->addWidget(container);
    splitter->addWidget(m_errorListWidget);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->setContentsMargins(0, 0, 0, 0);
    layout->addWidget(splitter);
    setLayout(layout);
}

void PreviewWidget::setupConnections()
{
    connect(StateController::instance(), &StateController::stateChanged, this,
            &PreviewWidget::onAppStateChanged);
    connect(m_quickView, &QQuickView::statusChanged, this,
            &PreviewWidget::onQuickWidetStatusChanged);
    connect(&m_errorListModel, &ErrorListModel::errorPositionSelected, this,
            &PreviewWidget::errorPositionSelected);
}

void PreviewWidget::onAppStateChanged(int oldState, int newState)
{
    Q_UNUSED(oldState);

    switch (newState) {
    case StateController::InitState:
        m_errorListModel.setErrorList({});
        break;

    default:
        break;
    }
}

void PreviewWidget::onQuickWidetStatusChanged(int status)
{
    switch (status) {
    case QQuickView::Error:
        m_errorListModel.setErrorList(m_quickView->errors());
        break;
    default:
        m_errorListModel.setErrorList({});
        break;
    }
}