Working typing users bar
This commit is contained in:
parent
d28b95f7b7
commit
4c4603691f
|
@ -3,7 +3,9 @@ QT = quick
|
||||||
DEFINES += QT_DEPRECATED_WARNINGS
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
CONFIG += warn_off c++11 release
|
CONFIG += warn_off c++11 release
|
||||||
dev {
|
dev {
|
||||||
|
CONFIG -= warn_off release
|
||||||
CONFIG += debug
|
CONFIG += debug
|
||||||
|
message($$CONFIG)
|
||||||
}
|
}
|
||||||
|
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
|
|
|
@ -17,6 +17,7 @@ class RoomUpdated(Event):
|
||||||
display_name: str = ""
|
display_name: str = ""
|
||||||
avatar_url: str = ""
|
avatar_url: str = ""
|
||||||
topic: str = ""
|
topic: str = ""
|
||||||
|
typing_members: Sequence[str] = ()
|
||||||
|
|
||||||
inviter_id: str = ""
|
inviter_id: str = ""
|
||||||
left_event: Dict[str, str] = field(default_factory=dict)
|
left_event: Dict[str, str] = field(default_factory=dict)
|
||||||
|
|
|
@ -7,7 +7,7 @@ import platform
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
from typing import DefaultDict, Dict, Optional, Type
|
from typing import DefaultDict, Dict, List, Optional, Type
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
import nio
|
import nio
|
||||||
|
@ -216,6 +216,11 @@ class MatrixClient(nio.AsyncClient):
|
||||||
if room_id not in self.backend.past_tokens:
|
if room_id not in self.backend.past_tokens:
|
||||||
self.backend.past_tokens[room_id] = info.timeline.prev_batch
|
self.backend.past_tokens[room_id] = info.timeline.prev_batch
|
||||||
|
|
||||||
|
typing: List[str] = []
|
||||||
|
for ev in info.ephemeral:
|
||||||
|
if isinstance(ev, nio.TypingNoticeEvent):
|
||||||
|
typing = ev.users
|
||||||
|
|
||||||
rooms.RoomUpdated(
|
rooms.RoomUpdated(
|
||||||
user_id = self.user_id,
|
user_id = self.user_id,
|
||||||
category = "Rooms",
|
category = "Rooms",
|
||||||
|
@ -223,6 +228,7 @@ class MatrixClient(nio.AsyncClient):
|
||||||
display_name = self._get_room_name(room) or "",
|
display_name = self._get_room_name(room) or "",
|
||||||
avatar_url = room.gen_avatar_url or "",
|
avatar_url = room.gen_avatar_url or "",
|
||||||
topic = room.topic or "",
|
topic = room.topic or "",
|
||||||
|
typing_members = typing,
|
||||||
)
|
)
|
||||||
|
|
||||||
for room_id, _ in resp.rooms.leave.items():
|
for room_id, _ in resp.rooms.leave.items():
|
||||||
|
|
|
@ -55,7 +55,7 @@ HColumnLayout {
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
}
|
}
|
||||||
|
|
||||||
//TypingMembersBar {}
|
TypingMembersBar {}
|
||||||
|
|
||||||
InviteBanner {
|
InviteBanner {
|
||||||
visible: category === "Invites"
|
visible: category === "Invites"
|
||||||
|
|
|
@ -1,22 +1,18 @@
|
||||||
import QtQuick 2.7
|
import QtQuick 2.7
|
||||||
import QtQuick.Layouts 1.3
|
import QtQuick.Layouts 1.3
|
||||||
import "../Base"
|
import "../Base"
|
||||||
import "utils.js" as ChatJS
|
|
||||||
|
|
||||||
HRectangle {
|
HRectangle {
|
||||||
property var typingMembers: chatPage.roomInfo.typingMembers
|
|
||||||
|
|
||||||
color: HStyle.chat.typingMembers.background
|
color: HStyle.chat.typingMembers.background
|
||||||
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.minimumHeight: usersLabel.text ? usersLabel.implicitHeight : 0
|
Layout.preferredHeight: usersLabel.text ? usersLabel.implicitHeight : 0
|
||||||
Layout.maximumHeight: Layout.minimumHeight
|
|
||||||
|
|
||||||
HLabel {
|
HLabel {
|
||||||
id: usersLabel
|
id: usersLabel
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
text: ChatJS.getTypingMembersText(typingMembers, chatPage.userId)
|
text: chatPage.roomInfo.typingText
|
||||||
elide: Text.ElideMiddle
|
elide: Text.ElideMiddle
|
||||||
maximumLineCount: 1
|
maximumLineCount: 1
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,21 +39,3 @@ function getLeftBannerAvatarName(leftEvent, accountId) {
|
||||||
|
|
||||||
return Backend.users.get(leftEvent.sender).displayName.value
|
return Backend.users.get(leftEvent.sender).displayName.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getTypingMembersText(users, ourAccountId) {
|
|
||||||
var names = []
|
|
||||||
|
|
||||||
for (var i = 0; i < users.length; i++) {
|
|
||||||
if (users[i] !== ourAccountId) {
|
|
||||||
names.push(Backend.users.get(users[i]).displayName.value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (names.length < 1) { return "" }
|
|
||||||
|
|
||||||
return "🖋 " +
|
|
||||||
[names.slice(0, -1).join(", "), names.slice(-1)[0]]
|
|
||||||
.join(names.length < 2 ? "" : " and ") +
|
|
||||||
(names.length > 1 ? " are" : " is") + " typing…"
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,27 @@
|
||||||
function onRoomUpdated(user_id, category, room_id, display_name, avatar_url,
|
function typingTextFor(members, our_user_id) {
|
||||||
topic, inviter_id, left_event) {
|
var names = []
|
||||||
|
|
||||||
|
for (var i = 0; i < members.length; i++) {
|
||||||
|
if (members[i] != our_user_id) {
|
||||||
|
names.push(users.getUser(members[i]).displayName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (names.length == 0) { return "" }
|
||||||
|
if (names.length == 1) { return qsTr("%1 is typing...").arg(names[0]) }
|
||||||
|
|
||||||
|
var text = qsTr("%1 and %2 are typing...")
|
||||||
|
|
||||||
|
if (names.length == 2) { return text.arg(names[0]).arg(names[1]) }
|
||||||
|
|
||||||
|
return text.arg(names.slice(0, -1).join(", ")).arg(names.slice(-1)[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function onRoomUpdated(
|
||||||
|
user_id, category, room_id, display_name, avatar_url, topic,
|
||||||
|
typing_members, inviter_id, left_event
|
||||||
|
) {
|
||||||
roomCategories.upsert({"userId": user_id, "name": category}, {
|
roomCategories.upsert({"userId": user_id, "name": category}, {
|
||||||
"userId": user_id,
|
"userId": user_id,
|
||||||
"name": category
|
"name": category
|
||||||
|
@ -37,8 +58,9 @@ function onRoomUpdated(user_id, category, room_id, display_name, avatar_url,
|
||||||
"displayName": display_name,
|
"displayName": display_name,
|
||||||
"avatarUrl": avatar_url,
|
"avatarUrl": avatar_url,
|
||||||
"topic": topic,
|
"topic": topic,
|
||||||
|
"typingText": typingTextFor(typing_members, user_id),
|
||||||
"inviterId": inviter_id,
|
"inviterId": inviter_id,
|
||||||
"leftEvent": left_event
|
"leftEvent": left_event,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,3 +120,7 @@ function onTimelineEventReceived(
|
||||||
|
|
||||||
|
|
||||||
var onTimelineMessageReceived = onTimelineEventReceived
|
var onTimelineMessageReceived = onTimelineEventReceived
|
||||||
|
|
||||||
|
|
||||||
|
function onTypingNoticeEvent(room_id, members) {
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,17 @@
|
||||||
|
function arrayToModelItem(keys_name, array) {
|
||||||
|
// Convert an array to an object suitable to be in a model, example:
|
||||||
|
// [1, 2, 3] → [{keys_name: 1}, {keys_name: 2}, {keys_name: 3}]
|
||||||
|
var items = []
|
||||||
|
|
||||||
|
for (var i = 0; i < array.length; i++) {
|
||||||
|
var obj = {}
|
||||||
|
obj[keys_name] = array[i]
|
||||||
|
items.push(obj)
|
||||||
|
}
|
||||||
|
return items
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function stripUserId(user_id) {
|
function stripUserId(user_id) {
|
||||||
// Remove leading @
|
// Remove leading @
|
||||||
return user_id.substring(1)
|
return user_id.substring(1)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user