diff --git a/linphone-app/assets/languages/da.ts b/linphone-app/assets/languages/da.ts index abae57a59..874968f25 100644 --- a/linphone-app/assets/languages/da.ts +++ b/linphone-app/assets/languages/da.ts @@ -993,9 +993,7 @@ Server url ikke konfigureret. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/de.ts b/linphone-app/assets/languages/de.ts index 1c560c667..1d5684b8f 100644 --- a/linphone-app/assets/languages/de.ts +++ b/linphone-app/assets/languages/de.ts @@ -993,9 +993,7 @@ Server URL ist nicht konfiguriert. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/es.ts b/linphone-app/assets/languages/es.ts index 1a8326e1c..292f1f4d1 100644 --- a/linphone-app/assets/languages/es.ts +++ b/linphone-app/assets/languages/es.ts @@ -983,9 +983,7 @@ URL del servidor no configurada. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/fr_FR.ts b/linphone-app/assets/languages/fr_FR.ts index ce1853d30..047e34322 100644 --- a/linphone-app/assets/languages/fr_FR.ts +++ b/linphone-app/assets/languages/fr_FR.ts @@ -993,9 +993,7 @@ URL du serveur non configurée. nDay - '%1 day' ----------- -'%1 days' + '%1 day' %1 jour %1 jours diff --git a/linphone-app/assets/languages/hu.ts b/linphone-app/assets/languages/hu.ts index 9b0c253ae..77976d609 100644 --- a/linphone-app/assets/languages/hu.ts +++ b/linphone-app/assets/languages/hu.ts @@ -986,9 +986,7 @@ A kiszolgáló URL-je nincs konfigurálva. nDay - '%1 day' ----------- -'%1 days' + '%1 day' %1 nap diff --git a/linphone-app/assets/languages/it.ts b/linphone-app/assets/languages/it.ts index 3e99add58..bfd59e0ec 100644 --- a/linphone-app/assets/languages/it.ts +++ b/linphone-app/assets/languages/it.ts @@ -993,9 +993,7 @@ URL del server non configurato. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/ja.ts b/linphone-app/assets/languages/ja.ts index ac60ad87c..e4d3e6297 100644 --- a/linphone-app/assets/languages/ja.ts +++ b/linphone-app/assets/languages/ja.ts @@ -986,9 +986,7 @@ nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/lt.ts b/linphone-app/assets/languages/lt.ts index ce7749bbd..402d9f457 100644 --- a/linphone-app/assets/languages/lt.ts +++ b/linphone-app/assets/languages/lt.ts @@ -1000,9 +1000,7 @@ Nesukonfigūruotas serverio url. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/pt_BR.ts b/linphone-app/assets/languages/pt_BR.ts index 68ba06fb7..4f8f51080 100644 --- a/linphone-app/assets/languages/pt_BR.ts +++ b/linphone-app/assets/languages/pt_BR.ts @@ -993,9 +993,7 @@ URL do servidor não configurado. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/ru.ts b/linphone-app/assets/languages/ru.ts index 92ff69baf..8b27f9c60 100644 --- a/linphone-app/assets/languages/ru.ts +++ b/linphone-app/assets/languages/ru.ts @@ -1000,9 +1000,7 @@ nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/sv.ts b/linphone-app/assets/languages/sv.ts index 51b12e918..dcf8efbd7 100644 --- a/linphone-app/assets/languages/sv.ts +++ b/linphone-app/assets/languages/sv.ts @@ -993,9 +993,7 @@ Serverwebbadressen är inte konfigurerad. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/tr.ts b/linphone-app/assets/languages/tr.ts index 9fcc80445..cf4430d5c 100644 --- a/linphone-app/assets/languages/tr.ts +++ b/linphone-app/assets/languages/tr.ts @@ -986,9 +986,7 @@ Sunucu url'si yapılandırılmadı. nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/uk.ts b/linphone-app/assets/languages/uk.ts index 3d4a26915..28cdda213 100644 --- a/linphone-app/assets/languages/uk.ts +++ b/linphone-app/assets/languages/uk.ts @@ -1000,9 +1000,7 @@ nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/assets/languages/zh_CN.ts b/linphone-app/assets/languages/zh_CN.ts index 7a80f5f44..1cbee3e80 100644 --- a/linphone-app/assets/languages/zh_CN.ts +++ b/linphone-app/assets/languages/zh_CN.ts @@ -986,9 +986,7 @@ nDay - '%1 day' ----------- -'%1 days' + '%1 day' diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.cpp b/linphone-app/src/components/chat-room/ChatRoomModel.cpp index b4aeed58b..2d8a65295 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -223,8 +223,13 @@ ChatRoomModel::ChatRoomModel (std::shared_ptr chatRoom, QObj QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactAdded, this, &ChatRoomModel::usernameChanged); QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactAdded, this, &ChatRoomModel::fullPeerAddressChanged); + QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactAdded, this, &ChatRoomModel::avatarChanged); QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactRemoved, this, &ChatRoomModel::usernameChanged); QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactRemoved, this, &ChatRoomModel::fullPeerAddressChanged); + QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactRemoved, this, &ChatRoomModel::avatarChanged); + QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactUpdated, this, &ChatRoomModel::usernameChanged); + QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactUpdated, this, &ChatRoomModel::fullPeerAddressChanged); + QObject::connect(coreManager->getContactsListModel(), &ContactsListModel::contactUpdated, this, &ChatRoomModel::avatarChanged); //QObject::connect(this, &ChatRoomModel::messageCountReset, coreManager, &CoreManager::eventCountChanged ); @@ -1070,6 +1075,7 @@ void ChatRoomModel::onChatMessageSent(const std::shared_ptr updateLastUpdateTime(); } +// Called when the core have the participant (= exists) void ChatRoomModel::onParticipantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ auto events = chatRoom->getHistoryEvents(0); auto e = std::find(events.begin(), events.end(), eventLog); diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index 281c5b6fa..c8c56c627 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -287,7 +287,7 @@ signals: void participantsChanged(); void subjectChanged(QString subject); void usernameChanged(); - void avatarChanged(QString avatar); + void avatarChanged(); void presenceStatusChanged(); void lastUpdateTimeChanged(); void unreadMessagesCountChanged(); diff --git a/linphone-app/src/components/conference/ConferenceModel.cpp b/linphone-app/src/components/conference/ConferenceModel.cpp index 36c5d8c02..dff2d0d7f 100644 --- a/linphone-app/src/components/conference/ConferenceModel.cpp +++ b/linphone-app/src/components/conference/ConferenceModel.cpp @@ -21,10 +21,12 @@ #include #include +#include "app/App.hpp" #include "components/call/CallModel.hpp" #include "components/calls/CallsListModel.hpp" #include "components/core/CoreHandlers.hpp" #include "components/core/CoreManager.hpp" +#include "components/notifier/Notifier.hpp" #include "components/settings/SettingsModel.hpp" #include "utils/MediastreamerUtils.hpp" #include "utils/Utils.hpp" @@ -76,13 +78,11 @@ void ConferenceModel::startRecording () { qInfo() << QStringLiteral("Start recording conference:") << this; CoreManager *coreManager = CoreManager::getInstance(); - coreManager->getCore()->startConferenceRecording( - Utils::appStringToCoreString( + mLastRecordFile = QStringLiteral("%1%2.mkv") .arg(coreManager->getSettingsModel()->getSavedCallsFolder()) - .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss")) - ) - ); + .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss")); + coreManager->getCore()->startConferenceRecording(Utils::appStringToCoreString(mLastRecordFile) ); mRecording = true; emit recordingChanged(true); @@ -95,7 +95,9 @@ void ConferenceModel::stopRecording () { qInfo() << QStringLiteral("Stop recording conference:") << this; mRecording = false; + CoreManager::getInstance()->getCore()->stopConferenceRecording(); + App::getInstance()->getNotifier()->notifyRecordingCompleted(mLastRecordFile); emit recordingChanged(false); } diff --git a/linphone-app/src/components/conference/ConferenceModel.hpp b/linphone-app/src/components/conference/ConferenceModel.hpp index ec35ffa77..67096cec4 100644 --- a/linphone-app/src/components/conference/ConferenceModel.hpp +++ b/linphone-app/src/components/conference/ConferenceModel.hpp @@ -28,51 +28,52 @@ class CallModel; class ConferenceModel : public QSortFilterProxyModel { - Q_OBJECT; - - Q_PROPERTY(int count READ getCount NOTIFY countChanged); - - Q_PROPERTY(bool microMuted READ getMicroMuted WRITE setMicroMuted NOTIFY microMutedChanged); - Q_PROPERTY(float microVu READ getMicroVu CONSTANT); - - Q_PROPERTY(bool recording READ getRecording NOTIFY recordingChanged); - Q_PROPERTY(bool isInConf READ isInConference NOTIFY conferenceChanged); - + Q_OBJECT; + + Q_PROPERTY(int count READ getCount NOTIFY countChanged); + + Q_PROPERTY(bool microMuted READ getMicroMuted WRITE setMicroMuted NOTIFY microMutedChanged); + Q_PROPERTY(float microVu READ getMicroVu CONSTANT); + + Q_PROPERTY(bool recording READ getRecording NOTIFY recordingChanged); + Q_PROPERTY(bool isInConf READ isInConference NOTIFY conferenceChanged); + public: - ConferenceModel (QObject *parent = Q_NULLPTR); - + ConferenceModel (QObject *parent = Q_NULLPTR); + protected: - bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const override; - - Q_INVOKABLE void terminate (); - - Q_INVOKABLE void startRecording (); - Q_INVOKABLE void stopRecording (); - - Q_INVOKABLE void join (); - Q_INVOKABLE void leave (); - + bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const override; + + Q_INVOKABLE void terminate (); + + Q_INVOKABLE void startRecording (); + Q_INVOKABLE void stopRecording (); + + Q_INVOKABLE void join (); + Q_INVOKABLE void leave (); + signals: - void countChanged (int count); - - void microMutedChanged (bool status); - void recordingChanged (bool status); - void conferenceChanged (); - + void countChanged (int count); + + void microMutedChanged (bool status); + void recordingChanged (bool status); + void conferenceChanged (); + private: - int getCount () const { - return rowCount(); - } - - bool getMicroMuted () const; - void setMicroMuted (bool status); - float getMicroVu () const; - - bool isInConference () const; - - bool getRecording () const; - - bool mRecording = false; + int getCount () const { + return rowCount(); + } + + bool getMicroMuted () const; + void setMicroMuted (bool status); + float getMicroVu () const; + + bool isInConference () const; + + bool getRecording () const; + + bool mRecording = false; + QString mLastRecordFile; }; #endif // CONFERENCE_MODEL_H_ diff --git a/linphone-app/src/components/participant/ParticipantModel.cpp b/linphone-app/src/components/participant/ParticipantModel.cpp index b59549029..8c6a7543f 100644 --- a/linphone-app/src/components/participant/ParticipantModel.cpp +++ b/linphone-app/src/components/participant/ParticipantModel.cpp @@ -132,3 +132,12 @@ std::shared_ptr ParticipantModel::getParticipantDevi return mParticipantDevices; } +void ParticipantModel::startInvitation(const int& secs){ + QTimer::singleShot(secs * 1000, this, &ParticipantModel::onEndOfInvitation); +} + +void ParticipantModel::onEndOfInvitation(){ + if( getInviting()) + emit invitationTimeout(this); +} + diff --git a/linphone-app/src/components/participant/ParticipantModel.hpp b/linphone-app/src/components/participant/ParticipantModel.hpp index 129be7a03..c65b32355 100644 --- a/linphone-app/src/components/participant/ParticipantModel.hpp +++ b/linphone-app/src/components/participant/ParticipantModel.hpp @@ -68,11 +68,13 @@ public: //linphone::ChatRoomSecurityLevel getSecurityLevel() const; //std::shared_ptr findDevice(const std::shared_ptr & address) const; + void startInvitation(const int& secondes = 30); // Start a timer to remove the model if the invitation didn't ended after some time public slots: void onSecurityLevelChanged(); void onDeviceSecurityLevelChanged(std::shared_ptr device); + void onEndOfInvitation(); signals: void securityLevelChanged(); @@ -83,6 +85,8 @@ signals: void deviceCountChanged(); void invitingChanged(); + void invitationTimeout(ParticipantModel* model); + // void contactUpdated (); diff --git a/linphone-app/src/components/participant/ParticipantProxyModel.cpp b/linphone-app/src/components/participant/ParticipantProxyModel.cpp index f6c41c56e..021c08c9e 100644 --- a/linphone-app/src/components/participant/ParticipantProxyModel.cpp +++ b/linphone-app/src/components/participant/ParticipantProxyModel.cpp @@ -83,28 +83,29 @@ void ParticipantProxyModel::setChatRoomModel(ChatRoomModel * chatRoomModel){ } } -void ParticipantProxyModel::add(const QString& address){ +void ParticipantProxyModel::addAddress(const QString& address){ ParticipantListModel * participantsModel = dynamic_cast(sourceModel()); if(!participantsModel->contains(address)){ std::shared_ptr participant = std::make_shared(nullptr); participant->setSipAddress(address); participantsModel->add(participant); - if(mChatRoomModel && mChatRoomModel->getChatRoom())// Invite and wait for its creation + if(mChatRoomModel && mChatRoomModel->getChatRoom()){// Invite and wait for its creation mChatRoomModel->getChatRoom()->addParticipant(Utils::interpretUrl(address)); + connect(participant.get(), &ParticipantModel::invitationTimeout, this, &ParticipantProxyModel::removeModel); + participant->startInvitation(); + } emit countChanged(); emit addressAdded(address); } } -void ParticipantProxyModel::remove(ParticipantModel * participant){ +void ParticipantProxyModel::removeModel(ParticipantModel * participant){ if(participant) { QString sipAddress = participant->getSipAddress(); - if( !mChatRoomModel){ - ParticipantListModel * participantsModel = dynamic_cast(sourceModel()); - participantsModel->remove(participant); - }else if(mChatRoomModel->getChatRoom() && participant->getParticipant() ) - mChatRoomModel->getChatRoom()->removeParticipant(participant->getParticipant()); - //dynamic_cast(sourceModel())->remove(participant); + if(mChatRoomModel && mChatRoomModel->getChatRoom() && participant->getParticipant() ) + mChatRoomModel->getChatRoom()->removeParticipant(participant->getParticipant()); // Remove already added + ParticipantListModel * participantsModel = dynamic_cast(sourceModel()); + participantsModel->remove(participant); emit countChanged(); emit addressRemoved(sipAddress); } diff --git a/linphone-app/src/components/participant/ParticipantProxyModel.hpp b/linphone-app/src/components/participant/ParticipantProxyModel.hpp index 37da1017e..bb24f550d 100644 --- a/linphone-app/src/components/participant/ParticipantProxyModel.hpp +++ b/linphone-app/src/components/participant/ParticipantProxyModel.hpp @@ -52,8 +52,8 @@ public: void setChatRoomModel(ChatRoomModel * chatRoomModel); - Q_INVOKABLE void add(const QString& address); - Q_INVOKABLE void remove(ParticipantModel * participant); + Q_INVOKABLE void addAddress(const QString& address); + Q_INVOKABLE void removeModel(ParticipantModel * participant); diff --git a/linphone-app/src/components/settings/SettingsModel.cpp b/linphone-app/src/components/settings/SettingsModel.cpp index 4b607fef5..ec6d98276 100644 --- a/linphone-app/src/components/settings/SettingsModel.cpp +++ b/linphone-app/src/components/settings/SettingsModel.cpp @@ -612,7 +612,10 @@ void SettingsModel::setChatEnabled (bool status) { // ----------------------------------------------------------------------------- bool SettingsModel::getHideEmptyChatRooms() const{ - return !!mConfig->getInt("misc", "hide_empty_chat_rooms", 0); + int defaultValue = 0; + if(!mConfig->hasEntry("misc", "hide_empty_chat_rooms"))// This step should be removed when this option comes from API and not directly from config file + mConfig->setInt("misc", "hide_empty_chat_rooms", defaultValue); + return !!mConfig->getInt("misc", "hide_empty_chat_rooms", defaultValue); } void SettingsModel::setHideEmptyChatRooms(const bool& status){ diff --git a/linphone-app/src/utils/Utils.cpp b/linphone-app/src/utils/Utils.cpp index 8866ad6bc..bf024b9fb 100644 --- a/linphone-app/src/utils/Utils.cpp +++ b/linphone-app/src/utils/Utils.cpp @@ -93,6 +93,10 @@ QString Utils::toDateString(QDateTime date){ return date.toString("yyyy/MM/dd"); } +QString Utils::getDisplayName(const QString& address){ + return getDisplayName(interpretUrl(address)); +} + QImage Utils::getImage(const QString &pUri) { QImage image(pUri); if(image.isNull()){// Try to determine format from headers instead of using suffix diff --git a/linphone-app/src/utils/Utils.hpp b/linphone-app/src/utils/Utils.hpp index b4aa6b009..ade0bbec9 100644 --- a/linphone-app/src/utils/Utils.hpp +++ b/linphone-app/src/utils/Utils.hpp @@ -56,6 +56,7 @@ public: Q_INVOKABLE static QString toDateTimeString(QDateTime date); Q_INVOKABLE static QString toTimeString(QDateTime date); Q_INVOKABLE static QString toDateString(QDateTime date); + Q_INVOKABLE static QString getDisplayName(const QString& address); //---------------------------------------------------------------------------------- static inline QString coreStringToAppString (const std::string &str) { diff --git a/linphone-app/ui/modules/Common/Menus/DropDownStaticMenuEntry.qml b/linphone-app/ui/modules/Common/Menus/DropDownStaticMenuEntry.qml index 8023cadc4..b72369a89 100644 --- a/linphone-app/ui/modules/Common/Menus/DropDownStaticMenuEntry.qml +++ b/linphone-app/ui/modules/Common/Menus/DropDownStaticMenuEntry.qml @@ -20,6 +20,7 @@ Rectangle { ) height: parent.entryHeight width: parent.entryWidth + property int implicitWidth : text.implicitWidth + DropDownStaticMenuStyle.entry.leftMargin + DropDownStaticMenuStyle.entry.rightMargin + 5 // 5 = Elide width Text { id: text diff --git a/linphone-app/ui/modules/Common/Tooltip/TooltipArea.qml b/linphone-app/ui/modules/Common/Tooltip/TooltipArea.qml index 4bd7d56a9..ab0e886ed 100644 --- a/linphone-app/ui/modules/Common/Tooltip/TooltipArea.qml +++ b/linphone-app/ui/modules/Common/Tooltip/TooltipArea.qml @@ -18,6 +18,16 @@ MouseArea { property int hoveringCursor : Qt.PointingHandCursor property bool isClickable : false + function show(){ + if(isClickable){ + if(tooltip.delay>0) { + tooltip.oldDelay = tooltip.delay + tooltip.delay = 0 + } + tooltip.show(text, -1); + } + } + anchors.fill:parent hoverEnabled: true @@ -34,13 +44,7 @@ MouseArea { wheel.accepted = false } onClicked:{ - if(isClickable){ - if(tooltip.delay>0) { - tooltip.oldDelay = tooltip.delay - tooltip.delay = 0 - } - tooltip.show(text, -1); - } + show() mouse.accepted = false } diff --git a/linphone-app/ui/modules/Linphone/Calls/Calls.js b/linphone-app/ui/modules/Linphone/Calls/Calls.js index d2c9bb95f..f9915cb68 100644 --- a/linphone-app/ui/modules/Linphone/Calls/Calls.js +++ b/linphone-app/ui/modules/Linphone/Calls/Calls.js @@ -117,12 +117,12 @@ function getParams (call) { if (call.pausedByUser) { optActions.push({ handler: (function () { call.pausedByUser = false }), - name: qsTr('resumeCall') + name: qsTr('resumeCall').toUpperCase() }) } else if (Linphone.SettingsModel.callPauseEnabled) { optActions.push({ handler: (function () { call.pausedByUser = true }), - name: qsTr('callPause') + name: qsTr('callPause').toUpperCase() }) } @@ -130,25 +130,25 @@ function getParams (call) { optActions.push({ handler: call.askForTransfer, //: 'COMPLETE ATTENDED TRANSFER' : Title button, design is in uppercase. - name: qsTr('attendedTransferComplete') + name: qsTr('attendedTransferComplete').toUpperCase() }) } else { optActions.push({ handler: call.askForTransfer, - name: qsTr('transferCall') + name: qsTr('transferCall').toUpperCase() }) optActions.push({ handler: call.askForAttendedTransfer, //: 'ATTENDED TRANSFER CALL' : Title button, design is in uppercase. - name: qsTr('attendedTransferCall') + name: qsTr('attendedTransferCall').toUpperCase() }) } return { actions: optActions.concat([{ handler: call.terminate, - name: qsTr('terminateCall') + name: qsTr('terminateCall').toUpperCase() }]), component: callActions, string: 'paused' diff --git a/linphone-app/ui/modules/Linphone/Calls/Calls.qml b/linphone-app/ui/modules/Linphone/Calls/Calls.qml index 5267b2496..3d5eb79cb 100644 --- a/linphone-app/ui/modules/Linphone/Calls/Calls.qml +++ b/linphone-app/ui/modules/Linphone/Calls/Calls.qml @@ -70,14 +70,15 @@ ListView { relativeX: callControls.width entryHeight: CallsStyle.entry.height - entryWidth: CallsStyle.entry.width + entryWidth: maxWidth + property int maxWidth : CallsStyle.entry.width Repeater { model: params ? params.actions : [] DropDownStaticMenuEntry { entryName: modelData.name - + Component.onCompleted: if( menu.maxWidth < implicitWidth ) menu.maxWidth = implicitWidth onClicked: { menu.close() params.actions[index].handler() diff --git a/linphone-app/ui/modules/Linphone/Chat/ChatMenu.qml b/linphone-app/ui/modules/Linphone/Chat/ChatMenu.qml index dfb0c0cfe..8b447f260 100644 --- a/linphone-app/ui/modules/Linphone/Chat/ChatMenu.qml +++ b/linphone-app/ui/modules/Linphone/Chat/ChatMenu.qml @@ -86,17 +86,15 @@ Item { // Handle hovered link. MouseArea { - anchors.fill:parent - // height: parent.height - // width: rectangle.width + anchors.fill: parent + //height: messageMenu.height + //width: messageMenu.width acceptedButtons: Qt.RightButton propagateComposedEvents:true cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.IBeamCursor - onClicked: mouse.button === Qt.RightButton && messageMenu.popup() } - } diff --git a/linphone-app/ui/modules/Linphone/Chat/FileMessage.qml b/linphone-app/ui/modules/Linphone/Chat/FileMessage.qml index 4add61bd9..bb742eb30 100644 --- a/linphone-app/ui/modules/Linphone/Chat/FileMessage.qml +++ b/linphone-app/ui/modules/Linphone/Chat/FileMessage.qml @@ -39,7 +39,12 @@ Row { delay:0 text:parent.username+'\n'+ (isOutgoing ? $chatEntry.toSipAddress : $chatEntry.fromSipAddress) tooltipParent:mainRow + isClickable: true + onDoubleClicked: { + window.mainSearchBar.text = $chatEntry.fromSipAddress + } } + } } @@ -74,6 +79,7 @@ Row { //property ContentModel contentModel : ($chatEntry.getContent(0) ? $chatEntry.getContent(0) : null) property ContentModel contentModel : $chatEntry.fileContentModel property string thumbnail : contentModel ? contentModel.thumbnail : '' + color: isOutgoing ? ChatStyle.entry.message.outgoing.backgroundColor : ChatStyle.entry.message.incoming.backgroundColor @@ -186,70 +192,83 @@ Row { // --------------------------------------------------------------------- // Upload or file status. // --------------------------------------------------------------------- - - Column { + Item{ Layout.fillWidth: true Layout.fillHeight: true - - spacing: ChatStyle.entry.message.file.status.spacing - - Text { - id: fileName + Column { + anchors.fill: parent - color: isOutgoing - ? ChatStyle.entry.message.outgoing.text.color - : ChatStyle.entry.message.incoming.text.color - elide: Text.ElideRight + spacing: ChatStyle.entry.message.file.status.spacing - font { - bold: true - pointSize: isOutgoing - ? ChatStyle.entry.message.outgoing.text.pointSize - : ChatStyle.entry.message.incoming.text.pointSize + Text { + id: fileName + + color: isOutgoing + ? ChatStyle.entry.message.outgoing.text.color + : ChatStyle.entry.message.incoming.text.color + elide: Text.ElideRight + + font { + bold: true + pointSize: isOutgoing + ? ChatStyle.entry.message.outgoing.text.pointSize + : ChatStyle.entry.message.incoming.text.pointSize + } + + text: (rectangle.contentModel ? rectangle.contentModel.name : '') + width: parent.width } - text: (rectangle.contentModel ? rectangle.contentModel.name : '') - width: parent.width - } - - ProgressBar { - id: progressBar - - height: ChatStyle.entry.message.file.status.bar.height - width: parent.width - - to: (rectangle.contentModel ? rectangle.contentModel.fileSize : 0) - value: rectangle.contentModel ? rectangle.contentModel.fileOffset || 0 : 0 - visible: $chatEntry.state == LinphoneEnums.ChatMessageStateInProgress || $chatEntry.state == LinphoneEnums.ChatMessageStateFileTransferInProgress - background: Rectangle { - color: ChatStyle.entry.message.file.status.bar.background.color - radius: ChatStyle.entry.message.file.status.bar.radius - } - - contentItem: Item { - Rectangle { - color: ChatStyle.entry.message.file.status.bar.contentItem.color - height: parent.height - width: progressBar.visualPosition * parent.width - + ProgressBar { + id: progressBar + + height: ChatStyle.entry.message.file.status.bar.height + width: parent.width + + to: (rectangle.contentModel ? rectangle.contentModel.fileSize : 0) + value: rectangle.contentModel ? rectangle.contentModel.fileOffset || 0 : 0 + visible: $chatEntry.state == LinphoneEnums.ChatMessageStateInProgress || $chatEntry.state == LinphoneEnums.ChatMessageStateFileTransferInProgress + background: Rectangle { + color: ChatStyle.entry.message.file.status.bar.background.color radius: ChatStyle.entry.message.file.status.bar.radius } + + contentItem: Item { + Rectangle { + color: ChatStyle.entry.message.file.status.bar.contentItem.color + height: parent.height + width: progressBar.visualPosition * parent.width + + radius: ChatStyle.entry.message.file.status.bar.radius + } + } + } + + Text { + color: fileName.color + elide: Text.ElideRight + font.pointSize: fileName.font.pointSize + text: { + if(rectangle.contentModel){ + var fileSize = Utils.formatSize(rectangle.contentModel.fileSize) + return progressBar.visible + ? Utils.formatSize(rectangle.contentModel.fileOffset) + '/' + fileSize + : fileSize + }else + return '' + } } } - - Text { - color: fileName.color - elide: Text.ElideRight - font.pointSize: fileName.font.pointSize - text: { - if(rectangle.contentModel){ - var fileSize = Utils.formatSize(rectangle.contentModel.fileSize) - return progressBar.visible - ? Utils.formatSize(rectangle.contentModel.fileOffset) + '/' + fileSize - : fileSize - }else - return '' - } + ChatMenu{ + id: chatMenu + anchors.fill: parent + //height: parent.height + //width: parent.width + + deliveryCount: deliveryLayout.model.count + onDeliveryStatusClicked: deliveryLayout.visible = !deliveryLayout.visible + onRemoveEntryRequested: removeEntry() + deliveryVisible: deliveryLayout.visible } } } @@ -283,25 +302,18 @@ Row { rectangle.contentModel.openFile() } else if (rectangle.contentModel && rectangle.contentModel.wasDownloaded) { rectangle.contentModel.openFile(true)// Show directory + thumbnailProvider.state = '' } else { rectangle.contentModel.downloadFile() + thumbnailProvider.state = '' } } - onExited: thumbnailProvider.state = '' onMouseXChanged: handleMouseMove.call(this, mouse) onMouseYChanged: handleMouseMove.call(this, mouse) } - ChatMenu{ - id: chatMenu - height: parent.height - width: rectangle.width - - deliveryCount: deliveryLayout.model.count - onDeliveryStatusClicked: deliveryLayout.visible = !deliveryLayout.visible - onRemoveEntryRequested: removeEntry() - deliveryVisible: deliveryLayout.visible - } + + Row{ id:ephemeralTimerRow @@ -326,7 +338,7 @@ Row { icon:'timer' iconSize: 15 } - } + } } ChatDeliveries{ diff --git a/linphone-app/ui/modules/Linphone/Contact/Contact.qml b/linphone-app/ui/modules/Linphone/Contact/Contact.qml index cc191efec..7b60fd468 100644 --- a/linphone-app/ui/modules/Linphone/Contact/Contact.qml +++ b/linphone-app/ui/modules/Linphone/Contact/Contact.qml @@ -30,7 +30,7 @@ Rectangle { property string username: (entry != undefined ?(entry.contactModel != undefined ? entry.contactModel.vcard.username :entry.username != undefined ?entry.username: - LinphoneUtils.getContactUsername(entry.sipAddress || entry.fullPeerAddress || entry.peerAddress || '') + UtilsCpp.getDisplayName(entry.sipAddress || entry.fullPeerAddress || entry.peerAddress || '') ):'') // --------------------------------------------------------------------------- @@ -53,8 +53,9 @@ Rectangle { Layout.preferredWidth: ContactStyle.contentHeight //image: _contact && _contact.vcard.avatar - image: entry?(entry.contactModel?entry.contactModel.vcard.avatar:entry.avatar?entry.avatar: ''):'' - + image: entry?(entry.contactModel ? entry.contactModel.vcard.avatar + : entry.avatar ? entry.avatar : '') + :'' presenceLevel: entry?(entry.contactModel ? (entry.contactModel.presenceStatus >= 0 ? Presence.getPresenceLevel(entry.contactModel.presenceStatus) : -1) : (entry.presenceStatus >= 0 ? Presence.getPresenceLevel(entry.presenceStatus) : -1) ) diff --git a/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml b/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml index 3543e65f9..f12178ae0 100644 --- a/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml +++ b/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml @@ -7,6 +7,8 @@ import Linphone 1.0 import Linphone.Styles 1.0 import ColorsList 1.0 +import UtilsCpp 1.0 + import 'Timeline.js' as Logic // ============================================================================= @@ -222,6 +224,7 @@ Rectangle { width: parent ? parent.width : 0 Contact { + id: contactView property bool isSelected: modelData != undefined && modelData.selected //view.currentIndex === index anchors.fill: parent @@ -240,16 +243,10 @@ Rectangle { usernameColor: isSelected ? TimelineStyle.contact.username.color.selected : TimelineStyle.contact.username.color.normal - - Loader { - anchors.fill: parent - sourceComponent: TooltipArea { - - //text: $timelineEntry.timestamp.toLocaleString( - //Qt.locale(App.locale), - //Locale.ShortFormat - //) - } + TooltipArea { + id: contactTooltip + text: UtilsCpp.toDateTimeString(modelData.chatRoomModel.lastUpdateTime) + isClickable: true } Icon{ icon: modelData.selected ? 'timer_light' : 'timer' @@ -264,12 +261,19 @@ Rectangle { MouseArea { anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + propagateComposedEvents: true + preventStealing: false onClicked: { //timeline.model.unselectAll() - if(modelData.selected)// Update selection - timeline.entrySelected(modelData) - modelData.selected = true - view.currentIndex = index; + if(mouse.button == Qt.LeftButton){ + if(modelData.selected)// Update selection + timeline.entrySelected(modelData) + modelData.selected = true + view.currentIndex = index; + }else{ + contactTooltip.show() + } } } diff --git a/linphone-app/ui/views/App/Calls/Conference.qml b/linphone-app/ui/views/App/Calls/Conference.qml index d39ce7e82..5d6a5dec4 100644 --- a/linphone-app/ui/views/App/Calls/Conference.qml +++ b/linphone-app/ui/views/App/Calls/Conference.qml @@ -76,12 +76,13 @@ Rectangle { id: rightActions anchors.right: parent.right - iconSize: CallStyle.header.iconSize + iconSize: CallStyle.header.buttonIconSize ActionSwitch { enabled: conference.conferenceModel.recording icon: 'record' useStates: false + visible: SettingsModel.callRecorderEnabled onClicked: !enabled ? conference.conferenceModel.startRecording() diff --git a/linphone-app/ui/views/App/Calls/IncallAvatar.qml b/linphone-app/ui/views/App/Calls/IncallAvatar.qml index e1ed1f42e..520eae683 100644 --- a/linphone-app/ui/views/App/Calls/IncallAvatar.qml +++ b/linphone-app/ui/views/App/Calls/IncallAvatar.qml @@ -35,7 +35,7 @@ Avatar { horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter - text: '▐ ▌' + text: '❙❙' textFormat: Text.RichText visible: call.status === CallModel.CallStatusPaused } diff --git a/linphone-app/ui/views/App/Main/Conversation.qml b/linphone-app/ui/views/App/Main/Conversation.qml index aaaaeacf8..8c0af2695 100644 --- a/linphone-app/ui/views/App/Main/Conversation.qml +++ b/linphone-app/ui/views/App/Main/Conversation.qml @@ -40,6 +40,18 @@ ColumnLayout { property bool haveMoreThanOneParticipants: chatRoomModel ? chatRoomModel.participants.count > 2 : false property bool haveLessThanMinParticipantsForCall: chatRoomModel ? chatRoomModel.participants.count <= 5 : false + function getPeerAddress() { + if(chatRoomModel) { + if(chatRoomModel.groupEnabled || chatRoomModel.isSecure()) { + return chatRoomModel.participants.addressesToString; + }else { + return chatRoomModel.sipAddress; + } + }else { + return conversation.fullPeerAddress || conversation.peerAddress || ''; + } + } + // --------------------------------------------------------------------------- spacing: 0 @@ -279,7 +291,7 @@ ColumnLayout { visible: SettingsModel.contactsEnabled && !conversation.chatRoomModel.groupEnabled onClicked: window.setView('ContactEdit', { - sipAddress: conversation.peerAddress + sipAddress: conversation.getPeerAddress() }) TooltipArea { text: Logic.getEditTooltipText() diff --git a/linphone-app/ui/views/App/Main/Dialogs/InfoChatRoom.qml b/linphone-app/ui/views/App/Main/Dialogs/InfoChatRoom.qml index 4dc79b2bf..f91ac56e4 100644 --- a/linphone-app/ui/views/App/Main/Dialogs/InfoChatRoom.qml +++ b/linphone-app/ui/views/App/Main/Dialogs/InfoChatRoom.qml @@ -93,12 +93,12 @@ DialogPlus { return !chatRoomModel.haveEncryption || UtilsCpp.hasCapability(entry.sipAddress, LinphoneEnums.FriendCapabilityLimeX3Dh); }, handler: function (entry) { - selectedParticipants.add(entry.sipAddress) + selectedParticipants.addAddress(entry.sipAddress) }, }] onEntryClicked: { - selectedParticipants.add(entry) + selectedParticipants.addAddress(entry) } } @@ -159,7 +159,7 @@ DialogPlus { visible:true, tooltipText: 'Remove this participant from the selection', handler: function (entry) { - selectedParticipants.remove(entry) + selectedParticipants.removeModel(entry) // ++lastContacts.reloadCount } }] diff --git a/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml b/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml index 3fe22de5f..c83b09c53 100644 --- a/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml +++ b/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml @@ -256,7 +256,7 @@ DialogPlus { anchors.fill:parent visible:!mask.visible onClicked: { - selectedParticipants.add(modelData.sipAddress) + selectedParticipants.addAddress(modelData.sipAddress) smartSearchBar.addAddressToIgnore(modelData.sipAddress); ++lastContacts.reloadCount } @@ -317,7 +317,7 @@ DialogPlus { return isUsable(entry.sipAddress) }, handler: function (entry) { - selectedParticipants.add(entry.sipAddress) + selectedParticipants.addAddress(entry.sipAddress) smartSearchBar.addAddressToIgnore(entry.sipAddress); ++lastContacts.reloadCount }, @@ -325,7 +325,7 @@ DialogPlus { onEntryClicked: { if( isUsable(entry)){ - selectedParticipants.add(entry) + selectedParticipants.addAddress(entry) smartSearchBar.addAddressToIgnore(entry); ++lastContacts.reloadCount } @@ -364,7 +364,7 @@ DialogPlus { showInvitingIndicator: false function removeParticipant(entry){ smartSearchBar.removeAddressToIgnore(entry.sipAddress) - selectedParticipants.remove(entry) + selectedParticipants.removeModel(entry) ++lastContacts.reloadCount } diff --git a/linphone-app/ui/views/App/Styles/Calls/CallStyle.qml b/linphone-app/ui/views/App/Styles/Calls/CallStyle.qml index 5029f6a75..da7a7f381 100644 --- a/linphone-app/ui/views/App/Styles/Calls/CallStyle.qml +++ b/linphone-app/ui/views/App/Styles/Calls/CallStyle.qml @@ -46,7 +46,7 @@ QtObject { property QtObject text: QtObject { property color color: ColorsList.add("Call_container_pause_text", "q").color - property int pointSizeFactor: 10 + property int pointSizeFactor: 5 } } }