1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "settingstab.h"
5
6#include <QVBoxLayout>
7#include <QtQuick3DAssetImport/private/qssgassetimportmanager_p.h>
8#include <QtWidgets>
9
10SettingsTab::SettingsTab(QWidget *parent) : QScrollArea(parent)
11{
12 QWidget *central = new QWidget;
13 QVBoxLayout *mainLayout = new QVBoxLayout(central);
14
15 const auto allDescs = QSSGAssetImportManager().getImporterPluginInfos();
16
17 for (const auto &plugin : allDescs) {
18 auto options = plugin.importOptions;
19 // Skip plugins without options
20 if (options.isEmpty())
21 continue;
22
23 if (auto optionsIt = options.constFind(key: QLatin1String("options")); optionsIt != options.constEnd())
24 options = optionsIt->toObject();
25
26 QGroupBox *pluginGroup = new QGroupBox(plugin.typeDescription + " (" + plugin.name + ")");
27 QFormLayout *extensionsLayout = new QFormLayout;
28 extensionsLayout->addRow(label: new QLabel(tr(s: "Supported extensions:")), field: new QLabel(plugin.inputExtensions.join(sep: ", ")));
29
30 for (auto kv_it = options.constBegin(); kv_it != options.constEnd(); ++kv_it) {
31 if (kv_it->isObject()) {
32 auto map = kv_it->toObject();
33 auto settingKeyName = kv_it.key();
34 auto description = map.value(key: "description");
35 auto name = map.value(key: QLatin1String("name"));
36 auto type = map.value(key: "type");
37 auto value = map.value(key: "value");
38
39 auto label = new QLabel(name.toString() + ":");
40 label->setToolTip(description.toString());
41
42 if (type == "Boolean") {
43 QCheckBox *checkBox = new QCheckBox();
44 checkBox->setChecked(value.toBool());
45 extensionsLayout->addRow(label, field: checkBox);
46 settings.push_back(t: Setting { .uiELement: checkBox, .name: settingKeyName, .defaultBool: value.toBool(), .defaultReal: 0.0f });
47 } else if (type == "Real") {
48 QSpinBox *spinBox = new QSpinBox();
49 spinBox->setMinimum(-9999);
50 spinBox->setMaximum(9999);
51 spinBox->setSingleStep(1);
52 spinBox->setValue(value.toDouble());
53 extensionsLayout->addRow(label, field: spinBox);
54 settings.push_back(t: Setting { .uiELement: spinBox, .name: settingKeyName, .defaultBool: false, .defaultReal: value.toDouble() });
55 } else {
56 qWarning() << "Unsupported setting " << name;
57 }
58 }
59 }
60
61 pluginGroup->setLayout(extensionsLayout);
62 mainLayout->addWidget(pluginGroup);
63 }
64
65 mainLayout->addStretch(stretch: 1);
66
67 setWidget(central);
68 setWidgetResizable(true);
69}
70
71QJsonObject SettingsTab::getOptions() const
72{
73 QJsonObject options;
74
75 for (const Setting &setting : settings) {
76 auto checkBox = dynamic_cast<QCheckBox *>(setting.uiELement);
77 auto spinBox = dynamic_cast<QSpinBox *>(setting.uiELement);
78
79 if (checkBox != nullptr && setting.defaultBool != checkBox->isChecked()) {
80 options[setting.name] = QJsonValue(checkBox->isChecked());
81 } else if (spinBox != nullptr && setting.defaultReal != spinBox->value()) {
82 options[setting.name] = QJsonValue(double(spinBox->value()));
83 }
84 }
85
86 return options;
87}
88

source code of qtquick3d/tools/balsamui/settingstab.cpp