8b9472e0bf
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
202 lines
6.1 KiB
QML
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)
|
|
}
|
|
}
|
|
}
|
|
}
|