Warning, /plasma/kwin/src/kcms/rules/ui/OptionsComboBox.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2020 Ismael Asensio <isma.af@gmail.com>
0003
0004 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as QQC2
0010
0011 import org.kde.kirigami 2.10 as Kirigami
0012 import org.kde.kcms.kwinrules
0013
0014
0015 QQC2.ComboBox {
0016 id: optionsCombo
0017
0018 textRole: "display"
0019 valueRole: "value"
0020
0021 property bool multipleChoice: false
0022 property int selectionMask: 0
0023 readonly property int allOptionsMask: model.allOptionsMask
0024
0025 currentIndex: multipleChoice ? -1 : model.selectedIndex
0026
0027 displayText: {
0028 if (!multipleChoice) {
0029 return currentText;
0030 }
0031 const selectionCount = selectionMask.toString(2).replace(/0/g, '').length;
0032 const optionsCount = allOptionsMask.toString(2).replace(/0/g, '').length;
0033 switch (selectionCount) {
0034 case 0:
0035 return i18n("None selected");
0036 case 1:
0037 const selectedBit = selectionMask.toString(2).length - 1;
0038 const selectedIndex = (model.useFlags) ? model.indexOf(selectionMask) : selectedBit
0039 return model.data(model.index(selectedIndex, 0), Qt.DisplayRole);
0040 case optionsCount:
0041 return i18n("All selected");
0042 }
0043 return i18np("%1 selected", "%1 selected", selectionCount);
0044 }
0045
0046 delegate: QQC2.ItemDelegate {
0047 id: delegateItem
0048
0049 highlighted: optionsCombo.highlightedIndex == index
0050 width: parent.width
0051
0052 contentItem: RowLayout {
0053 QQC2.RadioButton {
0054 id: radioButton
0055 visible: multipleChoice && model.optionType === OptionsModel.ExclusiveOption
0056 checked: (selectionMask & bitMask) == bitMask
0057 enabled: false // We don't want to uncheck the exclusive option on toggle
0058 }
0059 QQC2.CheckBox {
0060 id: checkBox
0061 visible: multipleChoice && model.optionType !== OptionsModel.ExclusiveOption
0062 checked: (selectionMask & model.bitMask) == model.bitMask
0063 onToggled: {
0064 selectionMask = (checked) ? selectionMask | model.bitMask : selectionMask & ~model.bitMask;
0065 selectionMask &= allOptionsMask;
0066 activated(index);
0067 }
0068 }
0069 Kirigami.Icon {
0070 source: model.decoration
0071 Layout.preferredHeight: Kirigami.Units.iconSizes.small
0072 Layout.preferredWidth: Kirigami.Units.iconSizes.small
0073 }
0074 QQC2.Label {
0075 text: model.display
0076 color: highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0077 Layout.fillWidth: true
0078 horizontalAlignment: Text.AlignLeft
0079 }
0080 }
0081
0082 MouseArea {
0083 anchors.fill: contentItem
0084 enabled: multipleChoice
0085 onClicked: {
0086 if (checkBox.visible) {
0087 checkBox.toggle();
0088 checkBox.toggled();
0089 } else if (radioButton.visible) {
0090 selectionMask = model.bitMask; // Only check the exclusive option
0091 activated(index);
0092 }
0093 }
0094 }
0095
0096 QQC2.ToolTip {
0097 text: model.tooltip
0098 visible: hovered && (model.tooltip.length > 0)
0099 }
0100
0101 Component.onCompleted: {
0102 //FIXME: work around bug https://bugs.kde.org/show_bug.cgi?id=403153
0103 optionsCombo.popup.width = Math.max(implicitWidth, optionsCombo.width, optionsCombo.popup.width);
0104 }
0105
0106 onActiveFocusChanged: {
0107 if (!activeFocus) {
0108 popup.close();
0109 }
0110 }
0111 }
0112 }