Add a message banner to call view. If the user is alone, display an alone message.

Fix paused view : fix the state display (next to username)and show username in remote view.
Add an API to get participant device count from the conference model.
Reduce mosaic max size before switchçng to lesser quality (9 to 6 participants).
Upgrade message banner to be more customizable on colors and icons.
Hide some buttons if the conference is not ready.
Fix title display if there is no elapsed time (remove the minus character).
This commit is contained in:
Julien Wadel 2022-08-29 18:37:51 +02:00
parent 50be00a386
commit 91f4d94aae
26 changed files with 332 additions and 81 deletions

View file

@ -1133,6 +1133,14 @@ Server url ikke konfigureret.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ Server url ikke konfigureret.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ Server URL ist nicht konfiguriert.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ Server URL ist nicht konfiguriert.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ Server URL not configured.</translation>
<translation>Select date and time</translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation>paused</translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ Server URL not configured.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation>Waiting for another participant...</translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation>You are alone in this conference</translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ URL del servidor no configurada.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ URL del servidor no configurada.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ URL du serveur non configurée.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ URL du serveur non configurée.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1127,6 +1127,14 @@ A kiszolgáló URL-je nincs konfigurálva.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1375,6 +1383,11 @@ A kiszolgáló URL-je nincs konfigurálva.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ URL del server non configurato.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ URL del server non configurato.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1127,6 +1127,14 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1375,6 +1383,11 @@
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1139,6 +1139,14 @@ Nesukonfigūruotas serverio url.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1395,6 +1403,11 @@ Nesukonfigūruotas serverio url.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ URL do servidor não configurado.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ URL do servidor não configurado.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1139,6 +1139,14 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1395,6 +1403,11 @@
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1133,6 +1133,14 @@ Serverwebbadressen är inte konfigurerad.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1385,6 +1393,11 @@ Serverwebbadressen är inte konfigurerad.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1127,6 +1127,14 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1375,6 +1383,11 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1139,6 +1139,14 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1395,6 +1403,11 @@
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -1127,6 +1127,14 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DecorationSticker</name>
<message>
<source>paused</source>
<extracomment>&apos;paused&apos; : Pause state on sticker, next to username.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DroppableTextArea</name>
<message>
@ -1375,6 +1383,11 @@
<extracomment>&apos;Waiting for another participant...&apos; : Waiting message for more participant.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>aloneInConference</source>
<extracomment>&apos;&apos;You are alone in this conference&apos; : Text in message banner when the user is the only participant.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IncallFullscreen</name>

View file

@ -63,6 +63,8 @@ ConferenceModel::ConferenceModel (std::shared_ptr<linphone::Conference> conferen
mConferenceListener = std::make_shared<ConferenceListener>();
connectTo(mConferenceListener.get());
mConference->addListener(mConferenceListener);
connect(this, &ConferenceModel::participantDeviceAdded, this, &ConferenceModel::participantDeviceCountChanged);
connect(this, &ConferenceModel::participantDeviceRemoved, this, &ConferenceModel::participantDeviceCountChanged);
}
ConferenceModel::~ConferenceModel(){
@ -123,6 +125,10 @@ std::list<std::shared_ptr<linphone::Participant>> ConferenceModel::getParticipan
return participantList;
}
int ConferenceModel::getParticipantDeviceCount() const{
return mConference->getParticipantDeviceList().size();
}
void ConferenceModel::setIsReady(bool state){
if( mIsReady != state){
mIsReady = state;

View file

@ -42,6 +42,7 @@ public:
Q_PROPERTY(ParticipantListModel* participants READ getParticipantListModel CONSTANT)
Q_PROPERTY(ParticipantModel* localParticipant READ getLocalParticipant NOTIFY localParticipantChanged)
Q_PROPERTY(bool isReady MEMBER mIsReady WRITE setIsReady NOTIFY isReadyChanged)
Q_PROPERTY(int participantDeviceCount READ getParticipantDeviceCount NOTIFY participantDeviceCountChanged)
static QSharedPointer<ConferenceModel> create(std::shared_ptr<linphone::Conference> chatRoom, QObject *parent = Q_NULLPTR);
@ -57,6 +58,7 @@ public:
Q_INVOKABLE ParticipantModel* getLocalParticipant() const;
ParticipantListModel* getParticipantListModel() const;
std::list<std::shared_ptr<linphone::Participant>> getParticipantList() const; // SDK exclude me. We want to get ALL participants.
int getParticipantDeviceCount() const;
void setIsReady(bool state);
@ -88,6 +90,7 @@ signals:
void conferenceStateChanged(linphone::Conference::State newState);
void subjectChanged();
void isReadyChanged();
void participantDeviceCountChanged();
private:
void connectTo(ConferenceListener * listener);

View file

@ -141,6 +141,12 @@ class ColorListModel : public ProxyListModel {
ADD_COLOR("timeline_bg_1", "#EFF0F2", "Timeline background color 1")
ADD_COLOR("timeline_bg_2", "#FFFFFF", "Timeline background color 2")
ADD_COLOR("message_banner_bg", "#9ECD1D", "Message banner background")
ADD_COLOR("message_banner_fg", "#FFFFFF", "Message banner foreground")
ADD_COLOR("incall_message_banner_bg", "#FC4607", "Incall message banner background")
ADD_COLOR("incall_message_banner_fg", "#FFFFFF", "Incall message banner foreground")
// Keywords: 'mKeywordsMap'
// s=standard, ma=main, l=list, sc=screen, me=menu

View file

@ -63,7 +63,7 @@ public:
static constexpr char ContactUrl[] = "https://www.linphone.org/contact";
static constexpr char TranslationUrl[] = "https://weblate.linphone.org/projects/linphone-desktop/";
static constexpr int MaxMosaicParticipants = 9;// From 10, the mosaic quality will be limited to avoid useless computations
static constexpr int MaxMosaicParticipants = 6;// From 7, the mosaic quality will be limited to avoid useless computations
static constexpr char LinphoneBZip2_exe[] = "https://www.linphone.org/releases/windows/tools/bzip2/bzip2.exe";
static constexpr char LinphoneBZip2_dll[] = "https://www.linphone.org/releases/windows/tools/bzip2/bzip2.dll";

View file

@ -10,7 +10,11 @@ Rectangle{
property int fitHeight: visible && opacity > 0 ? 32 : 0
property string noticeBannerText
property int iconMode : 1 // 0=noIcons, 1=copy
property bool showIcon: true
property alias pointSize: textItem.font.pointSize
property alias textColor: textItem.color
property alias icon: iconItem.icon
property alias iconColor: iconItem.overwriteColor // = textColor by default
onNoticeBannerTextChanged: if(noticeBannerText!='') mainItem.state = "showed"
@ -27,12 +31,14 @@ Rectangle{
anchors.centerIn: parent
spacing: 5
Icon{
icon: if(iconMode == 1) MessageBannerStyle.copyTextIcon
overwriteColor: MessageBannerStyle.textColor
id: iconItem
icon: mainItem.showIcon ? MessageBannerStyle.copyTextIcon : ''
overwriteColor: textItem.color
iconSize: 20
visible: iconMode != 0
visible: mainItem.showIcon
}
Text{
id: textItem
Layout.fillHeight: true
Layout.fillWidth: true
text: mainItem.noticeBannerText

View file

@ -9,7 +9,7 @@ QtObject {
property string sectionName: 'MessageBanner'
property string copyTextIcon : 'menu_copy_text_custom'
property color color: ColorsList.add(sectionName+'_message_banner', '', 'Background of message banner', '#9ecd1d').color
property color textColor: ColorsList.add(sectionName+'_message_banner_text', 'q', 'Text of message banner').color
property color color: ColorsList.add(sectionName+'_message_banner', 'message_banner_bg', 'Background of message banner').color
property color textColor: ColorsList.add(sectionName+'_message_banner_text', 'message_banner_fg', 'Text of message banner').color
property int pointSize: Units.dp * 9
}

View file

@ -43,7 +43,7 @@ Avatar {
return null;
}
username: (mainItem.isPaused || !_username) ? '' : _username
username: _username ? _username : ''
Text {
anchors.fill: parent
color: CallStyle.container.pause.text.color

View file

@ -19,7 +19,7 @@ Item{
id: mainItem
default property alias _content: content.data
property alias speakingOverlayDisplayed: effect.visible
property alias username: username.text
property string username: mainItem._currentDevice ? mainItem._currentDevice.displayName : ''
property bool showUsername: true
property ParticipantDeviceModel _currentDevice
@ -78,7 +78,7 @@ Item{
}
}
Text{
id: username
id: usernameItem
visible: mainItem.showUsername && mainItem._currentDevice
anchors.right: parent.right
anchors.left: parent.left
@ -86,19 +86,20 @@ Item{
anchors.margins: 10
elide: Text.ElideRight
maximumLineCount: 1
text: mainItem._currentDevice && mainItem._currentDevice.displayName + (mainItem._isPaused ? ' (en pause)' : '')
//: 'paused' : Pause state on sticker, next to username.
text: mainItem.username + (mainItem._isPaused ? ' ('+qsTr('paused')+')' : '')
font.pointSize: DecorationStickerStyle.contactDescription.pointSize
font.weight: DecorationStickerStyle.contactDescription.weight
color: DecorationStickerStyle.contactDescription.color
}
Glow {
anchors.fill: username
visible: username.visible
anchors.fill: usernameItem
visible: usernameItem.visible
//spread: 1
radius: 12
samples: 25
color: "#80000000"
source: username
source: usernameItem
}
ActionButton{
visible: mainItem._showCloseButton && mainItem._isPreview && mainItem._callModel && mainItem._callModel.videoEnabled

View file

@ -20,20 +20,38 @@ import 'qrc:/ui/scripts/Utils/utils.js' as Utils
// =============================================================================
Rectangle {
id: conference
id: mainItem
property CallModel callModel
property ConferenceModel conferenceModel: callModel && callModel.conferenceModel
property bool cameraIsReady : false
property bool previewIsReady : false
property bool isFullScreen: false // Use this variable to test if we are in fullscreen. Do not test _fullscreen : we need to clean memory before having the window (see .js file)
property bool isAudioOnly: callModel && callModel.isConference && conferenceLayout.sourceComponent == gridComponent && !callModel.videoEnabled
property var _fullscreen: null
on_FullscreenChanged: if( !_fullscreen) isFullScreen = false
property bool listCallsOpened: true
signal openListCallsRequest()
property int participantCount: mainItem.conferenceModel
? mainItem.conferenceModel.participantDeviceCount
: conferenceLayout.item ? conferenceLayout.item.participantCount : 0
// States
property bool isAudioOnly: callModel && callModel.isConference && conferenceLayout.sourceComponent == gridComponent && !callModel.videoEnabled
property bool isReady : mainItem.callModel
&& (!mainItem.callModel.isConference
|| (mainItem.conferenceModel && mainItem.conferenceModel.isReady)
)
&& conferenceLayout.item && conferenceLayout.status == Loader.Ready
function updateMessageBanner(){
//: ''You are alone in this conference' : Text in message banner when the user is the only participant.
if( isReady && participantCount <= 1) messageBanner.noticeBannerText = qsTr('aloneInConference')
}
onParticipantCountChanged: updateMessageBanner()
onIsReadyChanged: updateMessageBanner()
// ---------------------------------------------------------------------------
color: IncallStyle.backgroundColor
@ -42,10 +60,9 @@ Rectangle {
target: callModel
onCameraFirstFrameReceived: Logic.handleCameraFirstFrameReceived(width, height)
onStatusChanged: Logic.handleStatusChanged (status, conference._fullscreen)
onStatusChanged: Logic.handleStatusChanged (status, mainItem._fullscreen)
onVideoRequested: Logic.handleVideoRequested(callModel)
}
// ---------------------------------------------------------------------------
Rectangle{
MouseArea{
@ -119,6 +136,7 @@ Rectangle {
isCustom: true
backgroundRadius: width/2
colorSet: IncallStyle.buttons.dialpad
visible: mainItem.isReady
toggled: telKeypad.visible
onClicked: telKeypad.visible = !telKeypad.visible
}
@ -129,6 +147,7 @@ Rectangle {
backgroundRadius: width/2
colorSet: IncallStyle.buttons.callQuality
icon: IncallStyle.buttons.callQuality.icon_0
visible: mainItem.isReady
toggled: callStatistics.isOpen
onClicked: callStatistics.isOpen ? callStatistics.close() : callStatistics.open()
@ -155,43 +174,56 @@ Rectangle {
}
// Title
ColumnLayout{
Item{
Layout.fillWidth: true
Text{
id: title
Timer{
id: elapsedTimeRefresher
running: true
interval: 1000
repeat: true
onTriggered: if(conferenceModel) parent.elaspedTime = Utils.formatElapsedTime(conferenceModel.getElapsedSeconds())
else parent.elaspedTime = Utils.formatElapsedTime(conference.callModel.duration)
Layout.fillHeight: true
ColumnLayout{
anchors.fill: parent
Text{
id: title
Timer{
id: elapsedTimeRefresher
running: true
interval: 1000
repeat: true
onTriggered: if(conferenceModel) parent.elaspedTime = Utils.formatElapsedTime(conferenceModel.getElapsedSeconds())
else parent.elaspedTime = Utils.formatElapsedTime(mainItem.callModel.duration)
}
property string elaspedTime
horizontalAlignment: Qt.AlignHCenter
Layout.fillWidth: true
text: conferenceModel
? conferenceModel.subject
? conferenceModel.subject+ (elaspedTime ? ' - ' +elaspedTime : '')
: elaspedTime
: callModel
? elaspedTime
: ''
color: IncallStyle.title.color
font.pointSize: IncallStyle.title.pointSize
}
property string elaspedTime
horizontalAlignment: Qt.AlignHCenter
Layout.fillWidth: true
text: conferenceModel
? conferenceModel.subject
? conferenceModel.subject+ ' - ' +elaspedTime
: elaspedTime
: callModel
? elaspedTime
: ''
color: IncallStyle.title.color
font.pointSize: IncallStyle.title.pointSize
Text{
id: address
Layout.fillWidth: true
horizontalAlignment: Qt.AlignHCenter
visible: !conferenceModel && callModel && !callModel.isConference
text: !conferenceModel && callModel
? callModel.peerAddress
: ''
color: IncallStyle.title.color
font.pointSize: IncallStyle.title.addressPointSize
}
}
Text{
id: address
Layout.fillWidth: true
horizontalAlignment: Qt.AlignHCenter
visible: !conferenceModel && callModel && !callModel.isConference
text: !conferenceModel && callModel
? callModel.peerAddress
: ''
color: IncallStyle.title.color
font.pointSize: IncallStyle.title.addressPointSize
MessageBanner{
id: messageBanner
anchors.fill: parent
textColor: IncallStyle.header.messageBanner.textColor
color: IncallStyle.header.messageBanner.color
showIcon: false
pointSize: IncallStyle.header.messageBanner.pointSize
}
}
// Mode buttons
ActionButton{
@ -205,9 +237,9 @@ Rectangle {
isCustom: true
backgroundRadius: width/2
colorSet: IncallStyle.buttons.record
property CallModel callModel: conference.callModel
property CallModel callModel: mainItem.callModel
onCallModelChanged: if(!callModel) callModel.stopRecording()
visible: SettingsModel.callRecorderEnabled && callModel
visible: SettingsModel.callRecorderEnabled && callModel && (callModel.recording || mainItem.isReady)
toggled: callModel.recording
onClicked: {
@ -224,8 +256,8 @@ Rectangle {
isCustom: true
backgroundRadius: width/2
colorSet: IncallStyle.buttons.screenshot
visible: conference.callModel.snapshotEnabled
onClicked: conference.callModel.takeSnapshot()
visible: mainItem.callModel.snapshotEnabled && mainItem.isReady
onClicked: mainItem.callModel.takeSnapshot()
//: 'Take Snapshot' : Tooltip for takking snapshot.
tooltipText: qsTr('incallSnapshotTooltip')
}
@ -233,7 +265,7 @@ Rectangle {
isCustom: true
backgroundRadius: width/2
colorSet: IncallStyle.buttons.fullscreen
visible: conference.callModel.videoEnabled
visible: mainItem.callModel.videoEnabled
onClicked: Logic.showFullscreen(window, conference, 'IncallFullscreen.qml', title.mapToGlobal(0,0))
}
@ -259,18 +291,18 @@ Rectangle {
id: grid
Layout.leftMargin: 70
Layout.rightMargin: rightMenu.visible ? 15 : 70
callModel: conference.callModel
cameraEnabled: !conference.isFullScreen
callModel: mainItem.callModel
cameraEnabled: !mainItem.isFullScreen
}
}
Component{
id: activeSpeakerComponent
IncallActiveSpeaker{
id: activeSpeaker
callModel: conference.callModel
callModel: mainItem.callModel
isRightReducedLayout: rightMenu.visible
isLeftReducedLayout: conference.listCallsOpened
cameraEnabled: !conference.isFullScreen
isLeftReducedLayout: mainItem.listCallsOpened
cameraEnabled: !mainItem.isFullScreen
onCameraEnabledChanged: console.log(cameraEnabled)
}
}
@ -282,23 +314,18 @@ Rectangle {
Loader{
id: conferenceLayout
anchors.fill: parent
sourceComponent: conference.conferenceModel
? conference.callModel.conferenceVideoLayout == LinphoneEnums.ConferenceLayoutGrid || !conference.callModel.videoEnabled
sourceComponent: mainItem.conferenceModel
? mainItem.callModel.conferenceVideoLayout == LinphoneEnums.ConferenceLayoutGrid || !mainItem.callModel.videoEnabled
? gridComponent
: activeSpeakerComponent
: activeSpeakerComponent
onSourceComponentChanged: console.log("conferenceLayout: "+conference.callModel.conferenceVideoLayout)
active: conference.callModel
onSourceComponentChanged: console.log("conferenceLayout: "+mainItem.callModel.conferenceVideoLayout)
active: mainItem.callModel
}
Rectangle{
anchors.fill: parent
color: conference.color
visible: !conference.callModel || (conference.callModel.isConference
&& (!conference.conferenceModel
|| (conference.conferenceModel && !conference.conferenceModel.isReady))
)
|| !conferenceLayout.item
|| (conferenceLayout.sourceComponent == gridComponent && !conference.callModel.videoEnabled && conferenceLayout.item.participantCount <= 1)
color: mainItem.color
visible: !mainItem.isReady
ColumnLayout {
anchors.fill: parent
BusyIndicator{
@ -311,7 +338,7 @@ Rectangle {
Text{
Layout.alignment: Qt.AlignCenter
text: conferenceLayout.sourceComponent == gridComponent && !conference.callModel.videoEnabled
text: false //mainItem.needMoreParticipants
//: 'Waiting for another participant...' : Waiting message for more participant.
? qsTr('incallWaitParticipantMessage')
//: 'Video conference is not ready. Please Wait...' : Waiting message for starting conference.
@ -326,8 +353,8 @@ Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 400
Layout.rightMargin: 30
callModel: conference.callModel
conferenceModel: conference.conferenceModel
callModel: mainItem.callModel
conferenceModel: mainItem.conferenceModel
visible: false
onClose: rightMenu.visible = !rightMenu.visible
onLayoutChanging: conferenceLayout.item.clearAll(layoutMode)
@ -404,6 +431,7 @@ Rectangle {
z: 2
RowLayout{
spacing: 10
visible: mainItem.isReady
Row {
spacing: 2
visible: SettingsModel.muteMicrophoneEnabled
@ -453,7 +481,7 @@ Rectangle {
backgroundRadius: 90
colorSet: callModel && callModel.cameraEnabled ? IncallStyle.buttons.cameraOn : IncallStyle.buttons.cameraOff
updating: callModel.videoEnabled && callModel.updating
enabled: !conference.isAudioOnly
enabled: !mainItem.isAudioOnly
onClicked: if(callModel){
if( callModel.isConference){// Only deactivate camera in conference.
callModel.cameraEnabled = !callModel.cameraEnabled
@ -469,7 +497,7 @@ Rectangle {
ActionButton{
isCustom: true
backgroundRadius: width/2
visible: SettingsModel.callPauseEnabled
visible: SettingsModel.callPauseEnabled && mainItem.isReady
updating: callModel.updating
colorSet: callModel.pausedByUser ? IncallStyle.buttons.play : IncallStyle.buttons.pause
onClicked: callModel.pausedByUser = !callModel.pausedByUser
@ -534,9 +562,9 @@ Rectangle {
CallStatistics {
id: callStatistics
call: conference.callModel
width: conference.width
height: conference.height
call: mainItem.callModel
width: mainItem.width
height: mainItem.height
}
TelKeypad {
id: telKeypad

View file

@ -26,7 +26,7 @@ Item {
property bool isLeftReducedLayout: false
property bool cameraEnabled: true
property bool showMe : !(callModel && callModel.pausedByUser) && (callModel.isConference || callModel.localVideoEnabled)
property int participantCount: callModel.isConference ? allDevices.count : 2
property int participantCount: callModel.isConference ? allDevices.count + 1 : 2 // +me
onParticipantCountChanged: {console.log("Conf count: " +participantCount);allDevices.updateCurrentDevice()}

View file

@ -135,6 +135,12 @@ QtObject {
property QtObject stats: QtObject {
property int relativeY: 90
}
property QtObject messageBanner: QtObject{
property color color: ColorsList.add(sectionName+'_message_bg', 'incall_message_banner_bg').color
property color textColor: ColorsList.add(sectionName+'_message_fg', 'incall_message_banner_fg').color
property int pointSize: Units.dp * 10
}
}
property QtObject zrtpArea: QtObject {