From c581576e27ea13ec25ab8470b5a9254d8daebb19 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 13 Mar 2024 14:33:08 +0200 Subject: [PATCH] QmlDesigner: Use flags instead of int in FlagsComboBox Fixes: QDS-12217 Change-Id: I0b87e084ac35ade002ed4d4f85ee141bd9e527b8 Reviewed-by: Miikka Heikkinen --- .../imports/HelperWidgets/FlagsComboBox.qml | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlagsComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlagsComboBox.qml index 8bc9ad44282..46c98f25c50 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlagsComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlagsComboBox.qml @@ -12,11 +12,11 @@ import StudioTheme as StudioTheme itemsModel: ListModel { ListElement { name: "..." - flag: ... + flag: "..." } ListElement { name: "..." - flag: ... + flag: "..." } ... */ @@ -29,30 +29,36 @@ StudioControls.CustomComboBox { property bool showExtendedFunctionButton: true + property string scope: "Qt" // flag prefix scope + property string zeroFlag + Connections { id: backendValueConnection target: backendValue function onValueChangedQml() { - let numSelected = 0 let selectedItem = "" + let flags = root.backendValue.expression.split(/\s*\|\s*/).filter(Boolean) + for (let i = 0; i < root.itemsModel.count; ++i) { - let flag = root.itemsModel.get(i).flag - let flagActive = root.backendValue.value & flag + let flag = root.scope + "." + root.itemsModel.get(i).flag + let flagActive = flags.indexOf(flag) !== -1 root.popupItem.itemAt(i).checked = flagActive - if (flagActive) { + if (flagActive) selectedItem = root.itemsModel.get(i).name - ++numSelected - } } // update ComboBox text - root.model = numSelected == 0 ? [qsTr("empty")] - : numSelected == 1 ? root.model = [selectedItem] - : [qsTr("%1 items selected").arg(numSelected)] + let numSelected = flags.length + if (flags.length > 0 && flags[0] === root.scope + "." + root.zeroFlag) + --numSelected + + root.model = numSelected === 0 ? [qsTr("empty")] + : numSelected === 1 ? root.model = [selectedItem] + : [qsTr("%1 items selected").arg(numSelected)] } } @@ -76,18 +82,23 @@ StudioControls.CustomComboBox { width: 80 onClicked: { - let allFlags = 0 - for (let i = 0; i < root.itemsModel.count; ++i) - allFlags += root.itemsModel.get(i).flag + let allFlags = root.scope + "." + root.itemsModel.get(0).flag + for (let i = 1; i < root.itemsModel.count; ++i) + allFlags += " | " + root.scope + "." + root.itemsModel.get(i).flag - root.backendValue.value = allFlags + root.backendValue.expression = allFlags } } HelperWidgets.Button { text: qsTr("Select None") width: 80 - onClicked: root.backendValue.value = 0 + onClicked: { + if (root.zeroFlag) + root.backendValue.expression = root.scope + "." + root.zeroFlag + else + root.backendValue.resetValue() + } } } @@ -100,10 +111,19 @@ StudioControls.CustomComboBox { actionIndicatorVisible: false onToggled: { - if (root.popupItem.itemAt(index).checked) - root.backendValue.value |= flag - else - root.backendValue.value &= ~flag + let flags = root.backendValue.expression.split(/\s*\|\s*/).filter(Boolean) + let scopedFlag = root.scope + "." + flag + let idx = flags.indexOf(scopedFlag) + + if (root.popupItem.itemAt(index).checked) { + if (idx === -1) + flags.push(scopedFlag) + } else { + if (idx !== -1) + flags.splice(idx, 1) + } + + root.backendValue.expression = flags.join(" | ") } } }