Display chat messages
This commit is contained in:
parent
df1199060d
commit
a4deb4b7a9
|
@ -0,0 +1,63 @@
|
||||||
|
import NimQml, chatMessages, Tables
|
||||||
|
import ../signals/types
|
||||||
|
|
||||||
|
type
|
||||||
|
ChatMessageRoles {.pure.} = enum
|
||||||
|
UserName = UserRole + 1,
|
||||||
|
Message = UserRole + 2,
|
||||||
|
Timestamp = UserRole + 3
|
||||||
|
IsCurrentUser = UserRole + 4
|
||||||
|
|
||||||
|
QtObject:
|
||||||
|
type
|
||||||
|
ChatMessageList* = ref object of QAbstractListModel
|
||||||
|
messages*: seq[ChatMessage]
|
||||||
|
|
||||||
|
proc delete(self: ChatMessageList) =
|
||||||
|
self.QAbstractListModel.delete
|
||||||
|
for message in self.messages:
|
||||||
|
message.delete
|
||||||
|
self.messages = @[]
|
||||||
|
|
||||||
|
proc setup(self: ChatMessageList) =
|
||||||
|
self.QAbstractListModel.setup
|
||||||
|
|
||||||
|
proc newChatMessageList*(): ChatMessageList =
|
||||||
|
new(result, delete)
|
||||||
|
result.messages = @[]
|
||||||
|
result.setup
|
||||||
|
|
||||||
|
method rowCount(self: ChatMessageList, index: QModelIndex = nil): int =
|
||||||
|
return self.messages.len
|
||||||
|
|
||||||
|
method data(self: ChatMessageList, index: QModelIndex, role: int): QVariant =
|
||||||
|
if not index.isValid:
|
||||||
|
return
|
||||||
|
if index.row < 0 or index.row >= self.messages.len:
|
||||||
|
return
|
||||||
|
let message = self.messages[index.row]
|
||||||
|
let chatMessageRole = role.ChatMessageRoles
|
||||||
|
case chatMessageRole:
|
||||||
|
of ChatMessageRoles.UserName: result = newQVariant(message.userName)
|
||||||
|
of ChatMessageRoles.Message: result = newQVariant(message.message)
|
||||||
|
of ChatMessageRoles.Timestamp: result = newQVariant(message.timestamp)
|
||||||
|
of ChatMessageRoles.IsCurrentUser: result = newQVariant(message.isCurrentUser)
|
||||||
|
|
||||||
|
method roleNames(self: ChatMessageList): Table[int, string] =
|
||||||
|
{
|
||||||
|
ChatMessageRoles.UserName.int:"userName",
|
||||||
|
ChatMessageRoles.Message.int:"message",
|
||||||
|
ChatMessageRoles.Timestamp.int:"timestamp",
|
||||||
|
ChatMessageRoles.IsCurrentUser.int:"isCurrentUser"
|
||||||
|
}.toTable
|
||||||
|
|
||||||
|
proc add*(self: ChatMessageList, message: Message) =
|
||||||
|
let chatMessage = newChatMessage()
|
||||||
|
chatMessage.userName = message.alias
|
||||||
|
chatMessage.message = message.text
|
||||||
|
chatMessage.timestamp = message.timestamp #TODO convert to date/time?
|
||||||
|
chatMessage.isCurrentUser = false #TODO: Determine who originated the message
|
||||||
|
|
||||||
|
self.beginInsertRows(newQModelIndex(), self.messages.len, self.messages.len)
|
||||||
|
self.messages.add(chatMessage)
|
||||||
|
self.endInsertRows()
|
|
@ -0,0 +1,90 @@
|
||||||
|
import NimQml
|
||||||
|
|
||||||
|
QtObject:
|
||||||
|
type ChatMessage* = ref object of QObject
|
||||||
|
userName: string
|
||||||
|
message: string
|
||||||
|
timestamp: string
|
||||||
|
isCurrentUser: bool
|
||||||
|
|
||||||
|
proc delete*(self: ChatMessage) =
|
||||||
|
self.QObject.delete
|
||||||
|
|
||||||
|
proc setup(self: ChatMessage) =
|
||||||
|
self.QObject.setup
|
||||||
|
|
||||||
|
proc newChatMessage*(): ChatMessage =
|
||||||
|
new(result)
|
||||||
|
result.userName = ""
|
||||||
|
result.message = ""
|
||||||
|
result.timestamp = "0"
|
||||||
|
result.isCurrentUser = false
|
||||||
|
result.setup
|
||||||
|
|
||||||
|
proc userName*(self: ChatMessage): string {.slot.} =
|
||||||
|
result = self.userName
|
||||||
|
|
||||||
|
proc userNameChanged*(self: ChatMessage, userName: string) {.signal.}
|
||||||
|
|
||||||
|
proc setUserName(self: ChatMessage, userName: string) {.slot.} =
|
||||||
|
if self.userName == userName: return
|
||||||
|
self.userName = userName
|
||||||
|
self.userNameChanged(userName)
|
||||||
|
|
||||||
|
proc `userName=`*(self: ChatMessage, userName: string) = self.setUserName(userName)
|
||||||
|
|
||||||
|
QtProperty[string] userName:
|
||||||
|
read = userName
|
||||||
|
write = setUserName
|
||||||
|
notify = userNameChanged
|
||||||
|
|
||||||
|
proc message*(self: ChatMessage): string {.slot.} =
|
||||||
|
result = self.message
|
||||||
|
|
||||||
|
proc messageChanged*(self: ChatMessage, message: string) {.signal.}
|
||||||
|
|
||||||
|
proc setMessage(self: ChatMessage, message: string) {.slot.} =
|
||||||
|
if self.message == message: return
|
||||||
|
self.message = message
|
||||||
|
self.messageChanged(message)
|
||||||
|
|
||||||
|
proc `message=`*(self: ChatMessage, message: string) = self.setMessage(message)
|
||||||
|
|
||||||
|
QtProperty[string] message:
|
||||||
|
read = message
|
||||||
|
write = setMessage
|
||||||
|
notify = messageChanged
|
||||||
|
|
||||||
|
proc timestamp*(self: ChatMessage): string {.slot.} =
|
||||||
|
result = self.timestamp
|
||||||
|
|
||||||
|
proc timestampChanged*(self: ChatMessage, timestamp: string) {.signal.}
|
||||||
|
|
||||||
|
proc setTimestamp(self: ChatMessage, timestamp: string) {.slot.} =
|
||||||
|
if self.timestamp == timestamp: return
|
||||||
|
self.timestamp = timestamp
|
||||||
|
self.timestampChanged(timestamp)
|
||||||
|
|
||||||
|
proc `timestamp=`*(self: ChatMessage, timestamp: string) = self.setTimestamp(timestamp)
|
||||||
|
|
||||||
|
QtProperty[string] timestamp:
|
||||||
|
read = timestamp
|
||||||
|
write = setTimestamp
|
||||||
|
notify = timestampChanged
|
||||||
|
|
||||||
|
proc isCurrentUser*(self: ChatMessage): bool {.slot.} =
|
||||||
|
result = self.isCurrentUser
|
||||||
|
|
||||||
|
proc isCurrentUserChanged*(self: ChatMessage, isCurrentUser: bool) {.signal.}
|
||||||
|
|
||||||
|
proc setIsCurrentUser(self: ChatMessage, isCurrentUser: bool) {.slot.} =
|
||||||
|
if self.isCurrentUser == isCurrentUser: return
|
||||||
|
self.isCurrentUser = isCurrentUser
|
||||||
|
self.isCurrentUserChanged(isCurrentUser)
|
||||||
|
|
||||||
|
proc `isCurrentUser=`*(self: ChatMessage, isCurrentUser: bool) = self.setIsCurrentUser(isCurrentUser)
|
||||||
|
|
||||||
|
QtProperty[bool] isCurrentUser:
|
||||||
|
read = isCurrentUser
|
||||||
|
write = setIsCurrentUser
|
||||||
|
notify = isCurrentUserChanged
|
|
@ -1,5 +1,7 @@
|
||||||
import NimQml
|
import NimQml
|
||||||
import Tables
|
import Tables
|
||||||
|
import chatMessageList
|
||||||
|
import ../signals/types
|
||||||
# import core as chat
|
# import core as chat
|
||||||
|
|
||||||
type
|
type
|
||||||
|
@ -11,6 +13,7 @@ QtObject:
|
||||||
ChatsView* = ref object of QAbstractListModel
|
ChatsView* = ref object of QAbstractListModel
|
||||||
names*: seq[string]
|
names*: seq[string]
|
||||||
callResult: string
|
callResult: string
|
||||||
|
messageList: ChatMessageList
|
||||||
sendMessage: proc (msg: string): string
|
sendMessage: proc (msg: string): string
|
||||||
|
|
||||||
proc delete(self: ChatsView) =
|
proc delete(self: ChatsView) =
|
||||||
|
@ -23,6 +26,7 @@ QtObject:
|
||||||
new(result, delete)
|
new(result, delete)
|
||||||
result.sendMessage = sendMessage
|
result.sendMessage = sendMessage
|
||||||
result.names = @[]
|
result.names = @[]
|
||||||
|
result.messageList = newChatMessageList()
|
||||||
result.setup
|
result.setup
|
||||||
|
|
||||||
proc addNameTolist*(self: ChatsView, chatId: string) {.slot.} =
|
proc addNameTolist*(self: ChatsView, chatId: string) {.slot.} =
|
||||||
|
@ -69,3 +73,12 @@ QtObject:
|
||||||
proc onMessage*(self: ChatsView, message: string) {.slot.} =
|
proc onMessage*(self: ChatsView, message: string) {.slot.} =
|
||||||
self.setCallResult(message)
|
self.setCallResult(message)
|
||||||
echo "Received message: ", message
|
echo "Received message: ", message
|
||||||
|
|
||||||
|
proc pushMessage*(self:ChatsView, message: Message) =
|
||||||
|
self.messageList.add(message)
|
||||||
|
|
||||||
|
proc getMessageList(self: ChatsView): QVariant {.slot.} =
|
||||||
|
return newQVariant(self.messageList)
|
||||||
|
|
||||||
|
QtProperty[QVariant] messageList:
|
||||||
|
read = getMessageList
|
|
@ -263,7 +263,7 @@ SplitView {
|
||||||
|
|
||||||
TextEdit {
|
TextEdit {
|
||||||
id: chatName
|
id: chatName
|
||||||
text: username
|
text: userName
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: 22
|
anchors.topMargin: 22
|
||||||
anchors.left: !isCurrentUser ? chatImage.right : undefined
|
anchors.left: !isCurrentUser ? chatImage.right : undefined
|
||||||
|
@ -316,59 +316,9 @@ SplitView {
|
||||||
ListView {
|
ListView {
|
||||||
id: chatLogView
|
id: chatLogView
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
// model: chatLogModel
|
model: chatsModel.messageList
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
model: ListModel {
|
|
||||||
ListElement {
|
|
||||||
username: "You"
|
|
||||||
message: "First Message - I’m generally against putting too many rules on social interaction because it makes interaction anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:30 AM"
|
|
||||||
isCurrentUser: true
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: qsTr("Slushy Welltodo Woodborer")
|
|
||||||
message: "Lorem ipsum ion anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:31 AM"
|
|
||||||
isCurrentUser: false
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: "You"
|
|
||||||
message: "I’m generally against putting too many rules on social interaction because it makes interaction anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:32 AM"
|
|
||||||
isCurrentUser: true
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: qsTr("Slushy Welltodo Woodborer")
|
|
||||||
message: "Lorem ipsum ionanything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:33 AM"
|
|
||||||
isCurrentUser: false
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: "You"
|
|
||||||
message: "I’m generally against putting too many rules on social interaction because it makes interaction anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:34 AM"
|
|
||||||
isCurrentUser: true
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: qsTr("Slushy Welltodo Woodborer")
|
|
||||||
message: "Lorem ipsum ion anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:35 AM"
|
|
||||||
isCurrentUser: false
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: "You"
|
|
||||||
message: "I’m generally against putting too many rules on social interaction because it makes interaction anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:36 AM"
|
|
||||||
isCurrentUser: true
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
username: qsTr("Slushy Welltodo Woodborer")
|
|
||||||
message: "Last Message - Lorem ipsum ion anything but social, but technical specifics on how to get on board or participate in a team are I think generally useful, especially if they prevent maintainers from pasting the same response to every PR / issue."
|
|
||||||
timestamp: "7:36 AM"
|
|
||||||
isCurrentUser: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delegate: chatLogViewDelegate
|
delegate: chatLogViewDelegate
|
||||||
onCountChanged: {
|
onCountChanged: {
|
||||||
chatLogView.positionViewAtEnd()
|
chatLogView.positionViewAtEnd()
|
||||||
|
|
Loading…
Reference in New Issue