diff --git a/linphone-app/assets/languages/da.ts b/linphone-app/assets/languages/da.ts index 375bbc7d6..96fe42b36 100644 --- a/linphone-app/assets/languages/da.ts +++ b/linphone-app/assets/languages/da.ts @@ -1454,6 +1454,13 @@ Klik her: <a href="%1">%1</a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/de.ts b/linphone-app/assets/languages/de.ts index 30d2db494..e4d55b0dd 100644 --- a/linphone-app/assets/languages/de.ts +++ b/linphone-app/assets/languages/de.ts @@ -1454,6 +1454,13 @@ Klicken Sie hier: <a href="%1">%1</a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/en.ts b/linphone-app/assets/languages/en.ts index d83a142a0..a12ef5d7c 100644 --- a/linphone-app/assets/languages/en.ts +++ b/linphone-app/assets/languages/en.ts @@ -1454,6 +1454,13 @@ Click here: <a href="%1">%1</a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/es.ts b/linphone-app/assets/languages/es.ts index 9e7fae26a..83e9da2de 100644 --- a/linphone-app/assets/languages/es.ts +++ b/linphone-app/assets/languages/es.ts @@ -1454,6 +1454,13 @@ Haga clic aquí: <a href="%1">%1 </a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/fr_FR.ts b/linphone-app/assets/languages/fr_FR.ts index 73e851847..64eed8f38 100644 --- a/linphone-app/assets/languages/fr_FR.ts +++ b/linphone-app/assets/languages/fr_FR.ts @@ -1454,6 +1454,13 @@ Cliquez ici : <a href="%1">%1</a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/hu.ts b/linphone-app/assets/languages/hu.ts index 1c703f6c5..cabe2e860 100644 --- a/linphone-app/assets/languages/hu.ts +++ b/linphone-app/assets/languages/hu.ts @@ -1445,6 +1445,13 @@ Kattintson ide: <a href="%1">%1</a> Rendben + + MultimediaParametersDialog + + ok + Rendben + + NewChatRoom diff --git a/linphone-app/assets/languages/it.ts b/linphone-app/assets/languages/it.ts index 0d8f5103b..e5c2dd682 100644 --- a/linphone-app/assets/languages/it.ts +++ b/linphone-app/assets/languages/it.ts @@ -1454,6 +1454,13 @@ Clicca: <a href="%1">%1</a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/ja.ts b/linphone-app/assets/languages/ja.ts index 595a5cb06..1311caf7f 100644 --- a/linphone-app/assets/languages/ja.ts +++ b/linphone-app/assets/languages/ja.ts @@ -1445,6 +1445,13 @@ OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/lt.ts b/linphone-app/assets/languages/lt.ts index 39b5829b3..1f71b6ba0 100644 --- a/linphone-app/assets/languages/lt.ts +++ b/linphone-app/assets/languages/lt.ts @@ -1463,6 +1463,13 @@ Spustelėkite čia: <a href="%1">%1</a> GERAI + + MultimediaParametersDialog + + ok + GERAI + + NewChatRoom diff --git a/linphone-app/assets/languages/pt_BR.ts b/linphone-app/assets/languages/pt_BR.ts index 446c36e11..76a69505d 100644 --- a/linphone-app/assets/languages/pt_BR.ts +++ b/linphone-app/assets/languages/pt_BR.ts @@ -1454,6 +1454,13 @@ Clique aqui: <a href="%1">%1 </a> ESTÁ BEM + + MultimediaParametersDialog + + ok + + + NewChatRoom diff --git a/linphone-app/assets/languages/ru.ts b/linphone-app/assets/languages/ru.ts index 38afc7369..c85e64b0f 100644 --- a/linphone-app/assets/languages/ru.ts +++ b/linphone-app/assets/languages/ru.ts @@ -1463,6 +1463,13 @@ OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/sv.ts b/linphone-app/assets/languages/sv.ts index 68706bcb3..fc299a6fd 100644 --- a/linphone-app/assets/languages/sv.ts +++ b/linphone-app/assets/languages/sv.ts @@ -1454,6 +1454,13 @@ Klicka här: <a href="%1">%1</a> OK + + MultimediaParametersDialog + + ok + OK + + NewChatRoom diff --git a/linphone-app/assets/languages/tr.ts b/linphone-app/assets/languages/tr.ts index a22eab247..335c8bc0f 100644 --- a/linphone-app/assets/languages/tr.ts +++ b/linphone-app/assets/languages/tr.ts @@ -1450,6 +1450,13 @@ Buraya tıklayın: <a href="%1">%1</a> TAMAM + + MultimediaParametersDialog + + ok + + + NewChatRoom diff --git a/linphone-app/assets/languages/uk.ts b/linphone-app/assets/languages/uk.ts index c41d2e99c..cb22d2445 100644 --- a/linphone-app/assets/languages/uk.ts +++ b/linphone-app/assets/languages/uk.ts @@ -1463,6 +1463,13 @@ Так + + MultimediaParametersDialog + + ok + Так + + NewChatRoom diff --git a/linphone-app/assets/languages/zh_CN.ts b/linphone-app/assets/languages/zh_CN.ts index 7c3fee755..41d2ab197 100644 --- a/linphone-app/assets/languages/zh_CN.ts +++ b/linphone-app/assets/languages/zh_CN.ts @@ -1445,6 +1445,13 @@ + + MultimediaParametersDialog + + ok + + + NewChatRoom diff --git a/linphone-app/resources.qrc b/linphone-app/resources.qrc index a16d12d70..60600aa08 100644 --- a/linphone-app/resources.qrc +++ b/linphone-app/resources.qrc @@ -329,6 +329,7 @@ ui/modules/Linphone/Contact/Contact.qml ui/modules/Linphone/Dialog/OnlineInstallerDialog.qml ui/modules/Linphone/Dialog/SipAddressDialog.qml + ui/modules/Linphone/Dialog/MultimediaParametersDialog.qml ui/modules/Linphone/File/FileView.qml ui/modules/Linphone/History/History.qml ui/modules/Linphone/History/History.js @@ -366,6 +367,7 @@ ui/modules/Linphone/Styles/Contact/ContactDescriptionStyle.qml ui/modules/Linphone/Styles/Contact/ContactMessageCounterStyle.qml ui/modules/Linphone/Styles/Contact/ContactStyle.qml + ui/modules/Linphone/Styles/Dialog/MultimediaParametersDialogStyle.qml ui/modules/Linphone/Styles/Dialog/OnlineInstallerDialogStyle.qml ui/modules/Linphone/Styles/Dialog/SipAddressDialogStyle.qml ui/modules/Linphone/Styles/History/HistoryStyle.qml diff --git a/linphone-app/src/components/call/CallModel.cpp b/linphone-app/src/components/call/CallModel.cpp index 4a1fc68ce..82dc3d4c5 100644 --- a/linphone-app/src/components/call/CallModel.cpp +++ b/linphone-app/src/components/call/CallModel.cpp @@ -229,10 +229,12 @@ float CallModel::getSpeakerVolumeGain () const { void CallModel::setSpeakerVolumeGain (float volume) { Q_ASSERT(volume >= 0.0f && volume <= 1.0f); + float oldGain = getSpeakerVolumeGain(); if( mCall && mCall->getSpeakerVolumeGain() >= 0) mCall->setSpeakerVolumeGain(volume); else CoreManager::getInstance()->getSettingsModel()->setPlaybackGain(volume); + if( (int)(oldGain * 1000) != (int)(volume*1000)) emit speakerVolumeGainChanged(getSpeakerVolumeGain()); } @@ -245,11 +247,13 @@ float CallModel::getMicroVolumeGain () const { void CallModel::setMicroVolumeGain (float volume) { Q_ASSERT(volume >= 0.0f && volume <= 1.0f); + float oldGain = getMicroVolumeGain(); if(mCall && mCall->getMicrophoneVolumeGain() >= 0) mCall->setMicrophoneVolumeGain(volume); else CoreManager::getInstance()->getSettingsModel()->setCaptureGain(volume); - emit microVolumeGainChanged(getMicroVolumeGain()); + if( (int)(oldGain * 1000) != (int)(volume*1000)) + emit microVolumeGainChanged(getMicroVolumeGain()); } // ----------------------------------------------------------------------------- diff --git a/linphone-app/src/components/other/colors/ColorListModel.hpp b/linphone-app/src/components/other/colors/ColorListModel.hpp index 2f2bd531e..c296b242f 100644 --- a/linphone-app/src/components/other/colors/ColorListModel.hpp +++ b/linphone-app/src/components/other/colors/ColorListModel.hpp @@ -218,11 +218,13 @@ class ColorListModel : public ProxyListModel { ADD_COLOR("me_d_b_inv_bg", "transparent", "[M] Menu disabled button : inverse background") ADD_COLOR("me_h_b_inv_bg", "transparent", "[M] Menu hovered button : inverse background") ADD_COLOR("me_p_b_inv_bg", "transparent", "[M] Menu pressed button : inverse background") + ADD_COLOR("me_c_b_inv_bg", "#FF5E00", "[M] Menu checked button : inverse background") ADD_COLOR("me_n_b_inv_fg", "white", "[M] Menu normal button : inverse foreground") ADD_COLOR("me_d_b_inv_fg", "#80FFFFFF", "[M] Menu disabled button : inverse foreground") ADD_COLOR("me_h_b_inv_fg", "#B0FFFFFF", "[M] Menu hovered button : inverse foreground") - ADD_COLOR("me_p_b_inv_fg", "white", "[M] Menu pressed button : inverse foreground") + ADD_COLOR("me_p_b_inv_fg", "white", "[M] Menu pressed button : inverse foreground") + ADD_COLOR("me_c_b_inv_fg", "white", "[M] Menu checked button : inverse foreground") //------------------------------------- // Wave Play ADD_COLOR_WITH_LINK("w_n_b_bg", "", "[M] Wave play normal button : background", "ma_n_b_bg") diff --git a/linphone-app/src/components/settings/SettingsModel.cpp b/linphone-app/src/components/settings/SettingsModel.cpp index 429f7e2b2..e13916464 100644 --- a/linphone-app/src/components/settings/SettingsModel.cpp +++ b/linphone-app/src/components/settings/SettingsModel.cpp @@ -234,19 +234,34 @@ void SettingsModel::setDeviceName(const QString& deviceName){ // Audio. // ============================================================================= +void SettingsModel::resetCaptureGraph() { + deleteCaptureGraph(); + createCaptureGraph(); +} void SettingsModel::createCaptureGraph() { - if (mSimpleCaptureGraph) { - delete mSimpleCaptureGraph; - mSimpleCaptureGraph = nullptr; - } - if (!mSimpleCaptureGraph) { - mSimpleCaptureGraph = + mSimpleCaptureGraph = new MediastreamerUtils::SimpleCaptureGraph(Utils::appStringToCoreString(getCaptureDevice()), Utils::appStringToCoreString(getPlaybackDevice())); - } mSimpleCaptureGraph->start(); emit captureGraphRunningChanged(getCaptureGraphRunning()); } - +void SettingsModel::startCaptureGraph(){ + if(!mSimpleCaptureGraph) + createCaptureGraph(); + ++mCaptureGraphListenerCount; +} +void SettingsModel::stopCaptureGraph(){ + if(--mCaptureGraphListenerCount == 0) + deleteCaptureGraph(); +} +void SettingsModel::deleteCaptureGraph(){ + if (mSimpleCaptureGraph) { + if (mSimpleCaptureGraph->isRunning()) { + mSimpleCaptureGraph->stop(); + } + delete mSimpleCaptureGraph; + mSimpleCaptureGraph = nullptr; + } +} //Force a call on the 'detect' method of all audio filters, updating new or removed devices void SettingsModel::accessAudioSettings() { CoreManager::getInstance()->getCore()->reloadSoundDevices(); @@ -256,19 +271,13 @@ void SettingsModel::accessAudioSettings() { emit captureDeviceChanged(getCaptureDevice()); emit ringerDeviceChanged(getRingerDevice()); - if (!getIsInCall()) { - createCaptureGraph(); - } + //if (!getIsInCall()) { + startCaptureGraph(); + //} } void SettingsModel::closeAudioSettings() { - if (mSimpleCaptureGraph) { - if (mSimpleCaptureGraph->isRunning()) { - mSimpleCaptureGraph->stop(); - } - delete mSimpleCaptureGraph; - mSimpleCaptureGraph = nullptr; - } + stopCaptureGraph(); emit captureGraphRunningChanged(getCaptureGraphRunning()); } @@ -291,10 +300,13 @@ float SettingsModel::getPlaybackGain() const { } void SettingsModel::setPlaybackGain(float gain) { + float oldGain = getPlaybackGain(); CoreManager::getInstance()->getCore()->setPlaybackGainDb(MediastreamerUtils::linearToDb(gain)); if (mSimpleCaptureGraph && mSimpleCaptureGraph->isRunning()) { mSimpleCaptureGraph->setPlaybackGain(gain); } + if((int)(oldGain*1000) != (int)(gain*1000)) + emit playbackGainChanged(gain); } float SettingsModel::getCaptureGain() const { @@ -303,10 +315,13 @@ float SettingsModel::getCaptureGain() const { } void SettingsModel::setCaptureGain(float gain) { + float oldGain = getCaptureGain(); CoreManager::getInstance()->getCore()->setMicGainDb(MediastreamerUtils::linearToDb(gain)); if (mSimpleCaptureGraph && mSimpleCaptureGraph->isRunning()) { mSimpleCaptureGraph->setCaptureGain(gain); } + if((int)(oldGain *1000) != (int)(gain *1000)) + emit captureGainChanged(gain); } QStringList SettingsModel::getCaptureDevices () const { @@ -350,7 +365,7 @@ void SettingsModel::setCaptureDevice (const QString &device) { CoreManager::getInstance()->getCore()->setCaptureDevice(devId); CoreManager::getInstance()->getCore()->setInputAudioDevice(*audioDevice); emit captureDeviceChanged(device); - createCaptureGraph(); + resetCaptureGraph(); }else qWarning() << "Cannot set Capture device. The ID cannot be matched with an existant device : " << device; } @@ -374,7 +389,7 @@ void SettingsModel::setPlaybackDevice (const QString &device) { CoreManager::getInstance()->getCore()->setPlaybackDevice(devId); CoreManager::getInstance()->getCore()->setOutputAudioDevice(*audioDevice); emit playbackDeviceChanged(device); - createCaptureGraph(); + resetCaptureGraph(); }else qWarning() << "Cannot set Playback device. The ID cannot be matched with an existant device : " << device; } diff --git a/linphone-app/src/components/settings/SettingsModel.hpp b/linphone-app/src/components/settings/SettingsModel.hpp index c2f373cee..bc9ab3b87 100644 --- a/linphone-app/src/components/settings/SettingsModel.hpp +++ b/linphone-app/src/components/settings/SettingsModel.hpp @@ -269,8 +269,12 @@ public: void setDeviceName(const QString& deviceName); // Audio. -------------------------------------------------------------------- - + + Q_INVOKABLE void startCaptureGraph(); + Q_INVOKABLE void stopCaptureGraph(); + Q_INVOKABLE void resetCaptureGraph(); void createCaptureGraph(); + void deleteCaptureGraph(); bool getCaptureGraphRunning(); void accessAudioSettings(); void closeAudioSettings(); @@ -725,6 +729,7 @@ signals: private: int mCurrentSettingsTab = 0; MediastreamerUtils::SimpleCaptureGraph *mSimpleCaptureGraph = nullptr; + int mCaptureGraphListenerCount = 0; std::shared_ptr mConfig; }; diff --git a/linphone-app/ui/modules/Common/Dialog/DialogPlus.qml b/linphone-app/ui/modules/Common/Dialog/DialogPlus.qml index de5efe688..8600922f9 100644 --- a/linphone-app/ui/modules/Common/Dialog/DialogPlus.qml +++ b/linphone-app/ui/modules/Common/Dialog/DialogPlus.qml @@ -15,7 +15,8 @@ Rectangle { property alias title : titleBar.text //Optionnal. Show a title bar with a close button. property alias descriptionText: description.text // Optionnal. property int buttonsAlignment : Qt.AlignLeft - property bool flat : false // Remove margins + property bool flat : false + property bool showMargins: !flat property bool expandHeight: flat property alias showCloseCross : titleBar.showCloseCross @@ -51,7 +52,7 @@ Rectangle { color: DialogStyle.color layer { - enabled: true + enabled: !dialog.flat effect: PopupShadow {} } @@ -71,6 +72,7 @@ Rectangle { DialogTitle{ id:titleBar //Layout.fillHeight: dialog.contentIsEmpty + flat: dialog.flat showCloseCross:dialog.showCloseCross Layout.fillWidth: true onClose: exitStatus(0) @@ -89,8 +91,8 @@ Rectangle { Layout.fillHeight: (expandHeight ? true : !dialog.contentIsEmpty) Layout.fillWidth: true - Layout.leftMargin: (flat ? 0 : DialogStyle.content.leftMargin) - Layout.rightMargin: (flat ? 0 : DialogStyle.content.rightMargin) + Layout.leftMargin: (showMargins ? DialogStyle.content.leftMargin : 0) + Layout.rightMargin: (showMargins ? DialogStyle.content.rightMargin : 0) } RowLayout { diff --git a/linphone-app/ui/modules/Common/Dialog/DialogTitle.qml b/linphone-app/ui/modules/Common/Dialog/DialogTitle.qml index 99b5c59f5..f7d253785 100644 --- a/linphone-app/ui/modules/Common/Dialog/DialogTitle.qml +++ b/linphone-app/ui/modules/Common/Dialog/DialogTitle.qml @@ -16,9 +16,10 @@ Item { property alias text: title.text property bool showBar : text != '' property bool showCloseCross: showBar + property bool flat: false signal close() - height: 30 + height: showBar || showCloseCross ? (flat ? 60 : 30) : 0 Rectangle{ anchors.fill:parent @@ -26,7 +27,7 @@ Item { GradientStop { position: 0.0; color: DialogStyle.title.lowGradient } GradientStop { position: 1.0; color: DialogStyle.title.highGradient } } - visible:showBar + visible:showBar && !flat } Text { id: title @@ -39,7 +40,8 @@ Item { color: DialogStyle.description.color //font.pointSize: DialogStyle.description.pointSize - font.pointSize: Units.dp * 10 + font.pointSize: !flat ? Units.dp * 10 : Units.dp * 14 + font.weight: !flat ? Font.Normal : Font.Bold horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: Text.WordWrap diff --git a/linphone-app/ui/modules/Common/Form/Slider.qml b/linphone-app/ui/modules/Common/Form/Slider.qml index 21930f1df..f188bd744 100644 --- a/linphone-app/ui/modules/Common/Form/Slider.qml +++ b/linphone-app/ui/modules/Common/Form/Slider.qml @@ -6,47 +6,54 @@ import Common.Styles 1.0 // ============================================================================= Controls.Slider { - id: slider + id: slider + property alias backgroundImplicitHeight: backgroundItem.implicitHeight + property alias backgroundImplicitWidth: backgroundItem.implicitWidth - background: Rectangle { - color: SliderStyle.background.color + property alias handleImplicitHeight: handleItem.implicitHeight + property alias handleImplicitWidth: handleItem.implicitWidth - x: slider.leftPadding - y: slider.topPadding + slider.availableHeight / 2 - height / 2 + background: Rectangle { + id: backgroundItem + color: SliderStyle.background.color - implicitHeight: SliderStyle.background.height - implicitWidth: SliderStyle.background.width + x: slider.leftPadding + y: slider.topPadding + slider.availableHeight / 2 - height / 2 - height: implicitHeight - width: slider.availableWidth + implicitHeight: SliderStyle.background.height + implicitWidth: SliderStyle.background.width - radius: SliderStyle.background.radius + height: implicitHeight + width: slider.availableWidth - Rectangle { - color: SliderStyle.background.content.color + radius: SliderStyle.background.radius - height: parent.height - width: slider.visualPosition * parent.width + Rectangle { + color: SliderStyle.background.content.color - radius: SliderStyle.background.content.radius - } - } + height: parent.height + width: slider.visualPosition * parent.width - handle: Rectangle { - border.color: slider.pressed - ? SliderStyle.handle.border.color.pressed - : SliderStyle.handle.border.color.normal + radius: SliderStyle.background.content.radius + } + } - color: slider.pressed - ? SliderStyle.handle.color.pressed - : SliderStyle.handle.color.normal + handle: Rectangle { + id: handleItem + border.color: slider.pressed + ? SliderStyle.handle.border.color.pressed + : SliderStyle.handle.border.color.normal - x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) - y: slider.topPadding + slider.availableHeight / 2 - height / 2 + color: slider.pressed + ? SliderStyle.handle.color.pressed + : SliderStyle.handle.color.normal - implicitWidth: SliderStyle.handle.width - implicitHeight: SliderStyle.handle.height + x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) + y: slider.topPadding + slider.availableHeight / 2 - height / 2 - radius: SliderStyle.handle.radius - } + implicitWidth: SliderStyle.handle.width + implicitHeight: SliderStyle.handle.height + + radius: SliderStyle.handle.radius + } } diff --git a/linphone-app/ui/modules/Linphone/Dialog/MultimediaParametersDialog.qml b/linphone-app/ui/modules/Linphone/Dialog/MultimediaParametersDialog.qml new file mode 100644 index 000000000..50404512e --- /dev/null +++ b/linphone-app/ui/modules/Linphone/Dialog/MultimediaParametersDialog.qml @@ -0,0 +1,205 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.7 +import QtQuick.Layouts 1.3 + +import Common 1.0 +import Common.Styles 1.0 +import Linphone 1.0 +import Linphone.Styles 1.0 +import Utils 1.0 + +import App.Styles 1.0 + +// ============================================================================= + +DialogPlus { + property var call + property bool fixedSize : true + + property int fitHeight: MultimediaParametersDialogStyle.height+30 + property int fitWidth: MultimediaParametersDialogStyle.width + // --------------------------------------------------------------------------- + + buttons: [ + TextButtonB { + text: qsTr('ok') + + onClicked: { + if(call) + call.updateStreams() + exit(0) + } + } + ] + + buttonsAlignment: Qt.AlignCenter + Component.onCompleted: { + SettingsModel.startCaptureGraph() + if( fixedSize){ + height = fitHeight + width = fitWidth + } + } + Component.onDestruction: SettingsModel.stopCaptureGraph() + onCallChanged: !call && exit(0) + + // --------------------------------------------------------------------------- + + Column { + anchors.fill: parent + anchors.topMargin: MultimediaParametersDialogStyle.column.spacing + spacing: MultimediaParametersDialogStyle.column.spacing + + RowLayout { + spacing: MultimediaParametersDialogStyle.column.entry.spacing + width: parent.width + + Icon { + Layout.alignment: Qt.AlignTop + Layout.preferredHeight: ComboBoxStyle.background.height + + icon: MultimediaParametersDialogStyle.column.entry.speaker.icon + overwriteColor: MultimediaParametersDialogStyle.column.entry.speaker.color + iconSize: MultimediaParametersDialogStyle.column.entry.speaker.iconSize + } + + Column { + Layout.fillWidth: true + + spacing: MultimediaParametersDialogStyle.column.entry.spacing2 + + ComboBox { + currentIndex: Utils.findIndex(model, function (device) { + return device === SettingsModel.playbackDevice + }) + model: SettingsModel.playbackDevices + width: parent.width + + onActivated: SettingsModel.playbackDevice = model[index] + } + + Slider { + id: playbackSlider + width: parent.width + + value: call ? value = call.speakerVolumeGain : value = SettingsModel.playbackGain + onPositionChanged: if(call) + call.speakerVolumeGain = position + else + SettingsModel.playbackGain = position + + ToolTip { + parent: playbackSlider.handle + visible: playbackSlider.pressed + text: (playbackSlider.value * 100).toFixed(0) + " %" + } + } + } + } + + RowLayout { + spacing: MultimediaParametersDialogStyle.column.entry.spacing + width: parent.width + + Icon { + Layout.alignment: Qt.AlignTop + Layout.preferredHeight: ComboBoxStyle.background.height + + icon: MultimediaParametersDialogStyle.column.entry.micro.icon + overwriteColor: MultimediaParametersDialogStyle.column.entry.micro.color + iconSize: MultimediaParametersDialogStyle.column.entry.micro.iconSize + } + + Column { + Layout.fillWidth: true + + spacing: MultimediaParametersDialogStyle.column.entry.spacing2 + + ComboBox { + currentIndex: Utils.findIndex(model, function (device) { + return device === SettingsModel.captureDevice + }) + model: SettingsModel.captureDevices + width: parent.width + + onActivated: SettingsModel.captureDevice = model[index] + } + + Slider { + id: captureSlider + width: parent.width + value: call ? call.microVolumeGain : SettingsModel.captureGain + + onPositionChanged: if(call) + call.microVolumeGain = position + else + SettingsModel.captureGain = position + + ToolTip { + parent: captureSlider.handle + visible: captureSlider.pressed + text: "+ " + (captureSlider.value * 100).toFixed(0) + " %" + } + } + Slider { + id: audioTestSlider + + enabled: false + width: parent.width + height: 8 + + background: Rectangle { + x: audioTestSlider.leftPadding + y: audioTestSlider.topPadding + audioTestSlider.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 8 + width: audioTestSlider.availableWidth + height: implicitHeight + radius: 2 + color: SettingsAudioStyle.sliderBackgroundColor + + Rectangle { + width: audioTestSlider.visualPosition * parent.width + height: parent.height + color: audioTestSlider.value > 0.8 ? SettingsAudioStyle.sliderHighColor : SettingsAudioStyle.sliderLowColor + radius: 2 + } + } + + //Empty slider handle + handle: Text {text: ''; visible: false } + + Timer { + interval: 50 + repeat: true + running: SettingsModel.captureGraphRunning || call + + onTriggered: call ? parent.value = call.microVu : parent.value = SettingsModel.getMicVolume() + } + } + } + } + + RowLayout { + spacing: MultimediaParametersDialogStyle.column.entry.spacing + width: parent.width + + Icon { + icon: MultimediaParametersDialogStyle.column.entry.camera.icon + overwriteColor: MultimediaParametersDialogStyle.column.entry.camera.color + iconSize: MultimediaParametersDialogStyle.column.entry.speaker.iconSize + } + + ComboBox { + Layout.fillWidth: true + + currentIndex: Number(Utils.findIndex(model, function (device) { + return device === SettingsModel.videoDevice + })) + model: SettingsModel.videoDevices + + onActivated: SettingsModel.videoDevice = model[index] + } + } + } +} diff --git a/linphone-app/ui/modules/Linphone/Styles/Dialog/MultimediaParametersDialogStyle.qml b/linphone-app/ui/modules/Linphone/Styles/Dialog/MultimediaParametersDialogStyle.qml new file mode 100644 index 000000000..4a2befceb --- /dev/null +++ b/linphone-app/ui/modules/Linphone/Styles/Dialog/MultimediaParametersDialogStyle.qml @@ -0,0 +1,39 @@ +pragma Singleton +import QtQml 2.2 +import ColorsList 1.0 +// ============================================================================= + +QtObject { + property string sectionName: 'MultimediaParamsDialog' + property int height: 312 + property int width: 450 + + property QtObject column: QtObject { + property int spacing: 15 + + property QtObject entry: QtObject { + property int iconSize: 24 + property int spacing: 10 + property int spacing2: 5 + property QtObject speaker: QtObject { + property int iconSize: 30 + property string icon : 'speaker_on_custom' + property string name : 'speaker' + property color color : ColorsList.addImageColor(sectionName+'_'+name, icon, 'g').color + } + property QtObject micro: QtObject { + property int iconSize: 30 + property string icon : 'micro_on_custom' + property string name : 'micro' + property color color : ColorsList.addImageColor(sectionName+'_'+name, icon, 'g').color + } + property QtObject camera: QtObject { + property int iconSize: 30 + property string icon : 'camera_on_custom' + property string name : 'camera' + property color color : ColorsList.addImageColor(sectionName+'_'+name, icon, 'g').color + } + } + } + +} diff --git a/linphone-app/ui/modules/Linphone/Styles/qmldir b/linphone-app/ui/modules/Linphone/Styles/qmldir index 67fab4607..929a90265 100644 --- a/linphone-app/ui/modules/Linphone/Styles/qmldir +++ b/linphone-app/ui/modules/Linphone/Styles/qmldir @@ -31,6 +31,7 @@ singleton ContactDescriptionStyle 1.0 Contact/ContactDescriptionSty singleton ContactMessageCounterStyle 1.0 Contact/ContactMessageCounterStyle.qml singleton ContactStyle 1.0 Contact/ContactStyle.qml +singleton MultimediaParametersDialogStyle 1.0 Dialog/MultimediaParametersDialogStyle.qml singleton OnlineInstallerDialogStyle 1.0 Dialog/OnlineInstallerDialogStyle.qml singleton SipAddressDialogStyle 1.0 Dialog/SipAddressDialogStyle.qml diff --git a/linphone-app/ui/modules/Linphone/qmldir b/linphone-app/ui/modules/Linphone/qmldir index 5b712677e..6de91ac0a 100644 --- a/linphone-app/ui/modules/Linphone/qmldir +++ b/linphone-app/ui/modules/Linphone/qmldir @@ -6,51 +6,52 @@ module Linphone # Components ------------------------------------------------------------------- -AccountStatus 1.0 Account/AccountStatus.qml +AccountStatus 1.0 Account/AccountStatus.qml -CardBlock 1.0 Blocks/CardBlock.qml -RequestBlock 1.0 Blocks/RequestBlock.qml +CardBlock 1.0 Blocks/CardBlock.qml +RequestBlock 1.0 Blocks/RequestBlock.qml -Calls 1.0 Calls/Calls.qml -CallStatistics 1.0 Calls/CallStatistics.qml -IncallAvatar 1.0 Calls/IncallAvatar.qml +Calls 1.0 Calls/Calls.qml +CallStatistics 1.0 Calls/CallStatistics.qml +IncallAvatar 1.0 Calls/IncallAvatar.qml -CameraItem 1.0 Camera/CameraItem.qml -CameraView 1.0 Camera/CameraView.qml +CameraItem 1.0 Camera/CameraItem.qml +CameraView 1.0 Camera/CameraView.qml -Chat 1.0 Chat/Chat.qml -ChatAudioMessage 1.0 Chat/ChatAudioMessage.qml -ChatAudioPreview 1.0 Chat/ChatAudioPreview.qml -ChatCalendarMessage 1.0 Chat/ChatCalendarMessage.qml -ChatMessagePreview 1.0 Chat/ChatMessagePreview.qml -ChatForwardMessage 1.0 Chat/ChatForwardMessage.qml -ChatReplyMessage 1.0 Chat/ChatReplyMessage.qml -ChatReplyPreview 1.0 Chat/ChatReplyPreview.qml +Chat 1.0 Chat/Chat.qml +ChatAudioMessage 1.0 Chat/ChatAudioMessage.qml +ChatAudioPreview 1.0 Chat/ChatAudioPreview.qml +ChatCalendarMessage 1.0 Chat/ChatCalendarMessage.qml +ChatMessagePreview 1.0 Chat/ChatMessagePreview.qml +ChatForwardMessage 1.0 Chat/ChatForwardMessage.qml +ChatReplyMessage 1.0 Chat/ChatReplyMessage.qml +ChatReplyPreview 1.0 Chat/ChatReplyPreview.qml -CodecsViewer 1.0 Codecs/CodecsViewer.qml +CodecsViewer 1.0 Codecs/CodecsViewer.qml -Avatar 1.0 Contact/Avatar.qml -Contact 1.0 Contact/Contact.qml -ContactDescription 1.0 Contact/ContactDescription.qml +Avatar 1.0 Contact/Avatar.qml +Contact 1.0 Contact/Contact.qml +ContactDescription 1.0 Contact/ContactDescription.qml -SipAddressDialog 1.0 Dialog/SipAddressDialog.qml +SipAddressDialog 1.0 Dialog/SipAddressDialog.qml +MultimediaParametersDialog 1.0 Dialog/MultimediaParametersDialog.qml -FileView 1.0 File/FileView.qml +FileView 1.0 File/FileView.qml -History 1.0 History/History.qml +History 1.0 History/History.qml -SipAddressesMenu 1.0 Menus/SipAddressesMenu.qml +SipAddressesMenu 1.0 Menus/SipAddressesMenu.qml -MessageCounter 1.0 Misc/MessageCounter.qml +MessageCounter 1.0 Misc/MessageCounter.qml -PresenceLevel 1.0 Presence/PresenceLevel.qml +PresenceLevel 1.0 Presence/PresenceLevel.qml -SmartSearchBar 1.0 SmartSearchBar/SmartSearchBar.qml +SmartSearchBar 1.0 SmartSearchBar/SmartSearchBar.qml -TelKeypad 1.0 TelKeypad/TelKeypad.qml +TelKeypad 1.0 TelKeypad/TelKeypad.qml -Timeline 1.0 Timeline/Timeline.qml +Timeline 1.0 Timeline/Timeline.qml -SipAddressesView 1.0 View/SipAddressesView.qml +SipAddressesView 1.0 View/SipAddressesView.qml -ParticipantsView 1.0 View/ParticipantsView.qml +ParticipantsView 1.0 View/ParticipantsView.qml diff --git a/linphone-app/ui/views/App/Calls/VideoConference.qml b/linphone-app/ui/views/App/Calls/VideoConference.qml index 16e5529cc..f04eb1dd2 100644 --- a/linphone-app/ui/views/App/Calls/VideoConference.qml +++ b/linphone-app/ui/views/App/Calls/VideoConference.qml @@ -392,6 +392,7 @@ Rectangle { isCustom: true backgroundRadius: width/2 colorSet: VideoConferenceStyle.buttons.options + toggled: rightMenu.visible onClicked: rightMenu.visible = !rightMenu.visible } } diff --git a/linphone-app/ui/views/App/Calls/VideoConferenceFullscreen.qml b/linphone-app/ui/views/App/Calls/VideoConferenceFullscreen.qml index 27efc5994..5b2bf80af 100644 --- a/linphone-app/ui/views/App/Calls/VideoConferenceFullscreen.qml +++ b/linphone-app/ui/views/App/Calls/VideoConferenceFullscreen.qml @@ -197,7 +197,7 @@ Window { ActionButton{ isCustom: true backgroundRadius: width/2 - colorSet: VideoConferenceStyle.buttons.fullscreen + colorSet: VideoConferenceStyle.buttons.stopFullscreen onClicked: window.exit() } diff --git a/linphone-app/ui/views/App/Calls/VideoConferenceMenu.qml b/linphone-app/ui/views/App/Calls/VideoConferenceMenu.qml index 20548f72b..bd0150168 100644 --- a/linphone-app/ui/views/App/Calls/VideoConferenceMenu.qml +++ b/linphone-app/ui/views/App/Calls/VideoConferenceMenu.qml @@ -52,7 +52,7 @@ Rectangle{ } Text{ id: title - text: contentsStack.currentItem.objectName == 'settingsMenu' ? 'Paramètres' : 'Modifier la mise en page' + text: 'Paramètres' Layout.fillWidth: true Layout.preferredHeight: implicitHeight horizontalAlignment: Qt.AlignCenter @@ -77,6 +77,7 @@ Rectangle{ initialItem: settingsMenuComponent Layout.fillHeight: true Layout.fillWidth: true + onPopEnterChanged: if(nViews <= 1 ) title.text = 'Paramètres' } Component{ id: settingsMenuComponent @@ -85,7 +86,12 @@ Rectangle{ Layout.fillHeight: true Layout.fillWidth: true Repeater{ - model: [{text: 'Modifier la mise en page' + model: [ + {text: 'Régler les périphériques' + , icon: VideoConferenceMenuStyle.settingsIcons.mediaIcon + , nextPage:mediaMenu}, + + {text: 'Modifier la mise en page' , icon: (mainItem.callModel.videoEnabled ? (mainItem.callModel.conferenceVideoLayout == LinphoneEnums.ConferenceLayoutGrid ? VideoConferenceMenuStyle.settingsIcons.gridIcon : VideoConferenceMenuStyle.settingsIcons.activeSpeakerIcon) : VideoConferenceMenuStyle.settingsIcons.audioOnlyIcon) @@ -131,7 +137,10 @@ Rectangle{ } MouseArea{ anchors.fill: parent - onClicked: contentsStack.push(modelData.nextPage) + onClicked: { + title.text = modelData.text + contentsStack.push(modelData.nextPage) + } } } } @@ -141,6 +150,28 @@ Rectangle{ } } } + Component{ + id: mediaMenu + ColumnLayout{ + Layout.fillHeight: true + Layout.fillWidth: true + MultimediaParametersDialog{ + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: fitHeight + call: conference.callModel + flat: true + showMargins: true + expandHeight: false + fixedSize: false + onExitStatus: contentsStack.pop() + } + Item{// Spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + } + } Component{ id: layoutMenu ColumnLayout{ diff --git a/linphone-app/ui/views/App/Calls/WaitingRoom.qml b/linphone-app/ui/views/App/Calls/WaitingRoom.qml index e27e63040..97abc6370 100644 --- a/linphone-app/ui/views/App/Calls/WaitingRoom.qml +++ b/linphone-app/ui/views/App/Calls/WaitingRoom.qml @@ -35,17 +35,46 @@ Rectangle { font.pointSize: WaitingRoomStyle.title.pointSize horizontalAlignment: Qt.AlignCenter } - - Item{ + RowLayout{ id: loader Layout.fillWidth: true Layout.fillHeight: true - CameraView{ - id: previewLoader - showCloseButton: false - anchors.centerIn: parent - height: parent.height - width : height + Item{ + Layout.fillHeight: true + Layout.fillWidth: true + CameraView{ + id: previewLoader + showCloseButton: false + anchors.centerIn: parent + height: Math.min( parent.height, parent.width) + width : height + ActionButton{ + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 10 + anchors.rightMargin: 10 + isCustom: true + backgroundRadius: width/2 + colorSet: WaitingRoomStyle.buttons.options + toggled: mediaMenu.visible + onClicked: mediaMenu.visible = !mediaMenu.visible + } + } + } + MultimediaParametersDialog{ + id: mediaMenu + Layout.fillHeight: true + Layout.leftMargin: 10 + Layout.rightMargin: 10 + Layout.minimumHeight: fitHeight + Layout.minimumWidth: fitWidth + radius: 8 + flat: true + showMargins: true + fixedSize: false + onExitStatus: visible = false + visible: false + title: 'Régler les périphériques' } } // ------------------------------------------------------------------------- @@ -53,7 +82,8 @@ Rectangle { // ------------------------------------------------------------------------- RowLayout{ Layout.fillWidth: true - Layout.bottomMargin: 40 + Layout.topMargin: 25 + Layout.bottomMargin: 25 Layout.leftMargin: 25 Layout.rightMargin: 25 Item{ diff --git a/linphone-app/ui/views/App/Settings/SettingsAudio.qml b/linphone-app/ui/views/App/Settings/SettingsAudio.qml index f659e3edc..cd1fb94c4 100644 --- a/linphone-app/ui/views/App/Settings/SettingsAudio.qml +++ b/linphone-app/ui/views/App/Settings/SettingsAudio.qml @@ -71,7 +71,7 @@ TabContainer { width: parent.width enabled: !SettingsModel.isInCall - Component.onCompleted: value = SettingsModel.playbackGain + value: SettingsModel.playbackGain onPositionChanged: SettingsModel.playbackGain = position ToolTip { @@ -107,7 +107,7 @@ TabContainer { width: parent.width enabled: !SettingsModel.isInCall - Component.onCompleted: value = SettingsModel.captureGain + value: SettingsModel.captureGain onPositionChanged: SettingsModel.captureGain = position ToolTip { diff --git a/linphone-app/ui/views/App/Styles/Calls/CallsWindowStyle.qml b/linphone-app/ui/views/App/Styles/Calls/CallsWindowStyle.qml index ea7f3d963..f0bd8069e 100644 --- a/linphone-app/ui/views/App/Styles/Calls/CallsWindowStyle.qml +++ b/linphone-app/ui/views/App/Styles/Calls/CallsWindowStyle.qml @@ -6,7 +6,7 @@ import ColorsList 1.0 QtObject { property string sectionName: 'CallsWindow' - property int minimumHeight: 480 + property int minimumHeight: 640 property int minimumWidth: 960 property QtObject call: QtObject { diff --git a/linphone-app/ui/views/App/Styles/Calls/VideoConferenceMenuStyle.qml b/linphone-app/ui/views/App/Styles/Calls/VideoConferenceMenuStyle.qml index 8c659da52..bf2034906 100644 --- a/linphone-app/ui/views/App/Styles/Calls/VideoConferenceMenuStyle.qml +++ b/linphone-app/ui/views/App/Styles/Calls/VideoConferenceMenuStyle.qml @@ -43,6 +43,7 @@ QtObject { property string gridIcon: 'conference_layout_grid_custom' property string activeSpeakerIcon: 'conference_layout_active_speaker_custom' property string audioOnlyIcon: 'conference_audio_only_custom' + property string mediaIcon: 'micro_on_custom' property int width: 40 property int height: 40 } diff --git a/linphone-app/ui/views/App/Styles/Calls/VideoConferenceStyle.qml b/linphone-app/ui/views/App/Styles/Calls/VideoConferenceStyle.qml index f2d21371e..a6599176c 100644 --- a/linphone-app/ui/views/App/Styles/Calls/VideoConferenceStyle.qml +++ b/linphone-app/ui/views/App/Styles/Calls/VideoConferenceStyle.qml @@ -420,9 +420,11 @@ QtObject { property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_inv_bg').color + property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_c', icon, 'me_c_b_inv_bg').color property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_inv_fg').color property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color + property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_c', icon, 'me_c_b_inv_fg').color } //------------------------------------------------------------------------------ property QtObject closePreview: QtObject { diff --git a/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml b/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml index 77c40dc6c..3b1679a41 100644 --- a/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml +++ b/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml @@ -236,6 +236,19 @@ QtObject { property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg').color } + property QtObject options: QtObject { + property int iconSize: 40 + property string icon : 'options_custom' + property string name : 'options' + property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_n_b_bg').color + property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg').color + property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_p_b_bg').color + property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_c', icon, 's_p_b_bg').color + property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_n_b_fg').color + property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_n_b_fg').color + property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_p_b_fg').color + property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_c', icon, 's_p_b_fg').color + } /* property QtObject callsList: QtObject { property int iconSize: 40