Capitalization, list model and room header work

- Standardized capitalization for variables and file names everywhere in
  QML and JS, get rid of mixed camelCase/snakeCase,
  use camelCase like everywhere in Qt

- ListModel items are now stored and returned as real QObjects with
  PyQt properties and signals.
  This makes dynamic property binding a lot easier and eliminates the need
  for many hacks.

- New update(), updateOrAppendWhere() methods and roles property
  for ListModel

- RoomHeader now properly updates when the room title or topic changes

- Add Backend.pdb(), to make it easier to start the debugger from QML
This commit is contained in:
miruka
2019-04-20 17:36:21 -04:00
parent b33f5f1d34
commit 8f35e60801
34 changed files with 304 additions and 250 deletions

View File

@@ -31,14 +31,14 @@ class SignalManager(QObject):
def onClientAdded(self, client: Client) -> None:
self.connectClient(client)
self.backend.models.accounts.append(User(
user_id = client.userID,
display_name = self.backend.getUserDisplayName(client.userID),
userId = client.userId,
displayName = self.backend.getUserDisplayName(client.userId),
))
def onClientDeleted(self, user_id: str) -> None:
accs = self.backend.models.accounts
del accs[accs.indexWhere("user_id", user_id)]
del accs[accs.indexWhere("userId", user_id)]
def connectClient(self, client: Client) -> None:
@@ -58,7 +58,7 @@ class SignalManager(QObject):
def onRoomJoined(self, client: Client, room_id: str) -> None:
model = self.backend.models.rooms[client.userID]
model = self.backend.models.rooms[client.userId]
room = client.nio.rooms[room_id]
def group_name() -> Optional[str]:
@@ -66,22 +66,17 @@ class SignalManager(QObject):
return None if name == "Empty room?" else name
item = Room(
room_id = room_id,
display_name = room.name or room.canonical_alias or group_name(),
description = room.topic,
roomId = room_id,
displayName = room.name or room.canonical_alias or group_name(),
topic = room.topic,
)
try:
index = model.indexWhere("room_id", room_id)
except ValueError:
model.append(item)
else:
model[index] = item
model.updateOrAppendWhere("roomId", room_id, item)
def onRoomLeft(self, client: Client, room_id: str) -> None:
rooms = self.backend.models.rooms[client.userID]
del rooms[rooms.indexWhere("room_id", room_id)]
rooms = self.backend.models.rooms[client.userId]
del rooms[rooms.indexWhere("roomId", room_id)]
def onRoomSyncPrevBatchTokenReceived(
@@ -116,15 +111,15 @@ class SignalManager(QObject):
model = self.backend.models.roomEvents[room_id]
date_time = QDateTime\
.fromMSecsSinceEpoch(edict["server_timestamp"])
new_event = RoomEvent(type=etype, date_time=date_time, dict=edict)
new_event = RoomEvent(type=etype, dateTime=date_time, dict=edict)
if self._events_in_transfer:
local_echoes_met: int = 0
replace_at: Optional[int] = None
update_at: Optional[int] = None
# Find if any locally echoed event corresponds to new_event
for i, event in enumerate(model):
if not event.is_local_echo:
if not event.isLocalEcho:
continue
sb = (event.dict["sender"], event.dict["body"])
@@ -132,23 +127,23 @@ class SignalManager(QObject):
if sb == new_sb:
# The oldest matching local echo shall be replaced
replace_at = max(replace_at or 0, i)
update_at = max(update_at or 0, i)
local_echoes_met += 1
if local_echoes_met >= self._events_in_transfer:
break
if replace_at is not None:
model[replace_at] = new_event
if update_at is not None:
model.update(update_at, new_event)
self._events_in_transfer -= 1
return
for i, event in enumerate(model):
if event.is_local_echo:
if event.isLocalEcho:
continue
# Model is sorted from newest to oldest message
if new_event.date_time > event.date_time:
if new_event.dateTime > event.dateTime:
model.insert(i, new_event)
return
@@ -159,8 +154,8 @@ class SignalManager(QObject):
self, client: Client, room_id: str, users: List[str]
) -> None:
rooms = self.backend.models.rooms[client.userID]
rooms[rooms.indexWhere("room_id", room_id)].typing_users = users
rooms = self.backend.models.rooms[client.userId]
rooms[rooms.indexWhere("roomId", room_id)].typingUsers = users
def onMessageAboutToBeSent(
@@ -171,15 +166,15 @@ class SignalManager(QObject):
model = self.backend.models.roomEvents[room_id]
nio_event = nio.events.RoomMessage.parse_event({
"event_id": "",
"sender": client.userID,
"sender": client.userId,
"origin_server_ts": timestamp,
"content": content,
})
event = RoomEvent(
type = type(nio_event).__name__,
date_time = QDateTime.fromMSecsSinceEpoch(timestamp),
dict = nio_event.__dict__,
is_local_echo = True,
type = type(nio_event).__name__,
dateTime = QDateTime.fromMSecsSinceEpoch(timestamp),
dict = nio_event.__dict__,
isLocalEcho = True,
)
model.insert(0, event)
self._events_in_transfer += 1