aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2022-04-06 14:42:39 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2022-04-08 06:09:36 +0000
commitca5efe788069a3b0677abae26a9688ce6a2e0cff (patch)
tree8d27483691ec852750303aa7d54b8e5e270a77e1 /src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp
parent7c4df8d23ee2c62fa4cbb7192600004135fffdf1 (diff)
QmlDesigner: Hide advanced 3D model import options
Only simple options are shown by default. Fixes: QDS-6574 Change-Id: Idb642d80ca8867dce95d3db4509d2ee454aa2be1 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Diffstat (limited to 'src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp')
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp280
1 files changed, 207 insertions, 73 deletions
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp
index 6c5005546e..e3645756d6 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp
@@ -55,6 +55,7 @@
#include <QScrollArea>
#include <QMessageBox>
#include <QFileDialog>
+#include <QVBoxLayout>
namespace QmlDesigner {
@@ -73,7 +74,11 @@ static void addFormattedMessage(Utils::OutputFormatter *formatter, const QString
formatter->plainTextEdit()->verticalScrollBar()->maximum());
}
-static const int rowHeight = 26;
+static const int rowHeight = 28;
+static const int checkBoxColWidth = 18;
+static const int labelMinWidth = 130;
+static const int controlMinWidth = 65;
+static const int columnSpacing = 16;
}
@@ -120,6 +125,12 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog(
ui->buttonBox->button(QDialogButtonBox::Close)->setDefault(true);
+ ui->advancedSettingsButton->setStyleSheet(
+ "QPushButton#advancedSettingsButton {background-color: transparent}");
+ ui->advancedSettingsButton->setStyleSheet(
+ QString("QPushButton { border: none; color :%1 }").arg(
+ Utils::creatorTheme()->color(Utils::Theme::QmlDesigner_HighlightColor).name()));
+
QStringList importPaths;
auto doc = QmlDesignerPlugin::instance()->currentDesignDocument();
if (doc) {
@@ -196,6 +207,10 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog(
++optIndex;
}
+ m_simpleData.contentWidgets.resize(optIndex);
+ m_advancedData.contentWidgets.resize(optIndex);
+ m_labelToControlWidgetMaps.resize(optIndex);
+
// Create tab for each supported extension group that also has files included in the import
QMap<QString, int> tabMap; // QMap used for alphabetical order
for (const auto &file : qAsConst(m_quick3DFiles)) {
@@ -214,22 +229,21 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog(
auto tabIt = tabMap.constBegin();
while (tabIt != tabMap.constEnd()) {
createTab(tabIt.key(), tabIt.value(), groups[tabIt.value()]);
- ++tabIt;
- }
- // Pad all tabs to same height
- for (int i = 0; i < ui->tabWidget->count(); ++i) {
- auto optionsArea = qobject_cast<QScrollArea *>(ui->tabWidget->widget(i));
- if (optionsArea && optionsArea->widget()) {
- auto grid = qobject_cast<QGridLayout *>(optionsArea->widget()->layout());
+ auto padGrid = [](QWidget *widget, int optionRows) {
+ auto grid = qobject_cast<QGridLayout *>(widget->layout());
if (grid) {
int rows = grid->rowCount();
- for (int j = rows; j < m_optionsRows; ++j) {
- grid->addWidget(new QWidget(optionsArea->widget()), j, 0);
- grid->setRowMinimumHeight(j, rowHeight);
+ for (int i = rows; i <optionRows; ++i) {
+ grid->addWidget(new QWidget(widget), i, 0);
+ grid->setRowMinimumHeight(i, rowHeight);
}
}
- }
+ };
+ padGrid(m_simpleData.contentWidgets[tabIt.value()], m_simpleData.optionsRows);
+ padGrid(m_advancedData.contentWidgets[tabIt.value()], m_advancedData.optionsRows);
+
+ ++tabIt;
}
ui->tabWidget->setCurrentIndex(0);
@@ -257,8 +271,10 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog(
for (const auto &file : qAsConst(m_quick3DFiles))
addInfo(file);
- QTimer::singleShot(0, [this]() {
- ui->tabWidget->setMaximumHeight(m_optionsHeight + ui->tabWidget->tabBar()->height() + 10);
+ connect(ui->advancedSettingsButton, &QPushButton::clicked,
+ this, &ItemLibraryAssetImportDialog::toggleAdvanced);
+
+ QTimer::singleShot(0, this, [this]() {
updateUi();
});
}
@@ -390,28 +406,45 @@ void ItemLibraryAssetImportDialog::updateImport(const ModelNode &updateNode,
void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int optionsIndex,
const QJsonObject &groups)
{
- const int checkBoxColWidth = 18;
- const int labelMinWidth = 130;
- const int controlMinWidth = 65;
- const int columnSpacing = 16;
- int rowIndex[2] = {0, 0};
-
- QJsonObject &options = m_importOptions[optionsIndex];
-
- // First index has ungrouped widgets, rest are groups
- // First item in each real group is group label
- QVector<QVector<QPair<QWidget *, QWidget *>>> widgets;
- QHash<QString, int> groupIndexMap;
- QHash<QString, QPair<QWidget *, QWidget *>> optionToWidgetsMap;
- QHash<QString, QJsonArray> conditionMap;
- QHash<QWidget *, QWidget *> conditionalWidgetMap;
- QHash<QString, QString> optionToGroupMap;
-
auto optionsArea = new QScrollArea(ui->tabWidget);
optionsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
auto optionsAreaContents = new QWidget(optionsArea);
+ m_simpleData.contentWidgets[optionsIndex] = new QWidget(optionsAreaContents);
+ m_advancedData.contentWidgets[optionsIndex] = new QWidget(optionsAreaContents);
+
+ // Advanced widgets need to be set up first, as simple widgets will connect to those
+ QGridLayout *advancedLayout = createOptionsGrid(m_advancedData.contentWidgets[optionsIndex], true,
+ optionsIndex, groups);
+ QGridLayout *simpleLayout = createOptionsGrid(m_simpleData.contentWidgets[optionsIndex], false,
+ optionsIndex, groups);
+
+ m_advancedData.contentWidgets[optionsIndex]->setLayout(advancedLayout);
+ m_simpleData.contentWidgets[optionsIndex]->setLayout(simpleLayout);
- auto layout = new QGridLayout(optionsAreaContents);
+ m_advancedData.contentWidgets[optionsIndex]->setVisible(false);
+
+ auto layout = new QVBoxLayout(optionsAreaContents);
+ layout->addWidget(m_simpleData.contentWidgets[optionsIndex]);
+ layout->addWidget(m_advancedData.contentWidgets[optionsIndex]);
+
+ optionsAreaContents->setContentsMargins(0, 0, 0, 0);
+ optionsAreaContents->setLayout(layout);
+ optionsAreaContents->setMinimumWidth(
+ (checkBoxColWidth + labelMinWidth + controlMinWidth) * 2 + columnSpacing);
+ optionsAreaContents->setObjectName("optionsAreaContents"); // For stylesheet
+
+ optionsArea->setWidget(optionsAreaContents);
+ optionsArea->setStyleSheet("QScrollArea {background-color: transparent}");
+ optionsAreaContents->setStyleSheet(
+ "QWidget#optionsAreaContents {background-color: transparent}");
+
+ ui->tabWidget->addTab(optionsArea, tr("%1 options").arg(tabLabel));
+}
+
+QGridLayout *ItemLibraryAssetImportDialog::createOptionsGrid(
+ QWidget *contentWidget, bool advanced, int optionsIndex, const QJsonObject &groups)
+{
+ auto layout = new QGridLayout();
layout->setColumnMinimumWidth(0, checkBoxColWidth);
layout->setColumnMinimumWidth(1, labelMinWidth);
layout->setColumnMinimumWidth(2, controlMinWidth);
@@ -427,14 +460,29 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
layout->setColumnStretch(5, 4);
layout->setColumnStretch(6, 2);
+ // First index has ungrouped widgets, rest are groups
+ // First item in each real group is group label
+ QVector<QVector<QPair<QWidget *, QWidget *>>> widgets;
+ QHash<QString, int> groupIndexMap;
+ QHash<QString, QPair<QWidget *, QWidget *>> optionToWidgetsMap;
+ QHash<QString, QJsonArray> conditionMap;
+ QHash<QWidget *, QWidget *> conditionalWidgetMap;
+ QHash<QString, QString> optionToGroupMap;
+
+ int rowIndex[2] = {0, 0};
+
widgets.append(QVector<QPair<QWidget *, QWidget *>>());
- for (const auto &group : groups) {
+ const QStringList &groupIds = groups.keys();
+ for (const QString &groupId : groupIds) {
+ if (!advanced && !isSimpleGroup(groupId))
+ continue;
+ const auto &group = groups.value(groupId);
const QString name = group.toObject().value("name").toString();
const QJsonArray items = group.toObject().value("items").toArray();
for (const auto &item : items)
optionToGroupMap.insert(item.toString(), name);
- auto groupLabel = new QLabel(name, optionsAreaContents);
+ auto groupLabel = new QLabel(name, contentWidget);
QFont labelFont = groupLabel->font();
labelFont.setBold(true);
groupLabel->setFont(labelFont);
@@ -442,8 +490,11 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
groupIndexMap.insert(name, widgets.size() - 1);
}
+ QJsonObject &options = m_importOptions[optionsIndex];
const auto optKeys = options.keys();
for (const auto &optKey : optKeys) {
+ if (!advanced && !isSimpleOption(optKey))
+ continue;
QJsonObject optObj = options.value(optKey).toObject();
const QString optName = optObj.value("name").toString();
const QString optDesc = optObj.value("description").toString();
@@ -452,24 +503,41 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
QJsonValue optValue = optObj.value("value");
QJsonArray conditions = optObj.value("conditions").toArray();
- auto *optLabel = new QLabel(optionsAreaContents);
+ auto *optLabel = new QLabel(contentWidget);
optLabel->setText(optName);
optLabel->setToolTip(optDesc);
QWidget *optControl = nullptr;
if (optType == "Boolean") {
- auto *optCheck = new QCheckBox(optionsAreaContents);
+ auto *optCheck = new QCheckBox(contentWidget);
optCheck->setChecked(optValue.toBool());
optControl = optCheck;
- QObject::connect(optCheck, &QCheckBox::toggled,
- [this, optCheck, optKey, optionsIndex]() {
- QJsonObject optObj = m_importOptions[optionsIndex].value(optKey).toObject();
- QJsonValue value(optCheck->isChecked());
- optObj.insert("value", value);
- m_importOptions[optionsIndex].insert(optKey, optObj);
- });
+ if (advanced) {
+ QObject::connect(optCheck, &QCheckBox::toggled, this,
+ [this, optCheck, optKey, optionsIndex]() {
+ QJsonObject optObj = m_importOptions[optionsIndex].value(optKey).toObject();
+ QJsonValue value(optCheck->isChecked());
+ optObj.insert("value", value);
+ m_importOptions[optionsIndex].insert(optKey, optObj);
+ });
+ } else {
+ // Simple options also exist in advanced, so don't connect simple controls directly
+ // to import options. Connect them instead to corresponding advanced controls.
+ auto *advCheck = qobject_cast<QCheckBox *>(
+ m_labelToControlWidgetMaps[optionsIndex].value(optKey));
+ if (advCheck) {
+ QObject::connect(optCheck, &QCheckBox::toggled, this, [optCheck, advCheck]() {
+ if (advCheck->isChecked() != optCheck->isChecked())
+ advCheck->setChecked(optCheck->isChecked());
+ });
+ QObject::connect(advCheck, &QCheckBox::toggled, this, [optCheck, advCheck]() {
+ if (advCheck->isChecked() != optCheck->isChecked())
+ optCheck->setChecked(advCheck->isChecked());
+ });
+ }
+ }
} else if (optType == "Real") {
- auto *optSpin = new QDoubleSpinBox(optionsAreaContents);
+ auto *optSpin = new QDoubleSpinBox(contentWidget);
double min = -999999999.;
double max = 999999999.;
double step = 1.;
@@ -493,13 +561,31 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
optSpin->setSingleStep(step);
optSpin->setMinimumWidth(controlMinWidth);
optControl = optSpin;
- QObject::connect(optSpin, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
- [this, optSpin, optKey, optionsIndex]() {
- QJsonObject optObj = m_importOptions[optionsIndex].value(optKey).toObject();
- QJsonValue value(optSpin->value());
- optObj.insert("value", value);
- m_importOptions[optionsIndex].insert(optKey, optObj);
- });
+ if (advanced) {
+ QObject::connect(optSpin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this,
+ [this, optSpin, optKey, optionsIndex]() {
+ QJsonObject optObj = m_importOptions[optionsIndex].value(optKey).toObject();
+ QJsonValue value(optSpin->value());
+ optObj.insert("value", value);
+ m_importOptions[optionsIndex].insert(optKey, optObj);
+ });
+ } else {
+ auto *advSpin = qobject_cast<QDoubleSpinBox *>(
+ m_labelToControlWidgetMaps[optionsIndex].value(optKey));
+ if (advSpin) {
+ // Connect corresponding advanced control
+ QObject::connect(optSpin, &QDoubleSpinBox::valueChanged, this,
+ [optSpin, advSpin]() {
+ if (advSpin->value() != optSpin->value())
+ advSpin->setValue(optSpin->value());
+ });
+ QObject::connect(advSpin, &QDoubleSpinBox::valueChanged, this,
+ [optSpin, advSpin]() {
+ if (advSpin->value() != optSpin->value())
+ optSpin->setValue(advSpin->value());
+ });
+ }
+ }
} else {
qWarning() << __FUNCTION__ << "Unsupported option type:" << optType;
continue;
@@ -515,6 +601,8 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
else
widgets[0].append({optLabel, optControl});
optionToWidgetsMap.insert(optKey, {optLabel, optControl});
+ if (advanced)
+ m_labelToControlWidgetMaps[optionsIndex].insert(optKey, optControl);
}
// Handle conditions
@@ -562,7 +650,7 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
else
conditionalWidgetMap.insert(optCb, conControl);
QObject::connect(
- optCb, &QCheckBox::toggled,
+ optCb, &QCheckBox::toggled, optCb,
[optCb, conLabel, conControl, mode, enableConditionally]() {
enableConditionally(optCb, conLabel, conControl, mode);
});
@@ -586,7 +674,7 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
enableConditionally(optSpin, conLabel, conControl, mode);
QObject::connect(
optSpin, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
- [optSpin, conLabel, conControl, mode, enableConditionally]() {
+ optSpin, [optSpin, conLabel, conControl, mode, enableConditionally]() {
enableConditionally(optSpin, conLabel, conControl, mode);
});
}
@@ -646,8 +734,13 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
};
if (widgets.size() == 1 && widgets[0].isEmpty()) {
- layout->addWidget(new QLabel(tr("No options available for this type."),
- optionsAreaContents), 0, 0, 2, 7, Qt::AlignCenter);
+ if (advanced) {
+ layout->addWidget(new QLabel(tr("No options available for this type."),
+ contentWidget), 0, 0, 2, 7, Qt::AlignCenter);
+ } else {
+ layout->addWidget(new QLabel(tr("No simple options available for this type."),
+ contentWidget), 0, 0, 2, 7, Qt::AlignCenter);
+ }
incrementColIndex(0);
incrementColIndex(0);
}
@@ -663,7 +756,7 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
for (int j = 1; j < groupWidgets.size(); ++j)
insertOptionToLayout(col, groupWidgets[j]);
// Add a separator line after each group
- auto *separator = new QFrame(optionsAreaContents);
+ auto *separator = new QFrame(contentWidget);
separator->setMaximumHeight(1);
separator->setFrameShape(QFrame::HLine);
separator->setFrameShadow(QFrame::Sunken);
@@ -681,38 +774,56 @@ void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int option
}
int optionRows = qMax(rowIndex[0], rowIndex[1]);
- m_optionsRows = qMax(m_optionsRows, optionRows);
- m_optionsHeight = qMax(rowHeight * optionRows + 16, m_optionsHeight);
- layout->setContentsMargins(8, 8, 8, 8);
- optionsAreaContents->setContentsMargins(0, 0, 0, 0);
- optionsAreaContents->setLayout(layout);
- optionsAreaContents->setMinimumWidth(
- (checkBoxColWidth + labelMinWidth + controlMinWidth) * 2 + columnSpacing);
- optionsAreaContents->setObjectName("optionsAreaContents"); // For stylesheet
+ int &globalOptionRows = advanced ? m_advancedData.optionsRows : m_simpleData.optionsRows;
+ int &globalOptionsHeight = advanced ? m_advancedData.optionsHeight : m_simpleData.optionsHeight;
+ globalOptionRows = qMax(globalOptionRows, optionRows);
+ globalOptionsHeight = qMax(rowHeight * optionRows + 20, globalOptionsHeight);
+ layout->setContentsMargins(8, 8, 8, 0);
- optionsArea->setWidget(optionsAreaContents);
- optionsArea->setStyleSheet("QScrollArea {background-color: transparent}");
- optionsAreaContents->setStyleSheet(
- "QWidget#optionsAreaContents {background-color: transparent}");
-
- ui->tabWidget->addTab(optionsArea, tr("%1 options").arg(tabLabel));
+ return layout;
}
void ItemLibraryAssetImportDialog::updateUi()
{
auto optionsArea = qobject_cast<QScrollArea *>(ui->tabWidget->currentWidget());
if (optionsArea) {
+ int optionsHeight = m_advancedMode ? m_advancedData.optionsHeight
+ : m_simpleData.optionsHeight;
+
+ ui->tabWidget->setMaximumHeight(optionsHeight + ui->tabWidget->tabBar()->height() + 10);
auto optionsAreaContents = optionsArea->widget();
int scrollBarWidth = optionsArea->verticalScrollBar()->isVisible()
? optionsArea->verticalScrollBar()->width() : 0;
- optionsAreaContents->resize(optionsArea->contentsRect().width()
- - scrollBarWidth - 8, m_optionsHeight);
+
+ optionsAreaContents->resize(optionsArea->contentsRect().width() - scrollBarWidth - 8,
+ optionsHeight);
+
+ resize(width(), m_dialogHeight);
}
}
+bool ItemLibraryAssetImportDialog::isSimpleGroup(const QString &id)
+{
+ static QStringList simpleGroups {
+ "globalScale"
+ };
+
+ return simpleGroups.contains(id);
+}
+
+bool ItemLibraryAssetImportDialog::isSimpleOption(const QString &id)
+{
+ static QStringList simpleOptions {
+ "globalScale",
+ "globalScaleValue"
+ };
+
+ return simpleOptions.contains(id);
+}
+
void ItemLibraryAssetImportDialog::resizeEvent(QResizeEvent *event)
{
- Q_UNUSED(event)
+ m_dialogHeight = event->size().height();
updateUi();
}
@@ -801,4 +912,27 @@ void ItemLibraryAssetImportDialog::onClose()
}
}
+void ItemLibraryAssetImportDialog::toggleAdvanced()
+{
+ m_advancedMode = !m_advancedMode;
+ for (const auto &widget : qAsConst(m_simpleData.contentWidgets)) {
+ if (widget)
+ widget->setVisible(!m_advancedMode);
+ }
+ for (const auto &widget : qAsConst(m_advancedData.contentWidgets)) {
+ if (widget)
+ widget->setVisible(m_advancedMode);
+ }
+
+ if (m_advancedMode)
+ ui->advancedSettingsButton->setText(tr("Hide Advanced Options"));
+ else
+ ui->advancedSettingsButton->setText(tr("Show All Options"));
+
+ int diff = qMin(300, m_advancedData.optionsHeight - m_simpleData.optionsHeight);
+ m_dialogHeight = qMax(350, m_dialogHeight + (m_advancedMode ? diff : -diff));
+
+ updateUi();
+}
+
}