This commit is contained in:
Gaelle Braud 2024-03-26 16:08:42 +01:00 committed by Julien Wadel
parent 10427b5288
commit d70b08c36e
11 changed files with 261 additions and 168 deletions

View file

@ -34,7 +34,7 @@ void Thread::run() {
}
}
bool Thread::isInLinphoneThread() {
return QThread::currentThread() == CoreModel::getInstance()->thread();
return CoreModel::getInstance() && QThread::currentThread() == CoreModel::getInstance()->thread();
}
bool Thread::mustBeInLinphoneThread(const QString &context) {

View file

@ -16,9 +16,10 @@ Window {
property CallGui call
property ConferenceInfoGui conferenceInfo
onConferenceInfoChanged: console.log("CONFERENCE INFO", conferenceInfo)
property ConferenceGui conference: call && call.core.conference || null
onConferenceChanged: console.log ("CONFERENCE CHANGED", conference)
property bool callTerminatedByUser: false
onCallChanged: {
@ -56,7 +57,10 @@ Window {
onCallStateChanged: {
console.log("State:", callState)
if (callState === LinphoneEnums.CallState.Connected) {
if (conferenceInfo) middleItemStackView.replace(inCallItem)
if (conferenceInfo) {
middleItemStackView.replace(inCallItem)
bottomButtonsLayout.visible = true
}
if(!call.core.isSecured && call.core.encryption === LinphoneEnums.MediaEncryption.Zrtp) {
zrtpValidation.open()
}
@ -642,19 +646,17 @@ Window {
Layout.alignment: Qt.AlignHCenter
layoutDirection: Qt.LeftToRight
columnSpacing: 20 * DefaultStyle.dp
visible: mainWindow.conferenceUri ? mainWindow.conferenceJoined : mainWindow.call
visible: mainWindow.call && !mainWindow.conferenceInfo
function refreshLayout() {
if (mainWindow.callState === LinphoneEnums.CallState.Connected || mainWindow.callState === LinphoneEnums.CallState.StreamsRunning) {
bottomButtonsLayout.layoutDirection = Qt.RightToLeft
connectedCallButtons.visible = true
videoCameraButton.enabled = true
moreOptionsButton.visible = true
}
connectedCallButtons.visible = bottomButtonsLayout.visible
moreOptionsButton.visible = bottomButtonsLayout.visible
}
else if (mainWindow.callState === LinphoneEnums.CallState.OutgoingInit) {
connectedCallButtons.visible = false
bottomButtonsLayout.layoutDirection = Qt.LeftToRight
videoCameraButton.enabled = false
moreOptionsButton.visible = false
}
}
@ -669,9 +671,12 @@ Window {
children[i].enabled = false
}
}
BottomButton {
Button {
Layout.row: 0
enabledIcon: AppIcons.endCall
icon.source: AppIcons.endCall
icon.width: 32 * DefaultStyle.dp
icon.height: 32 * DefaultStyle.dp
contentImageColor: DefaultStyle.grey_0
checkable: false
Layout.column: mainWindow.callState == LinphoneEnums.CallState.OutgoingInit
|| mainWindow.callState == LinphoneEnums.CallState.OutgoingProgress
@ -696,7 +701,7 @@ Window {
visible: false
Layout.row: 0
Layout.column: 1
BottomButton {
CheckableButton {
id: pauseButton
Layout.preferredWidth: 55 * DefaultStyle.dp
Layout.preferredHeight: 55 * DefaultStyle.dp
@ -712,17 +717,20 @@ Window {
: DefaultStyle.grey_600
}
enabled: mainWindow.callState != LinphoneEnums.CallState.PausedByRemote
enabledIcon: enabled && checked ? AppIcons.play : AppIcons.pause
icon.source: enabled && checked ? AppIcons.play : AppIcons.pause
checked: mainWindow.call && mainWindow.call.core.paused
onClicked: {
mainWindow.call.core.lSetPaused(!callsModel.currentCall.core.paused)
onCheckedChanged: {
mainWindow.call.core.lSetPaused(!mainWindow.call.core.paused)
}
}
BottomButton {
CheckableButton {
id: transferCallButton
enabledIcon: AppIcons.transferCall
icon.source: AppIcons.transferCall
Layout.preferredWidth: 55 * DefaultStyle.dp
Layout.preferredHeight: 55 * DefaultStyle.dp
contentImageColor: enabled ? DefaultStyle.grey_0 : DefaultStyle.grey_500
onEnabledChanged: console.log("===================enable change", enabled)
onContentImageColorChanged: console.log("===================================== content image color", contentImageColor)
onCheckedChanged: {
if (checked) {
rightPanel.visible = true
@ -736,10 +744,10 @@ Window {
onVisibleChanged: if(!rightPanel.visible) transferCallButton.checked = false
}
}
BottomButton {
CheckableButton {
id: newCallButton
checkable: false
enabledIcon: AppIcons.newCall
icon.source: AppIcons.newCall
Layout.preferredWidth: 55 * DefaultStyle.dp
Layout.preferredHeight: 55 * DefaultStyle.dp
onClicked: {
@ -757,41 +765,42 @@ Window {
|| mainWindow.callState == LinphoneEnums.CallState.OutgoingEarlyMedia
|| mainWindow.callState == LinphoneEnums.CallState.IncomingReceived
? bottomButtonsLayout.columns - 1 : 0
BottomButton {
CheckableButton {
id: videoCameraButton
enabledIcon: AppIcons.videoCamera
disabledIcon: AppIcons.videoCameraSlash
enabled: mainWindow.conferenceInfo || (mainWindow.callState === LinphoneEnums.CallState.Connected || mainWindow.callState === LinphoneEnums.CallState.StreamsRunning)
iconUrl: AppIcons.videoCamera
checkedIconUrl: AppIcons.videoCameraSlash
checked: mainWindow.call && !mainWindow.call.core.cameraEnabled
Layout.preferredWidth: 55 * DefaultStyle.dp
Layout.preferredHeight: 55 * DefaultStyle.dp
onClicked: mainWindow.call.core.lSetCameraEnabled(!mainWindow.call.core.cameraEnabled)
onCheckedChanged: mainWindow.call.core.lSetCameraEnabled(!mainWindow.call.core.cameraEnabled)
}
BottomButton {
enabledIcon: AppIcons.microphone
disabledIcon: AppIcons.microphoneSlash
CheckableButton {
iconUrl: AppIcons.microphone
checkedIconUrl: AppIcons.microphoneSlash
checked: mainWindow.call && mainWindow.call.core.microphoneMuted
Layout.preferredWidth: 55 * DefaultStyle.dp
Layout.preferredHeight: 55 * DefaultStyle.dp
onClicked: mainWindow.call.core.lSetMicrophoneMuted(!mainWindow.call.core.microphoneMuted)
onCheckedChanged: mainWindow.call.core.lSetMicrophoneMuted(!mainWindow.call.core.microphoneMuted)
}
PopupButton {
id: moreOptionsButton
Layout.preferredWidth: 55 * DefaultStyle.dp
Layout.preferredHeight: 55 * DefaultStyle.dp
onEnabledChanged: console.log("========== enabled changed", enabled)
contentImageColor: enabled && !checked ? DefaultStyle.grey_0 : DefaultStyle.grey_500
icon.width: 24 * DefaultStyle.dp
icon.height: 24 * DefaultStyle.dp
icon.source: AppIcons.more
background: Rectangle {
anchors.fill: moreOptionsButton
color: moreOptionsButton.checked ? DefaultStyle.grey_0 : DefaultStyle.grey_500
color: moreOptionsButton.enabled
? moreOptionsButton.checked
? DefaultStyle.grey_0
: DefaultStyle.grey_500
: DefaultStyle.grey_600
radius: 40 * DefaultStyle.dp
}
contentItem: Item {
EffectImage {
imageSource: AppIcons.more
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
anchors.centerIn: parent
colorizationColor: moreOptionsButton.checked ? DefaultStyle.grey_500 : DefaultStyle.grey_0
}
}
popup.x: width/2
popup.y: y - popup.height + height/4
popup.contentItem: ColumnLayout {
@ -864,30 +873,7 @@ Window {
mainWindow.call && mainWindow.call.core.recording ? mainWindow.call.core.lStopRecording() : mainWindow.call.core.lStartRecording()
}
}
Control.Button {
id: speakerButton
Layout.fillWidth: true
checkable: true
background: Item {}
contentItem: RowLayout {
EffectImage {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
fillMode: Image.PreserveAspectFit
imageSource: AppIcons.recordFill
colorizationColor: mainWindow.call && mainWindow.call.core.recording ? DefaultStyle.danger_500main : undefined
}
Text {
color: mainWindow.call && mainWindow.call.core.recording ? DefaultStyle.danger_500main : DefaultStyle.main2_600
text: mainWindow.call && mainWindow.call.core.recording ? qsTr("Terminer l'enregistrement") : qsTr("Enregistrer l'appel")
}
}
onClicked: {
mainWindow.call.core.recording ? mainWindow.call.core.lStopRecording() : mainWindow.call.core.lStartRecording()
}
}
Control.Button {
Button {
id: settingsButton
Layout.fillWidth: true
background: Item{}

View file

@ -138,21 +138,21 @@ Item {
}
Popup {
id: listPopup
width: magicSearchList.width + listPopup.rightPadding + listPopup.leftPadding
height: Math.min(magicSearchList.contentHeight, 300 * DefaultStyle.dp + topPadding + bottomPadding)
width: magicSearchBar.width
height: Math.min(magicSearchList.contentHeight + topPadding + bottomPadding, 400 * DefaultStyle.dp)
y: magicSearchBar.height
closePolicy: Popup.NoAutoClose
topPadding: 10 * DefaultStyle.dp
bottomPadding: 10 * DefaultStyle.dp
rightPadding: 10 * DefaultStyle.dp
leftPadding: 10 * DefaultStyle.dp
background: Item {
anchors.fill: parent
Rectangle {
id: popupBg
radius: 15 * DefaultStyle.dp
anchors.fill: parent
// width: magicSearchList.width + listPopup.rightPadding + listPopup.leftPadding
}
MultiEffect {
source: popupBg
@ -166,101 +166,115 @@ Item {
Control.ScrollBar {
id: scrollbar
height: parent.height
anchors.right: parent.right
anchors.right: listPopup.right
}
ContactsList {
contentItem: ContactsList {
id: magicSearchList
visible: magicSearchBar.text.length != 0
height: Math.min(contentHeight, listPopup.height)
height: contentHeight
width: magicSearchBar.width
headerPositioning: ListView.OverlayHeader
rightMargin: 15 * DefaultStyle.dp
initialHeadersVisible: false
contactMenuVisible: false
actionMenuVisible: true
model: MagicSearchProxy {
searchText: magicSearchBar.text.length === 0 ? "*" : magicSearchBar.text
aggregationFlag: LinphoneEnums.MagicSearchAggregation.Friend
}
Control.ScrollBar.vertical: scrollbar
header: ColumnLayout {
header: Control.Control {
z: 2
width: magicSearchList.width
RowLayout {
Layout.fillWidth: true
spacing: 10 * DefaultStyle.dp
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: sipAddr.text
}
ColumnLayout {
Text {
text: magicSearchBar.text
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
leftPadding: 10 * DefaultStyle.dp
rightPadding: 10 * DefaultStyle.dp
background: Rectangle {
color: DefaultStyle.grey_0
}
contentItem: ColumnLayout {
RowLayout {
Layout.fillWidth: true
spacing: 10 * DefaultStyle.dp
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: sipAddr.text
}
ColumnLayout {
Text {
text: magicSearchBar.text
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
}
}
Text {
id: sipAddr
text: UtilsCpp.generateLinphoneSipAddress(magicSearchBar.text)
}
}
Text {
id: sipAddr
text: UtilsCpp.generateLinphoneSipAddress(magicSearchBar.text)
Item {
Layout.fillWidth: true
}
Button {
background: Item{}
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
property var callObj
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.phone
}
onClicked: {
callObj = UtilsCpp.createCall(sipAddr.text)
}
}
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.videoCamera
}
onClicked: callObj = UtilsCpp.createCall(sipAddr.text, true)
}
}
Item {
Layout.fillWidth: true
}
Button {
background: Item{}
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
property var callObj
contentItem: Image {
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.phone
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
color: DefaultStyle.main2_200
pressedColor: DefaultStyle.main2_400
background: Rectangle {
anchors.fill: parent
color: DefaultStyle.main2_200
}
contentItem: RowLayout {
spacing: 10 * DefaultStyle.dp
Image {
source: AppIcons.userPlus
}
Text {
text: qsTr("Ajouter ce contact")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
capitalization: Font.AllUppercase
}
}
Item {Layout.fillWidth: true}
}
onClicked: {
callObj = UtilsCpp.createCall(sipAddr.text)
var currentItem = mainStackLayout.children[mainStackLayout.currentIndex]
listPopup.close()
currentItem.createContact(magicSearchBar.text, sipAddr.text)
}
}
}
Button {
Layout.fillWidth: true
color: DefaultStyle.main2_200
pressedColor: DefaultStyle.main2_400
background: Rectangle {
anchors.fill: parent
color: DefaultStyle.main2_200
}
contentItem: RowLayout {
spacing: 10 * DefaultStyle.dp
Image {
source: AppIcons.userPlus
}
Text {
text: qsTr("Ajouter ce contact")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
capitalization: Font.AllUppercase
}
}
Item {Layout.fillWidth: true}
}
onClicked: {
var currentItem = mainStackLayout.children[mainStackLayout.currentIndex]
listPopup.close()
currentItem.createContact(magicSearchBar.text, sipAddr.text)
}
}
}
delegateButtons: Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.phone
}
}
}
}

View file

@ -5,7 +5,7 @@ import Linphone
import UtilsCpp 1.0
import SettingsCpp 1.0
Window {
ApplicationWindow {
id: mainWindow
width: 1512 * DefaultStyle.dp
height: 982 * DefaultStyle.dp
@ -15,6 +15,15 @@ Window {
property bool firstConnection: true
color: "transparent"
// TODO : use this to make the border transparent
// flags: Qt.Window | Qt.FramelessWindowHint | Qt.WindowTitleHint
// menuBar: Rectangle {
// width: parent.width
// height: 40 * DefaultStyle.dp
// color: DefaultStyle.grey_100
// }
function goToNewCall() {
mainWindowStackView.replace(mainPage, StackView.Immediate)
mainWindowStackView.currentItem.goToNewCall()

View file

@ -8,6 +8,7 @@ Control.Button {
id: mainItem
property int capitalization
property color color: DefaultStyle.main1_500_main
property color borderColor: "transparent"
property color pressedColor: DefaultStyle.main1_500_main_darker
property bool inversedColors: false
property int textSize: 18 * DefaultStyle.dp
@ -15,7 +16,6 @@ Control.Button {
property bool underline: false
property bool shadowEnabled: false
property var contentImageColor
property alias contentText: contentText
hoverEnabled: true
icon.width: width
icon.height: height
@ -44,7 +44,7 @@ Control.Button {
? mainItem.pressedColor
: mainItem.color
radius: 48 * DefaultStyle.dp
border.color: inversedColors ? mainItem.color : "transparent"
border.color: inversedColors ? mainItem.color : mainItem.borderColor
MouseArea {
anchors.fill: parent
@ -64,15 +64,48 @@ Control.Button {
}
contentItem: StackLayout {
currentIndex: mainItem.text.length != 0
currentIndex: mainItem.text.length != 0 && mainItem.icon.source != undefined
? 0
: mainItem.icon.source != undefined
: mainItem.text.length != 0
? 1
: 2
: mainItem.icon.source != undefined
? 2
: 3
width: mainItem.width
RowLayout {
spacing: 5 * DefaultStyle.dp
EffectImage {
visible: mainItem.icon.source != undefined
Layout.fillWidth: true
Layout.fillHeight: true
imageSource: mainItem.icon.source
imageWidth: mainItem.icon.width
imageHeight: mainItem.icon.height
colorizationColor: mainItem.contentImageColor
}
Text {
visible: mainItem.text != undefined
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
width: mainItem.text != undefined ? implicitWidth : 0
height: implicitHeight
wrapMode: Text.WrapAnywhere
Layout.fillWidth: true
Layout.fillHeight: true
text: mainItem.text
maximumLineCount: 1
color: inversedColors ? mainItem.color : DefaultStyle.grey_0
font {
pixelSize: mainItem.textSize
weight: mainItem.textWeight
family: DefaultStyle.defaultFont
capitalization: mainItem.capitalization
underline: mainItem.underline
}
}
}
Text {
id: contentText
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
Layout.alignment: Qt.AlignCenter
@ -92,7 +125,6 @@ Control.Button {
}
}
EffectImage {
id: image
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
Layout.fillHeight: true
@ -102,8 +134,8 @@ Control.Button {
colorizationColor: mainItem.contentImageColor
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.fillWidth : true
Layout.fillHeight : true
}
}
}

View file

@ -9,11 +9,7 @@ Button {
property string iconUrl
property string checkedIconUrl
property color color: DefaultStyle.grey_500
property color checkedColor: DefaultStyle.main2_400
leftPadding: 0
rightPadding: 0
topPadding: 0
bottomPadding: 0
property color checkedColor: color
checkable: true
background: Rectangle {
anchors.fill: parent

View file

@ -10,11 +10,15 @@ ListView {
height: contentHeight
visible: contentHeight > 0
clip: true
rightMargin: 5 * DefaultStyle.dp
property string searchBarText
property bool hoverEnabled: true
// dots popup menu
property bool contactMenuVisible: true
// call, video call etc menu
property bool actionMenuVisible: true
property bool initialHeadersVisible: true
property bool displayNameCapitalization: true
property bool showOnlyFavourites: false
@ -34,8 +38,6 @@ ListView {
property int delegateLeftMargin: 0
currentIndex: -1
property var delegateButtons: []
property FriendGui selectedContact: model.getAt(currentIndex) || null
onCurrentIndexChanged: selectedContact = model.getAt(currentIndex) || null
@ -49,7 +51,7 @@ ListView {
signal contactAddedToSelection()
model: MagicSearchProxy {
searchText: searchBarText.length === 0 ? "*" : searchBarText
searchText: searchBarText.length === 0 ? "*" : searchBarText
}
@ -88,6 +90,7 @@ ListView {
anchors.left: initial.visible ? initial.right : parent.left
anchors.leftMargin: 10 * DefaultStyle.dp + mainItem.delegateLeftMargin
anchors.right: parent.right
anchors.rightMargin: 10 * DefaultStyle.dp
anchors.verticalCenter: parent.verticalCenter
spacing: 10 * DefaultStyle.dp
z: 1
@ -122,12 +125,39 @@ ListView {
RowLayout {
id: actionsRow
z: 1
anchors.fill: parent
anchors.rightMargin: 5 * DefaultStyle.dp
visible: mainItem.actionMenuVisible || friendPopup.visible
// anchors.fill: parent
anchors.right: parent.right
anchors.rightMargin: 10 * DefaultStyle.dp
anchors.verticalCenter: parent.verticalCenter
RowLayout{
Layout.fillWidth: true
Layout.fillHeight: true
children: mainItem.delegateButtons
property var callObj
visible: mainItem.actionMenuVisible
spacing: 10 * DefaultStyle.dp
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.phone
}
onClicked: callObj = UtilsCpp.createCall(modelData.core.defaultAddress)
}
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.videoCamera
}
onClicked: callObj = UtilsCpp.createCall(modelData.core.defaultAddress, true)
}
}
PopupButton {
id: friendPopup

View file

@ -19,7 +19,7 @@ Loader {
sourceComponent: Item {
Image {
id: image
visible: !effect2.enabled
visible: !effect2.effectEnabled
source: mainItem.imageSource ? mainItem.imageSource : ""
fillMode: mainItem.fillMode
sourceSize.width: width
@ -34,18 +34,18 @@ Loader {
anchors.fill: image
source: image
maskSource: image
brightness: effect2.enabled ? 1.0 : 0.0
brightness: effect2.effectEnabled ? 1.0 : 0.0
}
MultiEffect {
id: effect2
visible: mainItem.useColor
enabled: mainItem.useColor
property bool effectEnabled: mainItem.useColor
anchors.fill: effect
source: effect
maskSource: effect
colorizationColor: effect2.enabled && mainItem.colorizationColor ? mainItem.colorizationColor : 'black'
colorization: effect2.enabled ? 1.0: 0.0
colorizationColor: effectEnabled && mainItem.colorizationColor ? mainItem.colorizationColor : 'black'
colorization: effectEnabled ? 1.0: 0.0
}
}
}

View file

@ -64,6 +64,26 @@ Item {
}
}
}
// ColumnLayout {
// id: waitingForParticipant
// Text {
// text: qsTr("Waiting for other participants...")
// color: DefaultStyle.frey_0
// font {
// pixelSize: 30 * DefaultStyle.dp
// weight: 300 * DefaultStyle.dp
// }
// }
// Button {
// inversedColors: true
// text: qsTr("Share invitation")
// icon.source: AppIcons.shareNetwork
// color: DefaultStyle.main2_400
// Layout.preferredWidth: 206 * DefaultStyle.dp
// Layout.preferredHeight: 47 * DefaultStyle.dp
// }
// }
/*
Sticker {
id: preview

View file

@ -111,4 +111,7 @@ ColumnLayout {
searchBarText: searchbar.text
onContactAddedToSelection: participantList.positionViewAtEnd()
}
Item {
Layout.fillHeight: true
}
}

View file

@ -368,8 +368,9 @@ AbstractMainPage {
inversedColors: true
color: DefaultStyle.main2_600
background: Item{}
property var callObj
onClicked: {
console.log("TODO: join conf", text)
callObj = UtilsCpp.createCall(mainItem.selectedConference.core.uri)
}
}
Button {
@ -377,7 +378,10 @@ AbstractMainPage {
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
icon.source: AppIcons.shareNetwork
onClicked: UtilsCpp.copyToClipboard(confUri.text)
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 {
@ -513,7 +517,6 @@ AbstractMainPage {
topPadding: 11 * DefaultStyle.dp
bottomPadding: 11 * DefaultStyle.dp
onClicked: {
console.log("TODO: join conf", mainItem.selectedConference.core.subject)
console.log(mainItem.selectedConference.core.uri)
UtilsCpp.setupConference(mainItem.selectedConference)
}