Add saving of pushrules action changes

This commit is contained in:
miruka 2020-11-01 00:55:29 -04:00
parent 2480603ee2
commit d5bcaca874
5 changed files with 135 additions and 20 deletions

View File

@ -41,8 +41,8 @@ from .errors import (
from .html_markdown import HTML_PROCESSOR as HTML from .html_markdown import HTML_PROCESSOR as HTML
from .media_cache import Media, Thumbnail from .media_cache import Media, Thumbnail
from .models.items import ( from .models.items import (
ZERO_DATE, Account, Event, Member, Room, Transfer, TransferStatus, ZERO_DATE, Account, Event, Member, PushRule, PushRuleKind, Room,
TypeSpecifier, Transfer, TransferStatus, TypeSpecifier,
) )
from .models.model_store import ModelStore from .models.model_store import ModelStore
from .nio_callbacks import NioCallbacks from .nio_callbacks import NioCallbacks
@ -1781,6 +1781,57 @@ class MatrixClient(nio.AsyncClient):
raise MatrixUnauthorized() raise MatrixUnauthorized()
async def tweak_pushrule(
self,
kind: Union[PushRuleKind, str],
rule_id: str,
notify: Optional[bool] = None,
highlight: Optional[bool] = None,
bubble: Optional[bool] = None,
sound: Optional[bool] = None,
urgency_hint: Optional[bool] = None,
) -> None:
# XXX: [kind, rule_id]
current: PushRule = self.models[self.user_id, "pushrules"][rule_id]
actions: List[nio.PushAction] = []
if notify or (notify is None and current.notify):
actions.append(nio.PushNotify())
if highlight or (highlight is None and current.highlight):
actions.append(nio.PushSetTweak("highlight", True))
if bubble or (bubble is None and current.bubble):
actions.append(nio.PushSetTweak("bubble", True))
elif bubble is False or (bubble is None and not current.bubble):
actions.append(nio.PushSetTweak("bubble", False))
# XXX: don't always override with "default"
if sound or (sound is None and current.sound):
actions.append(nio.PushSetTweak("sound", "default"))
hint = urgency_hint
if hint or (hint is None and current.urgency_hint):
actions.append(nio.PushSetTweak("urgency_hint", True))
elif hint is False or (hint is None and not current.urgency_hint):
actions.append(nio.PushSetTweak("urgency_hint", False))
nio_kind = nio.PushRuleKind[
(kind if isinstance(kind, str) else kind.value).lower()
]
print(nio_kind, rule_id, actions)
await self.set_pushrule_actions("global", nio_kind, rule_id, actions)
async def mass_tweak_pushrules(self, *tweaks_kwargs) -> None:
coros = [self.tweak_pushrule(**kwargs) for kwargs in tweaks_kwargs]
await asyncio.gather(*coros)
# Functions to register/modify data into models # Functions to register/modify data into models
async def update_account_unread_counts(self) -> None: async def update_account_unread_counts(self) -> None:

View File

@ -784,7 +784,7 @@ class NioCallbacks:
async def onPushRulesEvent(self, ev: nio.PushRulesEvent) -> None: async def onPushRulesEvent(self, ev: nio.PushRulesEvent) -> None:
model = self.models[self.user_id, "pushrules"] model = self.models[self.user_id, "pushrules"]
model.clear() model.clear() # XXX
kinds: Dict[PushRuleKind, List[nio.PushRule]] = { kinds: Dict[PushRuleKind, List[nio.PushRule]] = {
PushRuleKind.Override: ev.global_rules.override, PushRuleKind.Override: ev.global_rules.override,

View File

@ -4,9 +4,39 @@ import QtQuick 2.12
import "../../Base" import "../../Base"
HButton { HButton {
property bool on: true property string toggles: ""
readonly property string key: JSON.stringify([model.kind, model.id])
readonly property bool on:
toggles && page.pendingEdits[key] && toggles in page.pendingEdits[key]?
page.pendingEdits[key][toggles] :
toggles ?
model[toggles] :
true
opacity: on ? 1 : theme.disabledElementsOpacity opacity: on ? 1 : theme.disabledElementsOpacity
hoverEnabled: true hoverEnabled: true
backgroundColor: "transparent" backgroundColor: "transparent"
onClicked: {
if (! toggles) return
if (! (key in page.pendingEdits)) page.pendingEdits[key] = {}
if ((! on) === model[toggles])
delete page.pendingEdits[key][toggles]
else
page.pendingEdits[key][toggles] = ! on
if (! Object.keys(page.pendingEdits[key]).length)
delete page.pendingEdits[key]
page.pendingEditsChanged()
}
Behavior on opacity { HNumberAnimation {} }
} }

View File

@ -1,24 +1,20 @@
// SPDX-License-Identifier: LGPL-3.0-or-later // SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12 import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12 import QtQuick.Layouts 1.12
import "../.." import "../.."
import "../../Base" import "../../Base"
import "../../Base/Buttons"
import "../../Base/HTile" import "../../Base/HTile"
import "../../MainPane" import "../../MainPane"
import "../../PythonBridge"
import "../../ShortcutBundles"
HTile { HTile {
id: root id: root
property string userId property Item page
readonly property QtObject matchingRoom: readonly property QtObject matchingRoom:
model.kind === "Room" ? model.kind === "Room" ?
ModelStore.get(userId, "rooms").find(model.id) : ModelStore.get(page.userId, "rooms").find(model.id) :
null null
@ -69,7 +65,7 @@ HTile {
model.id === ".m.rule.contains_user_name" ? model.id === ".m.rule.contains_user_name" ?
qsTr("Contains %1").arg(utils.coloredNameHtml( qsTr("Contains %1").arg(utils.coloredNameHtml(
"", userId, userId.split(":")[0].substring(1), "", page.userId, page.userId.split(":")[0].substring(1),
)): )):
model.id === ".m.rule.call" ? model.id === ".m.rule.call" ?
@ -103,7 +99,7 @@ HTile {
HRowLayout { HRowLayout {
NotificationRuleButton { NotificationRuleButton {
on: model.notify toggles: "notify"
contentItem: MessageIndicator { contentItem: MessageIndicator {
indicatorTheme: indicatorTheme:
@ -117,7 +113,7 @@ HTile {
} }
NotificationRuleButton { NotificationRuleButton {
on: model.highlight toggles: "highlight"
contentItem: MessageIndicator { contentItem: MessageIndicator {
indicatorTheme: indicatorTheme:
@ -134,17 +130,17 @@ HTile {
NotificationRuleButton { NotificationRuleButton {
icon.name: "pushrule-action-bubble" icon.name: "pushrule-action-bubble"
on: model.bubble toggles: "bubble"
} }
NotificationRuleButton { NotificationRuleButton {
icon.name: "pushrule-action-sound" icon.name: "pushrule-action-sound"
on: model.sound toggles: "sound"
} }
NotificationRuleButton { NotificationRuleButton {
icon.name: "pushrule-action-urgency-hint" icon.name: "pushrule-action-urgency-hint"
on: model.urgency_hint toggles: "urgency_hint"
} }
HSpacer {} HSpacer {}

View File

@ -6,7 +6,6 @@ import QtQuick.Layouts 1.12
import "../.." import "../.."
import "../../Base" import "../../Base"
import "../../Base/Buttons" import "../../Base/Buttons"
import "../../PythonBridge"
import "../../ShortcutBundles" import "../../ShortcutBundles"
HListView { HListView {
@ -17,14 +16,38 @@ HListView {
property bool enableFlickShortcuts: property bool enableFlickShortcuts:
SwipeView ? SwipeView.isCurrentItem : true SwipeView ? SwipeView.isCurrentItem : true
// The object's array keys are run through `JSON.stringify(key)`.
// {[kind, rule_id]: {notify, highlight, bubble, sound, urgency_hint}}
property var pendingEdits: ({})
property string saveFutureId: ""
function takeFocus() { function takeFocus() {
// deviceList.headerItem.exportButton.forceActiveFocus() // deviceList.headerItem.exportButton.forceActiveFocus() TODO
}
function save() {
const args = []
for (const [kindRuleId, kwargs] of Object.entries(pendingEdits)) {
const [kind, rule_id] = JSON.parse(kindRuleId)
args.push(Object.assign({}, {kind, rule_id}, kwargs))
}
saveFutureId = py.callClientCoro(
userId,
"mass_tweak_pushrules",
args,
() => {
if (! root) return
saveFutureId = ""
pendingEdits = {}
}
)
} }
clip: true clip: true
model: ModelStore.get(userId, "pushrules") model: ModelStore.get(userId, "pushrules")
bottomMargin: theme.spacing
implicitHeight: Math.min(window.height, contentHeight + bottomMargin) implicitHeight: Math.min(window.height, contentHeight + bottomMargin)
section.property: "kind" section.property: "kind"
@ -42,10 +65,25 @@ HListView {
} }
delegate: NotificationRuleDelegate { delegate: NotificationRuleDelegate {
userId: root.userId page: root
width: root.width width: root.width
} }
footer: AutoDirectionLayout {
z: 100
width: root.width
enabled: Object.keys(root.pendingEdits).length !== 0
ApplyButton {
onClicked: root.save()
loading: root.saveFutureId !== ""
}
CancelButton {
onClicked: pendingEdits = {}
}
}
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true