Replace call quality percentage algorithm by a set of icons.

Upgrade Popup with a delay in order to avoid instant reopening with clicked events.
Change colors and checked behaviour of call statistics.
Fix action buttons layout on calls and buttons sizes (dialpad/call quality)
Add Participant view in video conference fullscreen mode and fix options toggle display.
This commit is contained in:
Julien Wadel 2022-06-29 19:47:19 +02:00
parent 0df78864d6
commit fc6d5b79c4
17 changed files with 731 additions and 367 deletions

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg10"
sodipodi:docname="call_quality_0_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs14" />
<sodipodi:namedview
id="namedview12"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="9.4659091"
inkscape:cx="26.093637"
inkscape:cy="39.721489"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg10" />
<g
id="g835"
transform="matrix(1.7307692,0,0,1.7307692,17.5,20)">
<rect
x="0.5"
y="12.5"
width="4.4499998"
height="9"
stroke="#000000"
id="rect2" />
<rect
x="7.5"
y="8.5"
width="4.4499998"
height="13"
stroke="#000000"
id="rect4" />
<rect
x="14.5"
y="4.5"
width="4.4499998"
height="17"
stroke="#000000"
id="rect6" />
<rect
x="21.5"
y="0.5"
width="4"
height="21"
stroke="#000000"
id="rect8" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg12"
sodipodi:docname="call_quality_1_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs16" />
<sodipodi:namedview
id="namedview14"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="9.4659091"
inkscape:cx="27.572629"
inkscape:cy="29.47419"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg12" />
<g
id="g838"
transform="matrix(1.7307692,0,0,1.7307692,17.5,20)">
<rect
x="0.5"
y="12.5"
width="4.4499998"
height="9"
stroke="#000000"
id="rect2" />
<rect
x="7.5"
y="8.5"
width="4.4499998"
height="13"
stroke="#000000"
id="rect4" />
<rect
x="14.5"
y="4.5"
width="4.4499998"
height="17"
stroke="#000000"
id="rect6" />
<rect
x="21.5"
y="0.5"
width="4"
height="21"
stroke="#000000"
id="rect8" />
<rect
x="0.5"
y="13.5"
width="4"
height="7"
fill="#000000"
stroke="#000000"
id="rect10" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg14"
sodipodi:docname="call_quality_2_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs18" />
<sodipodi:namedview
id="namedview16"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="37.863636"
inkscape:cx="12.703481"
inkscape:cy="10.986795"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg14" />
<g
id="g841"
transform="matrix(1.7307692,0,0,1.7307692,17.5,20)">
<rect
x="0.5"
y="12.5"
width="4.4499998"
height="9"
stroke="#000000"
id="rect2" />
<rect
x="7.5"
y="8.5"
width="4.4499998"
height="13"
stroke="#000000"
id="rect4" />
<rect
x="14.5"
y="4.5"
width="4.4499998"
height="17"
stroke="#000000"
id="rect6" />
<rect
x="21.5"
y="0.5"
width="4"
height="21"
stroke="#000000"
id="rect8" />
<rect
x="0.5"
y="13.5"
width="4"
height="7"
fill="#000000"
stroke="#000000"
id="rect10" />
<rect
x="7.5"
y="8.5"
width="4"
height="12"
fill="#000000"
stroke="#000000"
id="rect12" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg16"
sodipodi:docname="call_quality_3_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs20" />
<sodipodi:namedview
id="namedview18"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="37.863636"
inkscape:cx="12.703481"
inkscape:cy="19.438175"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg16" />
<g
id="g844"
transform="matrix(1.7307692,0,0,1.7307692,17.5,20)">
<rect
x="0.5"
y="12.5"
width="4.4499998"
height="9"
stroke="#000000"
id="rect2" />
<rect
x="7.5"
y="8.5"
width="4.4499998"
height="13"
stroke="#000000"
id="rect4" />
<rect
x="14.5"
y="4.5"
width="4.4499998"
height="17"
stroke="#000000"
id="rect6" />
<rect
x="21.5"
y="0.5"
width="4"
height="21"
stroke="#000000"
id="rect8" />
<rect
x="1.5"
y="13.5"
width="3"
height="7"
fill="#000000"
stroke="#000000"
id="rect10" />
<rect
x="8.5"
y="9.5"
width="3"
height="11"
fill="#000000"
stroke="#000000"
id="rect12" />
<rect
x="15.5"
y="5.5"
width="3"
height="15"
fill="#000000"
stroke="#000000"
id="rect14" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg18"
sodipodi:docname="call_quality_3_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs22" />
<sodipodi:namedview
id="namedview20"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="37.863636"
inkscape:cx="12.703481"
inkscape:cy="10.986795"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg18" />
<g
id="g847"
transform="matrix(1.7307692,0,0,1.7307692,17.5,20)">
<rect
x="0.5"
y="12.5"
width="4.4499998"
height="9"
stroke="#000000"
id="rect2" />
<rect
x="7.5"
y="8.5"
width="4.4499998"
height="13"
stroke="#000000"
id="rect4" />
<rect
x="14.5"
y="4.5"
width="4.4499998"
height="17"
stroke="#000000"
id="rect6" />
<rect
x="21.5"
y="0.5"
width="4"
height="21"
stroke="#000000"
id="rect8" />
<rect
x="1.5"
y="13.5"
width="3"
height="7"
fill="#000000"
stroke="#000000"
id="rect10" />
<rect
x="8.5"
y="9.5"
width="3"
height="11"
fill="#000000"
stroke="#000000"
id="rect12" />
<rect
x="15.5"
y="5.5"
width="3"
height="15"
fill="#000000"
stroke="#000000"
id="rect14" />
<rect
x="22.5"
y="1.5"
width="3"
height="19"
fill="#000000"
stroke="#000000"
id="rect16" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
version="1.1"
id="svg16"
sodipodi:docname="call_quality_custom.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata20">
<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>call_quality_custom</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="1131"
id="namedview18"
showgrid="false"
inkscape:zoom="4.5384615"
inkscape:cx="-30.516949"
inkscape:cy="37.237288"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="call_quality_custom"
inkscape:pagecheckerboard="0" />
<!-- Generator: Sketch 41 (35326) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">call_quality_custom</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;stroke-linecap:round"
transform="matrix(7.9999899,0,0,6.2557797,0,0.29056132)">
<g
id="call_quality_custom"
style="stroke:#6b7a86;stroke-width:2">
<path
d="M 1.201525,11.563552 V 5.1324526"
id="path8"
inkscape:connector-curvature="0"
style="stroke-width:2.40305372;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="M 4.9376248,11.537183 V 3.2399602"
id="path10"
inkscape:connector-curvature="0"
style="stroke-width:2.41245;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="M 8.8542434,11.560579 V 1.1347281"
id="path12"
inkscape:connector-curvature="0"
style="stroke-width:2.36235;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -4,8 +4,8 @@
height="80"
version="1.1"
id="svg8"
sodipodi:docname="conference_participants_custom.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="participants_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@ -23,18 +23,18 @@
showgrid="false"
inkscape:zoom="4.232442"
inkscape:cx="-17.602131"
inkscape:cy="66.982607"
inkscape:window-width="1852"
inkscape:window-height="1088"
inkscape:window-x="1983"
inkscape:window-y="355"
inkscape:window-maximized="0"
inkscape:cy="66.864472"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8" />
<g
fill="#000000"
fill-rule="nonzero"
id="g6"
transform="matrix(1.7307618,0,0,1.666979,17.500129,25)">
transform="matrix(2.3076824,0,0,2.2226387,10.000172,20)">
<path
d="m 5.469,15.664 c 1.396,0.418 2.83,0.685 4.25,0.827 a 20.538,20.538 0 0 0 2.697,0.105 h 0.13 l 0.163,0.005 c 0.656,0.019 1.536,-0.006 2.572,-0.11 1.42,-0.142 2.854,-0.409 4.25,-0.827 0.21,-1.138 0.006,-2.425 -0.932,-3.656 -0.713,-0.935 -1.81,-1.762 -3.359,-2.444 A 0.696,0.696 0 0 1 15.128,9.502 L 14.958,9.386 A 0.697,0.697 0 0 1 14.89,8.288 c 0.053,-0.063 0.065,-0.077 0.114,-0.13 0.584,-0.63 0.914,-1.459 0.914,-2.342 0,-1.892 -1.514,-3.423 -3.379,-3.423 h -0.078 c -1.865,0 -3.38,1.531 -3.38,3.423 0,0.883 0.33,1.711 0.916,2.343 0.049,0.053 0.057,0.063 0.101,0.12 0.353,0.309 0.32,0.852 -0.058,1.108 L 9.87,9.503 A 0.696,0.696 0 0 1 9.76,9.564 c -1.55,0.682 -2.647,1.51 -3.359,2.444 -0.938,1.231 -1.143,2.518 -0.932,3.656 z m 7.003,2.324 A 21.9,21.9 0 0 1 9.581,17.878 23.896,23.896 0 0 1 4.674,16.876 0.696,0.696 0 0 1 4.229,16.441 3.567,3.567 0 0 1 4.113,15.985 C 3.815,14.473 4.073,12.767 5.294,11.163 6.048,10.174 7.126,9.308 8.559,8.589 A 4.83,4.83 0 0 1 7.689,5.816 C 7.69,3.158 9.825,1 12.462,1 h 0.078 c 2.637,0 4.771,2.158 4.771,4.816 a 4.83,4.83 0 0 1 -0.87,2.773 c 1.434,0.719 2.512,1.585 3.265,2.574 1.223,1.604 1.48,3.31 1.182,4.822 -0.04,0.207 -0.083,0.361 -0.116,0.456 a 0.696,0.696 0 0 1 -0.445,0.435 23.9,23.9 0 0 1 -4.907,1.002 21.9,21.9 0 0 1 -2.891,0.11 h -0.056 z"
id="path2" />

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View file

@ -22,7 +22,11 @@
<file>assets/images/call_chat_unsecure_custom.svg</file>
<file>assets/images/call_custom.svg</file>
<file>assets/images/call_history_custom.svg</file>
<file>assets/images/call_quality_custom.svg</file>
<file>assets/images/call_quality_0_custom.svg</file>
<file>assets/images/call_quality_1_custom.svg</file>
<file>assets/images/call_quality_2_custom.svg</file>
<file>assets/images/call_quality_3_custom.svg</file>
<file>assets/images/call_quality_4_custom.svg</file>
<file>assets/images/call_menu_custom.svg</file>
<file>assets/images/call_sign_connected.svg</file>
<file>assets/images/call_sign_ended.svg</file>

View file

@ -7,88 +7,95 @@ import Utils 1.0
// =============================================================================
Item {
id: wrapper
// Optionnal parameters, set the position of popup relative to this item.
property var relativeTo
property int relativeX: 0
property int relativeY: 0
default property alias _content: popup.contentItem
property alias closePolicy : popup.closePolicy
// ---------------------------------------------------------------------------
signal closed
signal opened
// ---------------------------------------------------------------------------
function open () {
if (popup.visible) {
return
}
if (relativeTo) {
var parent = Utils.getTopParent(this)
popup.x = Qt.binding(function () {
return relativeTo ? relativeTo.mapToItem(null, relativeX, relativeY).x : 0
})
popup.y = Qt.binding(function () {
return relativeTo ? relativeTo.mapToItem(null, relativeX, relativeY).y : 0
})
} else {
popup.x = Qt.binding(function () {
return x
})
popup.y = Qt.binding(function () {
return y
})
}
popup.open()
}
function close () {
if (!popup.visible) {
return
}
popup.x = 0
popup.y = 0
popup.close()
}
// ---------------------------------------------------------------------------
visible: false
// ---------------------------------------------------------------------------
Controls.Popup {
id: popup
height: wrapper.height
width: wrapper.width
background: Rectangle {
color: PopupStyle.backgroundColor
height: popup.height
width: popup.width
layer {
enabled: true
effect: PopupShadow {}
}
}
padding: 0
Component.onCompleted: parent = Utils.getTopParent(this)
onClosed: wrapper.closed()
onOpened: wrapper.opened()
}
id: wrapper
property bool isOpen : popup.visible || (!popup.visible && closeDelay.running) // This way, we prevent instant reopening on lost focus with clicked events
property bool delayClosing : false
// Optionnal parameters, set the position of popup relative to this item.
property var relativeTo
property int relativeX: 0
property int relativeY: 0
default property alias _content: popup.contentItem
property alias closePolicy : popup.closePolicy
// ---------------------------------------------------------------------------
signal closed
signal opened
// ---------------------------------------------------------------------------
function open () {
if (popup.visible) {
return
}
if (relativeTo) {
var parent = Utils.getTopParent(this)
popup.x = Qt.binding(function () {
return relativeTo ? relativeTo.mapToItem(null, relativeX, relativeY).x : 0
})
popup.y = Qt.binding(function () {
return relativeTo ? relativeTo.mapToItem(null, relativeX, relativeY).y : 0
})
} else {
popup.x = Qt.binding(function () {
return x
})
popup.y = Qt.binding(function () {
return y
})
}
popup.open()
}
function close(){
if (!popup.visible) {
return
}
popup.x = 0
popup.y = 0
popup.close()
}
// ---------------------------------------------------------------------------
visible: false
// ---------------------------------------------------------------------------
Timer{// This way, we prevent instant reopening on lost focus with clicked events
id: closeDelay
interval: 100
}
Controls.Popup {
id: popup
height: wrapper.height
width: wrapper.width
background: Rectangle {
color: PopupStyle.backgroundColor
height: popup.height
width: popup.width
layer {
enabled: true
effect: PopupShadow {}
}
}
padding: 0
Component.onCompleted: parent = Utils.getTopParent(this)
onClosed: { if(wrapper.delayClosing) closeDelay.restart()
wrapper.closed()
}
onOpened: wrapper.opened()
}
}

View file

@ -8,109 +8,109 @@ import Linphone.Styles 1.0
// =============================================================================
Popup {
id: callStatistics
property var call
// ---------------------------------------------------------------------------
Rectangle {
color: CallStatisticsStyle.color
height: callStatistics.height
width: callStatistics.width
Row {
anchors {
fill: parent
topMargin: CallStatisticsStyle.topMargin
leftMargin: CallStatisticsStyle.leftMargin
rightMargin: CallStatisticsStyle.rightMargin
}
Loader {
property string $label: qsTr('audioStatsLabel')
property var $data: callStatistics.call?callStatistics.call.audioStats:null
sourceComponent: media
width: parent.width / 2
}
Loader {
property string $label: qsTr('videoStatsLabel')
property var $data: callStatistics.call?callStatistics.call.videoStats:null
sourceComponent: media
width: parent.width / 2
}
}
// -------------------------------------------------------------------------
// Line.
// -------------------------------------------------------------------------
Component {
id: line
RowLayout {
spacing: CallStatisticsStyle.spacing
width: parent.width
Text {
Layout.preferredWidth: CallStatisticsStyle.key.width
color: CallStatisticsStyle.key.color
elide: Text.ElideRight
font {
pointSize: CallStatisticsStyle.key.pointSize
bold: true
}
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: modelData.key
}
Text {
Layout.fillWidth: true
color: CallStatisticsStyle.value.color
elide: Text.ElideRight
font.pointSize: CallStatisticsStyle.value.pointSize
text: modelData.value
}
}
}
// -------------------------------------------------------------------------
// Media.
// -------------------------------------------------------------------------
Component {
id: media
Column {
Text {
color: CallStatisticsStyle.title.color
font {
bold: true
pointSize: CallStatisticsStyle.title.pointSize
}
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
text: $label
height: contentHeight + CallStatisticsStyle.title.bottomMargin
width: parent.width
}
Repeater {
model: $data
delegate: line
}
}
}
}
id: callStatistics
property var call
// ---------------------------------------------------------------------------
delayClosing: true
Rectangle {
color: CallStatisticsStyle.color
height: callStatistics.height
width: callStatistics.width
Row {
anchors {
fill: parent
topMargin: CallStatisticsStyle.topMargin
leftMargin: CallStatisticsStyle.leftMargin
rightMargin: CallStatisticsStyle.rightMargin
}
Loader {
property string $label: qsTr('audioStatsLabel')
property var $data: callStatistics.call?callStatistics.call.audioStats:null
sourceComponent: media
width: parent.width / 2
}
Loader {
property string $label: qsTr('videoStatsLabel')
property var $data: callStatistics.call?callStatistics.call.videoStats:null
sourceComponent: media
width: parent.width / 2
}
}
// -------------------------------------------------------------------------
// Line.
// -------------------------------------------------------------------------
Component {
id: line
RowLayout {
spacing: CallStatisticsStyle.spacing
width: parent.width
Text {
Layout.preferredWidth: CallStatisticsStyle.key.width
color: CallStatisticsStyle.key.color
elide: Text.ElideRight
font {
pointSize: CallStatisticsStyle.key.pointSize
bold: true
}
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: modelData.key
}
Text {
Layout.fillWidth: true
color: CallStatisticsStyle.value.color
elide: Text.ElideRight
font.pointSize: CallStatisticsStyle.value.pointSize
text: modelData.value
}
}
}
// -------------------------------------------------------------------------
// Media.
// -------------------------------------------------------------------------
Component {
id: media
Column {
Text {
color: CallStatisticsStyle.title.color
font {
bold: true
pointSize: CallStatisticsStyle.title.pointSize
}
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
text: $label
height: contentHeight + CallStatisticsStyle.title.bottomMargin
width: parent.width
}
Repeater {
model: $data
delegate: line
}
}
}
}
}

View file

@ -82,8 +82,7 @@ Rectangle {
isCustom: true
backgroundRadius: 4
colorSet: CallStyle.buttons.callQuality
percentageDisplayed: 0
icon: CallStyle.buttons.callQuality.icon_0
onClicked: Logic.openCallStatistics()
@ -97,10 +96,16 @@ Rectangle {
onTriggered: {
// Note: `quality` is in the [0, 5] interval and -1.
var quality = call.quality
if(quality >= 0)
callQuality.percentageDisplayed = quality * 100 / 5
if(quality > 4)
callQuality.icon = CallStyle.buttons.callQuality.icon_4
else if(quality > 3)
callQuality.icon = CallStyle.buttons.callQuality.icon_3
else if(quality > 2)
callQuality.icon = CallStyle.buttons.callQuality.icon_2
else if(quality > 1)
callQuality.icon = CallStyle.buttons.callQuality.icon_1
else
callQuality.percentageDisplayed = 0
callQuality.icon = CallStyle.buttons.callQuality.icon_0
}
}
@ -127,6 +132,7 @@ Rectangle {
}
ActionButton {
anchors.verticalCenter: parent.verticalCenter
id: callSecure
isCustom: true
backgroundRadius: 90

View file

@ -149,8 +149,7 @@ Window {
isCustom: true
backgroundRadius: 4
colorSet: CallFullscreenStyle.buttons.callQuality
iconSize: CallFullscreenStyle.header.iconSize
percentageDisplayed: 0
icon: CallStyle.buttons.callQuality.icon_0
onClicked: Logic.openCallStatistics()
// See: http://www.linphone.org/docs/liblinphone/group__call__misc.html#ga62c7d3d08531b0cc634b797e273a0a73
@ -163,10 +162,16 @@ Window {
onTriggered: {
// Note: `quality` is in the [0, 5] interval and -1.
var quality = window.call.quality
if(quality >= 0)
callQuality.percentageDisplayed = quality * 100 / 5
if(quality > 4)
callQuality.icon = CallStyle.buttons.callQuality.icon_4
else if(quality > 3)
callQuality.icon = CallStyle.buttons.callQuality.icon_3
else if(quality > 2)
callQuality.icon = CallStyle.buttons.callQuality.icon_2
else if(quality > 1)
callQuality.icon = CallStyle.buttons.callQuality.icon_1
else
callQuality.percentageDisplayed = 0
callQuality.icon = CallStyle.buttons.callQuality.icon_0
}
}
@ -187,13 +192,13 @@ Window {
isCustom: true
backgroundRadius: 90
colorSet: CallFullscreenStyle.buttons.telKeyad
iconSize: CallFullscreenStyle.header.iconSize
onClicked: telKeypad.visible = !telKeypad.visible
}
ActionButton {
id: callSecure
anchors.verticalCenter: parent.verticalCenter
isCustom: true
backgroundRadius: 90
colorSet: window.call && window.call.isSecured ? CallFullscreenStyle.buttons.secure : CallFullscreenStyle.buttons.unsecure

View file

@ -394,11 +394,12 @@ Rectangle {
id: callQuality
isCustom: true
backgroundRadius: 4
backgroundRadius: width/2
colorSet: VideoConferenceStyle.buttons.callQuality
percentageDisplayed: 0
icon: VideoConferenceStyle.buttons.callQuality.icon_0
toggled: callStatistics.isOpen
onClicked: {Logic.openCallStatistics();}
onClicked: callStatistics.isOpen ? callStatistics.close() : callStatistics.open()
Timer {
interval: 500
repeat: true
@ -407,10 +408,16 @@ Rectangle {
onTriggered: {
// Note: `quality` is in the [0, 5] interval and -1.
var quality = callModel.quality
if(quality >= 0)
callQuality.percentageDisplayed = quality * 100 / 5
if(quality > 4)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_4
else if(quality > 3)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_3
else if(quality > 2)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_2
else if(quality > 1)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_1
else
callQuality.percentageDisplayed = 0
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_0
}
}
}
@ -435,7 +442,6 @@ Rectangle {
relativeTo: conference
relativeY: CallStyle.header.stats.relativeY
relativeX: 10
onClosed: Logic.handleCallStatisticsClosed()
}
TelKeypad {
id: telKeypad

View file

@ -416,17 +416,25 @@ Window {
isCustom: true
backgroundRadius: width/2
colorSet: VideoConferenceStyle.buttons.participants
visible: false // TODO
toggled: rightMenu.visible && rightMenu.isParticipantsMenu
onClicked: {
if(toggled)
rightMenu.visible = false
else
rightMenu.showParticipantsMenu()
}
}
ActionButton {
id: callQuality
isCustom: true
backgroundRadius: 4
backgroundRadius: width/2
colorSet: VideoConferenceStyle.buttons.callQuality
percentageDisplayed: 0
onClicked: {Logic.openCallStatistics();}
icon: VideoConferenceStyle.buttons.callQuality.icon_0
toggled: callStatistics.isOpen
onClicked: callStatistics.isOpen ? callStatistics.close() : callStatistics.open()
Timer {
interval: 500
repeat: true
@ -436,10 +444,16 @@ Window {
if(callModel) {
// Note: `quality` is in the [0, 5] interval and -1.
var quality = callModel.quality
if(quality >= 0)
callQuality.percentageDisplayed = quality * 100 / 5
if(quality > 4)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_4
else if(quality > 3)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_3
else if(quality > 2)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_2
else if(quality > 1)
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_1
else
callQuality.percentageDisplayed = 0
callQuality.icon = VideoConferenceStyle.buttons.callQuality.icon_0
}
}
}
@ -448,6 +462,7 @@ Window {
isCustom: true
backgroundRadius: width/2
colorSet: VideoConferenceStyle.buttons.options
toggled: rightMenu.visible
onClicked: rightMenu.visible = !rightMenu.visible
}
}
@ -464,7 +479,6 @@ Window {
relativeTo: conference
relativeY: CallStyle.header.stats.relativeY
relativeX: 10
onClosed: Logic.handleCallStatisticsClosed()
}
}
TelKeypad {
@ -495,7 +509,8 @@ Window {
anchors.fill: parent
acceptedButtons: Qt.NoButton
propagateComposedEvents: true
cursorShape: Qt.ArrowCursor
cursorShape: undefined
//cursorShape: Qt.ArrowCursor
onEntered: hideButtonsTimer.startTimer()
onExited: hideButtonsTimer.stopTimer()

View file

@ -102,29 +102,24 @@ QtObject {
// Button colors
property QtObject buttons: QtObject {
property QtObject callQuality: QtObject {
property int iconSize: 16
property int iconSize: 30
property string name : 'quality'
property string icon : 'call_quality_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon, 'me_d_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon, 'me_d_b_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
property color backgroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_n', icon, 'me_n_b_inv_bg').color
property color backgroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_d', icon, 'me_d_b_inv_bg').color
property color backgroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_h', icon, 'me_h_b_inv_bg').color
property color backgroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_p', icon, 'me_p_b_inv_bg').color
property color foregroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_n', icon, 'me_h_b_inv_fg').color
property color foregroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_d', icon, 'me_d_b_inv_fg').color
property color foregroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_h', icon, 'me_h_b_inv_fg').color
property color foregroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_p', icon, 'me_p_b_inv_fg').color
property string icon_0 : 'call_quality_0_custom'
property string icon_1 : 'call_quality_1_custom'
property string icon_2 : 'call_quality_2_custom'
property string icon_3 : 'call_quality_3_custom'
property string icon_4 : 'call_quality_4_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon_2, 'me_n_b_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon_2, 'me_d_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon_2, 'me_h_b_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon_2, 'me_p_b_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon_2, 'me_n_b_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon_2, 'me_d_b_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon_2, 'me_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon_2, 'me_p_b_fg').color
}
property QtObject telKeyad: QtObject {
property int iconSize: 16
property int iconSize: 30
property string name : 'telKeypad'
property string icon : 'dialpad_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color

View file

@ -102,29 +102,24 @@ QtObject {
// Button colors
property QtObject buttons: QtObject {
property QtObject callQuality: QtObject {
property int iconSize: 16
property int iconSize: 30
property string name : 'quality'
property string icon : 'call_quality_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon, 'me_d_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon, 'me_d_b_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
property color backgroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_n', icon, 'me_n_b_inv_bg').color
property color backgroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_d', icon, 'me_d_b_inv_bg').color
property color backgroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_h', icon, 'me_h_b_inv_bg').color
property color backgroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_p', icon, 'me_p_b_inv_bg').color
property color foregroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_n', icon, 'me_h_b_inv_fg').color
property color foregroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_d', icon, 'me_d_b_inv_fg').color
property color foregroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_h', icon, 'me_h_b_inv_fg').color
property color foregroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_p', icon, 'me_p_b_inv_fg').color
property string icon_0 : 'call_quality_0_custom'
property string icon_1 : 'call_quality_1_custom'
property string icon_2 : 'call_quality_2_custom'
property string icon_3 : 'call_quality_3_custom'
property string icon_4 : 'call_quality_4_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon_2, 'me_n_b_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon_2, 'me_d_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon_2, 'me_h_b_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon_2, 'me_p_b_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon_2, 'me_n_b_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon_2, 'me_d_b_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon_2, 'me_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon_2, 'me_p_b_fg').color
}
property QtObject telKeyad: QtObject {
property int iconSize: 16
property int iconSize: 30
property string name : 'telKeypad'
property string icon : 'dialpad_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color

View file

@ -386,26 +386,23 @@ QtObject {
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_c', icon, 'me_c_b_inv_fg').color
}
property QtObject callQuality: QtObject {
property int iconSize: 20
property int iconSize: 40
property string name : 'quality'
property string icon : 'call_quality_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon, 'me_d_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'me_p_b_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'me_n_b_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon, 'me_d_b_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
property color backgroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_n', icon, 'me_n_b_inv_bg').color
property color backgroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_d', icon, 'me_d_b_inv_bg').color
property color backgroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_h', icon, 'me_h_b_inv_bg').color
property color backgroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_bg_p', icon, 'me_p_b_inv_bg').color
property color foregroundHiddenPartNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_n', icon, 'me_n_b_inv_fg').color
property color foregroundHiddenPartDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_d', icon, 'me_d_b_inv_fg').color
property color foregroundHiddenPartHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_h', icon, 'me_h_b_inv_fg').color
property color foregroundHiddenPartPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_hidden_fg_p', icon, 'me_p_b_inv_fg').color
property string icon_0 : 'call_quality_0_custom'
property string icon_1 : 'call_quality_1_custom'
property string icon_2 : 'call_quality_2_custom'
property string icon_3 : 'call_quality_3_custom'
property string icon_4 : 'call_quality_4_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon_2, 'me_n_b_inv_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon_2, 'me_d_b_inv_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon_2, 'me_h_b_inv_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon_2, 'me_p_b_inv_bg').color
property color backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_c', icon_2, 'me_c_b_inv_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon_2, 'me_n_b_inv_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon_2, 'me_d_b_inv_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon_2, 'me_h_b_inv_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon_2, 'me_p_b_inv_fg').color
property color foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_c', icon_2, 'me_c_b_inv_fg').color
}
property QtObject options: QtObject {
property int iconSize: 40