- New media settings panel in video conference and waiting room for device selection.

- Add a volume viewer for capture in media settings.
- Fix volumes synchronization between all settings panels.
- Allowing the use of capture graph from any place.
- Toggle button for Settings when menu is open.
This commit is contained in:
Julien Wadel 2022-05-05 18:21:44 +02:00
parent ccd21512c3
commit f7757dd8a3
36 changed files with 575 additions and 107 deletions

View file

@ -1454,6 +1454,13 @@ Klik her: <a href="%1">%1</a>
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Klicken Sie hier: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1445,6 +1445,13 @@ Kattintson ide: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>Rendben</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">Rendben</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Clicca: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1445,6 +1445,13 @@
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1463,6 +1463,13 @@ Spustelėkite čia: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>GERAI</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">GERAI</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Clique aqui: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<translation>ESTÁ BEM</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1463,6 +1463,13 @@
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1454,6 +1454,13 @@ Klicka här: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1450,6 +1450,13 @@ Buraya tıklayın: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>TAMAM</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1463,6 +1463,13 @@
<translation>Так</translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished">Так</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -1445,6 +1445,13 @@
<translation></translation>
</message>
</context>
<context>
<name>MultimediaParametersDialog</name>
<message>
<source>ok</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>

View file

@ -329,6 +329,7 @@
<file>ui/modules/Linphone/Contact/Contact.qml</file>
<file>ui/modules/Linphone/Dialog/OnlineInstallerDialog.qml</file>
<file>ui/modules/Linphone/Dialog/SipAddressDialog.qml</file>
<file>ui/modules/Linphone/Dialog/MultimediaParametersDialog.qml</file>
<file>ui/modules/Linphone/File/FileView.qml</file>
<file>ui/modules/Linphone/History/History.qml</file>
<file>ui/modules/Linphone/History/History.js</file>
@ -366,6 +367,7 @@
<file>ui/modules/Linphone/Styles/Contact/ContactDescriptionStyle.qml</file>
<file>ui/modules/Linphone/Styles/Contact/ContactMessageCounterStyle.qml</file>
<file>ui/modules/Linphone/Styles/Contact/ContactStyle.qml</file>
<file>ui/modules/Linphone/Styles/Dialog/MultimediaParametersDialogStyle.qml</file>
<file>ui/modules/Linphone/Styles/Dialog/OnlineInstallerDialogStyle.qml</file>
<file>ui/modules/Linphone/Styles/Dialog/SipAddressDialogStyle.qml</file>
<file>ui/modules/Linphone/Styles/History/HistoryStyle.qml</file>

View file

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

View file

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

View file

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

View file

@ -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<linphone::Config> mConfig;
};

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -392,6 +392,7 @@ Rectangle {
isCustom: true
backgroundRadius: width/2
colorSet: VideoConferenceStyle.buttons.options
toggled: rightMenu.visible
onClicked: rightMenu.visible = !rightMenu.visible
}
}

View file

@ -197,7 +197,7 @@ Window {
ActionButton{
isCustom: true
backgroundRadius: width/2
colorSet: VideoConferenceStyle.buttons.fullscreen
colorSet: VideoConferenceStyle.buttons.stopFullscreen
onClicked: window.exit()
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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