Add sortedMembers to Room ListItems

This commit is contained in:
miruka 2019-05-15 15:59:43 -04:00
parent c67e1bfc79
commit 68b6899de1
3 changed files with 46 additions and 17 deletions

View File

@ -1,11 +1,12 @@
from enum import Enum
from typing import Any, Dict, List, Optional
from PyQt5.QtCore import QDateTime, QSortFilterProxyModel
from PyQt5.QtCore import QDateTime
from ..pyqt_future import PyQtFuture
from .list_item import ListItem
from .list_model import ListModel
from .sort_filter_proxy import SortFilterProxy
class Account(ListItem):
@ -20,21 +21,24 @@ class RoomCategory(ListItem):
_required_init_values = {"name", "rooms", "sortedRooms"}
_constant = {"name", "rooms", "sortedRooms"}
name: str = ""
rooms: ListModel = ListModel()
sortedRooms: QSortFilterProxyModel = QSortFilterProxyModel()
name: str = ""
rooms: ListModel = ListModel()
sortedRooms: SortFilterProxy = SortFilterProxy(ListModel(), "", "")
class Room(ListItem):
_required_init_values = {"roomId", "displayName", "members"}
_constant = {"roomId", "members"}
_required_init_values = {"roomId", "displayName", "members",
"sortedMembers"}
_constant = {"roomId", "members", "sortedMembers"}
roomId: str = ""
displayName: str = ""
topic: Optional[str] = None
lastEventDateTime: Optional[QDateTime] = None
typingMembers: List[str] = []
members: ListModel = ListModel()
members: ListModel = ListModel()
sortedMembers: SortFilterProxy = SortFilterProxy(ListModel(), "", "")
inviter: Optional[Dict[str, str]] = None
leftEvent: Optional[Dict[str, str]] = None

View File

@ -166,6 +166,13 @@ class SignalManager(QObject):
previous_room = categories["Rooms"].rooms.pop(room_id, None)
previous_left = categories["Left"].rooms.pop(room_id, None)
members = ListModel()
sorted_members = SortFilterProxy(
source_model = members,
sort_by_role = "userId", # TODO
filter_by_role = "userId",
)
categories["Invites"].rooms.upsert(
where_main_key_is = room_id,
update_with = Room(
@ -174,9 +181,10 @@ class SignalManager(QObject):
topic = nio_room.topic,
inviter = inviter,
lastEventDateTime = QDateTime.currentDateTime(), # FIXME
members = ListModel(),
members = members,
sortedMembers = sorted_members,
),
no_update = ("typingMembers"),
no_update = ("typingMembers", "members"),
)
categories["Invites"].rooms[room_id].members.updateAll([
RoomMember(userId=user_id) for user_id in nio_room.users
@ -198,15 +206,24 @@ class SignalManager(QObject):
previous_invite = categories["Invites"].rooms.pop(room_id, None)
previous_left = categories["Left"].rooms.pop(room_id, None)
members = ListModel()
sorted_members = SortFilterProxy(
source_model = members,
sort_by_role = "userId", # TODO
filter_by_role = "userId",
)
categories["Rooms"].rooms.upsert(
where_main_key_is = room_id,
update_with = Room(
roomId = room_id,
displayName = self._get_room_displayname(nio_room),
topic = nio_room.topic,
members = ListModel(),
roomId = room_id,
displayName = self._get_room_displayname(nio_room),
topic = nio_room.topic,
members = members,
sortedMembers = sorted_members,
),
no_update = ("typingMembers", "members", "lastEventDateTime"),
no_update = ("typingMembers", "members", "sortedMembers",
"lastEventDateTime"),
)
categories["Rooms"].rooms[room_id].members.updateAll([
RoomMember(userId=user_id) for user_id in nio_room.users
@ -232,6 +249,13 @@ class SignalManager(QObject):
left_time = left_event.get("server_timestamp") if left_event else None
members = ListModel()
sorted_members = SortFilterProxy(
source_model = members,
sort_by_role = "userId", # TODO
filter_by_role = "userId",
)
categories["Left"].rooms.upsert(
where_main_key_is = room_id,
update_with = Room(
@ -243,9 +267,10 @@ class SignalManager(QObject):
QDateTime.fromMSecsSinceEpoch(left_time)
if left_time else QDateTime.currentDateTime()
),
members = ListModel(),
members = members,
sortedMembers = sorted_members,
),
no_update = ("members", "lastEventDateTime"),
no_update = ("members", "sortedMembers", "lastEventDateTime"),
)
signal = self.roomCategoryChanged

View File

@ -19,7 +19,7 @@ HColumnLayout {
NumberAnimation { duration: HStyle.animationDuration }
}
model: chatPage.roomInfo.members
model: chatPage.roomInfo.sortedMembers
delegate: MemberDelegate {}
Layout.fillWidth: true