work in progress

This commit is contained in:
Nicolas Michon 2020-01-15 14:06:57 +01:00
parent 9097ae1763
commit 0722aa64eb
43 changed files with 1580 additions and 2327 deletions

View file

@ -98,9 +98,11 @@ set(QT5_PACKAGES_OPTIONAL TextToSpeech)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(LinphoneCxx CONFIG REQUIRED)
find_package(Linphone CONFIG REQUIRED)
find_package(bctoolbox CONFIG REQUIRED)
find_package(belcard CONFIG REQUIRED)
find_package(Mediastreamer2 CONFIG REQUIRED)
find_package(ortp CONFIG REQUIRED)
find_package(Minizip REQUIRED)
@ -156,6 +158,7 @@ set(SOURCES
src/components/timeline/TimelineModel.cpp
src/components/url-handlers/UrlHandlers.cpp
src/utils/LinphoneUtils.cpp
src/utils/MediastreamerUtils.cpp
src/utils/QExifImageHeader.cpp
src/utils/Utils.cpp
)
@ -215,6 +218,7 @@ set(HEADERS
src/components/timeline/TimelineModel.hpp
src/components/url-handlers/UrlHandlers.hpp
src/utils/LinphoneUtils.hpp
src/utils/MediastreamerUtils.hpp
src/utils/QExifImageHeader.hpp
src/utils/Utils.hpp
)
@ -367,13 +371,10 @@ else ()
add_executable(${TARGET_NAME} $<TARGET_OBJECTS:${APP_LIBRARY}> ${MAIN_FILE})
endif ()
if (NOT WIN32)
add_dependencies(update_translations check_qml)
endif ()
set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME "${EXECUTABLE_NAME}")
set(INCLUDED_DIRECTORIES "${LINPHONECXX_INCLUDE_DIRS}" "${BELCARD_INCLUDE_DIRS}" "${BCTOOLBOX_INCLUDE_DIRS}" "${MEDIASTREAMER2_INCLUDE_DIRS}" "${MINIZIP_INCLUDE_DIRS}")
set(LIBRARIES ${BCTOOLBOX_CORE_LIBRARIES} ${BELCARD_LIBRARIES} ${LINPHONECXX_LIBRARIES} ${MINIZIP_LIBRARIES})
set(LIBRARIES ${BCTOOLBOX_CORE_LIBRARIES} ${BELCARD_LIBRARIES} ${LINPHONE_LIBRARIES} ${LINPHONECXX_LIBRARIES} ${MEDIASTREAMER2_LIBRARIES} ${ORTP_LIBRARIES} ${MINIZIP_LIBRARIES})
foreach (package ${QT5_PACKAGES})
list(APPEND INCLUDED_DIRECTORIES "${Qt5${package}_INCLUDE_DIRS}")

View file

@ -8,6 +8,12 @@ Linphone is a free VoIP and video softphone based on the SIP protocol.
## Getting started
Installing dependencies:
apt-get install libqt53dcore5:amd64 libqt53dextras5:amd64 libqt53dinput5:amd64 libqt53dlogic5:amd64 libqt53dquick5:amd64 libqt53dquickextras5:amd64 libqt53dquickinput5:amd64 libqt53dquickrender5:amd64 libqt53drender5:amd64 libqt5concurrent5:amd64 libqt5core5a:amd64 libqt5dbus5:amd64 libqt5designer5:amd64 libqt5designercomponents5:amd64 libqt5gui5:amd64 libqt5help5:amd64 libqt5multimedia5:amd64 libqt5multimedia5-plugins:amd64 libqt5multimediawidgets5:amd64 libqt5network5:amd64 libqt5opengl5:amd64 libqt5opengl5-dev:amd64 libqt5positioning5:amd64 libqt5printsupport5:amd64 libqt5qml5:amd64 libqt5quick5:amd64 libqt5quickcontrols2-5:amd64 libqt5quickparticles5:amd64 libqt5quicktemplates2-5:amd64 libqt5quicktest5:amd64 libqt5quickwidgets5:amd64 libqt5script5:amd64 libqt5scripttools5:amd64 libqt5sensors5:amd64 libqt5serialport5:amd64 libqt5sql5:amd64 libqt5sql5-sqlite:amd64 libqt5svg5:amd64 libqt5svg5-dev:amd64 libqt5test5:amd64 libqt5webchannel5:amd64 libqt5webengine-data libqt5webenginecore5:amd64 libqt5webenginewidgets5:amd64 libqt5webkit5:amd64 libqt5widgets5:amd64 libqt5x11extras5:amd64 libqt5xml5:amd64 libqt5xmlpatterns5:amd64 qt5-default:amd64 qt5-doc qt5-gtk-platformtheme:amd64 qt5-qmake:amd64 qt5-qmltooling-plugins:amd64
Here are the general instructions to build linphone for desktop. The specific instructions for each build platform is described just below.
1. Install some build tools: `CMake`, `Python` and `Qt5` (_5.9 or newer_). `C++11` support is required!
@ -68,7 +74,7 @@ Before you install packages with Brew, you may have to change directories permis
3. Open a Windows command line (cmd.exe) in the current directory and run:
python prepare.py -G "Visual Studio 14 2015" -DENABLE_DOC=OFF
python prepare.py -G "Visual Studio 15 2017" -DENABLE_DOC=OFF
4. Run the following command in the root directory of linphone-desktop:

90
assets/images/warning.svg Normal file
View file

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="28"
height="28"
viewBox="0 0 28 28"
version="1.1"
id="svg15"
sodipodi:docname="chat_error.svg"
inkscape:version="0.92.1 r">
<metadata
id="metadata19">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>chat_error</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1149"
id="namedview17"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg15" />
<!-- Generator: Sketch 42 (36781) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">chat_error</title>
<desc
id="desc4">Created with Sketch.</desc>
<defs
id="defs6" />
<g
id="Symbols"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="translate(2,2)">
<g
id="chat_error">
<g
id="Group-3">
<circle
id="Oval"
cx="12"
cy="12"
r="12"
class="color-error-style-fill"
style="fill:#FF0000" />
<g
id="Group-2"
transform="translate(10,4.6)"
style="fill:#ffffff;stroke:#ffffff">
<polygon
id="Path-1067"
transform="rotate(-180,2,4.880676)"
points="2,1.7763568e-15 0.5,9.7613525 3.5,9.7613525 "
style="stroke-width:0.80000001;stroke-linejoin:round" />
<circle
id="Oval-24"
cx="2.0000005"
cy="13.4"
r="1.4"
style="stroke-width:0.5" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -615,6 +615,10 @@ Server URL ist nicht konfiguriert.</translation>
<source>abortEditDescriptionText</source>
<translation>Möchten Sie die Änderungen an diesem Kontakt verwerfen?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Server URL ist nicht konfiguriert.</translation>
<source>removeAllEntriesDescription</source>
<translation>Möchten Sie diese Historie wirklich löschen?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -958,6 +974,10 @@ Server URL ist nicht konfiguriert.</translation>
<source>smartSearchBarTooltip</source>
<translation>Verwenden das intelligente Suchfeld um Audio- und Videocalls zu starten, Nachrichten zu senden oder Kontakt hinzuzufügen. Geben Sie die SIP-Adresse oder Username Ihres Kontaktes ein.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1152,6 +1172,22 @@ Server URL ist nicht konfiguriert.</translation>
<source>showAudioCodecsLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@ Server url not configured.</translation>
<source>abortEditDescriptionText</source>
<translation>Are you sure you want to cancel the contact modification?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation>Show conversation</translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Server url not configured.</translation>
<source>removeAllEntriesDescription</source>
<translation>Are you sure you want to clean this history?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation>Edit contact</translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation>Add contact</translation>
</message>
<message>
<source>cleanHistory</source>
<translation>Delete history</translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
calls, send a message or add a new contact. Just enter
your friend&apos;s SIP address or username.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation>Start conference call</translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ your friend&apos;s SIP address or username.</translation>
<source>showAudioCodecsLabel</source>
<translation>Show audio codecs</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation>Playback gain</translation>
</message>
<message>
<source>captureGainLabel</source>
<translation>Capture gain</translation>
</message>
<message>
<source>audioTestLabel</source>
<translation>Capture level</translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation>Audio call in progress: some settings are not available.</translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

File diff suppressed because it is too large Load diff

View file

@ -615,6 +615,10 @@ Url du serveur non configurée.</translation>
<source>abortEditDescriptionText</source>
<translation>Êtes-vous sûr de vouloir annuler l&apos;édition du contact ?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation>Allez à la conversation</translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Url du serveur non configurée.</translation>
<source>removeAllEntriesDescription</source>
<translation>Êtes-vous sûr de vouloir supprimer cet historique ?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation>Editer le contact</translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation>Ajouter le contact</translation>
</message>
<message>
<source>cleanHistory</source>
<translation>Supprimer l&apos;historique</translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -961,6 +977,10 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>smartSearchBarTooltip</source>
<translation>Utilisez la barre de recherche intelligente pour lancer des appels audio et vidéo, envoyer un message ou ajouter un contact. Entrez simplement l&apos;adresse SIP ou le nom d&apos;utilisateur de votre contact.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation>Démarrer une conférence</translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1155,6 +1175,22 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>showAudioCodecsLabel</source>
<translation>Afficher les codecs audio</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation>Gain de lecture</translation>
</message>
<message>
<source>captureGainLabel</source>
<translation>Gain de capture</translation>
</message>
<message>
<source>audioTestLabel</source>
<translation>Niveau micro</translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation>Appel en cours: certains paramètres sont inaccessibles</translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@
<source>abortEditDescriptionText</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@
<source>removeAllEntriesDescription</source>
<translation></translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -958,6 +974,10 @@
<source>smartSearchBarTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1152,6 +1172,22 @@
<source>showAudioCodecsLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@ Nesukonfigūruotas serverio url.</translation>
<source>abortEditDescriptionText</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Nesukonfigūruotas serverio url.</translation>
<source>removeAllEntriesDescription</source>
<translation>Ar tikrai norite išvalyti š istoriją?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Spustelėkite čia: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
garso ir vaizdo skambučius, siųsti žinutę ar pridėti naują kontaktą.
Tiesiog, įveskite savo draugo SIP adresą ar naudotojo vardą.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ Tiesiog, įveskite savo draugo SIP adresą ar naudotojo vardą.</translation>
<source>showAudioCodecsLabel</source>
<translation>Rodyti garso kodekus</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@ URL do servidor não configurado.</translation>
<source>abortEditDescriptionText</source>
<translation>Tem certeza de que deseja cancelar a modificação do contato?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ URL do servidor não configurado.</translation>
<source>removeAllEntriesDescription</source>
<translation>Tem certeza de que deseja limpar este histórico?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Click aqui: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
enviar uma mensagem ou adicionar um novo contato. Basta entrar
o endereço SIP ou nome de usuário do seu amigo.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ o endereço SIP ou nome de usuário do seu amigo.</translation>
<source>showAudioCodecsLabel</source>
<translation>Mostrar codecs de áudio</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@
<source>abortEditDescriptionText</source>
<translation>Вы уверены, что хотите отменить изменение контакта?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@
<source>removeAllEntriesDescription</source>
<translation>Вы уверены, что хотите очистить эту историю?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -961,6 +977,10 @@
<source>smartSearchBarTooltip</source>
<translation>Используйте умную поисковую строку, чтобы сразу начать аудио или видео вызов, отправить сообщение или добавить новый контакт. Просто введите SIP адрес или имя пользователя вашего контакта.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1155,6 +1175,22 @@
<source>showAudioCodecsLabel</source>
<translation>Показать Аудио кодаки</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@ Serverwebbadressen är inte konfigurerad.</translation>
<source>abortEditDescriptionText</source>
<translation>Är du säker att du vill avbryta kontaktändringen?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Serverwebbadressen är inte konfigurerad.</translation>
<source>removeAllEntriesDescription</source>
<translation>Är du säker att du vill rensa den här historiken?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -961,6 +977,10 @@ Klicka här: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>smartSearchBarTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1155,6 +1175,22 @@ Klicka här: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>showAudioCodecsLabel</source>
<translation>Visa ljudkodek</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -615,6 +615,10 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<source>abortEditDescriptionText</source>
<translation>Kişi düzenlemesini iptal etmek istediğinize emin misiniz?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<source>removeAllEntriesDescription</source>
<translation>Bu geçmişi temizlemek istediğinize emin misiniz?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Buraya tıklayın: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
eklemek için akıllı arama çubuğunu kullanın. Yalnızca
arkadaşınızın SIP adresini veya kullanıcı adını girin.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ arkadaşınızın SIP adresini veya kullanıcı adını girin.</translation>
<source>showAudioCodecsLabel</source>
<translation>Ses çözücüleri göster</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>

View file

@ -23,6 +23,6 @@
lcb_define_target("linphoneqt" "linphone" "ms2plugins")
if (NOT WIN32 AND NOT APPLE)
lcb_blacklist_dependencies("turbo-jpeg") # turbo-jpeg is already provided by Qt5 so do not build it.
endif ()
#if (NOT WIN32 AND NOT APPLE)
# lcb_blacklist_dependencies("turbojpeg") # turbo-jpeg is already provided by Qt5 so do not build it.
#endif ()

13
create_appimage.sh Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash
APP_NAME="linphone"
BIN_SOURCE_DIR="OUTPUT/desktop"
WORK_DIR="OUTPUT/AppDir/usr"
mkdir -p "${WORK_DIR}"
cp -rfv "${BIN_SOURCE_DIR}"/* "${WORK_DIR}"
./AppImage/linuxdeployqt-continuous-x86_64.AppImage "${WORK_DIR}/bin/${APP_NAME}" -appimage -bundle-non-qt-libs -verbose=2

@ -1 +1 @@
Subproject commit ef30406833bc49ac92d1a6b520d7fbde801159e6
Subproject commit 717a397ceae0b5e923aed26398b5ba7d204b67ef

View file

@ -199,6 +199,7 @@
<file>assets/images/video_call_hovered.svg</file>
<file>assets/images/video_call_normal.svg</file>
<file>assets/images/video_call_pressed.svg</file>
<file>assets/images/warning.svg</file>
<file>ui/modules/Common/Animations/BusyIndicator.qml</file>
<file>ui/modules/Common/Constants/Constants.qml</file>
<file>ui/modules/Common/Dialog/ConfirmDialog.qml</file>

View file

@ -33,6 +33,7 @@
#include "components/settings/AccountSettingsModel.hpp"
#include "components/settings/SettingsModel.hpp"
#include "utils/LinphoneUtils.hpp"
#include "utils/MediastreamerUtils.hpp"
#include "utils/Utils.hpp"
#include "CallModel.hpp"
@ -469,11 +470,11 @@ float CallModel::getQuality () const {
// -----------------------------------------------------------------------------
float CallModel::getSpeakerVu () const {
return LinphoneUtils::computeVu(mCall->getPlayVolume());
return MediastreamerUtils::computeVu(mCall->getPlayVolume());
}
float CallModel::getMicroVu () const {
return LinphoneUtils::computeVu(mCall->getRecordVolume());
return MediastreamerUtils::computeVu(mCall->getRecordVolume());
}
// -----------------------------------------------------------------------------

View file

@ -28,6 +28,7 @@
#include "components/core/CoreManager.hpp"
#include "components/settings/SettingsModel.hpp"
#include "utils/LinphoneUtils.hpp"
#include "utils/MediastreamerUtils.hpp"
#include "utils/Utils.hpp"
#include "ConferenceModel.hpp"
@ -128,7 +129,7 @@ bool ConferenceModel::getRecording () const {
// -----------------------------------------------------------------------------
float ConferenceModel::getMicroVu () const {
return LinphoneUtils::computeVu(
return MediastreamerUtils::computeVu(
CoreManager::getInstance()->getCore()->getConferenceLocalInputVolume()
);
}

View file

@ -125,6 +125,11 @@ void CoreHandlers::onCallStatsUpdated (
call->getData<CallModel>("call-model").updateStats(stats);
}
void CoreHandlers::onCallCreated(const shared_ptr<linphone::Core> &,
const shared_ptr<linphone::Call> &call) {
emit callCreated(call);
}
void CoreHandlers::onGlobalStateChanged (
const shared_ptr<linphone::Core> &,
linphone::GlobalState gstate,

View file

@ -46,6 +46,7 @@ signals:
void callStateChanged (const std::shared_ptr<linphone::Call> &call, linphone::Call::State state);
void callTransferFailed (const std::shared_ptr<linphone::Call> &call);
void callTransferSucceeded (const std::shared_ptr<linphone::Call> &call);
void callCreated(const std::shared_ptr<linphone::Call> & call);
void coreStarted ();
void isComposingChanged (const std::shared_ptr<linphone::ChatRoom> &chatRoom);
void logsUploadStateChanged (linphone::Core::LogCollectionUploadState state, const std::string &info);
@ -87,6 +88,11 @@ private:
const std::shared_ptr<const linphone::CallStats> &stats
) override;
void onCallCreated(
const std::shared_ptr<linphone::Core> & lc,
const std::shared_ptr<linphone::Call> & call
) override;
void onGlobalStateChanged (
const std::shared_ptr<linphone::Core> &core,
linphone::GlobalState gstate,

View file

@ -66,7 +66,7 @@ void AbstractEventCountNotifier::internalnotifyEventCount () {
n = n > 99 ? 99 : n;
notifyEventCount(CoreManager::getInstance()->getSettingsModel()->getChatEnabled() ? n : 0);
emit eventCountChanged(mUnreadMessageCount);
emit eventCountChanged(n);
}
// -----------------------------------------------------------------------------

File diff suppressed because it is too large Load diff

View file

@ -24,8 +24,11 @@
#define SETTINGS_MODEL_H_
#include <linphone++/linphone.hh>
#include <utils/MediastreamerUtils.hpp>
#include <QObject>
#include "components/core/CoreHandlers.hpp"
// =============================================================================
class SettingsModel : public QObject {
@ -46,8 +49,13 @@ class SettingsModel : public QObject {
// Audio. --------------------------------------------------------------------
Q_PROPERTY(QStringList captureDevices READ getCaptureDevices CONSTANT);
Q_PROPERTY(QStringList playbackDevices READ getPlaybackDevices CONSTANT);
Q_PROPERTY(bool captureGraphRunning READ getCaptureGraphRunning NOTIFY captureGraphRunningChanged);
Q_PROPERTY(QStringList captureDevices READ getCaptureDevices NOTIFY captureDevicesChanged);
Q_PROPERTY(QStringList playbackDevices READ getPlaybackDevices NOTIFY playbackDevicesChanged);
Q_PROPERTY(float playbackGain READ getPlaybackGain WRITE setPlaybackGain NOTIFY playbackGainChanged);
Q_PROPERTY(float captureGain READ getCaptureGain WRITE setCaptureGain NOTIFY captureGainChanged);
Q_PROPERTY(QString captureDevice READ getCaptureDevice WRITE setCaptureDevice NOTIFY captureDeviceChanged);
Q_PROPERTY(QString playbackDevice READ getPlaybackDevice WRITE setPlaybackDevice NOTIFY playbackDeviceChanged);
@ -61,7 +69,7 @@ class SettingsModel : public QObject {
// Video. --------------------------------------------------------------------
Q_PROPERTY(QStringList videoDevices READ getVideoDevices CONSTANT);
Q_PROPERTY(QStringList videoDevices READ getVideoDevices NOTIFY videoDevicesChanged);
Q_PROPERTY(QString videoDevice READ getVideoDevice WRITE setVideoDevice NOTIFY videoDeviceChanged);
@ -171,6 +179,8 @@ class SettingsModel : public QObject {
Q_PROPERTY(bool developerSettingsEnabled READ getDeveloperSettingsEnabled WRITE setDeveloperSettingsEnabled NOTIFY developerSettingsEnabledChanged);
Q_PROPERTY(bool isInCall READ getIsInCall NOTIFY isInCallChanged);
public:
enum MediaEncryption {
MediaEncryptionNone = int(linphone::MediaEncryption::None),
@ -193,6 +203,9 @@ public:
// METHODS.
// ===========================================================================
Q_INVOKABLE void onSettingsTabChanged(int idx);
Q_INVOKABLE void settingsWindowClosing(void);
// Assistant. ----------------------------------------------------------------
bool getCreateAppSipAccountEnabled () const;
@ -212,6 +225,19 @@ public:
// Audio. --------------------------------------------------------------------
void createCaptureGraph();
bool getCaptureGraphRunning();
void accessAudioSettings();
void closeAudioSettings();
Q_INVOKABLE float getMicVolume();
float getPlaybackGain() const;
void setPlaybackGain(float gain);
float getCaptureGain() const;
void setCaptureGain(float gain);
QStringList getCaptureDevices () const;
QStringList getPlaybackDevices () const;
@ -235,6 +261,9 @@ public:
// Video. --------------------------------------------------------------------
//Called from qml when accessing audio settings panel
Q_INVOKABLE void accessVideoSettings();
QStringList getVideoDevices () const;
QString getVideoDevice () const;
@ -424,6 +453,11 @@ public:
bool getDeveloperSettingsEnabled () const;
void setDeveloperSettingsEnabled (bool status);
void handleCallCreated(const std::shared_ptr<linphone::Call> &call);
void handleCallStateChanged(const std::shared_ptr<linphone::Call> &call, linphone::Call::State state);
bool getIsInCall() const;
static const std::string UiSection;
// ===========================================================================
@ -442,6 +476,14 @@ signals:
// Audio. --------------------------------------------------------------------
void captureGraphRunningChanged(bool running);
void playbackGainChanged(float gain);
void captureGainChanged(float gain);
void captureDevicesChanged (const QStringList &devices);
void playbackDevicesChanged (const QStringList &devices);
void captureDeviceChanged (const QString &device);
void playbackDeviceChanged (const QString &device);
void ringerDeviceChanged (const QString &device);
@ -454,6 +496,7 @@ signals:
// Video. --------------------------------------------------------------------
void videoDevicesChanged (const QStringList &devices);
void videoDeviceChanged (const QString &device);
void videoPresetChanged (const QString &preset);
@ -548,7 +591,12 @@ signals:
bool developerSettingsEnabledChanged (bool status);
bool isInCallChanged(bool);
private:
int mCurrentSettingsTab = 0;
MediastreamerUtils::SimpleCaptureGraph *mSimpleCaptureGraph = nullptr;
std::shared_ptr<linphone::Config> mConfig;
};

View file

@ -451,6 +451,14 @@ void SipAddressesModel::addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry,
].timestamp = callLog->getStatus() == linphone::Call::Status::Success
? QDateTime::fromMSecsSinceEpoch((callLog->getStartDate() + callLog->getDuration()) * 1000)
: QDateTime::fromMSecsSinceEpoch(callLog->getStartDate() * 1000);
if (callLog->getStatus() == linphone::Call::Status::Missed) {
for (auto &observer : mObservers.values(callLog->getPeerAddress()->asStringUriOnly())) {
if (observer->getLocalAddress() == callLog->getLocalAddress()->asStringUriOnly()) {
observer->setUnreadMessageCount(1);
}
}
}
}
void SipAddressesModel::addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry, const shared_ptr<linphone::ChatMessage> &message) {
@ -561,18 +569,17 @@ void SipAddressesModel::initSipAddressesFromCalls () {
const QString localAddress(Utils::coreStringToAppString(callLog->getLocalAddress()->asStringUriOnly()));
switch (callLog->getStatus()) {
case linphone::Call::Status::Aborted:
case linphone::Call::Status::EarlyAborted:
return; // Ignore aborted calls.
case linphone::Call::Status::Aborted:
case linphone::Call::Status::EarlyAborted:
return; // Ignore aborted calls.
case linphone::Call::Status::AcceptedElsewhere:
case linphone::Call::Status::DeclinedElsewhere:
return; // Ignore accepted calls on other device.
case linphone::Call::Status::Success:
case linphone::Call::Status::Declined:
case linphone::Call::Status::AcceptedElsewhere:
case linphone::Call::Status::DeclinedElsewhere:
return; // Ignore accepted calls on other device.
case linphone::Call::Status::Success:
case linphone::Call::Status::Missed:
case linphone::Call::Status::Declined:
break;
case linphone::Call::Status::Missed:
break;
}
ConferenceId conferenceId{ peerAddress, localAddress };
@ -617,9 +624,10 @@ void SipAddressesModel::updateObservers (const QString &sipAddress, const Presen
}
void SipAddressesModel::updateObservers (const QString &peerAddress, const QString &localAddress, int messageCount) {
for (auto &observer : mObservers.values(peerAddress))
if (observer->getLocalAddress() == localAddress) {
observer->setUnreadMessageCount(messageCount);
return;
}
for (auto &observer : mObservers.values(peerAddress)) {
if (observer->getLocalAddress() == localAddress) {
observer->setUnreadMessageCount(messageCount);
return;
}
}
}

View file

@ -114,6 +114,9 @@ private:
void addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry, const std::shared_ptr<linphone::Call> &call);
void addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry, const std::shared_ptr<linphone::ChatMessage> &message);
//NMN TODO bind to missedCall event and implement void addOrUpdateSipAddress
template<class T>
void addOrUpdateSipAddress (const QString &sipAddress, T data);

View file

@ -30,17 +30,6 @@
class QString;
namespace LinphoneUtils {
inline float computeVu (float volume) {
constexpr float VuMin = -20.f;
constexpr float VuMax = 4.f;
if (volume < VuMin)
return 0.f;
if (volume > VuMax)
return 1.f;
return (volume - VuMin) / (VuMax - VuMin);
}
linphone::TransportType stringToTransportType (const QString &transport);

View file

@ -0,0 +1,141 @@
/*
* MediastreamerUtils.cpp
* Copyright (C) 2017-2019 Belledonne Communications, Grenoble, France
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Created on: Nov 6, 2019
* Author: Nicolas Michon
*/
#include "linphone/linphonecore.h"
#include "mediastreamer2/msvolume.h"
#include "mediastreamer2/mssndcard.h"
#include "mediastreamer2/msticker.h"
#include "components/core/CoreManager.hpp"
#include "MediastreamerUtils.hpp"
using namespace MediastreamerUtils;
SimpleCaptureGraph::SimpleCaptureGraph(const std::string &capture, const std::string &playback)
: captureCardId(capture), playbackCardId(playback)
{
LinphoneCore *ccore = CoreManager::getInstance()->getCore()->cPtr();
msFactory = linphone_core_get_ms_factory(ccore);
playbackCard = ms_snd_card_manager_get_card(ms_factory_get_snd_card_manager(msFactory), playbackCardId.c_str());
captureCard = ms_snd_card_manager_get_card(ms_factory_get_snd_card_manager(msFactory), captureCardId.c_str());
init();
}
SimpleCaptureGraph::~SimpleCaptureGraph()
{
destroy();
}
void SimpleCaptureGraph::init() {
if (!audioCapture) {
audioCapture = ms_snd_card_create_reader(captureCard);
}
if (!audioSink) {
audioSink = ms_snd_card_create_writer(playbackCard);
}
if (!captureVolumeFilter) {
captureVolumeFilter = ms_factory_create_filter(msFactory, MS_VOLUME_ID);
}
if (!playbackVolumeFilter) {
playbackVolumeFilter = ms_factory_create_filter(msFactory, MS_VOLUME_ID);
}
ms_filter_link(audioCapture, 0, captureVolumeFilter, 0);
ms_filter_link(captureVolumeFilter, 0, playbackVolumeFilter, 0);
ms_filter_link(playbackVolumeFilter, 0, audioSink, 0);
//Mute playback
float muteGain = 0.0f;
ms_filter_call_method(playbackVolumeFilter, MS_VOLUME_SET_GAIN, &muteGain);
ticker = ms_ticker_new();
running = false;
}
void SimpleCaptureGraph::start() {
if (!running) {
ms_ticker_attach(ticker, audioCapture);
running = true;
}
}
void SimpleCaptureGraph::stop() {
if (running) {
ms_ticker_detach(ticker, audioCapture);
running = false;
}
}
void SimpleCaptureGraph::destroy() {
if (running) {
stop();
}
ms_ticker_destroy(ticker);
ms_filter_unlink(audioCapture, 0, captureVolumeFilter, 0);
ms_filter_unlink(captureVolumeFilter, 0, playbackVolumeFilter, 0);
ms_filter_unlink(playbackVolumeFilter, 0, audioSink, 0);
ms_free(audioCapture);
ms_free(captureVolumeFilter);
ms_free(audioSink);
ms_free(playbackVolumeFilter);
}
float SimpleCaptureGraph::getCaptureGain() {
float gain = 0.0f;
if (isRunning() && audioCapture) {
ms_filter_call_method(audioCapture, MS_AUDIO_CAPTURE_GET_VOLUME_GAIN, &gain);
}
return gain;
}
void SimpleCaptureGraph::setCaptureGain(float gain) {
if (isRunning() && audioCapture) {
ms_filter_call_method(audioCapture, MS_AUDIO_CAPTURE_SET_VOLUME_GAIN, &gain);
}
}
float SimpleCaptureGraph::getPlaybackGain() {
float gain = 0.0f;
if (isRunning() && audioSink) {
ms_filter_call_method(audioSink, MS_AUDIO_PLAYBACK_GET_VOLUME_GAIN, &gain);
}
return gain;
}
void SimpleCaptureGraph::setPlaybackGain(float gain) {
if (isRunning() && audioSink) {
ms_filter_call_method(audioSink, MS_AUDIO_PLAYBACK_SET_VOLUME_GAIN, &gain);
}
}
float SimpleCaptureGraph::getCaptureVolume() {
float vol = 0;
if (captureVolumeFilter) {
ms_filter_call_method(captureVolumeFilter, MS_VOLUME_GET, &vol);
vol = MediastreamerUtils::dbToLinear(vol);
}
return vol;
}

View file

@ -0,0 +1,102 @@
/*
* MediastreamerUtils.hpp
* Copyright (C) 2017-2019 Belledonne Communications, Grenoble, France
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Created on: Nov 6, 2019
* Author: Nicolas Michon
*/
#ifndef MEDIASTREAMER_UTILS_H_
#define MEDIASTREAMER_UTILS_H_
#include <cmath>
#include "mediastreamer2/mssndcard.h"
#include "mediastreamer2/msvolume.h"
#include "mediastreamer2/msfilter.h"
#include "mediastreamer2/msticker.h"
#include <linphone++/linphone.hh>
// =============================================================================
namespace MediastreamerUtils {
inline float computeVu (float volume) {
constexpr float VuMin = -20.f;
constexpr float VuMax = 4.f;
if (volume < VuMin)
return 0.f;
if (volume > VuMax)
return 1.f;
return (volume - VuMin) / (VuMax - VuMin);
}
inline float dbToLinear(float volume) {
return static_cast<float>(pow(10, volume / 10));
}
inline float linearToDb(float volume) {
if (volume == 0.0f) {
return MS_VOLUME_DB_LOWEST;
}
return static_cast<float>(10 * log10(volume));
}
//Simple mediastreamer audio capture graph
//Used to get current microphone volume in audio settings
class SimpleCaptureGraph {
public:
SimpleCaptureGraph(const std::string &captureCardId, const std::string &playbackCardId);
~SimpleCaptureGraph();
void start();
void stop();
float getCaptureVolume();
float getCaptureGain();
float getPlaybackGain();
void setCaptureGain(float volume);
void setPlaybackGain(float volume);
bool isRunning() const {
return running;
}
protected:
void init();
void destroy();
bool running = false;
std::string captureCardId;
std::string playbackCardId;
MSFilter *audioSink = nullptr;
MSFilter *audioCapture = nullptr;
MSFilter *captureVolumeFilter = nullptr;
MSFilter *playbackVolumeFilter = nullptr;
MSTicker *ticker = nullptr;
MSSndCard *playbackCard = nullptr;
MSSndCard *captureCard = nullptr;
MSFactory *msFactory = nullptr;
};
}
#endif // ifndef MEDIASTREAMER_UTILS_H_

View file

@ -17,6 +17,7 @@ Item {
property bool useStates: true
property int iconSize // Optional.
readonly property alias hovered: button.hovered
property alias text: button.text
// If `useStates` = true, the used icons are:
// `icon`_pressed, `icon`_hovered and `icon`_normal.
@ -51,7 +52,7 @@ Item {
// ---------------------------------------------------------------------------
height: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.width
Button {
id: button

View file

@ -5,6 +5,7 @@ import QtQuick 2.7
Item {
property alias updating: actionButton.updating
property alias useStates: actionButton.useStates
property alias text: actionButton.text
property bool enabled: true
property int iconSize // Optionnal.
property string icon
@ -16,7 +17,7 @@ Item {
// ---------------------------------------------------------------------------
height: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.width
ActionButton {
id: actionButton

View file

@ -1,5 +1,5 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick 2.7 as Core
import QtQuick.Controls 2.2 as Core
import Common 1.0
import Common.Styles 1.0
@ -7,7 +7,7 @@ import Utils 1.0
// =============================================================================
ToolTip {
Core.ToolTip {
id: tooltip
property var _edge: 'left'
@ -78,7 +78,7 @@ ToolTip {
// ---------------------------------------------------------------------------
background: Item {
background: Core.Item {
id: container
layer {
@ -86,7 +86,7 @@ ToolTip {
effect: PopupShadow {}
}
Rectangle {
Core.Rectangle {
anchors {
fill: parent
margins: TooltipStyle.margins
@ -97,10 +97,10 @@ ToolTip {
// Do not use `Icon` component to access to `implicitHeight`
// and `implicitWidth`.
Image {
Core.Image {
id: icon
fillMode: Image.PreserveAspectFit
fillMode: Core.Image.PreserveAspectFit
height: TooltipStyle.arrowSize
source: _edge
? Utils.resolveImageUri('tooltip_arrow_' + _edge)
@ -111,11 +111,11 @@ ToolTip {
width: TooltipStyle.arrowSize
z: Constants.zMax
onStatusChanged: status === Image.Ready && _setArrowPosition()
onStatusChanged: status === Core.Image.Ready && _setArrowPosition()
}
}
contentItem: Text {
contentItem: Core.Text {
id: text
color: TooltipStyle.color

View file

@ -81,6 +81,8 @@ PopupShadow 1.0 Popup/PopupShadow.qml
TooltipArea 1.0 Tooltip/TooltipArea.qml
ToolTip 1.0 Tooltip/Tooltip.qml
ScrollableListView 1.0 View/ScrollableListView.qml
ApplicationWindow 1.0 Window/ApplicationWindow.qml

View file

@ -17,7 +17,7 @@ Window {
// ---------------------------------------------------------------------------
// `{}` is a workaround to avoid `TypeError: Cannot read property...`.
// `{}` is a workaround to avoid `TypeError: Cannot read property...` when calls list is empty
readonly property var call: calls.selectedCall || ({
callError: '',
isOutgoing: true,

View file

@ -1,4 +1,5 @@
import QtQuick 2.7
import QtQuick.Controls 2.7
import QtQuick.Layouts 1.3
import Common 1.0
@ -67,10 +68,17 @@ DialogPlus {
}
Slider {
id: playbackSlider
width: parent.width
Component.onCompleted: value = call.speakerVolumeGain
onPositionChanged: call.speakerVolumeGain = position
ToolTip {
parent: playbackSlider.handle
visible: playbackSlider.pressed
text: (playbackSlider.value * 100).toFixed(0) + " %"
}
}
}
}
@ -103,10 +111,17 @@ DialogPlus {
}
Slider {
id: captureSlider
width: parent.width
Component.onCompleted: value = call.microVolumeGain
onPositionChanged: call.microVolumeGain = position
ToolTip {
parent: captureSlider.handle
visible: captureSlider.pressed
text: "+ " + (captureSlider.value * 100).toFixed(0) + " %"
}
}
}
}

View file

@ -129,6 +129,10 @@ ColumnLayout {
icon: 'history'
onClicked: sipAddressesMenu.open()
TooltipArea {
text: qsTr('tooltipShowConversation')
}
}
}

View file

@ -28,6 +28,10 @@ function getEditIcon () {
return conversation._sipAddressObserver.contact ? 'contact_edit' : 'contact_add'
}
function getEditTooltipText() {
return conversation._sipAddressObserver.contact ? qsTr('tooltipContactEdit') : qsTr('tooltipContactAdd')
}
function getUsername () {
return LinphoneUtils.getContactUsername(conversation._sipAddressObserver)
}

View file

@ -100,6 +100,9 @@ ColumnLayout {
onClicked: window.setView('ContactEdit', {
sipAddress: conversation.peerAddress
})
TooltipArea {
text: Logic.getEditTooltipText()
}
}
ActionButton {
@ -107,6 +110,10 @@ ColumnLayout {
iconSize: ConversationStyle.bar.actions.edit.iconSize
onClicked: Logic.removeAllEntries()
TooltipArea {
text: qsTr('cleanHistory')
}
}
}
}

View file

@ -81,6 +81,13 @@ DialogPlus {
itemIcon: Logic.getItemIcon(flattenedModel)
width: parent.width
ActionButton {
icon: 'options'
iconSize: 30
anchors.fill: parent
//TODO handle click and jump to proxy config settings
}
onClicked: {
container.currentIndex = index
AccountSettingsModel.setDefaultProxyConfig(flattenedModel.proxyConfig)

View file

@ -180,6 +180,10 @@ ApplicationWindow {
visible: SettingsModel.conferenceEnabled
onClicked: Logic.openConferenceManager()
TooltipArea {
text: qsTr('newConferenceButton')
}
}
ActionButton {

View file

@ -1,4 +1,6 @@
import QtQuick 2.7
import QtQuick 2.7 as Core
import QtQuick.Controls 2.7 as Core
import QtQuick.Layouts 1.10 as Core
import Common 1.0
import Linphone 1.0
@ -9,7 +11,7 @@ import App.Styles 1.0
// =============================================================================
TabContainer {
Column {
Core.Column {
spacing: SettingsWindowStyle.forms.spacing
width: parent.width
@ -21,6 +23,28 @@ TabContainer {
title: qsTr('audioTitle')
width: parent.width
//Warning if in call
FormLine {
visible: SettingsModel.isInCall
FormGroup {
Core.RowLayout {
spacing: SettingsAudioStyle.warningMessage.iconSize
Icon {
icon: 'warning'
iconSize: SettingsAudioStyle.warningMessage.iconSize
anchors {
rightMargin: SettingsAudioStyle.warningMessage.iconSize
leftMargin: SettingsAudioStyle.warningMessage.iconSize
}
}
Core.Text {
text: qsTr('audioSettingsInCallWarning')
}
}
}
}
FormLine {
FormGroup {
label: qsTr('playbackDeviceLabel')
@ -36,6 +60,28 @@ TabContainer {
}
}
FormLine {
FormGroup {
label: qsTr('playbackGainLabel')
enabled: !SettingsModel.isInCall
Slider {
id: playbackSlider
width: parent.width
enabled: !SettingsModel.isInCall
Core.Component.onCompleted: value = SettingsModel.playbackGain
onPositionChanged: SettingsModel.playbackGain = position
Core.ToolTip {
parent: playbackSlider.handle
visible: playbackSlider.pressed
text: (playbackSlider.value * 100).toFixed(0) + " %"
}
}
}
}
FormLine {
FormGroup {
label: qsTr('captureDeviceLabel')
@ -51,11 +97,83 @@ TabContainer {
}
}
FormLine {
FormGroup {
label: qsTr('captureGainLabel')
Slider {
id: captureSlider
width: parent.width
enabled: !SettingsModel.isInCall
Core.Component.onCompleted: value = SettingsModel.captureGain
onPositionChanged: SettingsModel.captureGain = position
Core.ToolTip {
parent: captureSlider.handle
visible: captureSlider.pressed
text: (captureSlider.value * 100).toFixed(0) + " %"
}
}
}
}
FormLine {
FormGroup {
id: audioTestRow
label: qsTr('audioTestLabel')
visible: !SettingsModel.isInCall
Core.Slider {
id: audioTestSlider
enabled: false
width: parent.width
anchors {
leftMargin: SettingsAudioStyle.ringPlayer.leftMargin
}
background: Core.Rectangle {
x: audioTestSlider.leftPadding
y: audioTestSlider.topPadding + audioTestSlider.availableHeight / 2 - height / 2
implicitWidth: 200
implicitHeight: 8
width: audioTestSlider.availableWidth
height: implicitHeight
radius: 2
color: "#bdbebf"
Core.Rectangle {
width: audioTestSlider.visualPosition * parent.width
height: parent.height
color: audioTestSlider.value > 0.8 ? "#ff0000" : "#21be2b"
radius: 2
}
}
//Empty slider handle
handle: Core.Text {
text: ''
visible: false
}
Core.Timer {
interval: 50
repeat: true
running: SettingsModel.captureGraphRunning
onTriggered: parent.value = SettingsModel.getMicVolume()
}
}
}
}
FormLine {
FormGroup {
label: qsTr('ringerDeviceLabel')
ComboBox {
enabled: !SettingsModel.isInCall
currentIndex: Utils.findIndex(model, function (device) {
return device === SettingsModel.ringerDevice
})
@ -108,7 +226,7 @@ TabContainer {
}
}
Loader {
Core.Loader {
id: ringPlayer
active: window.visible

View file

@ -19,6 +19,8 @@ ApplicationWindow {
title: qsTr('settingsTitle')
onClosing: SettingsModel.settingsWindowClosing()
// ---------------------------------------------------------------------------
Shortcut {
@ -48,16 +50,21 @@ ApplicationWindow {
TabBar {
id: tabBar
onCurrentIndexChanged: SettingsModel.onSettingsTabChanged(currentIndex)
TabButton {
iconName: 'settings_sip_accounts'
text: qsTr('sipAccountsTab')
width: implicitWidth
}
//onClicked: SettingsModel.settingsButtonClicked("sip")
}
TabButton {
iconName: 'settings_audio'
text: qsTr('audioTab')
width: implicitWidth
//onClicked: SettingsModel.accessAudioSettings()
//onClicked: SettingsModel.settingsButtonClicked("audio")
}
TabButton {
@ -65,12 +72,15 @@ ApplicationWindow {
iconName: 'settings_video'
text: qsTr('videoTab')
width: implicitWidth
//onClicked: SettingsModel.accessVideoSettings()
//onClicked: SettingsModel.settingsButtonClicked("video")
}
TabButton {
iconName: 'settings_call'
text: qsTr('callsAndChatTab')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("call")
}
TabButton {
@ -78,18 +88,21 @@ ApplicationWindow {
iconName: 'settings_network'
text: qsTr('networkTab')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("network")
}
TabButton {
iconName: 'settings_advanced'
text: qsTr('uiTab')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("ui")
}
TabButton {
iconName: 'settings_advanced'
text: qsTr('uiAdvanced')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("advanced")
}
}

View file

@ -7,4 +7,7 @@ QtObject {
property QtObject ringPlayer: QtObject {
property int leftMargin: 10
}
property QtObject warningMessage: QtObject {
property int iconSize: 20
}
}