linphone-desktop/linphone-app/ui/modules/Linphone/Chat/ChatConferenceInvitationMessage.qml
Julien Wadel 4532e278ac New chat layout :
- Split content type to be filtered by proxy lists.
- Add a message in notification when receiving a conference invitation.
- Change chat bubbles colors to match mobile application.
- Change date display on messages to remove sections. It allows to be more coherent when sorting messages.
- Change Chat Layout : outgoing messages to right, incoming messages to left.
- Change bubble design to be squared when grouped.
- Group messages on 1 second away from previous (and same sender).
- Add a background color with radius to files in reply messages.
- Make color corners on reply.
- Fix filename to 2 lines in file download icon.
- Add a background color on conference invitations.
- Change conference title from bold to normal on invitations.
- Rework chat message content layout to be used with grids and lists : files are now displayed in grid.
- Remove cyclic dependencies with reply design (which was recursivly linked with ChatContent).
- Fix center layouts that were not bind to the correct one.
- Align pictures to center.
- Fix hidden admin usernames in participant view.
2023-03-03 17:09:25 +01:00

299 lines
10 KiB
QML

import QtQuick 2.7
import QtQuick.Layouts 1.3
import Clipboard 1.0
import App 1.0
import Common 1.0
import Linphone 1.0
import Common.Styles 1.0
import Linphone.Styles 1.0
import TextToSpeech 1.0
import Utils 1.0
import Units 1.0
import UtilsCpp 1.0
import LinphoneEnums 1.0
import ColorsList 1.0
import 'Message.js' as Logic
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
// =============================================================================
Loader{
id: mainItem
property ContentModel contentModel
property ConferenceInfoModel conferenceInfoModel: contentModel ? contentModel.conferenceInfoModel : null
property int availableWidth : parent.width
property int fitHeight: active && item ? item.fitHeight : 0 // + (isExpanded? 200 : 0): 0
property int fitWidth: active && item ? Math.min(availableWidth > 0 ? availableWidth : 9999999, item.fitWidth + ChatCalendarMessageStyle.widthMargin*2) : 0
property bool containsMouse: false
property int gotoButtonMode: -1 //-1: hide, 0:goto, 1:MoreInfo
property bool isExpanded : false
signal expandToggle()
signal conferenceIcsCopied()
width: parent.width
height: parent.height
property font customFont : SettingsModel.textMessageFont
active: mainItem.conferenceInfoModel
sourceComponent: MouseArea{
id: loadedItem
property int fitHeight: layout.fitHeight + ChatCalendarMessageStyle.topMargin+ChatCalendarMessageStyle.bottomMargin
property int fitWidth: layout.fitWidth + ChatCalendarMessageStyle.leftMargin+ChatCalendarMessageStyle.rightMargin
anchors.fill: parent
anchors.leftMargin: ChatCalendarMessageStyle.widthMargin
anchors.rightMargin: ChatCalendarMessageStyle.widthMargin
anchors.topMargin: ChatCalendarMessageStyle.topMargin
anchors.bottomMargin: ChatCalendarMessageStyle.bottomMargin
clip: false
hoverEnabled: true
onClicked: CallsListModel.prepareConferenceCall(mainItem.conferenceInfoModel)
onHoveredChanged: mainItem.containsMouse = loadedItem.containsMouse
Rectangle{
anchors.fill: parent
color: ChatCalendarMessageStyle.backgroundColor.normal.color
radius: 5
}
ColumnLayout{
id: layout
// Fix for binding loops
property int minHeight: layout.implicitHeight
function updateFitHeight(){
fitHeight = minHeight + (description.visible? description.implicitHeight : 0)
}
onMinHeightChanged: Qt.callLater( layout.updateFitHeight)
property int fitHeight: 0
property int fitWidth: Math.max(titleItem.implicitWidth, Math.max(shareButton.width + joinButton.width, description.fitWidth))
anchors.fill: parent
spacing: 0
Text{
id: titleItem
Layout.fillWidth: true
Layout.topMargin: 5
Layout.leftMargin: 5
Layout.alignment: Qt.AlignRight
elide: Text.ElideRight
color: mainItem.conferenceInfoModel.state == LinphoneEnums.ConferenceInfoStateUpdated
? ChatCalendarMessageStyle.type.updatedColor.color
: mainItem.conferenceInfoModel.state == LinphoneEnums.ConferenceInfoStateCancelled
? ChatCalendarMessageStyle.type.cancelledColor.color
: ChatCalendarMessageStyle.type.colorModel.color
font.pointSize: ChatCalendarMessageStyle.type.pointSize
font.weight: Font.Bold
text: (mainItem.conferenceInfoModel.state == LinphoneEnums.ConferenceInfoStateUpdated
//: 'Meeting has been updated' : ICS title for an updated invitation.
? qsTr('icsUpdatedMeetingInvite')
: mainItem.conferenceInfoModel.state == LinphoneEnums.ConferenceInfoStateCancelled
//: 'Meeting has been cancelled' : ICS title for a cancelled invitation.
? qsTr('icsCancelledMeetingInvite')
//: 'Meeting invite' : ICS title that is an invitation.
: qsTr('icsMeetingInvite')
) +': '// + UtilsCpp.getDisplayName(mainItem.conferenceInfoModel.organizer)
}
Text{
id: title
Layout.fillWidth: true
Layout.leftMargin: 5
Layout.alignment: Qt.AlignRight
elide: Text.ElideRight
color: ChatCalendarMessageStyle.subject.colorModel.color
font.pointSize: ChatCalendarMessageStyle.subject.pointSize
text: mainItem.conferenceInfoModel.subject
}
RowLayout {
id: participantsRow
property int participantCount: mainItem.conferenceInfoModel.allParticipantCount
Layout.fillWidth: true
Layout.preferredHeight: ChatCalendarMessageStyle.participants.iconSize
Layout.leftMargin: 5
Layout.rightMargin: 15
spacing: ChatCalendarMessageStyle.participants.spacing
visible: participantsRow.participantCount > 0 && mainItem.conferenceInfoModel.state != LinphoneEnums.ConferenceInfoStateCancelled
Icon{
icon: ChatCalendarMessageStyle.participants.icon
iconSize: ChatCalendarMessageStyle.participants.iconSize
overwriteColor: ChatCalendarMessageStyle.participants.colorModel.color
}
Text {
id: participantsList
Layout.fillWidth: true
color: ChatCalendarMessageStyle.participants.colorModel.color
elide: Text.ElideRight
font.pointSize: ChatCalendarMessageStyle.participants.pointSize
//: '%1 participant' : number(=%1) of participant.
text: qsTr('icsParticipants', '', participantsRow.participantCount).arg(participantsRow.participantCount)
}
}
ColumnLayout{
Layout.fillWidth: true
Layout.leftMargin: 5
Layout.rightMargin: 15
spacing: 0
RowLayout {
id: dateRow
Layout.fillWidth: true
Layout.preferredHeight: conferenceDate.implicitHeight
spacing: ChatCalendarMessageStyle.calendar.spacing
Icon{
icon: ChatCalendarMessageStyle.calendar.icon
iconSize: ChatCalendarMessageStyle.calendar.iconSize-2
overwriteColor: ChatCalendarMessageStyle.calendar.colorModel.color
}
Text {
id: conferenceDate
Layout.fillWidth: true
Layout.minimumWidth: implicitWidth
verticalAlignment: Qt.AlignVCenter
color: ChatCalendarMessageStyle.schedule.colorModel.color
elide: Text.ElideRight
font.pointSize: Units.dp * 8
text: UtilsCpp.toDateString(Utils.fromUTC(mainItem.conferenceInfoModel.dateTimeUtc), 'yyyy/MM/dd')
}
}
RowLayout {
id: conferenceTimeRow
Layout.fillWidth: true
Layout.preferredHeight: conferenceTime.implicitHeight
spacing: ChatCalendarMessageStyle.schedule.spacing
Icon{
icon: ChatCalendarMessageStyle.schedule.icon
iconSize: ChatCalendarMessageStyle.schedule.iconSize-2
overwriteColor: ChatCalendarMessageStyle.schedule.colorModel.color
}
Text {
id: conferenceTime
Layout.fillWidth: true
Layout.minimumWidth: implicitWidth
verticalAlignment: Qt.AlignVCenter
color: ChatCalendarMessageStyle.schedule.colorModel.color
elide: Text.ElideRight
font.pointSize: Units.dp * 8
// Reminder: QML use locale time (not system). Use UTC from C++ => convert it into QML => pass QML => convert it into UTC and apply our timezone.
text: UtilsCpp.toTimeString( Utils.fromUTC(mainItem.conferenceInfoModel.dateTimeUtc), 'hh:mm')
+ (mainItem.conferenceInfoModel.duration > 0 ? ' ('+Utils.formatDuration(mainItem.conferenceInfoModel.duration * 60) + ')'
: '')
}
}
}
ColumnLayout{
id: expandedDescription
Layout.fillWidth: true
Layout.fillHeight: true
Layout.topMargin: 5
visible: mainItem.isExpanded
spacing: 0
ScrollableListView{
id: expandedParticipantsList
Layout.fillWidth: true
Layout.minimumHeight: Math.min( count * ChatCalendarMessageStyle.lineHeight, parent.height/(descriptionTitle.visible?3:2))
Layout.leftMargin: 10
spacing: 0
visible: mainItem.isExpanded
onVisibleChanged: visible ? model= mainItem.conferenceInfoModel.getAllParticipants() : model = []
Connections{
target: mainItem.conferenceInfoModel
onParticipantsChanged: if(expandedParticipantsList.visible) expandedParticipantsList.model = mainItem.conferenceInfoModel.getAllParticipants()
}
delegate: Row{
spacing: 5
width: expandedParticipantsList.width
height: ChatCalendarMessageStyle.lineHeight
Text{text: modelData.displayName
color: ChatCalendarMessageStyle.description.colorModel.color
font.pointSize: ChatCalendarMessageStyle.description.pointSize
elide: Text.ElideRight
wrapMode: TextEdit.WordWrap
}
Text{text: '('+modelData.address+')'
color: ChatCalendarMessageStyle.description.colorModel.color
font.pointSize: ChatCalendarMessageStyle.description.pointSize
elide: Text.ElideRight
wrapMode: TextEdit.WordWrap
}
}
}
}
Text{
id: descriptionTitle
Layout.fillWidth: true
Layout.leftMargin: 5
Layout.topMargin: 5
color: ChatCalendarMessageStyle.subject.colorModel.color
font.pointSize: ChatCalendarMessageStyle.subject.pointSize
font.weight: Font.Bold
//: 'Description' : Title for the meeting description.
text: qsTr('icsDescription')
visible: description.text != ''
}
TextAreaField{
id: description
Layout.fillWidth: true
Layout.preferredHeight: visible ? implicitHeight : 0
Layout.leftMargin: 5
padding: 0
color: 'transparent'
readOnly: true
textColor: ChatCalendarMessageStyle.description.colorModel.color
font.pointSize: ChatCalendarMessageStyle.description.pointSize
border.width: 0
visible: description.text != ''
text: mainItem.conferenceInfoModel.description
onImplicitHeightChanged: Qt.callLater( layout.updateFitHeight)
onVisibleChanged: Qt.callLater( layout.updateFitHeight)
}
RowLayout{
Layout.fillWidth: true
Layout.topMargin: 10
Layout.bottomMargin: 5
Layout.rightMargin: 10
spacing: 10
Item{
Layout.fillWidth: true
}
ActionButton{
id: shareButton
visible: joinButton.visible
iconSize: joinButton.height/2
isCustom: true
colorSet: ChatCalendarMessageStyle.shareButton
backgroundRadius: width/2
onClicked: {
Clipboard.text = mainItem.conferenceInfoModel.getIcalendarString()
mainItem.conferenceIcsCopied()
}
}
TextButtonC{
id: joinButton
addHeight: 20
visible: mainItem.conferenceInfoModel.state != LinphoneEnums.ConferenceInfoStateCancelled
//: 'Join' : Action button to join the meeting.
text: qsTr('icsJoinButton').toUpperCase()
onClicked: CallsListModel.prepareConferenceCall(mainItem.conferenceInfoModel)
}
}
}
}
}