add row to invite any address in a conference

This commit is contained in:
Gaelle Braud 2024-04-02 16:05:12 +02:00 committed by Julien Wadel
parent b6a0ae1c76
commit fd09a79957
3 changed files with 307 additions and 272 deletions

View file

@ -48,6 +48,21 @@ ListView {
signal contactDeletionRequested(FriendGui contact) signal contactDeletionRequested(FriendGui contact)
signal contactAddedToSelection() signal contactAddedToSelection()
function addContactToSelection(address) {
if (multiSelectionEnabled) {
var indexInSelection = selectedContacts.indexOf(address)
if (indexInSelection == -1) {
selectedContacts.push(address)
contactAddedToSelection()
}
}
}
function removeContactFromSelection(indexInSelection) {
if (indexInSelection != -1) {
selectedContacts.splice(indexInSelection, 1)
}
}
model: MagicSearchProxy { model: MagicSearchProxy {
searchText: searchBarText.length === 0 ? "*" : searchBarText searchText: searchBarText.length === 0 ? "*" : searchBarText
} }
@ -249,11 +264,10 @@ ListView {
if (mainItem.multiSelectionEnabled) { if (mainItem.multiSelectionEnabled) {
var indexInSelection = mainItem.selectedContacts.indexOf(modelData.core.defaultAddress) var indexInSelection = mainItem.selectedContacts.indexOf(modelData.core.defaultAddress)
if (indexInSelection == -1) { if (indexInSelection == -1) {
mainItem.selectedContacts.push(modelData.core.defaultAddress) mainItem.addContactToSelection(modelData.core.defaultAddress)
mainItem.contactAddedToSelection()
} }
else { else {
mainItem.selectedContacts.splice(indexInSelection, 1) mainItem.removeContactFromSelection(indexInSelection, 1)
} }
} }
} }

View file

@ -111,6 +111,7 @@ ColumnLayout {
} }
ContactsList { ContactsList {
id: contactList id: contactList
visible: contentHeight > 0 || searchbar.text.length > 0
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
Layout.preferredHeight: contentHeight Layout.preferredHeight: contentHeight
@ -119,6 +120,32 @@ ColumnLayout {
confInfoGui: mainItem.conferenceInfoGui confInfoGui: mainItem.conferenceInfoGui
searchBarText: searchbar.text searchBarText: searchbar.text
onContactAddedToSelection: participantList.positionViewAtEnd() onContactAddedToSelection: participantList.positionViewAtEnd()
headerPositioning: ListView.InlineHeader
header: MouseArea {
onClicked: contactList.addContactToSelection(sipAddr.text)
visible: searchbar.text.length > 0
height: searchbar.text.length > 0 ? 56 * DefaultStyle.dp : 0
width: contactList.width
RowLayout {
Layout.fillWidth: true
spacing: 10 * DefaultStyle.dp
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 30 * DefaultStyle.dp
anchors.left: parent.left
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: sipAddr.text
}
ColumnLayout {
Text {
id: sipAddr
text: UtilsCpp.generateLinphoneSipAddress(searchbar.text)
font.pixelSize: 14 * DefaultStyle.dp
}
}
}
}
} }
Item { Item {
Layout.fillHeight: true Layout.fillHeight: true

View file

@ -19,11 +19,12 @@ AbstractMainPage {
onVisibleChanged: if (visible) rightPanelStackView.push(overridenRightPanel, Control.StackView.Immediate) onVisibleChanged: if (visible) rightPanelStackView.push(overridenRightPanel, Control.StackView.Immediate)
onSelectedConferenceChanged: { onSelectedConferenceChanged: {
overridenRightPanelStackView.clear()
if (selectedConference) { if (selectedConference) {
/*if (!overridenRightPanelStackView.currentItem || overridenRightPanelStackView.currentItem.objectName != "meetingDetail") */overridenRightPanelStackView.replace(meetingDetail, Control.StackView.Immediate) if (!overridenRightPanelStackView.currentItem || overridenRightPanelStackView.currentItem.objectName != "meetingDetail") overridenRightPanelStackView.replace(meetingDetail, Control.StackView.Immediate)
} else { }// else {
/*if (overridenRightPanelStackView.currentItem && overridenRightPanelStackView.currentItem.objectName === "meetingDetail")*/ overridenRightPanelStackView.clear() /*if (overridenRightPanelStackView.currentItem && overridenRightPanelStackView.currentItem.objectName === "meetingDetail")*/
} // }
} }
Connections { Connections {
@ -161,9 +162,10 @@ AbstractMainPage {
id: overridenRightPanel id: overridenRightPanel
Control.StackView { Control.StackView {
id: overridenRightPanelStackView id: overridenRightPanelStackView
RectangleTest{anchors.fill: parent}
width: 393 * DefaultStyle.dp width: 393 * DefaultStyle.dp
height: parent.height
anchors.top: parent.top anchors.top: parent.top
// anchors.bottom: parent.bottom
// Layout.fillWidth: false // Layout.fillWidth: false
} }
} }
@ -240,297 +242,289 @@ AbstractMainPage {
} }
Component { Component {
id: editConf id: editConf
RowLayout { MeetingSetUp {
property bool isCreation property bool isCreation
property ConferenceInfoGui conferenceInfoGui isCreation: parent.isCreation
MeetingSetUp { onReturnRequested: {
isCreation: parent.isCreation overridenRightPanelStackView.pop()
conferenceInfoGui: parent.conferenceInfoGui }
onReturnRequested: { onSaveSucceed: {
overridenRightPanelStackView.pop() overridenRightPanelStackView.pop()
} UtilsCpp.showInformationPopup(qsTr("Enregistré"), qsTr("Réunion modifiée avec succès"), true)
onSaveSucceed: { }
overridenRightPanelStackView.pop() onAddParticipantsRequested: {
UtilsCpp.showInformationPopup(qsTr("Enregistré"), qsTr("Réunion modifiée avec succès"), true) overridenRightPanelStackView.push(addParticipants, {"conferenceInfoGui": conferenceInfoGui, "container": overridenRightPanelStackView})
}
onAddParticipantsRequested: {
overridenRightPanelStackView.push(addParticipants, {"conferenceInfoGui": conferenceInfoGui, "container": overridenRightPanelStackView})
}
} }
} }
} }
Component { Component {
id: addParticipants id: addParticipants
RowLayout { AddParticipantsLayout {
id: addParticipantLayout id: addParticipantLayout
property Control.StackView container property Control.StackView container
property ConferenceInfoGui conferenceInfoGui // Layout.fillHeight: true
AddParticipantsLayout { title: qsTr("Ajouter des participants")
conferenceInfoGui: parent.conferenceInfoGui validateButtonText: qsTr("Ajouter")
title: qsTr("Ajouter des participants") titleColor: DefaultStyle.main1_500_main
validateButtonText: qsTr("Ajouter") onReturnRequested: {
titleColor: DefaultStyle.main1_500_main container.pop()
onReturnRequested: {
addParticipantLayout.container.pop()
}
} }
} }
} }
Component { Component {
id: meetingDetail id: meetingDetail
RowLayout { ColumnLayout {
visible: mainItem.selectedConference visible: mainItem.selectedConference
ColumnLayout { spacing: 25 * DefaultStyle.dp
spacing: 25 * DefaultStyle.dp Section {
Section { content: RowLayout {
content: RowLayout { spacing: 8 * DefaultStyle.dp
spacing: 8 * DefaultStyle.dp Image {
Image { source: AppIcons.usersThree
source: AppIcons.usersThree Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredWidth: 24 * DefaultStyle.dp Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp }
} Text {
Text { text: mainItem.selectedConference ? mainItem.selectedConference.core.subject : ""
text: mainItem.selectedConference ? mainItem.selectedConference.core.subject : "" font {
font { pixelSize: 20 * DefaultStyle.dp
pixelSize: 20 * DefaultStyle.dp weight: 800 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
}
Item {
Layout.fillWidth: true
}
Button {
visible: UtilsCpp.isMe(mainItem.selectedConference.core.organizerAddress)
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
icon.source: AppIcons.pencil
contentImageColor: DefaultStyle.main1_500_main
background: Item{}
onClicked: mainItem.setUpConference(mainItem.selectedConference)
}
PopupButton {
id: deletePopup
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
contentImageColor: DefaultStyle.main1_500_main
popup.contentItem: RowLayout {
Button {
background: Item{}
contentItem: RowLayout {
EffectImage {
imageSource: AppIcons.trashCan
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
fillMode: Image.PreserveAspectFit
colorizationColor: DefaultStyle.danger_500main
}
Text {
text: qsTr("Delete this meeting")
color: DefaultStyle.danger_500main
font {
pixelSize: 14 * DefaultStyle.dp
weight: 400 * DefaultStyle.dp
}
}
}
onClicked: {
cancelAndDeleteConfDialog.cancel = UtilsCpp.isMe(mainItem.selectedConference.core.organizerAddress)
cancelAndDeleteConfDialog.open()
// mainItem.contactDeletionRequested(mainItem.selectedConference)
deletePopup.close()
}
Connections {
target: cancelAndDeleteConfDialog
onCancelRequested: {
mainItem.selectedConference.core.lCancelConferenceInfo()
}
onAccepted: {
mainItem.selectedConference.core.lDeleteConferenceInfo()
}
}
}
}
} }
} }
} Item {
Section { Layout.fillWidth: true
content: ColumnLayout { }
spacing: 15 * DefaultStyle.dp Button {
width: parent.width visible: mainItem.selectedConference && UtilsCpp.isMe(mainItem.selectedConference.core.organizerAddress)
RowLayout { Layout.preferredWidth: 24 * DefaultStyle.dp
spacing: 8 * DefaultStyle.dp Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.fillWidth: true icon.source: AppIcons.pencil
Image { contentImageColor: DefaultStyle.main1_500_main
Layout.preferredWidth: 24 * DefaultStyle.dp background: Item{}
Layout.preferredHeight: 24 * DefaultStyle.dp onClicked: mainItem.setUpConference(mainItem.selectedConference)
source: AppIcons.videoCamera }
} PopupButton {
id: deletePopup
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
contentImageColor: DefaultStyle.main1_500_main
popup.contentItem: RowLayout {
Button { Button {
Layout.fillWidth: true
text: mainItem.selectedConference ? mainItem.selectedConference.core.uri : ""
textSize: 14 * DefaultStyle.dp
textWeight: 400 * DefaultStyle.dp
underline: true
inversedColors: true
color: DefaultStyle.main2_600
background: Item{} background: Item{}
property var callObj contentItem: RowLayout {
onClicked: { EffectImage {
callObj = UtilsCpp.createCall(mainItem.selectedConference.core.uri) imageSource: AppIcons.trashCan
} width: 24 * DefaultStyle.dp
} height: 24 * DefaultStyle.dp
Button { Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredWidth: 24 * DefaultStyle.dp Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp fillMode: Image.PreserveAspectFit
background: Item{} colorizationColor: DefaultStyle.danger_500main
icon.source: AppIcons.shareNetwork }
onClicked: { Text {
UtilsCpp.copyToClipboard(mainItem.selectedConference.core.uri) text: qsTr("Delete this meeting")
UtilsCpp.showInformationPopup(qsTr("Enregistré"), qsTr("Le lien de la réunion a été copié dans le presse-papiers")) color: DefaultStyle.danger_500main
} font {
} pixelSize: 14 * DefaultStyle.dp
} weight: 400 * DefaultStyle.dp
RowLayout { }
spacing: 8 * DefaultStyle.dp
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
source: AppIcons.clock
}
Text {
text: mainItem.selectedConference
? UtilsCpp.toDateString(mainItem.selectedConference.core.dateTimeUtc)
+ " | " + UtilsCpp.toDateHourString(mainItem.selectedConference.core.dateTimeUtc)
+ " - "
+ UtilsCpp.toDateHourString(mainItem.selectedConference.core.endDateTime)
: ''
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
RowLayout {
spacing: 8 * DefaultStyle.dp
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
source: AppIcons.globe
}
Text {
text: qsTr("Time zone: ") + (mainItem.selectedConference ? (mainItem.selectedConference.core.timeZoneModel.displayName + ", " + mainItem.selectedConference.core.timeZoneModel.countryName) : "")
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
}
}
Section {
visible: mainItem.selectedConference && mainItem.selectedConference.core.description.length != 0
content: RowLayout {
spacing: 8 * DefaultStyle.dp
EffectImage {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
imageSource: AppIcons.note
colorizationColor: DefaultStyle.main2_600
}
Text {
text: mainItem.selectedConference ? mainItem.selectedConference.core.description : ""
Layout.fillWidth: true
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
}
Section {
content: RowLayout {
spacing: 8 * DefaultStyle.dp
EffectImage {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
imageSource: AppIcons.userRectangle
colorizationColor: DefaultStyle.main2_600
}
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: mainItem.selectedConference ? mainItem.selectedConference.core.organizerAddress : ""
}
Text {
text: mainItem.selectedConference ? mainItem.selectedConference.core.organizerName : ""
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
}
Section {
content: RowLayout {
Layout.preferredHeight: participantList.height
width: 393 * DefaultStyle.dp
spacing: 8 * DefaultStyle.dp
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.alignment: Qt.AlignLeft | Qt.AlignTop
Layout.topMargin: 20 * DefaultStyle.dp
source: AppIcons.usersTwo
}
ListView {
id: participantList
Layout.preferredHeight: Math.min(184 * DefaultStyle.dp, contentHeight)
Layout.fillWidth: true
model: mainItem.selectedConference ? mainItem.selectedConference.core.participants : []
clip: true
delegate: RowLayout {
height: 56 * DefaultStyle.dp
width: participantList.width
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: modelData.address
}
Text {
text: modelData.displayName
Layout.fillWidth: true
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
} }
} }
Text { onClicked: {
text: qsTr("Organizer") cancelAndDeleteConfDialog.cancel = UtilsCpp.isMe(mainItem.selectedConference.core.organizerAddress)
visible: mainItem.selectedConference && mainItem.selectedConference.core.organizerAddress === modelData.address cancelAndDeleteConfDialog.open()
color: DefaultStyle.main2_400 // mainItem.contactDeletionRequested(mainItem.selectedConference)
font { deletePopup.close()
pixelSize: 12 * DefaultStyle.dp }
weight: 300 * DefaultStyle.dp Connections {
target: cancelAndDeleteConfDialog
onCancelRequested: {
mainItem.selectedConference.core.lCancelConferenceInfo()
}
onAccepted: {
mainItem.selectedConference.core.lDeleteConferenceInfo()
} }
} }
} }
} }
} }
} }
Button {
Layout.fillWidth: true
text: qsTr("Rejoindre la réunion")
topPadding: 11 * DefaultStyle.dp
bottomPadding: 11 * DefaultStyle.dp
onClicked: {
console.log(mainItem.selectedConference.core.uri)
UtilsCpp.setupConference(mainItem.selectedConference)
}
}
} }
Section {
content: ColumnLayout {
spacing: 15 * DefaultStyle.dp
width: parent.width
RowLayout {
spacing: 8 * DefaultStyle.dp
Layout.fillWidth: true
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
source: AppIcons.videoCamera
}
Button {
Layout.fillWidth: true
text: mainItem.selectedConference ? mainItem.selectedConference.core.uri : ""
textSize: 14 * DefaultStyle.dp
textWeight: 400 * DefaultStyle.dp
underline: true
inversedColors: true
color: DefaultStyle.main2_600
background: Item{}
property var callObj
onClicked: {
callObj = UtilsCpp.createCall(mainItem.selectedConference.core.uri)
}
}
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
icon.source: AppIcons.shareNetwork
onClicked: {
UtilsCpp.copyToClipboard(mainItem.selectedConference.core.uri)
UtilsCpp.showInformationPopup(qsTr("Enregistré"), qsTr("Le lien de la réunion a été copié dans le presse-papiers"))
}
}
}
RowLayout {
spacing: 8 * DefaultStyle.dp
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
source: AppIcons.clock
}
Text {
text: mainItem.selectedConference
? UtilsCpp.toDateString(mainItem.selectedConference.core.dateTimeUtc)
+ " | " + UtilsCpp.toDateHourString(mainItem.selectedConference.core.dateTimeUtc)
+ " - "
+ UtilsCpp.toDateHourString(mainItem.selectedConference.core.endDateTime)
: ''
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
RowLayout {
spacing: 8 * DefaultStyle.dp
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
source: AppIcons.globe
}
Text {
text: qsTr("Time zone: ") + (mainItem.selectedConference ? (mainItem.selectedConference.core.timeZoneModel.displayName + ", " + mainItem.selectedConference.core.timeZoneModel.countryName) : "")
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
}
}
Section {
visible: mainItem.selectedConference && mainItem.selectedConference.core.description.length != 0
content: RowLayout {
spacing: 8 * DefaultStyle.dp
EffectImage {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
imageSource: AppIcons.note
colorizationColor: DefaultStyle.main2_600
}
Text {
text: mainItem.selectedConference ? mainItem.selectedConference.core.description : ""
Layout.fillWidth: true
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
}
Section {
content: RowLayout {
spacing: 8 * DefaultStyle.dp
EffectImage {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
imageSource: AppIcons.userRectangle
colorizationColor: DefaultStyle.main2_600
}
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: mainItem.selectedConference ? mainItem.selectedConference.core.organizerAddress : ""
}
Text {
text: mainItem.selectedConference ? mainItem.selectedConference.core.organizerName : ""
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
}
}
Section {
content: RowLayout {
Layout.preferredHeight: participantList.height
width: 393 * DefaultStyle.dp
spacing: 8 * DefaultStyle.dp
Image {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.alignment: Qt.AlignLeft | Qt.AlignTop
Layout.topMargin: 20 * DefaultStyle.dp
source: AppIcons.usersTwo
}
ListView {
id: participantList
Layout.preferredHeight: Math.min(184 * DefaultStyle.dp, contentHeight)
Layout.fillWidth: true
model: mainItem.selectedConference ? mainItem.selectedConference.core.participants : []
clip: true
delegate: RowLayout {
height: 56 * DefaultStyle.dp
width: participantList.width
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: modelData.address
}
Text {
text: modelData.displayName
Layout.fillWidth: true
font {
pixelSize: 14 * DefaultStyle.dp
capitalization: Font.Capitalize
}
}
Text {
text: qsTr("Organizer")
visible: mainItem.selectedConference && mainItem.selectedConference.core.organizerAddress === modelData.address
color: DefaultStyle.main2_400
font {
pixelSize: 12 * DefaultStyle.dp
weight: 300 * DefaultStyle.dp
}
}
}
}
}
}
Button {
Layout.fillWidth: true
text: qsTr("Rejoindre la réunion")
topPadding: 11 * DefaultStyle.dp
bottomPadding: 11 * DefaultStyle.dp
onClicked: {
console.log(mainItem.selectedConference.core.uri)
UtilsCpp.setupConference(mainItem.selectedConference)
}
}
Item { Layout.fillHeight: true}
} }
} }
} }