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 maxWidth : parent.width property int fitHeight: active && item ? item.fitHeight + (isExpanded? 200 : 0): 0 property int fitWidth: active && item ? maxWidth/2 + 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 conferenceUriCopied() 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 anchors.fill: parent anchors.leftMargin: ChatCalendarMessageStyle.widthMargin anchors.rightMargin: ChatCalendarMessageStyle.widthMargin anchors.topMargin: ChatCalendarMessageStyle.topMargin anchors.bottomMargin: ChatCalendarMessageStyle.bottomMargin clip: false hoverEnabled: true onClicked: mainItem.expandToggle() onHoveredChanged: mainItem.containsMouse = loadedItem.containsMouse ColumnLayout{ id: layout property int fitHeight: dateRow.implicitHeight + title.implicitHeight + participantsRow.implicitHeight +expandedDescription.implicitHeight property int fitWidth: Layout.minimumWidth anchors.fill: parent spacing: 0 RowLayout { id: dateRow Layout.fillWidth: true //Layout.preferredWidth: parent.width // Need this because fillWidth is not enough... Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.alignment: Qt.AlignTop Layout.topMargin: 5 spacing: 10 RowLayout { id: scheduleRow Layout.fillWidth: true Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.leftMargin: 5 spacing: ChatCalendarMessageStyle.schedule.spacing Item{ Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.preferredWidth: ChatCalendarMessageStyle.schedule.iconSize clip: false Icon{ anchors.centerIn: parent icon: ChatCalendarMessageStyle.schedule.icon iconSize: ChatCalendarMessageStyle.schedule.iconSize overwriteColor: ChatCalendarMessageStyle.schedule.color } } Text { id: conferenceTime Layout.fillWidth: true Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.minimumWidth: implicitWidth verticalAlignment: Qt.AlignVCenter color: ChatCalendarMessageStyle.schedule.color elide: Text.ElideRight font.pointSize: ChatCalendarMessageStyle.schedule.pointSize text: Qt.formatDateTime(mainItem.conferenceInfoModel.dateTime, 'hh:mm') + (mainItem.conferenceInfoModel.duration > 0 ? ' (' +Utils.formatDuration(mainItem.conferenceInfoModel.duration * 60) + ')' : '') } } Text{ Layout.fillWidth: true Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.rightMargin: 15 horizontalAlignment: Qt.AlignRight verticalAlignment: Qt.AlignVCenter color: ChatCalendarMessageStyle.schedule.color elide: Text.ElideRight font.pointSize: ChatCalendarMessageStyle.schedule.pointSize //: 'Organizer' : Label Title for the organizer. text: qsTr('icsOrganizer') +' : ' +UtilsCpp.getDisplayName(mainItem.conferenceInfoModel.organizer) } } Text{ id: title Layout.fillWidth: true Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.alignment: Qt.AlignTop Layout.leftMargin: 10 elide: Text.ElideRight color: ChatCalendarMessageStyle.subject.color font.pointSize: ChatCalendarMessageStyle.subject.pointSize font.weight: Font.Bold text: mainItem.conferenceInfoModel.subject } RowLayout { id: participantsRow Layout.fillWidth: true Layout.fillHeight: true Layout.minimumHeight: 4 + (mainItem.isExpanded ? expandedParticipantsList.minimumHeight : ChatCalendarMessageStyle.lineHeight) Layout.alignment: Qt.AlignTop Layout.leftMargin: 5 Layout.rightMargin: 10 spacing: ChatCalendarMessageStyle.participants.spacing Item{ Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.preferredWidth: ChatCalendarMessageStyle.participants.iconSize Layout.alignment: Qt.AlignTop clip: false Icon{ anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter icon: ChatCalendarMessageStyle.participants.icon iconSize: ChatCalendarMessageStyle.participants.iconSize overwriteColor: ChatCalendarMessageStyle.participants.color } } Text { id: participantsList Layout.fillWidth: true Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.topMargin: 4 Layout.alignment: Qt.AlignTop visible: !mainItem.isExpanded color: ChatCalendarMessageStyle.participants.color elide: Text.ElideRight font.pointSize: ChatCalendarMessageStyle.participants.pointSize text: mainItem.conferenceInfoModel.displayNamesToString } ScrollableListView{ id: expandedParticipantsList property int minimumHeight: Math.min( count * ChatCalendarMessageStyle.lineHeight, layout.height/(descriptionTitle.visible?3:2)) Layout.fillWidth: true Layout.topMargin: 4 Layout.minimumHeight: minimumHeight Layout.alignment: Qt.AlignTop spacing: 0 visible: mainItem.isExpanded onVisibleChanged: model= mainItem.conferenceInfoModel.getParticipants() delegate: Row{ spacing: 5 width: expandedParticipantsList.contentWidth height: ChatCalendarMessageStyle.lineHeight Text{ id: displayName height: ChatCalendarMessageStyle.lineHeight text: modelData.displayName color: ChatCalendarMessageStyle.participants.color font.pointSize: ChatCalendarMessageStyle.participants.pointSize elide: Text.ElideRight } Text{ height: ChatCalendarMessageStyle.lineHeight width: expandedParticipantsList.contentWidth - displayName.width - parent.spacing // parent.width is not enough. Force width text: '('+modelData.address+')' color: ChatCalendarMessageStyle.participants.color font.pointSize: ChatCalendarMessageStyle.participants.pointSize elide: Text.ElideRight } } } Item{ Layout.preferredWidth: expandButton.iconSize Layout.preferredHeight: ChatCalendarMessageStyle.lineHeight Layout.alignment: Qt.AlignTop | Qt.AlignRight ActionButton{ id: expandButton visible: mainItem.gotoButtonMode >= 0 anchors.centerIn: parent anchors.verticalCenter: parent.verticalCenter isCustom: true colorSet: mainItem.gotoButtonMode == 0 ? ChatCalendarMessageStyle.gotoButton : ChatCalendarMessageStyle.infoButton iconSize: ChatCalendarMessageStyle.lineHeight backgroundRadius: width/2 toggled: mainItem.isExpanded onClicked: mainItem.expandToggle() } } } Item{ Layout.fillHeight: true Layout.minimumHeight: 0 } ColumnLayout{ id: expandedDescription Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignTop Layout.topMargin: 5 visible: mainItem.isExpanded spacing: 0 Text{ id: descriptionTitle Layout.fillWidth: true Layout.leftMargin: 10 Layout.topMargin: 5 color: ChatCalendarMessageStyle.subject.color font.pointSize: ChatCalendarMessageStyle.subject.pointSize font.weight: Font.Bold //: 'Description' : Title for the conference description. text: qsTr('icsDescription') visible: description.text != '' } TextAreaField{ id: description Layout.fillWidth: true Layout.fillHeight: true Layout.leftMargin: 10 Layout.rightMargin: 10 padding: 0 color: 'transparent' readOnly: true textColor: ChatCalendarMessageStyle.description.color font.pointSize: ChatCalendarMessageStyle.description.pointSize border.width: 0 visible: description.text != '' text: mainItem.conferenceInfoModel.description } Text{ id: linkTitle Layout.fillWidth: true Layout.leftMargin: 10 color: ChatCalendarMessageStyle.subject.color font.pointSize: ChatCalendarMessageStyle.subject.pointSize font.weight: Font.Bold //: 'Conference address' : Title for the conference address. text: qsTr('icsconferenceAddressTitle') } RowLayout{ Layout.fillWidth: true Layout.fillHeight: true Layout.leftMargin: 10 Layout.rightMargin: 10 spacing: 10 TextField{ id: uriField readOnly: true Layout.fillWidth: true Layout.preferredHeight: ChatCalendarMessageStyle.copyLinkButton.iconSize textFieldStyle: TextFieldStyle.flatInverse text: mainItem.conferenceInfoModel.uri } ActionButton{ isCustom: true colorSet: ChatCalendarMessageStyle.copyLinkButton backgroundRadius: width/2 onClicked: { Clipboard.text = uriField.text mainItem.conferenceUriCopied() } } } RowLayout{ Layout.fillWidth: true Layout.topMargin: 10 Layout.rightMargin: 10 spacing: 10 Item{ Layout.fillWidth: true } TextButtonC{ addHeight: 20 //: 'Join' : Action button to join the conference. text: qsTr('icsJoinButton').toUpperCase() onClicked: CallsListModel.prepareConferenceCall(mainItem.conferenceInfoModel) } ActionButton{ isCustom: true colorSet: ChatCalendarMessageStyle.editButton backgroundRadius: width/2 visible: UtilsCpp.isMe(mainItem.conferenceInfoModel.organizer) onClicked: { window.detachVirtualWindow() window.attachVirtualWindow(Utils.buildAppDialogUri('NewConference') ,{conferenceInfoModel: mainItem.conferenceInfoModel}) } } ActionButton{ isCustom: true colorSet: ChatCalendarMessageStyle.deleteButton backgroundRadius: width/2 onClicked: { window.attachVirtualWindow(Utils.buildCommonDialogUri('ConfirmDialog'), { //: 'Do you really want do delete this meeting?' : Warning message to confirm the deletion of a meeting. descriptionText: qsTr('deleteConferenceInfo'), }, function (status) { if (status) { mainItem.conferenceInfoModel.deleteConferenceInfo() } }) } } } } } } }