Build system, messages support and more

This commit is contained in:
miruka
2019-07-02 13:59:52 -04:00
parent 933341b7e6
commit 06c823aa67
53 changed files with 2264 additions and 446 deletions

View File

@@ -6,6 +6,7 @@ Banner {
color: HStyle.chat.inviteBanner.background
// TODO: get disp name from models.users, inviter = userid now
avatar.name: inviter ? inviter.displayname : ""
//avatar.imageUrl: inviter ? inviter.avatar_url : ""

View File

@@ -10,27 +10,27 @@ HColumnLayout {
property string category: ""
property string roomId: ""
readonly property var roomInfo:
Backend.accounts.get(userId)
.roomCategories.get(category)
.rooms.get(roomId)
readonly property var roomInfo: models.rooms.getWhere(
{"userId": userId, "roomId": roomId, "category": category}, 1
)[0]
readonly property var sender: Backend.users.get(userId)
readonly property var sender:
models.users.getWhere({"userId": userId}, 1)[0]
readonly property bool hasUnknownDevices:
category == "Rooms" ?
Backend.clients.get(userId).roomHasUnknownDevices(roomId) : false
readonly property bool hasUnknownDevices: false
//category == "Rooms" ?
//Backend.clients.get(userId).roomHasUnknownDevices(roomId) : false
id: chatPage
onFocusChanged: sendBox.setFocus()
Component.onCompleted: Backend.signals.roomCategoryChanged.connect(
function(forUserId, forRoomId, previous, now) {
if (chatPage && forUserId == userId && forRoomId == roomId) {
chatPage.category = now
}
}
)
//Component.onCompleted: Backend.signals.roomCategoryChanged.connect(
//function(forUserId, forRoomId, previous, now) {
//if (chatPage && forUserId == userId && forRoomId == roomId) {
//chatPage.category = now
//}
//}
//)
RoomHeader {
id: roomHeader
@@ -77,72 +77,72 @@ HColumnLayout {
}
}
RoomSidePane {
id: roomSidePane
// RoomSidePane {
//id: roomSidePane
activeView: roomHeader.activeButton
property int oldWidth: width
onActiveViewChanged:
activeView ? restoreAnimation.start() : hideAnimation.start()
//activeView: roomHeader.activeButton
//property int oldWidth: width
//onActiveViewChanged:
//activeView ? restoreAnimation.start() : hideAnimation.start()
NumberAnimation {
id: hideAnimation
target: roomSidePane
properties: "width"
duration: HStyle.animationDuration
from: target.width
to: 0
//NumberAnimation {
//id: hideAnimation
//target: roomSidePane
//properties: "width"
//duration: HStyle.animationDuration
//from: target.width
//to: 0
onStarted: {
target.oldWidth = target.width
target.Layout.minimumWidth = 0
}
}
//onStarted: {
//target.oldWidth = target.width
//target.Layout.minimumWidth = 0
//}
//}
NumberAnimation {
id: restoreAnimation
target: roomSidePane
properties: "width"
duration: HStyle.animationDuration
from: 0
to: target.oldWidth
//NumberAnimation {
//id: restoreAnimation
//target: roomSidePane
//properties: "width"
//duration: HStyle.animationDuration
//from: 0
//to: target.oldWidth
onStopped: target.Layout.minimumWidth = Qt.binding(
function() { return HStyle.avatar.size }
)
}
//onStopped: target.Layout.minimumWidth = Qt.binding(
//function() { return HStyle.avatar.size }
//)
//}
collapsed: width < HStyle.avatar.size + 8
//collapsed: width < HStyle.avatar.size + 8
property bool wasSnapped: false
property int referenceWidth: roomHeader.buttonsWidth
onReferenceWidthChanged: {
if (chatSplitView.canAutoSize || wasSnapped) {
if (wasSnapped) { chatSplitView.canAutoSize = true }
width = referenceWidth
}
}
//property bool wasSnapped: false
//property int referenceWidth: roomHeader.buttonsWidth
//onReferenceWidthChanged: {
//if (chatSplitView.canAutoSize || wasSnapped) {
//if (wasSnapped) { chatSplitView.canAutoSize = true }
//width = referenceWidth
//}
//}
property int currentWidth: width
onCurrentWidthChanged: {
if (referenceWidth != width &&
referenceWidth - 15 < width &&
width < referenceWidth + 15)
{
currentWidth = referenceWidth
width = referenceWidth
wasSnapped = true
currentWidth = Qt.binding(
function() { return roomSidePane.width }
)
} else {
wasSnapped = false
}
}
//property int currentWidth: width
//onCurrentWidthChanged: {
//if (referenceWidth != width &&
//referenceWidth - 15 < width &&
//width < referenceWidth + 15)
//{
//currentWidth = referenceWidth
//width = referenceWidth
//wasSnapped = true
//currentWidth = Qt.binding(
//function() { return roomSidePane.width }
//)
//} else {
//wasSnapped = false
//}
//}
width: referenceWidth // Initial width
Layout.minimumWidth: HStyle.avatar.size
Layout.maximumWidth: parent.width
}
//width: referenceWidth // Initial width
//Layout.minimumWidth: HStyle.avatar.size
//Layout.maximumWidth: parent.width
//}
}
}

View File

@@ -2,7 +2,7 @@ import QtQuick 2.7
import "../../Base"
HNoticePage {
text: dateTime.toLocaleDateString()
text: model.date.toLocaleDateString()
color: HStyle.chat.daybreak.foreground
backgroundColor: HStyle.chat.daybreak.background
radius: HStyle.chat.daybreak.radius

View File

@@ -16,7 +16,7 @@ Row {
HAvatar {
id: avatar
name: sender.displayName.value
name: sender.displayName || stripUserId(sender.userId)
hidden: combine
dimension: 28
}

View File

@@ -10,7 +10,7 @@ Row {
HAvatar {
id: avatar
hidden: combine
name: sender.displayName.value
name: senderInfo.displayName || stripUserId(model.senderId)
dimension: 48
}
@@ -38,8 +38,8 @@ Row {
visible: height > 0
id: nameLabel
text: sender.displayName.value
color: Qt.hsla(Backend.hueFromString(text),
text: senderInfo.displayName || model.senderId
color: Qt.hsla(avatar.hueFromName(avatar.name),
HStyle.displayName.saturation,
HStyle.displayName.lightness,
1)
@@ -56,17 +56,16 @@ Row {
width: parent.width
id: contentLabel
text: (dict.formatted_body ?
Backend.htmlFilter.filter(dict.formatted_body) :
dict.body) +
text: model.content +
"&nbsp;&nbsp;<font size=" + HStyle.fontSize.small +
"px color=" + HStyle.chat.message.date + ">" +
Qt.formatDateTime(dateTime, "hh:mm:ss") +
Qt.formatDateTime(model.date, "hh:mm:ss") +
"</font>" +
(isLocalEcho ?
(model.isLocalEcho ?
"&nbsp;<font size=" + HStyle.fontSize.small +
"px>⏳</font>" : "")
textFormat: Text.RichText
textFormat: model.type == "text" ?
Text.PlainText : Text.RichText
color: HStyle.chat.message.body
wrapMode: Text.Wrap

View File

@@ -1,7 +1,6 @@
import QtQuick 2.7
import QtQuick.Layouts 1.3
import "../../Base"
import "../utils.js" as ChatJS
Column {
id: roomEventDelegate
@@ -10,46 +9,47 @@ Column {
return Math.round((((date2 - date1) % 86400000) % 3600000) / 60000)
}
function getIsMessage(type_) { return type_.startsWith("RoomMessage") }
function getPreviousItem() {
return index < roomEventListView.model.count - 1 ?
roomEventListView.model.get(index + 1) : null
}
function getIsMessage(type) {
return true
}
property var previousItem: getPreviousItem()
signal reloadPreviousItem()
onReloadPreviousItem: previousItem = getPreviousItem()
readonly property bool isMessage: getIsMessage(type)
property var senderInfo: null
Component.onCompleted:
senderInfo = models.users.getUser(chatPage.userId, senderId)
readonly property bool isUndecryptableEvent:
type === "OlmEvent" || type === "MegolmEvent"
//readonly property bool isMessage: ! model.type.match(/^event.*/)
readonly property bool isMessage: getIsMessage(model.type)
readonly property var sender: Backend.users.get(dict.sender)
readonly property bool isOwn: chatPage.userId === senderId
readonly property bool isOwn:
chatPage.userId === dict.sender
readonly property bool isFirstEvent: type == "RoomCreateEvent"
readonly property bool isFirstEvent: model.type == "eventCreate"
readonly property bool combine:
previousItem &&
! talkBreak &&
! dayBreak &&
getIsMessage(previousItem.type) === isMessage &&
previousItem.dict.sender === dict.sender &&
minsBetween(previousItem.dateTime, dateTime) <= 5
previousItem.senderId === senderId &&
minsBetween(previousItem.date, model.date) <= 5
readonly property bool dayBreak:
isFirstEvent ||
previousItem &&
dateTime.getDate() != previousItem.dateTime.getDate()
model.date.getDate() != previousItem.date.getDate()
readonly property bool talkBreak:
previousItem &&
! dayBreak &&
minsBetween(previousItem.dateTime, dateTime) >= 20
minsBetween(previousItem.date, model.date) >= 20
property int standardSpacing: 16

View File

@@ -1,4 +1,5 @@
import QtQuick 2.7
import SortFilterProxyModel 0.2
import "../../Base"
HRectangle {
@@ -8,10 +9,19 @@ HRectangle {
HListView {
id: roomEventListView
delegate: RoomEventDelegate {}
model: Backend.roomEvents.get(chatPage.roomId)
clip: true
model: HListModel {
sourceModel: models.timelines
filters: ValueFilter {
roleName: "roomId"
value: chatPage.roomId
}
}
delegate: RoomEventDelegate {}
anchors.fill: parent
anchors.leftMargin: space
anchors.rightMargin: space
@@ -29,7 +39,7 @@ HRectangle {
onYPosChanged: {
if (chatPage.category != "Invites" && yPos <= 0.1) {
Backend.loadPastEvents(chatPage.roomId)
//Backend.loadPastEvents(chatPage.roomId)
}
}
}

View File

@@ -3,7 +3,7 @@ import QtQuick.Layouts 1.3
import "../Base"
HRectangle {
property string displayName: ""
property var displayName: ""
property string topic: ""
property alias buttonsImplicitWidth: viewButtons.implicitWidth
@@ -22,7 +22,7 @@ HRectangle {
HAvatar {
id: avatar
name: displayName
name: stripRoomName(displayName) || qsTr("Empty room")
dimension: roomHeader.height
Layout.alignment: Qt.AlignTop
}

View File

@@ -15,7 +15,7 @@ MouseArea {
HAvatar {
id: memberAvatar
name: member.displayName.value
name: member.displayName || stripUserId(member.userId)
}
HColumnLayout {

View File

@@ -18,7 +18,7 @@ HRectangle {
HAvatar {
id: avatar
name: chatPage.sender.displayName.value
name: chatPage.sender.displayName || stripUserId(chatPage.userId)
dimension: root.Layout.minimumHeight
}