diff options
author | Tim Jenssen <tim.jenssen@qt.io> | 2023-03-30 13:34:12 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2023-03-30 13:30:42 +0000 |
commit | adb664f52128b3c28323a5d4dccedc204dec8b34 (patch) | |
tree | 5bc4573e921a37f7ba46d73eba16c6f08db37da4 /src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp | |
parent | 6f765181c9b9e716f3ae746183cdeac2459ac194 (diff) | |
parent | 5b28748554b3f97c4e163606208878d573f2a655 (diff) |
Merge remote-tracking branch 'origin/qds/dev'
Conflicts: src/libs/utils/filepath.cpp
src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp
src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp
tests/unit/unittest/CMakeLists.txt
Change-Id: I017a6075db41a5233487ac855ffe23de2b2bb0ee
Diffstat (limited to 'src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp')
-rw-r--r-- | src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp | 65 |
1 files changed, 59 insertions, 6 deletions
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index df9f273797..91f403f218 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -63,6 +63,9 @@ const int labelMinWidth = 130; const int controlMinWidth = 65; const int columnSpacing = 16; +constexpr QStringView qdsWorkaroundsKey{u"designStudioWorkarounds"}; +constexpr QStringView expandValuesKey{u"expandValueComponents"}; + } // namespace ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( @@ -172,6 +175,11 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( while (optIt != supportedOpts.constEnd()) { QJsonObject options = QJsonObject::fromVariantMap(qvariant_cast<QVariantMap>(optIt.value())); m_importOptions << options.value("options").toObject(); + if (m_importOptions.last().contains(qdsWorkaroundsKey)) { + QJsonObject optObj = m_importOptions.last()[qdsWorkaroundsKey].toObject(); + optObj.insert("value", QJsonValue{true}); + m_importOptions.last().insert(qdsWorkaroundsKey, optObj); + } auto it = defaultOpts.constBegin(); while (it != defaultOpts.constEnd()) { if (m_importOptions.last().contains(it.key())) { @@ -477,7 +485,7 @@ QGridLayout *ItemLibraryAssetImportDialog::createOptionsGrid( QJsonObject &options = m_importOptions[optionsIndex]; const auto optKeys = options.keys(); for (const auto &optKey : optKeys) { - if (!advanced && !isSimpleOption(optKey)) + if ((!advanced && !isSimpleOption(optKey)) || isHiddenOption(optKey)) continue; QJsonObject optObj = options.value(optKey).toObject(); const QString optName = optObj.value("name").toString(); @@ -589,11 +597,34 @@ QGridLayout *ItemLibraryAssetImportDialog::createOptionsGrid( m_labelToControlWidgetMaps[optionsIndex].insert(optKey, optControl); } - // Handle conditions + // Find condition chains (up to two levels supported) + // key: Option that has condition and is also specified in another condition as property + // value: List of extra widgets that are affected by key property via condition + QHash<QString, QList<QWidget *>> conditionChains; auto it = conditionMap.constBegin(); while (it != conditionMap.constEnd()) { const QString &option = it.key(); const QJsonArray &conditions = it.value(); + if (!conditions.isEmpty()) { + const QString optItem = conditions[0].toObject().value("property").toString(); + if (conditionMap.contains(optItem)) { + if (!conditionChains.contains(optItem)) + conditionChains.insert(optItem, {}); + QPair<QWidget *, QWidget *> widgetPair = optionToWidgetsMap.value(option); + if (widgetPair.first) + conditionChains[optItem].append(widgetPair.first); + if (widgetPair.second) + conditionChains[optItem].append(widgetPair.second); + } + } + ++it; + } + + // Handle conditions + it = conditionMap.constBegin(); + while (it != conditionMap.constEnd()) { + const QString &option = it.key(); + const QJsonArray &conditions = it.value(); const auto &conWidgets = optionToWidgetsMap.value(option); QWidget *conLabel = conWidgets.first; QWidget *conControl = conWidgets.second; @@ -622,21 +653,33 @@ QGridLayout *ItemLibraryAssetImportDialog::createOptionsGrid( auto optSpin = qobject_cast<QDoubleSpinBox *>(optWidgets.second); if (optCb) { auto enableConditionally = [optValue](QCheckBox *cb, QWidget *w1, - QWidget *w2, Mode mode) { + QWidget *w2, const QList<QWidget *> &extraWidgets, Mode mode) { bool equals = (mode == Mode::equals) == optValue.toBool(); bool enable = cb->isChecked() == equals; w1->setEnabled(enable); w2->setEnabled(enable); + if (extraWidgets.isEmpty()) + return; + + if (auto conditionCb = qobject_cast<QCheckBox *>(w2)) { + for (const auto w : extraWidgets) + w->setEnabled(conditionCb->isChecked() && enable); + } }; - enableConditionally(optCb, conLabel, conControl, mode); + // Only initialize conditional state if conditional control is enabled. + // If it is disabled, it is assumed that previous chained condition handling + // already handled this case. + if (optCb->isEnabled()) + enableConditionally(optCb, conLabel, conControl, conditionChains[option], mode); if (conditionalWidgetMap.contains(optCb)) conditionalWidgetMap.insert(optCb, nullptr); else conditionalWidgetMap.insert(optCb, conControl); QObject::connect( optCb, &QCheckBox::toggled, optCb, - [optCb, conLabel, conControl, mode, enableConditionally]() { - enableConditionally(optCb, conLabel, conControl, mode); + [optCb, conLabel, conControl, extraWidgets = conditionChains[option], + mode, enableConditionally]() { + enableConditionally(optCb, conLabel, conControl, extraWidgets, mode); }); } if (optSpin) { @@ -804,6 +847,16 @@ bool ItemLibraryAssetImportDialog::isSimpleOption(const QString &id) return simpleOptions.contains(id); } +bool ItemLibraryAssetImportDialog::isHiddenOption(const QString &id) +{ + static QList<QStringView> hiddenOptions { + qdsWorkaroundsKey, + expandValuesKey // Hidden because qdsWorkaroundsKey we force true implies this + }; + + return hiddenOptions.contains(id); +} + void ItemLibraryAssetImportDialog::resizeEvent(QResizeEvent *event) { m_dialogHeight = event->size().height(); |