QmlDesigner: Use flags instead of int in FlagsComboBox

Fixes: QDS-12217
Change-Id: I0b87e084ac35ade002ed4d4f85ee141bd9e527b8
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2024-03-13 14:33:08 +02:00
parent b6318addef
commit c581576e27

View File

@@ -12,11 +12,11 @@ import StudioTheme as StudioTheme
itemsModel: ListModel { itemsModel: ListModel {
ListElement { ListElement {
name: "..." name: "..."
flag: ... flag: "..."
} }
ListElement { ListElement {
name: "..." name: "..."
flag: ... flag: "..."
} }
... ...
*/ */
@@ -29,30 +29,36 @@ StudioControls.CustomComboBox {
property bool showExtendedFunctionButton: true property bool showExtendedFunctionButton: true
property string scope: "Qt" // flag prefix scope
property string zeroFlag
Connections { Connections {
id: backendValueConnection id: backendValueConnection
target: backendValue target: backendValue
function onValueChangedQml() { function onValueChangedQml() {
let numSelected = 0
let selectedItem = "" let selectedItem = ""
let flags = root.backendValue.expression.split(/\s*\|\s*/).filter(Boolean)
for (let i = 0; i < root.itemsModel.count; ++i) { for (let i = 0; i < root.itemsModel.count; ++i) {
let flag = root.itemsModel.get(i).flag let flag = root.scope + "." + root.itemsModel.get(i).flag
let flagActive = root.backendValue.value & flag let flagActive = flags.indexOf(flag) !== -1
root.popupItem.itemAt(i).checked = flagActive root.popupItem.itemAt(i).checked = flagActive
if (flagActive) { if (flagActive)
selectedItem = root.itemsModel.get(i).name selectedItem = root.itemsModel.get(i).name
++numSelected
}
} }
// update ComboBox text // update ComboBox text
root.model = numSelected == 0 ? [qsTr("empty")] let numSelected = flags.length
: numSelected == 1 ? root.model = [selectedItem] if (flags.length > 0 && flags[0] === root.scope + "." + root.zeroFlag)
: [qsTr("%1 items selected").arg(numSelected)] --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 width: 80
onClicked: { onClicked: {
let allFlags = 0 let allFlags = root.scope + "." + root.itemsModel.get(0).flag
for (let i = 0; i < root.itemsModel.count; ++i) for (let i = 1; i < root.itemsModel.count; ++i)
allFlags += root.itemsModel.get(i).flag allFlags += " | " + root.scope + "." + root.itemsModel.get(i).flag
root.backendValue.value = allFlags root.backendValue.expression = allFlags
} }
} }
HelperWidgets.Button { HelperWidgets.Button {
text: qsTr("Select None") text: qsTr("Select None")
width: 80 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 actionIndicatorVisible: false
onToggled: { onToggled: {
if (root.popupItem.itemAt(index).checked) let flags = root.backendValue.expression.split(/\s*\|\s*/).filter(Boolean)
root.backendValue.value |= flag let scopedFlag = root.scope + "." + flag
else let idx = flags.indexOf(scopedFlag)
root.backendValue.value &= ~flag
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(" | ")
} }
} }
} }