Implement (read-only for now) room settings

This commit is contained in:
miruka 2019-12-13 08:32:18 -04:00
parent f8d5260fd7
commit d240de702f
4 changed files with 139 additions and 11 deletions

View File

@ -7,6 +7,7 @@ import re
import traceback
from contextlib import suppress
from datetime import datetime
from functools import partial
from pathlib import Path
from typing import (
Any, DefaultDict, Dict, List, NamedTuple, Optional, Set, Tuple, Type,
@ -801,14 +802,17 @@ class MatrixClient(nio.AsyncClient):
except KeyError:
last_ev = None
inviter = getattr(room, "inviter", "") or ""
levels = room.power_levels
our_level = levels.get_user_level(self.user_id)
inviter = getattr(room, "inviter", "") or ""
levels = room.power_levels
can_send_state = partial(levels.can_user_send_state, self.user_id)
can_send_msg = partial(levels.can_user_send_message, self.user_id)
self.models[Room, self.user_id][room.room_id] = Room(
room_id = room.room_id,
given_name = room.name,
display_name = room.display_name or "",
avatar_url = room.gen_avatar_url or "",
plain_topic = room.topic,
topic = HTML_FILTER.filter_inline(room.topic or ""),
inviter_id = inviter,
inviter_name = room.user_name(inviter) if inviter else "",
@ -816,8 +820,18 @@ class MatrixClient(nio.AsyncClient):
(room.avatar_url(inviter) or "") if inviter else "",
left = left,
can_invite = our_level >= levels.defaults.invite,
can_send_messages = our_level >= levels.defaults.events_default,
encrypted = room.encrypted,
invite_required = room.join_rule == "invite",
guests_allowed = room.guest_access == "can_join",
can_invite = levels.can_user_invite(self.user),
can_send_messages = can_send_msg(),
can_set_name = can_send_state("m.room.name"),
can_set_topic = can_send_state("m.room.topic"),
can_set_avatar = can_send_state("m.room.avatar"),
can_set_encryption = can_send_state("m.room.encryption"),
can_set_join_rules = can_send_state("m.room.join_rules"),
can_set_guest_access = can_send_state("m.room.guest_access"),
last_event = last_ev,
)

View File

@ -38,8 +38,10 @@ class Account(ModelItem):
@dataclass
class Room(ModelItem):
room_id: str = field()
given_name: str = ""
display_name: str = ""
avatar_url: str = ""
plain_topic: str = ""
topic: str = ""
inviter_id: str = ""
inviter_name: str = ""
@ -47,8 +49,18 @@ class Room(ModelItem):
left: bool = False
typing_members: List[str] = field(default_factory=list)
can_invite: bool = True
can_send_messages: bool = True
encrypted: bool = False
invite_required: bool = True
guests_allowed: bool = True
can_invite: bool = False
can_send_messages: bool = False
can_set_name: bool = False
can_set_topic: bool = False
can_set_avatar: bool = False
can_set_encryption: bool = False
can_set_join_rules: bool = False
can_set_guest_access: bool = False
# Event.serialized
last_event: Optional[Dict[str, Any]] = field(default=None, repr=False)

View File

@ -1,4 +1,5 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import "../../Base"
@ -43,19 +44,32 @@ HDrawer {
height: theme.baseElementsHeight
backgroundColor: "transparent"
icon.name: "room-view-" + modelData
autoExclusive: true
checked: modelData === "members"
enabled: modelData === "members"
toolTip.text: qsTr(
modelData.charAt(0).toUpperCase() + modelData.slice(1)
)
autoExclusive: true
checked: swipeView.currentIndex === index
enabled: ["members", "settings"].includes(modelData)
onClicked: swipeView.currentIndex = index
}
}
}
MemberView {
SwipeView {
id: swipeView
interactive: ! roomPane.collapsed
currentIndex: 4 // XXX
Layout.fillWidth: true
Layout.fillHeight: true
MemberView {}
Item {}
Item {}
Item {}
SettingsView {}
}
}
}

View File

@ -0,0 +1,88 @@
import QtQuick 2.12
import QtQuick.Layouts 1.12
import "../../Base"
import "../../utils.js" as Utils
// TODO: hide roompane until room is loaded & expand if too small
HBox {
color: "transparent"
Component.onCompleted: Utils.debug(this) // XXX
HRoomAvatar {
id: avatar
displayName: chat.roomInfo.display_name
mxc: chat.roomInfo.avatar_url
// enabled: chat.roomInfo.can_set_avatar # put this in "change avatar"
Layout.fillWidth: true
Layout.preferredHeight: width
Layout.maximumWidth: 256 * theme.uiScale
}
HTextField {
id: nameField
placeholderText: qsTr("Room name")
maximumLength: 255
text: chat.roomInfo.given_name
enabled: chat.roomInfo.can_set_name
Layout.fillWidth: true
}
HScrollableTextArea {
id: topicField
placeholderText: qsTr("Room topic")
text: chat.roomInfo.plain_topic
enabled: chat.roomInfo.can_set_topic
Layout.fillWidth: true
}
HCheckBox {
id: encryptCheckBox
text: qsTr("Encrypt messages")
subtitle.text:
qsTr("Only you and those you trust will be able to read the " +
"conversation") +
`<br><font color="${theme.colors.middleBackground}">` +
(
chat.roomInfo.encrypted ?
qsTr("Cannot be disabled") :
qsTr("Cannot be disabled later!")
) +
"</font>"
subtitle.textFormat: Text.StyledText
checked: chat.roomInfo.encrypted
enabled: chat.roomInfo.can_set_encryption && ! chat.roomInfo.encrypted
Layout.fillWidth: true
}
HCheckBox {
id: requireInviteCheckbox
text: qsTr("Require being invited")
subtitle.text: qsTr("Users will need an invite to join the room")
checked: chat.roomInfo.invite_required
enabled: chat.roomInfo.can_set_join_rules
Layout.fillWidth: true
}
HCheckBox {
text: qsTr("Forbid guests")
subtitle.text: qsTr("Users without an account won't be able to join")
checked: ! chat.roomInfo.guests_allowed
enabled: chat.roomInfo.can_set_guest_access
Layout.fillWidth: true
}
// HCheckBox { TODO
// text: qsTr("Make this room visible in the public room directory")
// checked: chat.roomInfo.published_in_directory
// Layout.fillWidth: true
// }
}