mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-05-03 22:56:49 +00:00
Backup
This commit is contained in:
parent
a541df0cd4
commit
9ab931da4d
41 changed files with 1913 additions and 629 deletions
|
|
@ -19,6 +19,7 @@
|
|||
<entry name="contact_parameters" overwrite="true">message-expires=604800</entry>
|
||||
<entry name="conference_factory_uri" overwrite="true">sip:conference-factory@sip.linphone.org</entry>
|
||||
<entry name="cpim_in_basic_chat_rooms_enabled" overwrite="true">1</entry>
|
||||
<entry name="rtp_bundle" overwrite="true">1</entry>
|
||||
</section>
|
||||
<section name="nat_policy_default_values">
|
||||
<entry name="stun_server" overwrite="true">stun.linphone.org</entry>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
<entry name="contact_parameters" overwrite="true">message-expires=604800</entry>
|
||||
<entry name="conference_factory_uri" overwrite="true">sip:conference-factory@sip.linphone.org</entry>
|
||||
<entry name="cpim_in_basic_chat_rooms_enabled" overwrite="true">1</entry>
|
||||
<entry name="rtp_bundle" overwrite="true">1</entry>
|
||||
</section>
|
||||
<section name="nat_policy_default_values">
|
||||
<entry name="stun_server" overwrite="true">stun.linphone.org</entry>
|
||||
|
|
|
|||
307
linphone-app/assets/images/conference_layout_grid_custom.svg
Normal file
307
linphone-app/assets/images/conference_layout_grid_custom.svg
Normal file
|
|
@ -0,0 +1,307 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="80"
|
||||
height="80"
|
||||
viewBox="0 0 80 80"
|
||||
version="1.1"
|
||||
id="svg90"
|
||||
sodipodi:docname="conference_layout_grid.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview92"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
width="80px"
|
||||
inkscape:zoom="5.20625"
|
||||
inkscape:cx="15.270108"
|
||||
inkscape:cy="18.631453"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1043"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg90" />
|
||||
<defs
|
||||
id="defs62">
|
||||
<rect
|
||||
id="7d73pidfgb"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="2.766" />
|
||||
<rect
|
||||
id="yz4p2363vc"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="0ixe1p4o1e"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="2.766" />
|
||||
<rect
|
||||
id="gqqj4bqr3f"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="ei3bofohqh"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="2.766" />
|
||||
<rect
|
||||
id="fw8jktzkci"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="5kuxk18otk"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="2.766" />
|
||||
<rect
|
||||
id="j81y1lwafl"
|
||||
x="0"
|
||||
y="0"
|
||||
width="9.5240002"
|
||||
height="5.533"
|
||||
rx="1" />
|
||||
<filter
|
||||
x="-0.062998739"
|
||||
y="-0.10844027"
|
||||
width="1.1259975"
|
||||
height="1.2168805"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="1w3vu8nnia">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset10" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur12" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix14" />
|
||||
<feMerge
|
||||
id="feMerge20">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode16" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode18" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.062998739"
|
||||
y="-0.10844027"
|
||||
width="1.1259975"
|
||||
height="1.2168805"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="46vopj45hd">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset23" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur25" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix27" />
|
||||
<feMerge
|
||||
id="feMerge33">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode29" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode31" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.062998739"
|
||||
y="-0.10844027"
|
||||
width="1.1259975"
|
||||
height="1.2168805"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="jnauojodeg">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset36" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur38" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix40" />
|
||||
<feMerge
|
||||
id="feMerge46">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode42" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode44" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.062998739"
|
||||
y="-0.10844027"
|
||||
width="1.1259975"
|
||||
height="1.2168805"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="kc22z3ksgj">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset49" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur51" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix53" />
|
||||
<feMerge
|
||||
id="feMerge59">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode55" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode57" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
id="g88"
|
||||
transform="matrix(1.9811369,0,0,1.9721192,-0.6226868,-0.42639723)">
|
||||
<g
|
||||
filter="url(#1w3vu8nnia)"
|
||||
transform="translate(20.476,20.455)"
|
||||
id="g68">
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#7d73pidfgb"
|
||||
id="use64"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#yz4p2363vc"
|
||||
id="use66"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#46vopj45hd)"
|
||||
transform="translate(20.476,14)"
|
||||
id="g74">
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#0ixe1p4o1e"
|
||||
id="use70"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#gqqj4bqr3f"
|
||||
id="use72"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#jnauojodeg)"
|
||||
transform="translate(10,20.455)"
|
||||
id="g80">
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#ei3bofohqh"
|
||||
id="use76"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#fw8jktzkci"
|
||||
id="use78"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#kc22z3ksgj)"
|
||||
transform="translate(10,14)"
|
||||
id="g86">
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#5kuxk18otk"
|
||||
id="use82"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#000000"
|
||||
xlink:href="#j81y1lwafl"
|
||||
id="use84"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.3 KiB |
|
|
@ -53,6 +53,7 @@
|
|||
<file>assets/images/close_custom.svg</file>
|
||||
<file>assets/images/collapsed_custom.svg</file>
|
||||
<file>assets/images/conference_custom.svg</file>
|
||||
<file>assets/images/conference_layout_grid_custom.svg</file>
|
||||
<file>assets/images/contact_add_custom.svg</file>
|
||||
<file>assets/images/contact_card_photo_custom.svg</file>
|
||||
<file>assets/images/contact_custom.svg</file>
|
||||
|
|
@ -287,6 +288,9 @@
|
|||
<file>ui/modules/Linphone/Calls/Calls.qml</file>
|
||||
<file>ui/modules/Linphone/Calls/CallStatistics.qml</file>
|
||||
<file>ui/modules/Linphone/Calls/ConferenceControls.qml</file>
|
||||
<file>ui/modules/Linphone/Calls/IncallAvatar.qml</file>
|
||||
<file>ui/modules/Linphone/Camera/CameraItem.qml</file>
|
||||
<file>ui/modules/Linphone/Camera/CameraView.qml</file>
|
||||
<file>ui/modules/Linphone/Chat/Chat.js</file>
|
||||
<file>ui/modules/Linphone/Chat/Chat.qml</file>
|
||||
<file>ui/modules/Linphone/Chat/ChatContent.qml</file>
|
||||
|
|
@ -341,6 +345,7 @@
|
|||
<file>ui/modules/Linphone/Styles/Calls/CallsStyle.qml</file>
|
||||
<file>ui/modules/Linphone/Styles/Calls/CallStatisticsStyle.qml</file>
|
||||
<file>ui/modules/Linphone/Styles/Calls/ConferenceControlsStyle.qml</file>
|
||||
<file>ui/modules/Linphone/Styles/Camera/CameraViewStyle.qml</file>
|
||||
<file>ui/modules/Linphone/Styles/Chat/ChatStyle.qml</file>
|
||||
<file>ui/modules/Linphone/Styles/Chat/ChatAudioMessageStyle.qml</file>
|
||||
<file>ui/modules/Linphone/Styles/Chat/ChatAudioPreviewStyle.qml</file>
|
||||
|
|
@ -391,12 +396,12 @@
|
|||
<file>ui/views/App/Calls/Dialogs/ConferenceManager.qml</file>
|
||||
<file>ui/views/App/Calls/Dialogs/MultimediaParameters.qml</file>
|
||||
<file>ui/views/App/Calls/EndedCall.qml</file>
|
||||
<file>ui/views/App/Calls/IncallAvatar.qml</file>
|
||||
<file>ui/views/App/Calls/IncallFullscreenWindow.qml</file>
|
||||
<file>ui/views/App/Calls/Incall.js</file>
|
||||
<file>ui/views/App/Calls/Incall.qml</file>
|
||||
<file>ui/views/App/Calls/IncomingCall.qml</file>
|
||||
<file>ui/views/App/Calls/OutgoingCall.qml</file>
|
||||
<file>ui/views/App/Calls/WaitingRoom.qml</file>
|
||||
<file>ui/views/App/Calls/ZrtpTokenAuthentication.qml</file>
|
||||
<file>ui/views/App/Main/Assistant/ActivateAppSipAccountWithEmail.qml</file>
|
||||
<file>ui/views/App/Main/Assistant/ActivateAppSipAccountWithPhoneNumber.qml</file>
|
||||
|
|
@ -459,6 +464,7 @@
|
|||
<file>ui/views/App/Styles/Calls/CallsWindowStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/ConferenceStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/VideoConferenceStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/WaitingRoomStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/Dialogs/CallSipAddressStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/Dialogs/CallTransferStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/Dialogs/ConferenceManagerStyle.qml</file>
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ void CallsListModel::launchSecureAudioCall (const QString &sipAddress, LinphoneE
|
|||
CallModel::prepareTransfert(core->inviteAddressWithParams(address, params), prepareTransfertAddress);
|
||||
}
|
||||
|
||||
void CallsListModel::launchVideoCall (const QString &sipAddress, const QString& prepareTransfertAddress, const bool& autoSelectAfterCreation) const {
|
||||
void CallsListModel::launchVideoCall (const QString &sipAddress, const QString& prepareTransfertAddress, const bool& autoSelectAfterCreation, QVariantMap options) const {
|
||||
CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = autoSelectAfterCreation;
|
||||
shared_ptr<linphone::Core> core = CoreManager::getInstance()->getCore();
|
||||
if (!core->videoSupported()) {
|
||||
|
|
@ -182,9 +182,14 @@ void CallsListModel::launchVideoCall (const QString &sipAddress, const QString&
|
|||
return;
|
||||
|
||||
shared_ptr<linphone::CallParams> params = core->createCallParams(nullptr);
|
||||
params->enableVideo(true);
|
||||
params->setVideoDirection(linphone::MediaDirection::SendRecv);
|
||||
params->setConferenceVideoLayout(linphone::ConferenceLayout::Grid);
|
||||
bool enableVideo = options.contains("video") ? options["video"].toBool() : true;
|
||||
params->enableVideo(enableVideo);
|
||||
if( enableVideo ){
|
||||
params->setVideoDirection(linphone::MediaDirection::SendRecv);
|
||||
params->setConferenceVideoLayout(linphone::ConferenceLayout::Grid);
|
||||
}
|
||||
params->enableMic(options.contains("micro") ? options["micro"].toBool() : true);
|
||||
params->enableAudio(options.contains("audio") ? options["audio"].toBool() : true); // ???
|
||||
params->setAccount(core->getDefaultAccount());
|
||||
CallModel::setRecordFile(params, Utils::coreStringToAppString(address->getUsername()));
|
||||
CallModel::prepareTransfert(core->inviteAddressWithParams(address, params), prepareTransfertAddress);
|
||||
|
|
@ -373,6 +378,11 @@ QVariantMap CallsListModel::createConference(ConferenceInfoModel * conferenceInf
|
|||
return result;
|
||||
}
|
||||
|
||||
void CallsListModel::prepareConferenceCall(ConferenceInfoModel * model){
|
||||
auto app = App::getInstance();
|
||||
app->smartShowWindow(app->getCallsWindow());
|
||||
emit callConferenceAsked(model);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public:
|
|||
|
||||
Q_INVOKABLE void launchAudioCall (const QString &sipAddress, const QString& prepareTransfertAddress = "", const QHash<QString, QString> &headers = {}) const;
|
||||
Q_INVOKABLE void launchSecureAudioCall (const QString &sipAddress, LinphoneEnums::MediaEncryption encryption, const QHash<QString, QString> &headers = {}, const QString& prepareTransfertAddress = "") const;
|
||||
Q_INVOKABLE void launchVideoCall (const QString &sipAddress, const QString& prepareTransfertAddress = "", const bool& autoSelectAfterCreation = true) const;
|
||||
Q_INVOKABLE void launchVideoCall (const QString &sipAddress, const QString& prepareTransfertAddress = "", const bool& autoSelectAfterCreation = true, QVariantMap options = QVariantMap()) const;
|
||||
Q_INVOKABLE ChatRoomModel* launchSecureChat (const QString &sipAddress) const;
|
||||
Q_INVOKABLE QVariantMap launchChat(const QString &sipAddress, const int& securityLevel) const;
|
||||
Q_INVOKABLE ChatRoomModel* createChat (const QString &participantAddress) const;
|
||||
|
|
@ -57,6 +57,7 @@ public:
|
|||
Q_INVOKABLE QVariantMap createChatRoom(const QString& subject, const int& securityLevel, const QVariantList& participants, const bool& selectAfterCreation) const;
|
||||
//Q_INVOKABLE QVariantMap createConference(const QString& subject, const int& securityLevel, const QVariantList& participants, const int& inviteMode, const bool& selectAfterCreation);
|
||||
Q_INVOKABLE QVariantMap createConference(ConferenceInfoModel * conferenceInfo, const int& securityLevel, const int& inviteMode, const bool& selectAfterCreation);
|
||||
Q_INVOKABLE void prepareConferenceCall(ConferenceInfoModel * model);
|
||||
|
||||
|
||||
Q_INVOKABLE int getRunningCallsNumber () const;
|
||||
|
|
@ -70,9 +71,11 @@ signals:
|
|||
void callRunning (int index, CallModel *callModel);
|
||||
void callTransferAsked (CallModel *callModel);
|
||||
void callAttendedTransferAsked (CallModel *callModel);
|
||||
void callConferenceAsked(ConferenceInfoModel * conferenceInfoModel);
|
||||
|
||||
void callMissed (CallModel *callModel);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
void handleCallStateChanged (const std::shared_ptr<linphone::Call> &call, linphone::Call::State state);
|
||||
|
|
|
|||
|
|
@ -38,8 +38,12 @@ namespace {
|
|||
constexpr int MaxFps = 30;
|
||||
}
|
||||
|
||||
QMutex Camera::mPreviewCounterMutex;
|
||||
int Camera::mPreviewCounter;
|
||||
|
||||
// =============================================================================
|
||||
Camera::Camera (QQuickItem *parent) : QQuickFramebufferObject(parent) {
|
||||
|
||||
// The fbo content must be y-mirrored because the ms rendering is y-inverted.
|
||||
setMirrorVertically(true);
|
||||
|
||||
|
|
@ -55,11 +59,18 @@ Camera::Camera (QQuickItem *parent) : QQuickFramebufferObject(parent) {
|
|||
mRefreshTimer->start();
|
||||
}
|
||||
|
||||
Camera::~Camera(){
|
||||
if(mIsPreview)
|
||||
deactivatePreview();
|
||||
}
|
||||
|
||||
void Camera::resetWindowId() {
|
||||
if(mIsPreview)
|
||||
CoreManager::getInstance()->getCore()->setNativePreviewWindowId(NULL);
|
||||
else if( mCallModel && mCallModel->getCall())
|
||||
mCallModel->getCall()->setNativeVideoWindowId(NULL);
|
||||
else if(mParticipantDeviceModel)
|
||||
mParticipantDeviceModel->getDevice()->setNativeVideoWindowId(NULL);
|
||||
else
|
||||
CoreManager::getInstance()->getCore()->setNativeVideoWindowId(NULL);
|
||||
}
|
||||
|
|
@ -143,6 +154,10 @@ void Camera::setCallModel (CallModel *callModel) {
|
|||
void Camera::setIsPreview (bool status) {
|
||||
if (mIsPreview != status) {
|
||||
mIsPreview = status;
|
||||
if(mIsPreview)
|
||||
activatePreview();
|
||||
else
|
||||
deactivatePreview();
|
||||
update();
|
||||
|
||||
emit isPreviewChanged(status);
|
||||
|
|
@ -155,4 +170,22 @@ if (mParticipantDeviceModel != participantDeviceModel) {
|
|||
update();
|
||||
emit participantDeviceModelChanged(mParticipantDeviceModel);
|
||||
}
|
||||
}
|
||||
|
||||
void Camera::activatePreview(){
|
||||
mPreviewCounterMutex.lock();
|
||||
if (++mPreviewCounter == 1)
|
||||
CoreManager::getInstance()->getCore()->enableVideoPreview(true);
|
||||
mPreviewCounterMutex.unlock();
|
||||
}
|
||||
|
||||
void Camera::deactivatePreview(){
|
||||
auto core = CoreManager::getInstance()->getCore();
|
||||
if(core){
|
||||
mPreviewCounterMutex.lock();
|
||||
if (--mPreviewCounter == 0)
|
||||
core->enableVideoPreview(false);
|
||||
mPreviewCounterMutex.unlock();
|
||||
core->setNativePreviewWindowId(NULL);
|
||||
}
|
||||
}
|
||||
|
|
@ -25,11 +25,12 @@
|
|||
|
||||
#include <QQuickFramebufferObject>
|
||||
#include <mediastreamer2/msogl.h>
|
||||
#include <QMutex>
|
||||
|
||||
// =============================================================================
|
||||
|
||||
namespace linphone {
|
||||
class Call;
|
||||
class Call;
|
||||
}
|
||||
|
||||
class CallModel;
|
||||
|
|
@ -37,40 +38,46 @@ class ParticipantDeviceModel;
|
|||
// -----------------------------------------------------------------------------
|
||||
|
||||
class Camera : public QQuickFramebufferObject {
|
||||
|
||||
Q_OBJECT;
|
||||
|
||||
Q_PROPERTY(CallModel * call READ getCallModel WRITE setCallModel NOTIFY callChanged);
|
||||
Q_PROPERTY(ParticipantDeviceModel * participantDeviceModel READ getParticipantDeviceModel WRITE setParticipantDeviceModel NOTIFY participantDeviceModelChanged)
|
||||
Q_PROPERTY(bool isPreview READ getIsPreview WRITE setIsPreview NOTIFY isPreviewChanged);
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(CallModel * call READ getCallModel WRITE setCallModel NOTIFY callChanged);
|
||||
Q_PROPERTY(ParticipantDeviceModel * participantDeviceModel READ getParticipantDeviceModel WRITE setParticipantDeviceModel NOTIFY participantDeviceModelChanged)
|
||||
Q_PROPERTY(bool isPreview READ getIsPreview WRITE setIsPreview NOTIFY isPreviewChanged);
|
||||
|
||||
public:
|
||||
Camera (QQuickItem *parent = Q_NULLPTR);
|
||||
|
||||
QQuickFramebufferObject::Renderer *createRenderer () const override;
|
||||
|
||||
Q_INVOKABLE void resetWindowId();
|
||||
|
||||
Camera (QQuickItem *parent = Q_NULLPTR);
|
||||
virtual ~Camera();
|
||||
|
||||
QQuickFramebufferObject::Renderer *createRenderer () const override;
|
||||
|
||||
Q_INVOKABLE void resetWindowId();
|
||||
|
||||
static QMutex mPreviewCounterMutex;
|
||||
static int mPreviewCounter;
|
||||
|
||||
signals:
|
||||
void callChanged (CallModel *callModel);
|
||||
void isPreviewChanged (bool isPreview);
|
||||
void participantDeviceModelChanged(ParticipantDeviceModel *participantDeviceModel);
|
||||
void requestNewRenderer();
|
||||
|
||||
void callChanged (CallModel *callModel);
|
||||
void isPreviewChanged (bool isPreview);
|
||||
void participantDeviceModelChanged(ParticipantDeviceModel *participantDeviceModel);
|
||||
void requestNewRenderer();
|
||||
|
||||
private:
|
||||
CallModel *getCallModel () const;
|
||||
bool getIsPreview () const;
|
||||
ParticipantDeviceModel * getParticipantDeviceModel() const;
|
||||
|
||||
void setCallModel (CallModel *callModel);
|
||||
void setIsPreview (bool status);
|
||||
void setParticipantDeviceModel(ParticipantDeviceModel * participantDeviceModel);
|
||||
|
||||
bool mIsPreview = false;
|
||||
CallModel *mCallModel = nullptr;
|
||||
ParticipantDeviceModel *mParticipantDeviceModel = nullptr;
|
||||
|
||||
QTimer *mRefreshTimer = nullptr;
|
||||
CallModel *getCallModel () const;
|
||||
bool getIsPreview () const;
|
||||
ParticipantDeviceModel * getParticipantDeviceModel() const;
|
||||
|
||||
void setCallModel (CallModel *callModel);
|
||||
void setIsPreview (bool status);
|
||||
void setParticipantDeviceModel(ParticipantDeviceModel * participantDeviceModel);
|
||||
|
||||
void activatePreview();
|
||||
void deactivatePreview();
|
||||
|
||||
bool mIsPreview = false;
|
||||
CallModel *mCallModel = nullptr;
|
||||
ParticipantDeviceModel *mParticipantDeviceModel = nullptr;
|
||||
|
||||
QTimer *mRefreshTimer = nullptr;
|
||||
};
|
||||
|
||||
#endif // CAMERA_H_
|
||||
|
|
|
|||
|
|
@ -42,51 +42,54 @@ ConferenceListener::~ConferenceListener(){
|
|||
// LINPHONE LISTENERS
|
||||
//-----------------------------------------------------------------------------------------------------------------------
|
||||
void ConferenceListener::onParticipantAdded(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::Participant> & participant){
|
||||
qWarning() << "onParticipantAdded";
|
||||
qDebug() << "onParticipantAdded";
|
||||
emit participantAdded(participant);
|
||||
}
|
||||
void ConferenceListener::onParticipantRemoved(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::Participant> & participant){
|
||||
qWarning() << "onParticipantRemoved";
|
||||
qDebug() << "onParticipantRemoved";
|
||||
emit participantRemoved(participant);
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceAdded(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "onParticipantDeviceAdded";
|
||||
qWarning() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
qDebug() << "onParticipantDeviceAdded";
|
||||
qDebug() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
emit participantDeviceAdded(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceRemoved(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "onParticipantDeviceRemoved";
|
||||
qWarning() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
qDebug() << "onParticipantDeviceRemoved";
|
||||
qDebug() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
emit participantDeviceRemoved(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onParticipantAdminStatusChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::Participant> & participant){
|
||||
qWarning() << "onParticipantAdminStatusChanged";
|
||||
qDebug() << "onParticipantAdminStatusChanged";
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceLeft(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "onParticipantDeviceLeft";
|
||||
qWarning() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
qDebug() << "onParticipantDeviceLeft";
|
||||
qDebug() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
emit participantDeviceLeft(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceJoined(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "onParticipantDeviceJoined";
|
||||
qWarning() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
qDebug() << "onParticipantDeviceJoined";
|
||||
qDebug() << "Me devices : " << conference->getMe()->getDevices().size();
|
||||
emit participantDeviceJoined(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qDebug() << "onParticipantDeviceMediaCapabilityChanged: " << (int)participantDevice->getStreamCapability(linphone::StreamType::Video) << ". Device: " << participantDevice->getAddress()->asString().c_str();
|
||||
emit participantDeviceMediaCapabilityChanged(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "onParticipantDeviceMediaAvailabilityChanged";
|
||||
qWarning() << "ConferenceListener::onParticipantDeviceMediaAvailabilityChanged: " << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Me devices : " << conference->getMe()->getDevices().size();
|
||||
qDebug() << "onParticipantDeviceMediaAvailabilityChanged: " << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Device: " << participantDevice->getAddress()->asString().c_str();
|
||||
emit participantDeviceMediaAvailabilityChanged(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onStateChanged(const std::shared_ptr<linphone::Conference> & conference, linphone::Conference::State newState){
|
||||
qWarning() << "onStateChanged";
|
||||
qDebug() << "onStateChanged";
|
||||
emit conferenceStateChanged(newState);
|
||||
}
|
||||
void ConferenceListener::onSubjectChanged(const std::shared_ptr<linphone::Conference> & conference, const std::string & subject){
|
||||
qWarning() << "onSubjectChanged";
|
||||
qDebug() << "onSubjectChanged";
|
||||
emit subjectChanged(subject);
|
||||
}
|
||||
void ConferenceListener::onAudioDeviceChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::AudioDevice> & audioDevice){
|
||||
qWarning() << "onAudioDeviceChanged is not yet implemented.";
|
||||
qDebug() << "onAudioDeviceChanged is not yet implemented.";
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ public:
|
|||
virtual void onParticipantAdminStatusChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::Participant> & participant) override;
|
||||
virtual void onParticipantDeviceLeft(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onParticipantDeviceJoined(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onStateChanged(const std::shared_ptr<linphone::Conference> & conference, linphone::Conference::State newState) override;
|
||||
virtual void onSubjectChanged(const std::shared_ptr<linphone::Conference> & conference, const std::string & subject) override;
|
||||
|
|
@ -55,6 +56,7 @@ signals:
|
|||
void participantDeviceRemoved(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceLeft(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void conferenceStateChanged(linphone::Conference::State newState);
|
||||
void subjectChanged(const std::string & subject);
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ void ConferenceModel::connectTo(ConferenceListener * listener){
|
|||
connect(listener, &ConferenceListener::participantDeviceRemoved, this, &ConferenceModel::onParticipantDeviceRemoved);
|
||||
connect(listener, &ConferenceListener::participantDeviceLeft, this, &ConferenceModel::onParticipantDeviceLeft);
|
||||
connect(listener, &ConferenceListener::participantDeviceJoined, this, &ConferenceModel::onParticipantDeviceJoined);
|
||||
connect(listener, &ConferenceListener::participantDeviceMediaCapabilityChanged, this, &ConferenceModel::onParticipantDeviceMediaCapabilityChanged);
|
||||
connect(listener, &ConferenceListener::participantDeviceMediaAvailabilityChanged, this, &ConferenceModel::onParticipantDeviceMediaAvailabilityChanged);
|
||||
connect(listener, &ConferenceListener::conferenceStateChanged, this, &ConferenceModel::onConferenceStateChanged);
|
||||
connect(listener, &ConferenceListener::subjectChanged, this, &ConferenceModel::onSubjectChanged);
|
||||
|
|
@ -86,31 +87,35 @@ qint64 ConferenceModel::getElapsedSeconds() const {
|
|||
// LINPHONE LISTENERS
|
||||
//-----------------------------------------------------------------------------------------------------------------------
|
||||
void ConferenceModel::onParticipantAdded(const std::shared_ptr<const linphone::Participant> & participant){
|
||||
qWarning() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantAdded(participant);
|
||||
}
|
||||
void ConferenceModel::onParticipantRemoved(const std::shared_ptr<const linphone::Participant> & participant){
|
||||
qWarning() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantRemoved(participant);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceAdded(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceAdded(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceRemoved(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceRemoved(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceLeft(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceLeft(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceJoined(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qDebug() << "ConferenceModel::onParticipantDeviceMediaCapabilityChanged: " << (int)participantDevice->getStreamCapability(linphone::StreamType::Video) << ". Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceMediaCapabilityChanged(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
qWarning() << "ConferenceModel::onParticipantDeviceMediaAvailabilityChanged: " << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Me devices : " << mConference->getMe()->getDevices().size();
|
||||
qDebug() << "ConferenceModel::onParticipantDeviceMediaAvailabilityChanged: " << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceMediaAvailabilityChanged(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onConferenceStateChanged(linphone::Conference::State newState){
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ public:
|
|||
virtual void onParticipantDeviceRemoved(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
virtual void onParticipantDeviceLeft(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onParticipantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onConferenceStateChanged(linphone::Conference::State newState);
|
||||
virtual void onSubjectChanged(const std::string& subject);
|
||||
|
|
@ -65,6 +66,7 @@ signals:
|
|||
void participantDeviceRemoved(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceLeft(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void conferenceStateChanged(linphone::Conference::State newState);
|
||||
void subjectChanged();
|
||||
|
|
|
|||
|
|
@ -331,6 +331,10 @@ void CoreManager::migrate () {
|
|||
newParams->enableCpimInBasicChatRoom(true);
|
||||
qInfo() << "Migrating " << accountIdentity << " for version 3. enable Cpim in basic chat rooms";
|
||||
}
|
||||
if( rcVersion < 4){
|
||||
newParams->enableRtpBundle(true);
|
||||
qInfo() << "Migrating " << accountIdentity << " for version 4. enable RTP bundle mode";
|
||||
}
|
||||
account->setParams(newParams);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,8 +34,9 @@ ParticipantDeviceListModel::ParticipantDeviceListModel (std::shared_ptr<linphone
|
|||
std::list<std::shared_ptr<linphone::ParticipantDevice>> devices = participant->getDevices() ;
|
||||
//auto previewModel = ParticipantDeviceModel::create(nullptr, true);
|
||||
//mList << previewModel;
|
||||
mCallModel = nullptr;
|
||||
for(auto device : devices){
|
||||
auto deviceModel = ParticipantDeviceModel::create(device, isMe(device));
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, device, isMe(device));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
mList << deviceModel;
|
||||
}
|
||||
|
|
@ -49,7 +50,7 @@ ParticipantDeviceListModel::ParticipantDeviceListModel (CallModel * callModel, Q
|
|||
//mList << previewModel;
|
||||
std::list<std::shared_ptr<linphone::ParticipantDevice>> devices = conferenceModel->getConference()->getParticipantDeviceList();
|
||||
for(auto device : devices){
|
||||
auto deviceModel = ParticipantDeviceModel::create(device, isMe(device));
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, device, isMe(device));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
mList << deviceModel;
|
||||
}
|
||||
|
|
@ -70,6 +71,7 @@ ParticipantDeviceListModel::ParticipantDeviceListModel (CallModel * callModel, Q
|
|||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceJoined, this, &ParticipantDeviceListModel::onParticipantDeviceJoined);
|
||||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceLeft, this, &ParticipantDeviceListModel::onParticipantDeviceLeft);
|
||||
connect(conferenceModel.get(), &ConferenceModel::conferenceStateChanged, this, &ParticipantDeviceListModel::onConferenceStateChanged);
|
||||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceMediaCapabilityChanged, this, &ParticipantDeviceListModel::onParticipantDeviceMediaCapabilityChanged);
|
||||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceMediaAvailabilityChanged, this, &ParticipantDeviceListModel::onParticipantDeviceMediaAvailabilityChanged);
|
||||
}
|
||||
}
|
||||
|
|
@ -82,7 +84,7 @@ void ParticipantDeviceListModel::updateDevices(std::shared_ptr<linphone::Partici
|
|||
mList.clear();
|
||||
//mList << previewModel;
|
||||
for(auto device : devices){
|
||||
auto deviceModel = ParticipantDeviceModel::create(device, isMe(device));
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, device, isMe(device));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
mList << deviceModel;
|
||||
}
|
||||
|
|
@ -131,7 +133,7 @@ bool ParticipantDeviceListModel::add(std::shared_ptr<linphone::ParticipantDevice
|
|||
}
|
||||
}
|
||||
|
||||
auto deviceModel = ParticipantDeviceModel::create(deviceToAdd, isMe(deviceToAdd));
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, deviceToAdd, isMe(deviceToAdd));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
ProxyListModel::add<ParticipantDeviceModel>(deviceModel);
|
||||
qWarning() << "Device added. Count=" << mList.count();
|
||||
|
|
@ -189,12 +191,14 @@ void ParticipantDeviceListModel::onSecurityLevelChanged(std::shared_ptr<const li
|
|||
emit securityLevelChanged(device);
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------
|
||||
void ParticipantDeviceListModel::onParticipantAdded(const std::shared_ptr<const linphone::Participant> & participant){
|
||||
void ParticipantDeviceListModel::onParticipantAdded(const std::shared_ptr<const linphone::Participant> & participant){
|
||||
std::list<std::shared_ptr<linphone::ParticipantDevice>> devices = participant->getDevices() ;
|
||||
for(auto device : devices)
|
||||
add(device);
|
||||
if(devices.size() == 0)
|
||||
qWarning() << "Participant has no device. It will not be added : " << participant->getAddress()->asString().c_str();
|
||||
else
|
||||
for(auto device : devices)
|
||||
add(device);
|
||||
}
|
||||
|
||||
void ParticipantDeviceListModel::onParticipantRemoved(const std::shared_ptr<const linphone::Participant> & participant){
|
||||
|
|
@ -275,8 +279,25 @@ void ParticipantDeviceListModel::onConferenceStateChanged(linphone::Conference::
|
|||
}
|
||||
}
|
||||
|
||||
void ParticipantDeviceListModel::onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
void ParticipantDeviceListModel::onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
auto device = get(participantDevice);
|
||||
if(device)
|
||||
emit device->videoEnabledChanged();
|
||||
else
|
||||
onParticipantDeviceAdded(participantDevice);
|
||||
device = get(participantDevice);
|
||||
if( device && device->isMe()){ // Capability change for me. Update all videos.
|
||||
for(auto item : mList) {
|
||||
auto device = item.objectCast<ParticipantDeviceModel>();
|
||||
device->updateVideoEnabled();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ParticipantDeviceListModel::onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice){
|
||||
auto device = get(participantDevice);
|
||||
if(device)
|
||||
device->updateVideoEnabled();
|
||||
else
|
||||
onParticipantDeviceAdded(participantDevice);
|
||||
}
|
||||
|
|
@ -58,6 +58,7 @@ public slots:
|
|||
void onParticipantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void onParticipantDeviceLeft(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void onConferenceStateChanged(linphone::Conference::State newState);
|
||||
void onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
|
||||
signals:
|
||||
|
|
|
|||
|
|
@ -37,14 +37,18 @@ void ParticipantDeviceModel::connectTo(ParticipantDeviceListener * listener){
|
|||
|
||||
// =============================================================================
|
||||
|
||||
ParticipantDeviceModel::ParticipantDeviceModel (std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe, QObject *parent) : QObject(parent) {
|
||||
ParticipantDeviceModel::ParticipantDeviceModel (CallModel * callModel, std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe, QObject *parent) : QObject(parent) {
|
||||
App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it when passing by Q_INVOKABLE
|
||||
mIsMe = isMe;
|
||||
mParticipantDevice = device;
|
||||
mParticipantDeviceListener = std::make_shared<ParticipantDeviceListener>(nullptr);
|
||||
if( device)
|
||||
device->addListener(mParticipantDeviceListener);
|
||||
mCall = nullptr;
|
||||
mCall = callModel;
|
||||
if(mCall)
|
||||
connect(mCall, &CallModel::statusChanged, this, &ParticipantDeviceModel::onCallStatusChanged);
|
||||
mIsVideoEnabled = false;
|
||||
updateVideoEnabled();
|
||||
}
|
||||
/*
|
||||
ParticipantDeviceModel::ParticipantDeviceModel (CallModel * call, const bool& isMe, QObject *parent) : QObject(parent) {
|
||||
|
|
@ -60,8 +64,8 @@ ParticipantDeviceModel::~ParticipantDeviceModel(){
|
|||
mParticipantDevice->removeListener(mParticipantDeviceListener);
|
||||
}
|
||||
|
||||
QSharedPointer<ParticipantDeviceModel> ParticipantDeviceModel::create(std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe, QObject *parent){
|
||||
QSharedPointer<ParticipantDeviceModel> model = QSharedPointer<ParticipantDeviceModel>::create(device, isMe, parent);
|
||||
QSharedPointer<ParticipantDeviceModel> ParticipantDeviceModel::create(CallModel * callModel, std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe, QObject *parent){
|
||||
QSharedPointer<ParticipantDeviceModel> model = QSharedPointer<ParticipantDeviceModel>::create(callModel, device, isMe, parent);
|
||||
if(model){
|
||||
model->mSelf = model;
|
||||
return model;
|
||||
|
|
@ -110,9 +114,20 @@ std::shared_ptr<linphone::ParticipantDevice> ParticipantDeviceModel::getDevice(
|
|||
}
|
||||
|
||||
bool ParticipantDeviceModel::isVideoEnabled() const{
|
||||
bool enabled = mParticipantDevice && mParticipantDevice->getStreamAvailability(linphone::StreamType::Video) || isMe();// && mCall && mCall->getVideoEnabled();
|
||||
qWarning() << "VideoEnabled: " << enabled;
|
||||
return enabled;
|
||||
return mIsVideoEnabled;
|
||||
}
|
||||
|
||||
void ParticipantDeviceModel::updateVideoEnabled(){
|
||||
bool enabled = mParticipantDevice && mParticipantDevice->getStreamAvailability(linphone::StreamType::Video) &&
|
||||
( mParticipantDevice->getStreamCapability(linphone::StreamType::Video) == linphone::MediaDirection::SendRecv
|
||||
|| mParticipantDevice->getStreamCapability(linphone::StreamType::Video) == linphone::MediaDirection::SendOnly
|
||||
)
|
||||
|| isMe();
|
||||
if( mIsVideoEnabled != enabled && mCall && mCall->getCall()->getState() == linphone::Call::State::StreamsRunning) {
|
||||
qWarning() << "VideoEnabled: " << enabled << ", old=" << mIsVideoEnabled << (mParticipantDevice ? mParticipantDevice->getAddress()->asString().c_str() : "") << ", me=" << isMe() << ", CallState=" << (mCall ? (int)mCall->getCall()->getState() : -1);
|
||||
mIsVideoEnabled = enabled;
|
||||
emit videoEnabledChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool ParticipantDeviceModel::isMe() const{
|
||||
|
|
@ -124,18 +139,26 @@ void ParticipantDeviceModel::onSecurityLevelChanged(std::shared_ptr<const linpho
|
|||
emit securityLevelChanged();
|
||||
}
|
||||
|
||||
void ParticipantDeviceModel::onCallStatusChanged(){
|
||||
if( mCall->getCall()->getState() == linphone::Call::State::StreamsRunning){
|
||||
updateVideoEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void ParticipantDeviceModel::onIsSpeakingChanged(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice, bool isSpeaking) {
|
||||
}
|
||||
void ParticipantDeviceModel::onIsMuted(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice, bool isMuted) {
|
||||
}
|
||||
void ParticipantDeviceModel::onConferenceJoined(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice) {
|
||||
updateVideoEnabled();
|
||||
}
|
||||
void ParticipantDeviceModel::onConferenceLeft(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice) {
|
||||
updateVideoEnabled();
|
||||
}
|
||||
void ParticipantDeviceModel::onStreamCapabilityChanged(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice, linphone::MediaDirection direction, linphone::StreamType streamType) {
|
||||
emit videoEnabledChanged();
|
||||
updateVideoEnabled();
|
||||
}
|
||||
void ParticipantDeviceModel::onStreamAvailabilityChanged(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice, bool available, linphone::StreamType streamType) {
|
||||
emit videoEnabledChanged();
|
||||
updateVideoEnabled();
|
||||
}
|
||||
|
|
@ -37,11 +37,11 @@ class ParticipantDeviceModel : public QObject {
|
|||
|
||||
|
||||
public:
|
||||
ParticipantDeviceModel (std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe = false, QObject *parent = nullptr);
|
||||
ParticipantDeviceModel (CallModel * callModel, std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe = false, QObject *parent = nullptr);
|
||||
virtual ~ParticipantDeviceModel();
|
||||
//ParticipantDeviceModel (CallModel * call, const bool& isMe = true, QObject *parent = nullptr);
|
||||
|
||||
static QSharedPointer<ParticipantDeviceModel> create(std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe = false, QObject *parent = nullptr);
|
||||
static QSharedPointer<ParticipantDeviceModel> create(CallModel* callModel, std::shared_ptr<linphone::ParticipantDevice> device, const bool& isMe = false, QObject *parent = nullptr);
|
||||
//static std::shared_ptr<ParticipantDeviceModel> create(CallModel * call, const bool& isMe = true, QObject *parent = nullptr);
|
||||
|
||||
Q_PROPERTY(QString displayName READ getDisplayName CONSTANT)
|
||||
|
|
@ -71,8 +71,11 @@ public:
|
|||
virtual void onStreamAvailabilityChanged(const std::shared_ptr<linphone::ParticipantDevice> & participantDevice, bool available, linphone::StreamType streamType);
|
||||
|
||||
void connectTo(ParticipantDeviceListener * listener);
|
||||
void updateVideoEnabled();
|
||||
|
||||
public slots:
|
||||
void onSecurityLevelChanged(std::shared_ptr<const linphone::Address> device);
|
||||
void onCallStatusChanged();
|
||||
signals:
|
||||
void securityLevelChanged();
|
||||
void videoEnabledChanged();
|
||||
|
|
@ -80,6 +83,7 @@ signals:
|
|||
private:
|
||||
|
||||
bool mIsMe = false;
|
||||
bool mIsVideoEnabled;
|
||||
|
||||
std::shared_ptr<linphone::ParticipantDevice> mParticipantDevice;
|
||||
std::shared_ptr<ParticipantDeviceListener> mParticipantDeviceListener; // This is passed to linpĥone object and must be in shared_ptr
|
||||
|
|
|
|||
|
|
@ -136,8 +136,9 @@ public:
|
|||
static constexpr char VcardScheme[] = EXECUTABLE_NAME "-desktop:/";
|
||||
static constexpr int CbsCallInterval = 20;
|
||||
static constexpr char RcVersionName[] = "rc_version";
|
||||
static constexpr int RcVersionCurrent = 3; // 2 = Conference URI
|
||||
static constexpr int RcVersionCurrent = 4; // 2 = Conference URI
|
||||
// 3 = CPIM on basic chat rooms
|
||||
// 4 = RTP bundle mode
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// CISCO
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.2
|
||||
import QtQuick.Layouts 1.0
|
||||
import QtQml.Models 2.12
|
||||
|
|
@ -12,6 +12,7 @@ ColumnLayout{
|
|||
property alias delegateModel: grid.model
|
||||
property alias cellHeight: grid.cellHeight
|
||||
property alias cellWidth: grid.cellWidth
|
||||
property bool squaredDisplay: false
|
||||
|
||||
function appendItem(item){
|
||||
console.log("Adding "+item)
|
||||
|
|
@ -77,31 +78,41 @@ ColumnLayout{
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Item{// Spacer
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
}*/
|
||||
GridView{
|
||||
id: grid
|
||||
|
||||
property int itemCount: model.count ? model.count :( model.length ? model.length : 0)
|
||||
property int columns: getColumnCount(itemCount)
|
||||
property int rows: getRowCount(itemCount)
|
||||
property int columns: 1
|
||||
property int rows: 1
|
||||
|
||||
function updateLayout(){
|
||||
columns = getColumnCount(itemCount)
|
||||
rows = getRowCount(itemCount)
|
||||
}
|
||||
function getColumnCount(itemCount){
|
||||
return itemCount > 0 ? Math.sqrt(itemCount-1) + 1 : 1
|
||||
}
|
||||
function getRowCount(itemCount){
|
||||
return columns > 1 ? (itemCount-1) / columns + 1 : 1
|
||||
}
|
||||
|
||||
cellWidth: (mainLayout.width - 5 ) / columns
|
||||
cellHeight: (mainLayout.height - 5 ) / rows
|
||||
property int computedWidth: (mainLayout.width - 5 ) / columns
|
||||
property int computedHeight: (mainLayout.height - 5 ) / rows
|
||||
cellWidth: ( squaredDisplay ? Math.min(computedWidth, computedHeight) : computedWidth)
|
||||
cellHeight: ( squaredDisplay ? Math.min(computedWidth, computedHeight) : computedHeight)
|
||||
|
||||
function isLayoutWillChanged(){
|
||||
return columns !== getColumnCount(itemCount+1) || rows !== getRowCount(itemCount+1)
|
||||
}
|
||||
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
//Layout.fillHeight: true
|
||||
//Layout.fillWidth: true
|
||||
Layout.preferredWidth: cellWidth * columns
|
||||
Layout.preferredHeight: cellHeight * rows
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
interactive: false
|
||||
|
|
@ -131,6 +142,7 @@ ColumnLayout{
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
add: Transition {
|
||||
SequentialAnimation {
|
||||
ScriptAction {
|
||||
|
|
@ -144,6 +156,7 @@ ColumnLayout{
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
addDisplaced: defaultTransition
|
||||
displaced: defaultTransition
|
||||
move: defaultTransition
|
||||
|
|
@ -164,9 +177,21 @@ ColumnLayout{
|
|||
removeDisplaced: defaultTransition
|
||||
populate:defaultTransition
|
||||
|
||||
onItemCountChanged: console.log("Mosaic "+model+" itemCount: " +itemCount +" => " + (model.count ? " count="+model.count :( model.length ? " length":" no" )))
|
||||
Timer{ // if cell sizes change while adding/removing an item the animation will not end at the right position.
|
||||
id: updateLayoutDelay
|
||||
interval: mainLayout.maxTransitionTime
|
||||
onTriggered: grid.updateLayout()
|
||||
}
|
||||
onItemCountChanged: {
|
||||
updateLayoutDelay.restart()
|
||||
console.log("Mosaic "+model+" itemCount: " +itemCount +" => " + (model.count ? " count="+model.count :( model.length ? " length":" no" )))
|
||||
}
|
||||
|
||||
}
|
||||
}/*
|
||||
Item{// Spacer
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
}*/
|
||||
/*
|
||||
ListView{
|
||||
id: bottomRowList
|
||||
|
|
|
|||
139
linphone-app/ui/modules/Linphone/Camera/CameraItem.qml
Normal file
139
linphone-app/ui/modules/Linphone/Camera/CameraItem.qml
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import App.Styles 1.0
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import Linphone.Styles 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
Item {
|
||||
id: container
|
||||
property ParticipantDeviceModel currentDevice
|
||||
property bool isPreview: !container.currentDevice || container.currentDevice.isMe
|
||||
property bool isFullscreen: false
|
||||
property bool hideCamera: false //callModel.pausedByUser
|
||||
property bool showCloseButton: true
|
||||
signal closeRequested()
|
||||
|
||||
function resetActive(){
|
||||
resetTimer.resetActive()
|
||||
}
|
||||
Component {
|
||||
id: avatar
|
||||
|
||||
IncallAvatar {
|
||||
participantDeviceModel: container.currentDevice
|
||||
height: Utils.computeAvatarSize(container, CallStyle.container.avatar.maxSize)
|
||||
width: height
|
||||
}
|
||||
}
|
||||
Loader {
|
||||
anchors.centerIn: parent
|
||||
|
||||
active: container.currentDevice && !container.currentDevice.isMe && (!container.currentDevice.videoEnabled || container.isFullscreen)
|
||||
sourceComponent: avatar
|
||||
}
|
||||
Loader {
|
||||
id: cameraLoader
|
||||
|
||||
property bool isVideoEnabled: !container.currentDevice || (container.currentDevice && container.currentDevice.videoEnabled)
|
||||
property bool resetActive: false
|
||||
|
||||
property int cameraMode: isVideoEnabled ? container.isPreview ? 1 : 2 : 0
|
||||
onCameraModeChanged: console.log(cameraMode)
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
active: !resetActive && isVideoEnabled //avatarCell.currentDevice && (avatarCell.currentDevice.videoEnabled && !conference._fullscreen)
|
||||
sourceComponent: cameraMode == 1 ? cameraPreview : cameraMode == 2 ? camera : null
|
||||
|
||||
Timer{
|
||||
id: resetTimer
|
||||
interval: 100
|
||||
repeat: false
|
||||
onTriggered: if(!cameraLoader.active){
|
||||
cameraLoader.resetActive = false
|
||||
}else{
|
||||
start() // Let some more time to propagate active event
|
||||
}
|
||||
function resetActive(){
|
||||
start()// Do it first to avoid deleting caller while processing
|
||||
cameraLoader.resetActive = true
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: camera
|
||||
Camera {
|
||||
participantDeviceModel: container.currentDevice
|
||||
anchors.fill: parent
|
||||
onRequestNewRenderer: {resetTimer.resetActive()}
|
||||
Component.onDestruction: {resetWindowId()}
|
||||
Component.onCompleted: console.log("Completed Camera")
|
||||
Text{
|
||||
id: username
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.margins: 10
|
||||
elide: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
text: container.currentDevice.displayName
|
||||
font.pointSize: CameraViewStyle.contactDescription.pointSize
|
||||
font.weight: CameraViewStyle.contactDescription.weight
|
||||
color: CameraViewStyle.contactDescription.color
|
||||
}/*
|
||||
DropShadow {
|
||||
anchors.fill: username
|
||||
source: username
|
||||
verticalOffset: 2
|
||||
color: "#80000000"
|
||||
radius: 1
|
||||
samples: 3
|
||||
}*/
|
||||
Glow {
|
||||
anchors.fill: username
|
||||
//spread: 1
|
||||
radius: 12
|
||||
samples: 25
|
||||
color: "#80000000"
|
||||
source: username
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: cameraPreview
|
||||
Camera {
|
||||
anchors.fill: parent
|
||||
isPreview: true
|
||||
onRequestNewRenderer: {resetTimer.resetActive()}
|
||||
Component.onDestruction: {resetWindowId();}
|
||||
Component.onCompleted: console.log("Completed Preview")
|
||||
Rectangle{
|
||||
anchors.fill: parent
|
||||
color: 'black'
|
||||
visible: container.hideCamera
|
||||
}
|
||||
ActionButton{
|
||||
visible: container.showCloseButton
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.rightMargin: 15
|
||||
anchors.topMargin: 15
|
||||
isCustom: true
|
||||
colorSet: CameraViewStyle.closePreview
|
||||
onClicked: container.closeRequested()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
59
linphone-app/ui/modules/Linphone/Camera/CameraView.qml
Normal file
59
linphone-app/ui/modules/Linphone/Camera/CameraView.qml
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import Linphone.Styles 1.0
|
||||
|
||||
// =============================================================================
|
||||
Item{
|
||||
id: mainItem
|
||||
property alias currentDevice: camera.currentDevice
|
||||
property alias hideCamera: camera.hideCamera
|
||||
property alias showCloseButton: camera.showCloseButton
|
||||
signal closeRequested()
|
||||
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
onClicked: {camera.resetActive()}
|
||||
}
|
||||
Rectangle{
|
||||
id: showArea
|
||||
anchors.fill: parent
|
||||
radius: CameraViewStyle.radius
|
||||
visible: false
|
||||
color: 'red'
|
||||
}
|
||||
CameraItem{
|
||||
id: camera
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
onCloseRequested: mainItem.closeRequested()
|
||||
}
|
||||
OpacityMask{
|
||||
anchors.fill: parent
|
||||
source: camera
|
||||
maskSource: showArea
|
||||
invert:false
|
||||
visible: true
|
||||
|
||||
/* In case we need transformations.
|
||||
property Matrix4x4 mirroredRotationMatrix : Matrix4x4 {// 180 rotation + mirror
|
||||
matrix: Qt.matrix4x4(-Math.cos(Math.PI), -Math.sin(Math.PI), 0, 0,
|
||||
Math.sin(Math.PI), Math.cos(Math.PI), 0, camera.height,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1)
|
||||
}
|
||||
property Matrix4x4 rotationMatrix : Matrix4x4 {// 180 rotation only
|
||||
matrix: Qt.matrix4x4(Math.cos(Math.PI), -Math.sin(Math.PI), 0, camera.width,
|
||||
Math.sin(Math.PI), Math.cos(Math.PI), 0, camera.height,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1)
|
||||
}
|
||||
|
||||
//transform: ( camera.isPreview ? mirroredRotationMatrix : rotationMatrix)
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
|
@ -50,7 +50,7 @@ Loader{
|
|||
clip: false
|
||||
|
||||
hoverEnabled: true
|
||||
onClicked: CallsListModel.launchVideoCall(mainItem.conferenceInfoModel.uri, '', 0)
|
||||
onClicked: CallsListModel.prepareConferenceCall(mainItem.conferenceInfoModel)
|
||||
onHoveredChanged: mainItem.containsMouse = loadedItem.containsMouse
|
||||
|
||||
ColumnLayout{
|
||||
|
|
|
|||
|
|
@ -92,11 +92,7 @@ Column {
|
|||
cursorShape: Qt.ArrowCursor
|
||||
|
||||
property bool held: false
|
||||
|
||||
anchors {
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
}
|
||||
width: view.width
|
||||
|
||||
drag {
|
||||
axis: Drag.YAxis
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
pragma Singleton
|
||||
import QtQml 2.2
|
||||
import QtQuick 2.7
|
||||
|
||||
import Units 1.0
|
||||
import ColorsList 1.0
|
||||
|
||||
|
||||
// =============================================================================
|
||||
|
||||
QtObject {
|
||||
property string sectionName: 'CameraView'
|
||||
property color backgroundColor: ColorsList.add(sectionName+'_description', '', '', '#798791').color
|
||||
property int radius : 8
|
||||
|
||||
property QtObject contactDescription: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_username', 'q').color
|
||||
property int pointSize: Units.dp * 12
|
||||
property int weight: Font.Bold
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
property QtObject closePreview: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'close_custom'
|
||||
property string name : 'close_preview'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_inv_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_inv_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
|
@ -9,6 +9,8 @@ singleton AccountStatusStyle 1.0 Account/AccountStatusStyle.qm
|
|||
singleton CardBlockStyle 1.0 Blocks/CardBlockStyle.qml
|
||||
singleton RequestBlockStyle 1.0 Blocks/RequestBlockStyle.qml
|
||||
|
||||
singleton CameraViewStyle 1.0 Camera/CameraViewStyle.qml
|
||||
|
||||
singleton ChatStyle 1.0 Chat/ChatStyle.qml
|
||||
singleton ChatAudioMessageStyle 1.0 Chat/ChatAudioMessageStyle.qml
|
||||
singleton ChatAudioPreviewStyle 1.0 Chat/ChatAudioPreviewStyle.qml
|
||||
|
|
|
|||
|
|
@ -13,6 +13,10 @@ RequestBlock 1.0 Blocks/RequestBlock.qml
|
|||
|
||||
Calls 1.0 Calls/Calls.qml
|
||||
CallStatistics 1.0 Calls/CallStatistics.qml
|
||||
IncallAvatar 1.0 Calls/IncallAvatar.qml
|
||||
|
||||
CameraItem 1.0 Camera/CameraItem.qml
|
||||
CameraView 1.0 Camera/CameraView.qml
|
||||
|
||||
Chat 1.0 Chat/Chat.qml
|
||||
ChatAudioMessage 1.0 Chat/ChatAudioMessage.qml
|
||||
|
|
|
|||
|
|
@ -693,3 +693,11 @@ function write (fileName, text) {
|
|||
request.open('PUT', getUriFromSystemPath(fileName), false)
|
||||
request.send(text)
|
||||
}
|
||||
|
||||
function computeAvatarSize (container, maxSize) {
|
||||
var height = container.height
|
||||
var width = container.width
|
||||
|
||||
var size = height < maxSize && height > 0 ? height : maxSize
|
||||
return size < width ? size : width
|
||||
}
|
||||
|
|
@ -58,13 +58,22 @@ function openConferenceManager (params, exitHandler) {
|
|||
window.attachVirtualWindow(Qt.resolvedUrl('Dialogs/ConferenceManager.qml'), params, exitHandler)
|
||||
}
|
||||
|
||||
function openWaitingRoom(model){
|
||||
if(window.conferenceInfoModel)
|
||||
window.conferenceInfoModel = null;
|
||||
window.conferenceInfoModel = model
|
||||
console.log('set : '+window.conferenceInfoModel)
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Used to get Component based from Call Status
|
||||
function getContent () {
|
||||
var call = window.call
|
||||
function getContent (call, conferenceInfoModel) {
|
||||
console.log('getContent call')
|
||||
if (call == null) {
|
||||
//return conference
|
||||
return videoConference
|
||||
if(conferenceInfoModel)
|
||||
return waitingRoom
|
||||
else
|
||||
return videoConference
|
||||
}
|
||||
|
||||
var status = call.status
|
||||
|
|
@ -84,8 +93,13 @@ function getContent () {
|
|||
if (status === CallModel.CallStatusEnded) {
|
||||
return endedCall
|
||||
}
|
||||
|
||||
if(call.isConference)
|
||||
return videoConference
|
||||
|
||||
if(!call && window.conferenceInfoModel)
|
||||
return waitingRoom;
|
||||
|
||||
return incall
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,15 +29,12 @@ Window {
|
|||
videoEnabled: false,
|
||||
chatRoomModel:null
|
||||
});
|
||||
|
||||
property ConferenceInfoModel conferenceInfoModel
|
||||
readonly property bool chatIsOpened: !rightPaned.isClosed()
|
||||
readonly property bool callsIsOpened: !mainPaned.isClosed()
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
function openConference(){
|
||||
middlePane.sourceComponent = videoConference
|
||||
}
|
||||
|
||||
function openChat () {
|
||||
rightPaned.open()
|
||||
|
|
@ -249,6 +246,12 @@ Window {
|
|||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: waitingRoom
|
||||
WaitingRoom{
|
||||
conferenceInfoModel: window.conferenceInfoModel
|
||||
}
|
||||
}
|
||||
Component {
|
||||
id: videoConference
|
||||
VideoConference {
|
||||
|
|
@ -263,8 +266,13 @@ Window {
|
|||
childA: Loader {
|
||||
id: middlePane
|
||||
anchors.fill: parent
|
||||
sourceComponent: Logic.getContent()
|
||||
onSourceComponentChanged: {rightPaned.childAItem.update()}// Force update when loading a new Content. It's just to be sure
|
||||
sourceComponent: Logic.getContent(calls.selectedCall, window.conferenceInfoModel)
|
||||
onSourceComponentChanged: {
|
||||
if( sourceComponent == waitingRoom)
|
||||
mainPaned.close()
|
||||
rightPaned.childAItem.update()
|
||||
}// Force update when loading a new Content. It's just to be sure
|
||||
active: calls.selectedCall || window.conferenceInfoModel
|
||||
}
|
||||
|
||||
childB: Loader {
|
||||
|
|
@ -283,6 +291,7 @@ Window {
|
|||
target: CallsListModel
|
||||
onCallTransferAsked: Logic.handleCallTransferAsked(callModel)
|
||||
onCallAttendedTransferAsked: Logic.handleCallAttendedTransferAsked(callModel)
|
||||
onCallConferenceAsked: {console.log('Openning : '+conferenceInfoModel);Logic.openWaitingRoom(conferenceInfoModel)}
|
||||
onRowsRemoved: Logic.tryToCloseWindow()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import UtilsCpp 1.0
|
|||
import App.Styles 1.0
|
||||
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
|
|
@ -68,7 +69,7 @@ Rectangle {
|
|||
image: _sipAddressObserver.contact && _sipAddressObserver.contact.vcard.avatar
|
||||
username: contactDescription.username
|
||||
|
||||
height: Logic.computeAvatarSize(container, CallStyle.container.avatar.maxSize)
|
||||
height: Utils.computeAvatarSize(container, CallStyle.container.avatar.maxSize)
|
||||
width: height
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,13 +28,7 @@
|
|||
|
||||
// =============================================================================
|
||||
|
||||
function computeAvatarSize (container, maxSize) {
|
||||
var height = container.height
|
||||
var width = container.width
|
||||
|
||||
var size = height < maxSize && height > 0 ? height : maxSize
|
||||
return size < width ? size : width
|
||||
}
|
||||
|
||||
function handleCallStatisticsClosed () {
|
||||
// Prevent many clicks on call statistics button.
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import UtilsCpp 1.0
|
|||
import App.Styles 1.0
|
||||
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
|
|
@ -239,7 +240,7 @@ Rectangle {
|
|||
|
||||
IncallAvatar {
|
||||
call: incall.call
|
||||
height: Logic.computeAvatarSize(container, CallStyle.container.avatar.maxSize)
|
||||
height: Utils.computeAvatarSize(container, CallStyle.container.avatar.maxSize)
|
||||
width: height
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,485 +1,369 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQml.Models 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import App.Styles 1.0
|
||||
|
||||
|
||||
// Temp
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Rectangle {
|
||||
id: conference
|
||||
|
||||
property CallModel callModel
|
||||
property ConferenceModel conferenceModel: callModel && callModel.getConferenceModel()
|
||||
property var _fullscreen: null
|
||||
property bool listCallsOpened: true
|
||||
|
||||
signal openListCallsRequest()
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
color: VideoConferenceStyle.backgroundColor
|
||||
|
||||
Connections {
|
||||
target: callModel
|
||||
|
||||
onCameraFirstFrameReceived: Logic.handleCameraFirstFrameReceived(width, height)
|
||||
onStatusChanged: Logic.handleStatusChanged (status)
|
||||
onVideoRequested: Logic.handleVideoRequested(callModel)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
spacing: 0
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Conference info.
|
||||
// -------------------------------------------------------------------------
|
||||
RowLayout{
|
||||
// Aux features
|
||||
Layout.topMargin: 10
|
||||
Layout.leftMargin: 25
|
||||
Layout.rightMargin: 25
|
||||
spacing: 10
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.callsList
|
||||
visible: !listCallsOpened
|
||||
onClicked: openListCallsRequest()
|
||||
}
|
||||
ActionButton{
|
||||
id: keypadButton
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.dialpad
|
||||
onClicked: telKeypad.visible = !telKeypad.visible
|
||||
}
|
||||
// Title
|
||||
Text{
|
||||
Timer{
|
||||
id: elapsedTimeRefresher
|
||||
running: true
|
||||
interval: 1000
|
||||
repeat: true
|
||||
onTriggered: parent.elaspedTime = ' - ' +Utils.formatElapsedTime(conferenceModel.getElapsedSeconds())
|
||||
}
|
||||
property string elaspedTime
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
text: conferenceModel.subject+ elaspedTime
|
||||
color: VideoConferenceStyle.title.color
|
||||
font.pointSize: VideoConferenceStyle.title.pointSize
|
||||
}
|
||||
// Mode buttons
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.screenSharing
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.recordOff
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.screenshot
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.fullscreen
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Contacts visual.
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
MouseArea{
|
||||
id: mainGrid
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 70
|
||||
Layout.rightMargin: 70
|
||||
Layout.topMargin: 15
|
||||
Layout.bottomMargin: 20
|
||||
onClicked: {
|
||||
if(!conference.callModel)
|
||||
grid.add({color: '#'+ Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
}
|
||||
/*
|
||||
ParticipantDeviceProxyModel{
|
||||
id: participantDevices
|
||||
callModel: conference.callModel
|
||||
}*/
|
||||
Mosaic {
|
||||
id: grid
|
||||
anchors.fill: parent
|
||||
|
||||
|
||||
property int radius : 8
|
||||
function setTestMode(){
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.defaultList
|
||||
for(var i = 0 ; i < 5 ; ++i)
|
||||
grid.add({color: '#'+ Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
console.log("Setting test mode : count=" + gridModel.defaultList.count)
|
||||
}
|
||||
function setParticipantDevicesMode(){
|
||||
console.log("Setting participant mode : count=" + gridModel.participantDevices.count)
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.participantDevices
|
||||
}
|
||||
|
||||
delegateModel: DelegateModel{
|
||||
id: gridModel
|
||||
property ParticipantDeviceProxyModel participantDevices : ParticipantDeviceProxyModel {
|
||||
id: participantDevices
|
||||
callModel: conference.callModel
|
||||
showMe: true
|
||||
}
|
||||
/*
|
||||
property ListModel defaultList : ListModel{}
|
||||
Component.onCompleted: {
|
||||
if( conference.callModel ){
|
||||
grid.clear()
|
||||
gridModel.model = participantDevices
|
||||
}
|
||||
}
|
||||
model: defaultList
|
||||
*/
|
||||
model: participantDevices
|
||||
onCountChanged: {console.log("Delegate count = "+count+"/"+participantDevices.count)}
|
||||
delegate: Rectangle{
|
||||
id: avatarCell
|
||||
property ParticipantDeviceModel currentDevice: gridModel.participantDevices.getAt(index)
|
||||
onCurrentDeviceChanged: console.log("currentDevice changed: " +currentDevice + (currentDevice?", me:"+currentDevice.isMe:'')+" ["+index+"]")
|
||||
color: /*!conference.callModel && gridModel.defaultList.get(index).color ? gridModel.defaultList.get(index).color : */'#AAAAAAAA'
|
||||
//color: gridModel.model.get(index) && gridModel.model.get(index).color ? gridModel.model.get(index).color : '' // modelIndex is a custom index because by Mosaic modelisation, it is not accessible.
|
||||
//color: $modelData.color ? $modelData.color : ''
|
||||
radius: 50//grid.radius
|
||||
height: grid.cellHeight - 5
|
||||
width: grid.cellWidth - 5
|
||||
Component.onCompleted: console.log("Completed: ["+index+"] " +(currentDevice?currentDevice.peerAddress+", isMe:"+currentDevice.isMe : '') )
|
||||
|
||||
Rectangle{
|
||||
id: showArea
|
||||
anchors.fill: parent
|
||||
radius: 50
|
||||
visible:false
|
||||
color: 'red'
|
||||
}
|
||||
|
||||
Item {
|
||||
id: container
|
||||
anchors.fill: parent
|
||||
//anchors.margins: CallStyle.container.margins
|
||||
//visible: conference.callModel
|
||||
visible: false
|
||||
//Layout.fillWidth: true
|
||||
//Layout.fillHeight: true
|
||||
//Layout.margins: CallStyle.container.margins
|
||||
|
||||
Component {
|
||||
id: avatar
|
||||
|
||||
IncallAvatar {
|
||||
//call: gridModel.participantDevices.get(index).call
|
||||
participantDeviceModel: avatarCell.currentDevice
|
||||
height: Logic.computeAvatarSize(container, CallStyle.container.avatar.maxSize)
|
||||
width: height
|
||||
Component.onCompleted: console.log("Avatar completed"+ " ["+index+"]")
|
||||
Component.onDestruction: console.log("Avatar destroyed"+ " ["+index+"]")
|
||||
}
|
||||
}
|
||||
Loader {
|
||||
anchors.centerIn: parent
|
||||
|
||||
active: avatarCell.currentDevice && !avatarCell.currentDevice.isMe && (!avatarCell.currentDevice.videoEnabled || conference._fullscreen)
|
||||
sourceComponent: avatar
|
||||
}
|
||||
Loader {
|
||||
id: cameraLoader
|
||||
|
||||
//anchors.centerIn: parent
|
||||
anchors.fill: parent
|
||||
property bool isVideoEnabled : avatarCell.currentDevice && avatarCell.currentDevice.videoEnabled
|
||||
property bool t_fullscreen: conference._fullscreen
|
||||
property bool tCallModel: conference.callModel
|
||||
property bool resetActive: false
|
||||
onIsVideoEnabledChanged: console.log("Video is enabled : " +isVideoEnabled + " ["+index+"]")
|
||||
onT_fullscreenChanged: console.log("_fullscreen changed: " +t_fullscreen+ " ["+index+"]")
|
||||
onTCallModelChanged: console.log("CallModel changed: " +tCallModel+ " ["+index+"]")
|
||||
|
||||
active: !resetActive && avatarCell.currentDevice && (avatarCell.currentDevice.videoEnabled && !conference._fullscreen)
|
||||
|
||||
property int cameraMode: isVideoEnabled ?
|
||||
avatarCell.currentDevice.isMe ? 1
|
||||
: 2
|
||||
: 0
|
||||
sourceComponent: cameraMode == 1 ? cameraPreview : cameraMode == 2 ? camera : null
|
||||
onSourceComponentChanged: console.log("SourceComponent Changed: "+cameraMode+ " ["+index+"]")
|
||||
|
||||
|
||||
Component {
|
||||
id: camera
|
||||
|
||||
Camera {
|
||||
//call: grid.get(modelIndex).call
|
||||
participantDeviceModel: avatarCell.currentDevice
|
||||
//height: container.height
|
||||
//width: container.width
|
||||
anchors.fill: parent
|
||||
onRequestNewRenderer: {cameraLoader.resetActive = true; cameraLoader.resetActive = false}
|
||||
|
||||
Component.onCompleted: console.log("Camera completed"+ " ["+index+"]")
|
||||
Component.onDestruction: console.log("Camera destroyed"+ " ["+index+"]")
|
||||
Text{
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.margins: 10
|
||||
elide: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
text: avatarCell.currentDevice.displayName
|
||||
color: 'white'
|
||||
}
|
||||
}
|
||||
}
|
||||
Component {
|
||||
id: cameraPreview
|
||||
|
||||
Camera {
|
||||
anchors.fill: parent
|
||||
//participantDeviceModel: avatarCell.currentDevice
|
||||
isPreview: true
|
||||
onRequestNewRenderer: {cameraLoader.resetActive = true; cameraLoader.resetActive = false}
|
||||
|
||||
Component.onCompleted: console.log("Preview completed"+ " ["+index+"]")
|
||||
Component.onDestruction: console.log("Preview destroyed"+ " ["+index+"]")
|
||||
ActionButton{
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.rightMargin: 15
|
||||
anchors.topMargin: 15
|
||||
isCustom: true
|
||||
colorSet: VideoConferenceStyle.buttons.closePreview
|
||||
onClicked: grid.remove( index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OpacityMask{
|
||||
anchors.fill: parent
|
||||
source: container
|
||||
maskSource: showArea
|
||||
invert:false
|
||||
|
||||
visible: conference.callModel
|
||||
// rotation: 180
|
||||
}
|
||||
|
||||
/*
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
onClicked: {grid.remove( index)}
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------------------------
|
||||
// Action Buttons.
|
||||
// -------------------------------------------------------------------------
|
||||
RowLayout{
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 40
|
||||
Layout.leftMargin: 25
|
||||
Layout.rightMargin: 25
|
||||
// Security
|
||||
ActionButton{
|
||||
//Layout.preferredHeight: VideoConferenceStyle.buttons.buttonSize
|
||||
//Layout.preferredWidth: VideoConferenceStyle.buttons.buttonSize
|
||||
height: VideoConferenceStyle.buttons.secure.buttonSize
|
||||
width: height
|
||||
isCustom: true
|
||||
iconIsCustom: false
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.secure
|
||||
|
||||
icon: 'secure_level_1'
|
||||
}
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
// Action buttons
|
||||
RowLayout{
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
spacing: 30
|
||||
RowLayout{
|
||||
spacing: 10
|
||||
Row {
|
||||
spacing: 2
|
||||
visible: SettingsModel.muteMicrophoneEnabled
|
||||
property bool microMuted: callModel.microMuted
|
||||
|
||||
VuMeter {
|
||||
enabled: !parent.microMuted
|
||||
Timer {
|
||||
interval: 50
|
||||
repeat: true
|
||||
running: parent.enabled
|
||||
|
||||
onTriggered: parent.value = callModel.microVu
|
||||
}
|
||||
}
|
||||
ActionSwitch {
|
||||
id: micro
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: parent.microMuted ? VideoConferenceStyle.buttons.microOff : VideoConferenceStyle.buttons.microOn
|
||||
onClicked: callModel.microMuted = !parent.microMuted
|
||||
}
|
||||
}
|
||||
Row {
|
||||
spacing: 2
|
||||
property bool speakerMuted: callModel.speakerMuted
|
||||
VuMeter {
|
||||
enabled: !parent.speakerMuted
|
||||
Timer {
|
||||
interval: 50
|
||||
repeat: true
|
||||
running: parent.enabled
|
||||
onTriggered: parent.value = callModel.speakerVu
|
||||
}
|
||||
}
|
||||
ActionSwitch {
|
||||
id: speaker
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: parent.speakerMuted ? VideoConferenceStyle.buttons.speakerOff : VideoConferenceStyle.buttons.speakerOn
|
||||
onClicked: callModel.speakerMuted = !parent.speakerMuted
|
||||
}
|
||||
}
|
||||
ActionSwitch {
|
||||
id: camera
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: callModel && callModel.videoEnabled ? VideoConferenceStyle.buttons.cameraOn : VideoConferenceStyle.buttons.cameraOff
|
||||
updating: callModel.videoEnabled && callModel.updating
|
||||
onClicked: if(callModel) callModel.videoEnabled = !callModel.videoEnabled
|
||||
}
|
||||
}
|
||||
RowLayout{
|
||||
spacing: 10
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
visible: SettingsModel.callPauseEnabled
|
||||
updating: callModel.updating
|
||||
colorSet: callModel.pausedByUser ? VideoConferenceStyle.buttons.play : VideoConferenceStyle.buttons.pause
|
||||
onClicked: callModel.pausedByUser = !callModel.pausedByUser
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.hangup
|
||||
|
||||
onClicked: callModel.terminate()
|
||||
}
|
||||
}
|
||||
}
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
// Panel buttons
|
||||
RowLayout{
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.chat
|
||||
visible: false // TODO for next version
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.participants
|
||||
}
|
||||
ActionButton {
|
||||
id: callQuality
|
||||
|
||||
isCustom: true
|
||||
backgroundRadius: 4
|
||||
colorSet: VideoConferenceStyle.buttons.callQuality
|
||||
percentageDisplayed: 0
|
||||
|
||||
onClicked: {console.log("opening stats");Logic.openCallStatistics();console.log("Stats should be opened")}
|
||||
Timer {
|
||||
interval: 500
|
||||
repeat: true
|
||||
running: true
|
||||
triggeredOnStart: true
|
||||
onTriggered: {
|
||||
// Note: `quality` is in the [0, 5] interval and -1.
|
||||
var quality = callModel.quality
|
||||
if(quality >= 0)
|
||||
callQuality.percentageDisplayed = quality * 100 / 5
|
||||
else
|
||||
callQuality.percentageDisplayed = 0
|
||||
}
|
||||
}
|
||||
|
||||
CallStatistics {
|
||||
id: callStatistics
|
||||
|
||||
call: callModel
|
||||
width: conference.width
|
||||
relativeTo: keypadButton
|
||||
relativeY: CallStyle.header.stats.relativeY
|
||||
onClosed: Logic.handleCallStatisticsClosed()
|
||||
onOpened: console.log("Stats Opened: " +call+", " +width +", "+relativeY)
|
||||
}
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.options
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
// TelKeypad.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
TelKeypad {
|
||||
id: telKeypad
|
||||
|
||||
call: callModel
|
||||
visible: SettingsModel.showTelKeypadAutomatically
|
||||
}
|
||||
}
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQml.Models 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import App.Styles 1.0
|
||||
|
||||
|
||||
// Temp
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Rectangle {
|
||||
id: conference
|
||||
|
||||
property CallModel callModel
|
||||
property ConferenceModel conferenceModel: callModel && callModel.getConferenceModel()
|
||||
property var _fullscreen: null
|
||||
property bool listCallsOpened: true
|
||||
|
||||
signal openListCallsRequest()
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
color: VideoConferenceStyle.backgroundColor
|
||||
|
||||
Connections {
|
||||
target: callModel
|
||||
|
||||
onCameraFirstFrameReceived: Logic.handleCameraFirstFrameReceived(width, height)
|
||||
onStatusChanged: Logic.handleStatusChanged (status)
|
||||
onVideoRequested: Logic.handleVideoRequested(callModel)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
spacing: 0
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Conference info.
|
||||
// -------------------------------------------------------------------------
|
||||
RowLayout{
|
||||
// Aux features
|
||||
Layout.topMargin: 10
|
||||
Layout.leftMargin: 25
|
||||
Layout.rightMargin: 25
|
||||
spacing: 10
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.callsList
|
||||
visible: !listCallsOpened
|
||||
onClicked: openListCallsRequest()
|
||||
}
|
||||
ActionButton{
|
||||
id: keypadButton
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.dialpad
|
||||
onClicked: telKeypad.visible = !telKeypad.visible
|
||||
}
|
||||
// Title
|
||||
Text{
|
||||
Timer{
|
||||
id: elapsedTimeRefresher
|
||||
running: true
|
||||
interval: 1000
|
||||
repeat: true
|
||||
onTriggered: parent.elaspedTime = ' - ' +Utils.formatElapsedTime(conferenceModel.getElapsedSeconds())
|
||||
}
|
||||
property string elaspedTime
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
text: conferenceModel.subject+ elaspedTime
|
||||
color: VideoConferenceStyle.title.color
|
||||
font.pointSize: VideoConferenceStyle.title.pointSize
|
||||
}
|
||||
// Mode buttons
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.screenSharing
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.recordOff
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.screenshot
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.fullscreen
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Contacts visual.
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
MouseArea{
|
||||
id: mainGrid
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 70
|
||||
Layout.rightMargin: 70
|
||||
Layout.topMargin: 15
|
||||
Layout.bottomMargin: 20
|
||||
onClicked: {
|
||||
if(!conference.callModel)
|
||||
grid.add({color: '#'+ Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
}
|
||||
/*
|
||||
ParticipantDeviceProxyModel{
|
||||
id: participantDevices
|
||||
callModel: conference.callModel
|
||||
}*/
|
||||
Mosaic {
|
||||
id: grid
|
||||
anchors.fill: parent
|
||||
//anchors.centerIn: parent
|
||||
//width: parent.width
|
||||
//height: parent.height
|
||||
squaredDisplay: true
|
||||
|
||||
property int radius : 8
|
||||
function setTestMode(){
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.defaultList
|
||||
for(var i = 0 ; i < 5 ; ++i)
|
||||
grid.add({color: '#'+ Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
console.log("Setting test mode : count=" + gridModel.defaultList.count)
|
||||
}
|
||||
function setParticipantDevicesMode(){
|
||||
console.log("Setting participant mode : count=" + gridModel.participantDevices.count)
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.participantDevices
|
||||
}
|
||||
|
||||
delegateModel: DelegateModel{
|
||||
id: gridModel
|
||||
property ParticipantDeviceProxyModel participantDevices : ParticipantDeviceProxyModel {
|
||||
id: participantDevices
|
||||
callModel: conference.callModel
|
||||
showMe: true
|
||||
}
|
||||
/*
|
||||
property ListModel defaultList : ListModel{}
|
||||
Component.onCompleted: {
|
||||
if( conference.callModel ){
|
||||
grid.clear()
|
||||
gridModel.model = participantDevices
|
||||
}
|
||||
}
|
||||
model: defaultList
|
||||
*/
|
||||
model: participantDevices
|
||||
onCountChanged: {console.log("Delegate count = "+count+"/"+participantDevices.count)}
|
||||
delegate: Rectangle{
|
||||
id: avatarCell
|
||||
property ParticipantDeviceModel currentDevice: gridModel.participantDevices.getAt(index)
|
||||
onCurrentDeviceChanged: console.log("currentDevice changed: " +currentDevice + (currentDevice?", me:"+currentDevice.isMe:'')+" ["+index+"]")
|
||||
color: /*!conference.callModel && gridModel.defaultList.get(index).color ? gridModel.defaultList.get(index).color : */'#AAAAAAAA'
|
||||
//color: gridModel.model.get(index) && gridModel.model.get(index).color ? gridModel.model.get(index).color : '' // modelIndex is a custom index because by Mosaic modelisation, it is not accessible.
|
||||
//color: $modelData.color ? $modelData.color : ''
|
||||
radius: grid.radius
|
||||
height: grid.cellHeight - 5
|
||||
width: grid.cellWidth - 5
|
||||
Component.onCompleted: console.log("Completed: ["+index+"] " +(currentDevice?currentDevice.peerAddress+", isMe:"+currentDevice.isMe : '') )
|
||||
|
||||
CameraView{
|
||||
anchors.fill: parent
|
||||
currentDevice: avatarCell.currentDevice
|
||||
hideCamera: callModel.pausedByUser
|
||||
onCloseRequested: grid.remove( index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------------------------
|
||||
// Action Buttons.
|
||||
// -------------------------------------------------------------------------
|
||||
RowLayout{
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 40
|
||||
Layout.leftMargin: 25
|
||||
Layout.rightMargin: 25
|
||||
// Security
|
||||
ActionButton{
|
||||
//Layout.preferredHeight: VideoConferenceStyle.buttons.buttonSize
|
||||
//Layout.preferredWidth: VideoConferenceStyle.buttons.buttonSize
|
||||
height: VideoConferenceStyle.buttons.secure.buttonSize
|
||||
width: height
|
||||
isCustom: true
|
||||
iconIsCustom: false
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.secure
|
||||
|
||||
icon: 'secure_level_1'
|
||||
}
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
// Action buttons
|
||||
RowLayout{
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
spacing: 30
|
||||
RowLayout{
|
||||
spacing: 10
|
||||
Row {
|
||||
spacing: 2
|
||||
visible: SettingsModel.muteMicrophoneEnabled
|
||||
property bool microMuted: callModel.microMuted
|
||||
|
||||
VuMeter {
|
||||
enabled: !parent.microMuted
|
||||
Timer {
|
||||
interval: 50
|
||||
repeat: true
|
||||
running: parent.enabled
|
||||
|
||||
onTriggered: parent.value = callModel.microVu
|
||||
}
|
||||
}
|
||||
ActionSwitch {
|
||||
id: micro
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: parent.microMuted ? VideoConferenceStyle.buttons.microOff : VideoConferenceStyle.buttons.microOn
|
||||
onClicked: callModel.microMuted = !parent.microMuted
|
||||
}
|
||||
}
|
||||
Row {
|
||||
spacing: 2
|
||||
property bool speakerMuted: callModel.speakerMuted
|
||||
VuMeter {
|
||||
enabled: !parent.speakerMuted
|
||||
Timer {
|
||||
interval: 50
|
||||
repeat: true
|
||||
running: parent.enabled
|
||||
onTriggered: parent.value = callModel.speakerVu
|
||||
}
|
||||
}
|
||||
ActionSwitch {
|
||||
id: speaker
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: parent.speakerMuted ? VideoConferenceStyle.buttons.speakerOff : VideoConferenceStyle.buttons.speakerOn
|
||||
onClicked: callModel.speakerMuted = !parent.speakerMuted
|
||||
}
|
||||
}
|
||||
ActionSwitch {
|
||||
id: camera
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: callModel && callModel.videoEnabled ? VideoConferenceStyle.buttons.cameraOn : VideoConferenceStyle.buttons.cameraOff
|
||||
updating: callModel.videoEnabled && callModel.updating
|
||||
onClicked: if(callModel) callModel.videoEnabled = !callModel.videoEnabled
|
||||
}
|
||||
}
|
||||
RowLayout{
|
||||
spacing: 10
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
visible: SettingsModel.callPauseEnabled
|
||||
updating: callModel.updating
|
||||
colorSet: callModel.pausedByUser ? VideoConferenceStyle.buttons.play : VideoConferenceStyle.buttons.pause
|
||||
onClicked: callModel.pausedByUser = !callModel.pausedByUser
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.hangup
|
||||
|
||||
onClicked: callModel.terminate()
|
||||
}
|
||||
}
|
||||
}
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
// Panel buttons
|
||||
RowLayout{
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.chat
|
||||
visible: false // TODO for next version
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.participants
|
||||
}
|
||||
ActionButton {
|
||||
id: callQuality
|
||||
|
||||
isCustom: true
|
||||
backgroundRadius: 4
|
||||
colorSet: VideoConferenceStyle.buttons.callQuality
|
||||
percentageDisplayed: 0
|
||||
|
||||
onClicked: {console.log("opening stats");Logic.openCallStatistics();console.log("Stats should be opened")}
|
||||
Timer {
|
||||
interval: 500
|
||||
repeat: true
|
||||
running: true
|
||||
triggeredOnStart: true
|
||||
onTriggered: {
|
||||
// Note: `quality` is in the [0, 5] interval and -1.
|
||||
var quality = callModel.quality
|
||||
if(quality >= 0)
|
||||
callQuality.percentageDisplayed = quality * 100 / 5
|
||||
else
|
||||
callQuality.percentageDisplayed = 0
|
||||
}
|
||||
}
|
||||
|
||||
CallStatistics {
|
||||
id: callStatistics
|
||||
|
||||
call: callModel
|
||||
width: conference.width
|
||||
relativeTo: keypadButton
|
||||
relativeY: CallStyle.header.stats.relativeY
|
||||
onClosed: Logic.handleCallStatisticsClosed()
|
||||
onOpened: console.log("Stats Opened: " +call+", " +width +", "+relativeY)
|
||||
}
|
||||
}
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.options
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
// TelKeypad.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
TelKeypad {
|
||||
id: telKeypad
|
||||
|
||||
call: callModel
|
||||
visible: SettingsModel.showTelKeypadAutomatically
|
||||
}
|
||||
}
|
||||
|
|
|
|||
196
linphone-app/ui/views/App/Calls/WaitingRoom.qml
Normal file
196
linphone-app/ui/views/App/Calls/WaitingRoom.qml
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import Common 1.0
|
||||
import Linphone 1.0
|
||||
|
||||
import Common.Styles 1.0
|
||||
import App.Styles 1.0
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Rectangle {
|
||||
color: WaitingRoomStyle.backgroundColor
|
||||
property ConferenceInfoModel conferenceInfoModel
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
Text{
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.preferredHeight: 60
|
||||
Layout.topMargin: 15
|
||||
text: conferenceInfoModel.subject
|
||||
color: WaitingRoomStyle.title.color
|
||||
font.pointSize: WaitingRoomStyle.title.pointSize
|
||||
horizontalAlignment: Qt.AlignCenter
|
||||
}
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
CameraView{
|
||||
id: previewLoader
|
||||
showCloseButton: false
|
||||
anchors.centerIn: parent
|
||||
height: parent.height
|
||||
width : height
|
||||
}
|
||||
}
|
||||
/*
|
||||
Loader{
|
||||
id: previewLoader
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
sourceComponent: Item{
|
||||
anchors.top:parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width : height
|
||||
|
||||
Rectangle{
|
||||
id: showArea
|
||||
anchors.fill: parent
|
||||
radius: 10
|
||||
visible:false
|
||||
color: 'red'
|
||||
}
|
||||
CameraPreview {
|
||||
id: preview
|
||||
anchors.fill: parent
|
||||
onRequestNewRenderer: {previewLoader.active = false; previewLoader.active = true}
|
||||
visible: false
|
||||
}
|
||||
|
||||
OpacityMask{
|
||||
anchors.fill: preview
|
||||
source: preview
|
||||
maskSource: showArea
|
||||
|
||||
visible: true
|
||||
rotation: 180
|
||||
|
||||
}
|
||||
}
|
||||
active: true
|
||||
}*/
|
||||
// -------------------------------------------------------------------------
|
||||
// Action Buttons.
|
||||
// -------------------------------------------------------------------------
|
||||
RowLayout{
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 40
|
||||
Layout.leftMargin: 25
|
||||
Layout.rightMargin: 25
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
// Action buttons
|
||||
RowLayout{
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
spacing: 30
|
||||
RowLayout{
|
||||
spacing: 10
|
||||
ActionSwitch {
|
||||
id: micro
|
||||
visible: SettingsModel.muteMicrophoneEnabled
|
||||
property bool microMuted: false
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: microMuted ? WaitingRoomStyle.buttons.microOff : WaitingRoomStyle.buttons.microOn
|
||||
onClicked: microMuted = !microMuted
|
||||
}
|
||||
ActionSwitch {
|
||||
id: speaker
|
||||
property bool speakerMuted: false
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: speakerMuted ? WaitingRoomStyle.buttons.speakerOff : WaitingRoomStyle.buttons.speakerOn
|
||||
onClicked: speakerMuted = !speakerMuted
|
||||
}
|
||||
ActionSwitch {
|
||||
id: camera
|
||||
property bool cameraEnabled: true
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: cameraEnabled ? WaitingRoomStyle.buttons.cameraOn : WaitingRoomStyle.buttons.cameraOff
|
||||
//updating: cameraEnabled && callModel.updating
|
||||
onClicked: cameraEnabled = !cameraEnabled
|
||||
}
|
||||
}
|
||||
RowLayout{
|
||||
ActionButton{
|
||||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: WaitingRoomStyle.buttons.gridLayout
|
||||
/*
|
||||
colorSet: callModel.pausedByUser ? WaitingRoomStyle.buttons.play : WaitingRoomStyle.buttons.pause
|
||||
onClicked: callModel.pausedByUser = !callModel.pausedByUser
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
Item{
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
RowLayout{
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.bottomMargin: 15
|
||||
TextButtonA {
|
||||
text: 'CANCEL'
|
||||
|
||||
onClicked: console.log('cancel')
|
||||
}
|
||||
TextButtonB {
|
||||
text: 'DEMARRER'
|
||||
|
||||
onClicked: CallsListModel.launchVideoCall(conferenceInfoModel.uri, '', 0, {video: camera.cameraEnabled, micro:!micro.microMuted, audio:!speaker.speakerMuted})
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
GridLayout {
|
||||
columns: parent.width < CallStyle.actionArea.lowWidth && call.videoEnabled ? 1 : 2
|
||||
rowSpacing: ActionBarStyle.spacing
|
||||
|
||||
anchors {
|
||||
left: parent.left
|
||||
leftMargin: CallStyle.actionArea.leftButtonsGroupMargin
|
||||
verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
ActionSwitch {
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: enabled ? CallStyle.buttons.microOn : CallStyle.buttons.microOff
|
||||
enabled: !call.microMuted
|
||||
|
||||
onClicked: call.microMuted = enabled
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
anchors.centerIn: parent
|
||||
height: CallStyle.actionArea.userVideo.height
|
||||
width: CallStyle.actionArea.userVideo.width
|
||||
|
||||
visible: call.videoEnabled
|
||||
}
|
||||
|
||||
ActionBar {
|
||||
anchors {
|
||||
right: parent.right
|
||||
rightMargin: CallStyle.actionArea.rightButtonsGroupMargin
|
||||
verticalCenter: parent.verticalCenter
|
||||
}
|
||||
iconSize: CallStyle.actionArea.iconSize
|
||||
|
||||
ActionButton {
|
||||
isCustom: true
|
||||
backgroundRadius: 90
|
||||
colorSet: CallStyle.buttons.hangup
|
||||
|
||||
onClicked: call.terminate()
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
|
@ -216,13 +216,13 @@ DialogPlus {
|
|||
Layout.preferredHeight: 50
|
||||
Layout.preferredWidth: 50
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
username: $modelData.username
|
||||
image:$modelData.avatar
|
||||
username: modelData.username
|
||||
image:modelData.avatar
|
||||
Icon{
|
||||
property int securityLevel : 2
|
||||
anchors.top:parent.top
|
||||
anchors.horizontalCenter: parent.right
|
||||
visible: UtilsCpp.hasCapability($modelData.sipAddress, LinphoneEnums.FriendCapabilityLimeX3Dh)
|
||||
visible: UtilsCpp.hasCapability(modelData.sipAddress, LinphoneEnums.FriendCapabilityLimeX3Dh)
|
||||
icon: 'secure_on'
|
||||
iconSize: parent.height/2
|
||||
}
|
||||
|
|
@ -233,7 +233,7 @@ DialogPlus {
|
|||
Layout.alignment: Qt.AlignVCenter | Qt.AlignTop
|
||||
maximumLineCount: 5
|
||||
wrapMode:Text.Wrap
|
||||
text: $modelData.username
|
||||
text: modelData.username
|
||||
verticalAlignment: Text.AlignTop
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
|
||||
|
|
@ -251,11 +251,11 @@ DialogPlus {
|
|||
anchors.topMargin: -5
|
||||
color:'white'
|
||||
opacity: 0.5
|
||||
visible: smartSearchBar.isIgnored($modelData.sipAddress)
|
||||
visible: smartSearchBar.isIgnored(modelData.sipAddress)
|
||||
Connections{// Workaround for refreshing data on events
|
||||
target:lastContacts
|
||||
onReloadCountChanged: {
|
||||
mask.visible=smartSearchBar.isIgnored($modelData.sipAddress)
|
||||
mask.visible=smartSearchBar.isIgnored(modelData.sipAddress)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -263,8 +263,8 @@ DialogPlus {
|
|||
anchors.fill:parent
|
||||
visible:!mask.visible
|
||||
onClicked: {
|
||||
selectedParticipants.addAddress($modelData.sipAddress)
|
||||
smartSearchBar.addAddressToIgnore($modelData.sipAddress);
|
||||
selectedParticipants.addAddress(modelData.sipAddress)
|
||||
smartSearchBar.addAddressToIgnore(modelData.sipAddress);
|
||||
++lastContacts.reloadCount
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,40 +24,47 @@ DialogPlus {
|
|||
width: SettingsVideoPreviewStyle.width
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
Item{
|
||||
anchors.fill: parent
|
||||
CameraView{
|
||||
id: previewLoader
|
||||
anchors.centerIn: parent
|
||||
height: parent.height
|
||||
width: height
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Loader{
|
||||
id: previewLoader
|
||||
anchors.fill: parent
|
||||
sourceComponent: Item{
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle{
|
||||
id: showArea
|
||||
anchors.fill: parent
|
||||
radius: 50
|
||||
radius: 10
|
||||
visible:false
|
||||
color: 'red'
|
||||
}
|
||||
Rectangle{
|
||||
id: test
|
||||
anchors.fill: parent
|
||||
visible:false
|
||||
color: 'green'
|
||||
}
|
||||
CameraPreview {
|
||||
id: camera
|
||||
anchors.fill: parent
|
||||
onRequestNewRenderer: previewLoader.active = false
|
||||
onRequestNewRenderer: {previewLoader.active = false;previewLoader.active = true}
|
||||
visible: false
|
||||
}
|
||||
|
||||
OpacityMask{
|
||||
anchors.fill: camera
|
||||
anchors.fill: parent
|
||||
source: camera
|
||||
maskSource: showArea
|
||||
invert:false
|
||||
|
||||
visible: true
|
||||
rotation: 180
|
||||
transform: Matrix4x4 {// 180 rotation + mirror
|
||||
matrix: Qt.matrix4x4(-Math.cos(Math.PI), -Math.sin(Math.PI), 0, 0,
|
||||
Math.sin(Math.PI), Math.cos(Math.PI), 0, camera.height,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
active: true
|
||||
|
|
@ -65,5 +72,5 @@ DialogPlus {
|
|||
console.log("Active changed : " +active)
|
||||
if(!active) active = true
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ QtObject {
|
|||
|
||||
property QtObject title: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_title', 'q').color
|
||||
property int pointSize: Units.dp * 11
|
||||
property int pointSize: Units.dp * 12
|
||||
}
|
||||
|
||||
property QtObject grid: QtObject {
|
||||
|
|
@ -24,7 +24,9 @@ QtObject {
|
|||
property int width: 154
|
||||
|
||||
property QtObject contactDescription: QtObject {
|
||||
property int height: 35
|
||||
property color color: ColorsList.add(sectionName+'_username', 'q').color
|
||||
property int pointSize: Units.dp * 12
|
||||
property int weight: Font.Bold
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
472
linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml
Normal file
472
linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml
Normal file
|
|
@ -0,0 +1,472 @@
|
|||
pragma Singleton
|
||||
import QtQml 2.2
|
||||
|
||||
import Units 1.0
|
||||
import ColorsList 1.0
|
||||
|
||||
// =============================================================================
|
||||
|
||||
QtObject {
|
||||
property string sectionName: 'WaitingRoom'
|
||||
property color backgroundColor: ColorsList.add(sectionName+'_description', '', '', '#798791').color
|
||||
|
||||
property QtObject title: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_title', 'q').color
|
||||
property int pointSize: Units.dp * 12
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
property QtObject grid: QtObject {
|
||||
property int spacing: 5
|
||||
|
||||
property QtObject cell: QtObject {
|
||||
property int height: 145
|
||||
property int spacing: 5
|
||||
property int width: 154
|
||||
|
||||
property QtObject contactDescription: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_username', 'q').color
|
||||
property int pointSize: Units.dp * 12
|
||||
property int weight: Font.Bold
|
||||
}
|
||||
}
|
||||
}
|
||||
property QtObject actionArea: QtObject {
|
||||
property int height: 100
|
||||
property int iconSize: 40
|
||||
property int leftButtonsGroupMargin: 50
|
||||
property int lowWidth: 650
|
||||
property int rightButtonsGroupMargin: 50
|
||||
|
||||
property QtObject userVideo: QtObject {
|
||||
property int height: 200
|
||||
property int width: 130
|
||||
property int heightReference: 1200 // height and width are fixed from these references
|
||||
property int widthReference: 780
|
||||
}
|
||||
|
||||
property QtObject vu: QtObject {
|
||||
property int spacing: 5
|
||||
}
|
||||
|
||||
property QtObject callError: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_action_error', 'i').color
|
||||
property int pointSize: Units.dp * 12
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject container: QtObject {
|
||||
property int margins: 15
|
||||
|
||||
property QtObject avatar: QtObject {
|
||||
property color backgroundColor: ColorsList.add(sectionName+'_container_avatar_bg', 'n').color
|
||||
property int maxSize: 300
|
||||
}
|
||||
|
||||
property QtObject pause: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_container_pause', 'g90').color
|
||||
|
||||
property QtObject text: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_container_pause_text', 'q').color
|
||||
property int pointSizeFactor: 5
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject header: QtObject {
|
||||
property int buttonIconSize: 40
|
||||
property int iconSize: 16
|
||||
property int leftMargin: 20
|
||||
property int rightMargin: 20
|
||||
property int spacing: 10
|
||||
property int topMargin: 26
|
||||
|
||||
property QtObject busyIndicator: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_header_busy', 'g').color
|
||||
property int height: 30
|
||||
property int width: 30
|
||||
}
|
||||
|
||||
property QtObject contactDescription: QtObject {
|
||||
property int height: 50
|
||||
property int width: 150
|
||||
}
|
||||
|
||||
property QtObject elapsedTime: QtObject {
|
||||
property color color: ColorsList.add(sectionName+'_header_elapsed_time', 'j').color
|
||||
property int pointSize: Units.dp * 10
|
||||
|
||||
property QtObject fullscreen: QtObject {
|
||||
property int pointSize: Units.dp * 12
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject stats: QtObject {
|
||||
property int relativeY: 90
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject zrtpArea: QtObject {
|
||||
property int height: 50
|
||||
|
||||
property QtObject buttons: QtObject {
|
||||
property int spacing: 10
|
||||
}
|
||||
|
||||
property QtObject text: QtObject {
|
||||
property color colorA: ColorsList.add(sectionName+'_zrtp_text_a', 'j').color
|
||||
property color colorB: ColorsList.add(sectionName+'_zrtp_text_b', 'i').color
|
||||
property int pointSize: Units.dp * 10
|
||||
property int wordsSpacing: 5
|
||||
}
|
||||
}
|
||||
*/
|
||||
// Button colors
|
||||
property QtObject buttons: QtObject {
|
||||
property QtObject microOn: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'micro_on_custom'
|
||||
property string name : 'microOn'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_n_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject microOff: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'micro_off_custom'
|
||||
property string name : 'microOff'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_n_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject speakerOn: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'speaker_on_custom'
|
||||
property string name : 'speakerOn'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_n_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject speakerOff: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'speaker_off_custom'
|
||||
property string name : 'speakerOff'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_n_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject cameraOn: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'camera_on_custom'
|
||||
property string name : 'cameraOn'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_n_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_u', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject cameraOff: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'camera_off_custom'
|
||||
property string name : 'cameraOff'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_n_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_u', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject gridLayout: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'conference_layout_grid_custom'
|
||||
property string name : 'gridLayout'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_u', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg').color
|
||||
}
|
||||
/*
|
||||
property QtObject callsList: QtObject {
|
||||
property int iconSize: 40
|
||||
property string name : 'callsList'
|
||||
property string icon : 'call_menu_custom'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject dialpad: QtObject {
|
||||
property int iconSize: 40
|
||||
property string name : 'dialpad'
|
||||
property string icon : 'dialpad_custom'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject screenSharing: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'screen_sharing_custom'
|
||||
property string name : 'screenSharing'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'sc_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'sc_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'sc_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'sc_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'sc_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'sc_p_b_fg').color
|
||||
}
|
||||
property QtObject recordOn: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'record_custom'
|
||||
property string name : 'recordOn'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'sc_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'sc_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'sc_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'sc_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'sc_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'sc_p_b_fg').color
|
||||
}
|
||||
property QtObject recordOff: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'record_custom'
|
||||
property string name : 'recordOff'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'sc_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'sc_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'sc_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'sc_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'sc_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'sc_p_b_fg').color
|
||||
}
|
||||
property QtObject screenshot: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'screenshot_custom'
|
||||
property string name : 'screenshot'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'sc_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'sc_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'sc_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'sc_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'sc_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'sc_p_b_fg').color
|
||||
}
|
||||
property QtObject fullscreen: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'fullscreen_custom'
|
||||
property string name : 'fullscreen'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'sc_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'sc_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'sc_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'sc_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'sc_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'sc_p_b_fg').color
|
||||
}
|
||||
property QtObject stopFullscreen: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'stop_fullscreen_custom'
|
||||
property string name : 'stopFullscreen'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'sc_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'sc_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'sc_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'sc_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'sc_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'sc_p_b_fg').color
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
property QtObject secure: QtObject {
|
||||
property int buttonSize: 40
|
||||
property int iconSize: 20
|
||||
property string icon : ''
|
||||
property string name : 'secure'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, '', '', '#66727B').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, '', '', '#66727B').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, '', '', '#66727B').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, '', '', 'transparent').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, '', '', 'transparent').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, '', '', 'transparent').color
|
||||
}
|
||||
property QtObject unsecure: QtObject {
|
||||
property int iconSize: 16
|
||||
property string icon : 'call_chat_unsecure_custom'
|
||||
property string name : 'unsecure'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, '', '', 'transparent').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, '', '', 'transparent').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, '', '', 'transparent').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, '', '', '#ff0000').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, '', '', '#ff0000').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, '', '', '#ff0000').color
|
||||
}
|
||||
|
||||
property QtObject pause: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'pause_custom'
|
||||
property string name : 'pause'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_u', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject play: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'play_custom'
|
||||
property string name : 'play'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_u', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg').color
|
||||
}
|
||||
property QtObject hangup: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'hangup_custom'
|
||||
property string name : 'hangup'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'r_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'r_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'r_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'r_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'r_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'r_p_b_fg').color
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
property QtObject chat: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'chat_custom'
|
||||
property string name : 'chat'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_inv_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_inv_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color
|
||||
}
|
||||
property QtObject participants: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'participants_custom'
|
||||
property string name : 'participants'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_inv_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_inv_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color
|
||||
}
|
||||
property QtObject callQuality: QtObject {
|
||||
property int iconSize: 20
|
||||
property string name : 'quality'
|
||||
property string icon : 'call_quality_custom'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color
|
||||
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon, 'me_d_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_fg').color
|
||||
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon, 'me_d_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
|
||||
|
||||
property color backgroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_n', icon, 'me_n_b_inv_bg').color
|
||||
property color backgroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_d', icon, 'me_d_b_inv_bg').color
|
||||
property color backgroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_h', icon, 'me_h_b_inv_bg').color
|
||||
property color backgroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_p', icon, 'me_p_b_inv_bg').color
|
||||
property color foregroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_n', icon, 'me_n_b_inv_fg').color
|
||||
property color foregroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_d', icon, 'me_d_b_inv_fg').color
|
||||
property color foregroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_h', icon, 'me_h_b_inv_fg').color
|
||||
property color foregroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_p', icon, 'me_p_b_inv_fg').color
|
||||
}
|
||||
property QtObject options: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'options_custom'
|
||||
property string name : 'options'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_inv_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_inv_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
property QtObject closePreview: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'close_custom'
|
||||
property string name : 'close_preview'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_inv_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_inv_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
property QtObject history: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'history_custom'
|
||||
property string name : 'history'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color
|
||||
}
|
||||
|
||||
|
||||
property QtObject acceptVideoCall: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'video_call_accept_custom'
|
||||
property string name : 'videoCallAccept'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'a_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'a_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'a_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'a_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'a_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'a_p_b_fg').color
|
||||
}
|
||||
property QtObject acceptCall: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'call_accept_custom'
|
||||
property string name : 'callAccept'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'a_n_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'a_h_b_bg').color
|
||||
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'a_p_b_bg').color
|
||||
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'a_n_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'a_h_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'a_p_b_fg').color
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
|
@ -9,6 +9,7 @@ module App.Styles
|
|||
singleton CallFullscreenStyle 1.0 Calls/CallFullscreenStyle.qml
|
||||
singleton CallStyle 1.0 Calls/CallStyle.qml
|
||||
singleton CallsWindowStyle 1.0 Calls/CallsWindowStyle.qml
|
||||
singleton WaitingRoomStyle 1.0 Calls/WaitingRoomStyle.qml
|
||||
singleton ConferenceStyle 1.0 Calls/ConferenceStyle.qml
|
||||
singleton VideoConferenceStyle 1.0 Calls/VideoConferenceStyle.qml
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 9791a5bc6cdce83db83c11af9b4c0e29bf9805a5
|
||||
Subproject commit e1f89e97bc75f297a5cb485e4ae91e0c81fa9add
|
||||
Loading…
Add table
Reference in a new issue