Make offline presence to stop sync

Setting the presence of an account to offline
will make the client to end sync task and will
prevent messages from being sent.

Setting it to online again or any other presence
will start sync task again.

Left:
- Local echo to presence change
- UI Control to affect all members presence
- Block more requests to be sent (e.g. member
  actions)
This commit is contained in:
vslg
2020-07-09 17:06:14 -03:00
committed by miruka
parent 3fa35b88c9
commit a3c9ac20c6
12 changed files with 231 additions and 109 deletions

View File

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
import QtQuick.Shapes 1.15
import QtQuick.Shapes 1.12
HAvatar {
name: displayName || userId.substring(1) // no leading @

View File

@@ -12,18 +12,16 @@ HMenu {
property string userId
property string presence
property string statusMsg
property bool firstSyncDone
onOpened: statusText.forceActiveFocus()
function setPresence(presence, statusMsg = null) {
function setPresence(presence, statusMsg = undefined) {
py.callClientCoro(userId, "set_presence", [presence, statusMsg])
}
HMenuItem {
enabled: firstSyncDone
icon.name: "presence"
icon.color: theme.controls.presence.online
text: qsTr("Online")
@@ -31,8 +29,7 @@ HMenu {
}
HMenuItem {
visible: presence
enabled: firstSyncDone
enabled: presence
icon.name: "presence-busy"
icon.color: theme.controls.presence.unavailable
text: qsTr("Unavailable")
@@ -40,7 +37,6 @@ HMenu {
}
HMenuItem {
enabled: firstSyncDone
icon.name: "presence-offline"
icon.color: theme.controls.presence.offline
text: qsTr("Offline")
@@ -48,8 +44,7 @@ HMenu {
}
HMenuItem {
visible: presence
enabled: firstSyncDone
enabled: presence
icon.name: "presence-invisible"
icon.color: theme.controls.presence.offline
text: qsTr("Invisible")
@@ -60,8 +55,7 @@ HMenu {
HLabeledItem {
id: statusMsgLabel
visible: presence
enabled: firstSyncDone
enabled: presence && presence !== "offline"
width: parent.width
height: visible ? implicitHeight : 0
label.text: qsTr("Status message:")
@@ -80,12 +74,14 @@ HMenu {
}
defaultText: statusMsg
placeholderText: ! presence ? "Unsupported server" : ""
Layout.fillWidth: true
}
HButton {
id: button
visible: presence
icon.name: "apply"
icon.color: theme.colors.positiveBackground

View File

@@ -13,7 +13,12 @@ HTile {
tile: account
spacing: 0
opacity:
collapsed ? theme.mainPane.listView.account.collapsedOpacity : 1
collapsed ?
theme.mainPane.listView.account.collapsedOpacity :
model.presence == "offline" ?
theme.mainPane.listView.offlineOpacity :
1
Behavior on opacity { HNumberAnimation {} }
@@ -25,14 +30,14 @@ HTile {
radius: theme.mainPane.listView.account.avatarRadius
compact: account.compact
presence: model.presence
presence: model.presence_support ? model.presence : ""
Layout.alignment: Qt.AlignCenter
HLoader {
anchors.fill: parent
z: 9998
opacity: model.first_sync_done ? 0 : 1
opacity: model.connecting ? 1 : 0
active: opacity > 0
sourceComponent: Rectangle {
@@ -157,12 +162,12 @@ HTile {
}
contextMenu: AccountContextMenu {
userId: model.id
presence: model.presence_support ? model.presence : null
statusMsg: model.status_msg
// Gray out buttons before first sync
firstSyncDone: model.first_sync_done
userId: model.id
presence:
model.presence_support || model.presence === "offline" ?
model.presence :
null
statusMsg: model.status_msg
}

View File

@@ -15,7 +15,13 @@ HTile {
contentItem: ContentRow {
tile: room
opacity: model.left ? theme.mainPane.listView.room.leftRoomOpacity : 1
opacity:
accountModel.presence === "offline" ?
theme.mainPane.listView.offlineOpacity :
model.left ?
theme.mainPane.listView.room.leftRoomOpacity :
1
Behavior on opacity { HNumberAnimation {} }
@@ -179,6 +185,10 @@ HTile {
readonly property ListModel eventModel:
ModelStore.get(model.for_account, model.id, "events")
// TODO: binding loop
readonly property QtObject accountModel:
ModelStore.get("accounts").find(model.for_account)
readonly property QtObject lastEvent:
eventModel.count > 0 ? eventModel.get(0) : null
}

View File

@@ -57,6 +57,10 @@ MultiviewPane {
}
readonly property QtObject accountModel:
ModelStore.get("accounts").find(chat.roomInfo.for_account)
function toggleFocus() {
if (roomPane.activeFocus) {
if (roomPane.collapse) roomPane.close()
@@ -78,7 +82,9 @@ MultiviewPane {
}
MemberView {}
SettingsView {}
SettingsView {
enabled: accountModel.presence !== "offline"
}
HShortcut {
sequences: window.settings.keys.toggleFocusRoomPane