kwin/kcmkwin/kwinrules/package/contents/ui/ValueEditor.qml
Ismael Asensio 8b9472e0bf [kcm/kwinrules] Fix types property for NET::AllTypesMask
When the user selects all of the types or none of them, the "types"
property must be set to a special value (`NET::AllTypesMask = -1`),
different than the sum of all the flags together.

This re-implements this behaviour as the old KCM, fixing some heuristics
that prevented finding the rule corresponding to the current window.

The enum name that handles this property has been changed to `NetTypes`
to make it more explicit.

BUG: 423214
FIXED-IN: 5.19.3

TEST PLAN:
1. Open the `Application specific settings` on a window via menu
2. Select every "Window Type" (or none of them)
3. Give the rule a different name than the default and save
4. Open it again and check that the same rule is found
2020-06-25 15:44:11 +00:00

202 lines
6.1 KiB
QML

/*
* Copyright (c) 2020 Ismael Asensio <isma.af@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.14
import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14 as QQC2
import org.kde.kirigami 2.10 as Kirigami
import org.kde.kquickcontrols 2.0 as KQC
import org.kde.kcms.kwinrules 1.0
Loader {
id: valueEditor
focus: true
property var ruleValue
property var ruleOptions
property int controlType
signal valueEdited(var value)
sourceComponent: {
switch (controlType) {
case RuleItem.Boolean: return booleanEditor
case RuleItem.String: return stringEditor
case RuleItem.Integer: return integerEditor
case RuleItem.Option: return optionEditor
case RuleItem.NetTypes: return netTypesEditor
case RuleItem.Percentage: return percentageEditor
case RuleItem.Point: return coordinateEditor
case RuleItem.Size: return coordinateEditor
case RuleItem.Shortcut: return shortcutEditor
default: return emptyEditor
}
}
Component {
id: emptyEditor
Item {}
}
Component {
id: booleanEditor
RowLayout {
Item {
Layout.fillWidth: true
}
QQC2.RadioButton {
text: i18n("Yes")
checked: ruleValue
Layout.margins: Kirigami.Units.smallSpacing
onToggled: valueEditor.valueEdited(checked)
}
QQC2.RadioButton {
text: i18n("No")
checked: !ruleValue
Layout.margins: Kirigami.Units.smallSpacing
onToggled: valueEditor.valueEdited(!checked)
}
}
}
Component {
id: stringEditor
QQC2.TextField {
property bool isTextEdited: false
text: ruleValue
horizontalAlignment: Text.AlignLeft
onTextEdited: { isTextEdited = true; }
onEditingFinished: {
if (isTextEdited) { valueEditor.valueEdited(text); }
isTextEdited = false;
}
}
}
Component {
id: integerEditor
QQC2.SpinBox {
editable: true
value: ruleValue
onValueModified: valueEditor.valueEdited(value)
}
}
Component {
id: optionEditor
OptionsComboBox {
flat: true
model: ruleOptions
onActivated: (index) => {
valueEditor.valueEdited(currentValue);
}
}
}
Component {
id: netTypesEditor
OptionsComboBox {
flat: true
model: ruleOptions
multipleChoice: true
// If NET::AllTypesMask (-1), select everything
selectionMask: (ruleValue == -1) ? 0x3BF : ruleValue
onActivated: {
valueEditor.valueEdited(selectionMask);
}
}
}
Component {
id: percentageEditor
RowLayout {
QQC2.Slider {
id: slider
Layout.fillWidth: true
from: 0
to: 100
value: ruleValue
onMoved: valueEditor.valueEdited(Math.round(slider.value))
}
QQC2.Label {
text: i18n("%1 %", Math.round(slider.value))
horizontalAlignment: Qt.AlignRight
Layout.minimumWidth: maxPercentage.width + Kirigami.Units.smallSpacing
Layout.margins: Kirigami.Units.smallSpacing
}
TextMetrics {
id: maxPercentage
text: i18n("%1 %", 100)
}
}
}
Component {
id: coordinateEditor
RowLayout {
id: coordItem
spacing: Kirigami.Units.smallSpacing
readonly property var coord: (controlType == RuleItem.Size) ? Qt.size(coordX.value, coordY.value)
: Qt.point(coordX.value, coordY.value)
onCoordChanged: valueEditor.valueEdited(coord)
QQC2.SpinBox {
id: coordX
editable: true
Layout.preferredWidth: 50 // 50%
Layout.fillWidth: true
from: 0
to: 32767
value: (controlType == RuleItem.Size) ? ruleValue.width : ruleValue.x
}
QQC2.Label {
id: coordSeparator
Layout.preferredWidth: implicitWidth
text: i18nc("(x, y) coordinates separator in size/position","x")
horizontalAlignment: Text.AlignHCenter
}
QQC2.SpinBox {
id: coordY
editable: true
from: 0
to: 32767
Layout.preferredWidth: 50 // 50%
Layout.fillWidth: true
value: (controlType == RuleItem.Size) ? ruleValue.height : ruleValue.y
}
}
}
Component {
id: shortcutEditor
RowLayout {
Item {
Layout.fillWidth: true
}
KQC.KeySequenceItem {
keySequence: ruleValue
onCaptureFinished: valueEditor.valueEdited(keySequence)
}
}
}
}