diff --git a/docs/TODO.md b/docs/TODO.md index cc03c2cf..776daaa8 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -3,7 +3,6 @@ - combo box custom item - explain pattern - fix spinbox buttons -- way to add new rule - quick room & sender rule changes - config & keybind for global rule disabling - quick settings diff --git a/src/backend/matrix_client.py b/src/backend/matrix_client.py index d67b5bcd..73b61913 100644 --- a/src/backend/matrix_client.py +++ b/src/backend/matrix_client.py @@ -1822,8 +1822,8 @@ class MatrixClient(nio.AsyncClient): if None not in key: old = self.models[self.user_id, "pushrules"].get(key) - kind_change = old_kind is not None and old_kind != kind - rule_id_change = old_rule_id is not None and old_rule_id != rule_id + kind_change = old and old_kind and old_kind != kind + rule_id_change = old and old_rule_id and old_rule_id != rule_id explicit_move = move_before_rule_id or move_after_rule_id if old and not kind_change and not explicit_move: @@ -1841,7 +1841,7 @@ class MatrixClient(nio.AsyncClient): rule_id = rule_id, before = move_before_rule_id, after = move_after_rule_id, - actions = actions, + actions = actions or [], conditions = conditions, pattern = pattern, ) diff --git a/src/gui/Pages/AccountSettings/Notifications.qml b/src/gui/Pages/AccountSettings/Notifications.qml index 322d59b4..aa8c6262 100644 --- a/src/gui/Pages/AccountSettings/Notifications.qml +++ b/src/gui/Pages/AccountSettings/Notifications.qml @@ -68,16 +68,50 @@ HListView { } section.property: "kind" - section.delegate: HLabel { + section.delegate: HRowLayout { width: root.width - padding: theme.spacing - font.pixelSize: theme.fontSize.big - text: - section === "override" ? qsTr("High priority general rules") : - section === "content" ? qsTr("Message content rules") : - section === "room" ? qsTr("Room rules") : - section === "sender" ? qsTr("Sender rules") : - qsTr("Low priority general rules") + + HLabel { + padding: theme.spacing + font.pixelSize: theme.fontSize.big + text: + section === "override" ? qsTr("High priority general rules") : + section === "content" ? qsTr("Message content rules") : + section === "room" ? qsTr("Room rules") : + section === "sender" ? qsTr("Sender rules") : + qsTr("Low priority general rules") + + Layout.fillWidth: true + } + + PositiveButton { + readonly property var newRule: ({ + id: '[section, ""]', + kind: section, + rule_id: "", + order: 0, + default: false, + enabled: true, + conditions: "[]", + pattern: "", + actions: "[]", + notify: false, + highlight: false, + bubble: false, + sound: false, + urgency_hint: false, + }) + + backgroundColor: "transparent" + icon.name: "pushrule-add" + iconItem.small: true + Layout.fillHeight: true + Layout.fillWidth: false + onClicked: window.makePopup( + "Popups/PushRuleSettingsPopup/PushRuleSettingsPopup.qml", + {userId: root.userId, rule: newRule, ruleExists: false}, + ) + } } delegate: NotificationRuleDelegate { diff --git a/src/gui/Popups/PushRuleSettingsPopup/PushRuleSettingsPopup.qml b/src/gui/Popups/PushRuleSettingsPopup/PushRuleSettingsPopup.qml index ab6d4f00..631325ff 100644 --- a/src/gui/Popups/PushRuleSettingsPopup/PushRuleSettingsPopup.qml +++ b/src/gui/Popups/PushRuleSettingsPopup/PushRuleSettingsPopup.qml @@ -15,6 +15,7 @@ HFlickableColumnPopup { property string userId // A rule item from ModelStore.get(userId, "pushrules") property var rule + property bool ruleExists: true readonly property bool generalChecked: overrideRadio.checked || underrideRadio.checked @@ -184,6 +185,7 @@ HFlickableColumnPopup { ) readonly property bool isCurrent: + root.ruleExists && model.length && currentIndex === currentPosition && root.rule.kind === root.checkedKind @@ -226,6 +228,7 @@ HFlickableColumnPopup { label.textFormat: HLabel.StyledText text: + root.ruleExists && model.index === positionCombo.currentPosition && root.rule.kind === root.checkedKind ? qsTr("Current") : diff --git a/src/icons/thin/pushrule-add.svg b/src/icons/thin/pushrule-add.svg new file mode 100644 index 00000000..b0ca843e --- /dev/null +++ b/src/icons/thin/pushrule-add.svg @@ -0,0 +1,3 @@ + + +