forked from qt-creator/qt-creator
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:
@@ -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,29 +29,35 @@ 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)
|
||||||
|
--numSelected
|
||||||
|
|
||||||
|
root.model = numSelected === 0 ? [qsTr("empty")]
|
||||||
|
: numSelected === 1 ? root.model = [selectedItem]
|
||||||
: [qsTr("%1 items selected").arg(numSelected)]
|
: [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(" | ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user