mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-17 03:18:07 +00:00
work in progress
This commit is contained in:
parent
9097ae1763
commit
0722aa64eb
43 changed files with 1580 additions and 2327 deletions
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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
90
assets/images/warning.svg
Normal 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 |
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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: <a href="%1">%1</a>
|
|||
calls, send a message or add a new contact. Just enter
|
||||
your friend'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'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
|
|
@ -615,6 +615,10 @@ Url du serveur non configurée.</translation>
|
|||
<source>abortEditDescriptionText</source>
|
||||
<translation>Êtes-vous sûr de vouloir annuler l'é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'historique</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CreateAppSipAccount</name>
|
||||
|
|
@ -961,6 +977,10 @@ Cliquez ici : <a href="%1">%1</a>
|
|||
<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'adresse SIP ou le nom d'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 : <a href="%1">%1</a>
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 šią 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: <a href="%1">%1</a>
|
|||
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>
|
||||
|
|
|
|||
|
|
@ -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: <a href="%1">%1</a>
|
|||
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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -615,6 +615,10 @@ Serverwebbadressen är inte konfigurerad.</translation>
|
|||
<source>abortEditDescriptionText</source>
|
||||
<translation>Är du säker på 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 på 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: <a href="%1">%1</a>
|
|||
<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: <a href="%1">%1</a>
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -615,6 +615,10 @@ Sunucu url'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'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: <a href="%1">%1</a>
|
|||
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>
|
||||
|
|
|
|||
|
|
@ -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
13
create_appimage.sh
Executable 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
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
141
src/utils/MediastreamerUtils.cpp
Normal file
141
src/utils/MediastreamerUtils.cpp
Normal 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;
|
||||
}
|
||||
102
src/utils/MediastreamerUtils.hpp
Normal file
102
src/utils/MediastreamerUtils.hpp
Normal 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_
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) + " %"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,6 +129,10 @@ ColumnLayout {
|
|||
icon: 'history'
|
||||
|
||||
onClicked: sipAddressesMenu.open()
|
||||
|
||||
TooltipArea {
|
||||
text: qsTr('tooltipShowConversation')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -180,6 +180,10 @@ ApplicationWindow {
|
|||
visible: SettingsModel.conferenceEnabled
|
||||
|
||||
onClicked: Logic.openConferenceManager()
|
||||
|
||||
TooltipArea {
|
||||
text: qsTr('newConferenceButton')
|
||||
}
|
||||
}
|
||||
|
||||
ActionButton {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,4 +7,7 @@ QtObject {
|
|||
property QtObject ringPlayer: QtObject {
|
||||
property int leftMargin: 10
|
||||
}
|
||||
property QtObject warningMessage: QtObject {
|
||||
property int iconSize: 20
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue