This commit is contained in:
Julien Wadel 2022-04-20 17:17:27 +02:00
parent a541df0cd4
commit 9ab931da4d
41 changed files with 1913 additions and 629 deletions

View file

@ -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>

View file

@ -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>

View 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

View file

@ -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>

View 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);
}
// -----------------------------------------------------------------------------

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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_

View file

@ -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.";
}

View file

@ -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);

View file

@ -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){

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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:

View file

@ -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();
}

View file

@ -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

View file

@ -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

View file

@ -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

View 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()
}
}
}
}
}

View 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)
*/
}
}

View file

@ -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{

View file

@ -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

View file

@ -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
}
//------------------------------------------------------------------------------
}

View file

@ -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

View file

@ -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

View file

@ -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
}

View file

@ -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
}

View file

@ -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()
}
}

View file

@ -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
}
}

View file

@ -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.

View file

@ -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
}
}

View file

@ -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
}
}

View 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()
}
}
*/
}
}

View file

@ -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
}
}

View file

@ -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
}
}
}*/
}

View file

@ -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
}
}
}

View 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
}
*/
}
}

View file

@ -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