mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-28 09:19:19 +00:00
New Layout : Active Speaker (without miniatures)
New settings menu to change layout. New GUI object : StackView and RadioButton.
This commit is contained in:
parent
19ad53d654
commit
efcb67944e
35 changed files with 1722 additions and 173 deletions
44
linphone-app/assets/images/back_custom.svg
Normal file
44
linphone-app/assets/images/back_custom.svg
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="80"
|
||||
height="80"
|
||||
viewBox="0 0 80 80"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="back_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="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
width="80px"
|
||||
inkscape:zoom="6.5078125"
|
||||
inkscape:cx="21.128451"
|
||||
inkscape:cy="21.973589"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1043"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="m 39.608255,28.531965 -13.57629,11.468633 13.57629,11.467439 M 26.031965,40.000598 h 27.936076"
|
||||
stroke="#000000"
|
||||
stroke-width="4.51043"
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
id="path2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
306
linphone-app/assets/images/conference_layout_active_speaker.svg
Normal file
306
linphone-app/assets/images/conference_layout_active_speaker.svg
Normal file
|
|
@ -0,0 +1,306 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="80"
|
||||
height="49.360001"
|
||||
viewBox="0 0 80 49.360001"
|
||||
version="1.1"
|
||||
id="svg89"
|
||||
sodipodi:docname="conference_layout_active_speaker.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:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview91"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.8602495"
|
||||
inkscape:cx="36.19478"
|
||||
inkscape:cy="24.808373"
|
||||
inkscape:window-width="1458"
|
||||
inkscape:window-height="749"
|
||||
inkscape:window-x="2079"
|
||||
inkscape:window-y="166"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg89" />
|
||||
<defs
|
||||
id="defs61">
|
||||
<rect
|
||||
id="b"
|
||||
x="0"
|
||||
y="0"
|
||||
width="47"
|
||||
height="30"
|
||||
rx="2" />
|
||||
<rect
|
||||
id="d"
|
||||
x="0"
|
||||
y="0"
|
||||
width="11"
|
||||
height="7"
|
||||
rx="3.5" />
|
||||
<rect
|
||||
id="e"
|
||||
x="0"
|
||||
y="0"
|
||||
width="11"
|
||||
height="7"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="g"
|
||||
x="0"
|
||||
y="0"
|
||||
width="11"
|
||||
height="7"
|
||||
rx="3.5" />
|
||||
<rect
|
||||
id="h"
|
||||
x="0"
|
||||
y="0"
|
||||
width="11"
|
||||
height="7"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="j"
|
||||
x="0"
|
||||
y="0"
|
||||
width="11"
|
||||
height="7"
|
||||
rx="3.5" />
|
||||
<rect
|
||||
id="k"
|
||||
x="0"
|
||||
y="0"
|
||||
width="11"
|
||||
height="7"
|
||||
rx="1" />
|
||||
<filter
|
||||
x="-0.012765957"
|
||||
y="-0.02"
|
||||
width="1.0255319"
|
||||
height="1.04"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="a">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset9" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur11" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix13" />
|
||||
<feMerge
|
||||
id="feMerge19">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode15" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode17" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.054545455"
|
||||
y="-0.085714286"
|
||||
width="1.1090909"
|
||||
height="1.1714286"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="c">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset22" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur24" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix26" />
|
||||
<feMerge
|
||||
id="feMerge32">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode28" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode30" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.054545455"
|
||||
y="-0.085714286"
|
||||
width="1.1090909"
|
||||
height="1.1714286"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="f">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset35" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur37" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix39" />
|
||||
<feMerge
|
||||
id="feMerge45">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode41" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode43" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.054545455"
|
||||
y="-0.085714286"
|
||||
width="1.1090909"
|
||||
height="1.1714286"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="i">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset48" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur50" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix52" />
|
||||
<feMerge
|
||||
id="feMerge58">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode54" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode56" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
id="g87"
|
||||
transform="matrix(1.4248675,0,0,1.5337842,-0.10328844,-0.72358158)">
|
||||
<g
|
||||
filter="url(#a)"
|
||||
transform="translate(1,1.742)"
|
||||
id="g67">
|
||||
<rect
|
||||
stroke="#6b7a86"
|
||||
fill="#6b7a86"
|
||||
x="0.5"
|
||||
y="0.5"
|
||||
width="46"
|
||||
height="29"
|
||||
rx="8"
|
||||
id="rect63" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#b"
|
||||
id="use65"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#c)"
|
||||
transform="translate(43.317,13.055)"
|
||||
id="g73">
|
||||
<use
|
||||
fill="#b1b1b1"
|
||||
xlink:href="#d"
|
||||
transform="translate(0.683,-0.055)"
|
||||
id="use69"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#b1b1b1"
|
||||
xlink:href="#e"
|
||||
transform="translate(0.683,-0.055)"
|
||||
id="use71"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#f)"
|
||||
transform="translate(43.317,5.355)"
|
||||
id="g79">
|
||||
<use
|
||||
fill="#b1b1b1"
|
||||
xlink:href="#g"
|
||||
transform="translate(0.683,-0.355)"
|
||||
id="use75"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#b1b1b1"
|
||||
xlink:href="#h"
|
||||
transform="translate(0.683,-0.355)"
|
||||
id="use77"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#i)"
|
||||
transform="translate(43.317,20.755)"
|
||||
id="g85">
|
||||
<use
|
||||
fill="#b1b1b1"
|
||||
xlink:href="#j"
|
||||
transform="translate(0.683,0.245)"
|
||||
id="use81"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#b1b1b1"
|
||||
xlink:href="#k"
|
||||
transform="translate(0.683,0.245)"
|
||||
id="use83"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.1 KiB |
636
linphone-app/assets/images/conference_layout_grid.svg
Normal file
636
linphone-app/assets/images/conference_layout_grid.svg
Normal file
|
|
@ -0,0 +1,636 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="80"
|
||||
height="49.365002"
|
||||
viewBox="0 0 80 49.365002"
|
||||
version="1.1"
|
||||
id="svg195"
|
||||
sodipodi:docname="conference_layout_grid.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:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview197"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="8.0031631"
|
||||
inkscape:cx="47.16885"
|
||||
inkscape:cy="30.362995"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1043"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg195" />
|
||||
<defs
|
||||
id="defs137">
|
||||
<rect
|
||||
id="b"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="c"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="e"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="f"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="h"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="i"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="k"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="l"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="n"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="o"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="q"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="r"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="t"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="u"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="w"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="x"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<rect
|
||||
id="z"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="4.8390002" />
|
||||
<rect
|
||||
id="A"
|
||||
x="0"
|
||||
y="0"
|
||||
width="17"
|
||||
height="9.677"
|
||||
rx="1" />
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="a">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset20" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur22" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix24" />
|
||||
<feMerge
|
||||
id="feMerge30">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode26" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode28" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="d">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset33" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur35" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix37" />
|
||||
<feMerge
|
||||
id="feMerge43">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode39" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode41" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="g">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset46" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur48" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix50" />
|
||||
<feMerge
|
||||
id="feMerge56">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode52" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode54" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="j">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset59" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur61" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix63" />
|
||||
<feMerge
|
||||
id="feMerge69">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode65" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode67" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="m">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset72" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur74" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix76" />
|
||||
<feMerge
|
||||
id="feMerge82">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode78" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode80" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="p">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset85" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur87" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix89" />
|
||||
<feMerge
|
||||
id="feMerge95">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode91" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode93" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="s">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset98" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur100" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix102" />
|
||||
<feMerge
|
||||
id="feMerge108">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode104" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode106" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="v">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset111" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur113" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix115" />
|
||||
<feMerge
|
||||
id="feMerge121">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode117" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode119" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter
|
||||
x="-0.035294118"
|
||||
y="-0.062002686"
|
||||
width="1.0705882"
|
||||
height="1.1240054"
|
||||
filterUnits="objectBoundingBox"
|
||||
id="y">
|
||||
<feOffset
|
||||
in="SourceAlpha"
|
||||
result="shadowOffsetOuter1"
|
||||
id="feOffset124" />
|
||||
<feGaussianBlur
|
||||
stdDeviation=".25"
|
||||
in="shadowOffsetOuter1"
|
||||
result="shadowBlurOuter1"
|
||||
id="feGaussianBlur126" />
|
||||
<feColorMatrix
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"
|
||||
in="shadowBlurOuter1"
|
||||
result="shadowMatrixOuter1"
|
||||
id="feColorMatrix128" />
|
||||
<feMerge
|
||||
id="feMerge134">
|
||||
<feMergeNode
|
||||
in="shadowMatrixOuter1"
|
||||
id="feMergeNode130" />
|
||||
<feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode132" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
id="g193"
|
||||
transform="matrix(1.4536228,0,0,1.4763592,-0.02305047,-0.08712252)">
|
||||
<g
|
||||
filter="url(#a)"
|
||||
transform="translate(37,12)"
|
||||
id="g143">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#b"
|
||||
id="use139"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#c"
|
||||
id="use141"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#d)"
|
||||
transform="translate(37,1.355)"
|
||||
id="g149">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#e"
|
||||
id="use145"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#f"
|
||||
id="use147"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#g)"
|
||||
transform="translate(37,22.645)"
|
||||
id="g155">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#h"
|
||||
id="use151"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#i"
|
||||
id="use153"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#j)"
|
||||
transform="translate(19,12)"
|
||||
id="g161">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#k"
|
||||
id="use157"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#l"
|
||||
id="use159"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#m)"
|
||||
transform="translate(19,1.355)"
|
||||
id="g167">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#n"
|
||||
id="use163"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#o"
|
||||
id="use165"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#p)"
|
||||
transform="translate(19,22.645)"
|
||||
id="g173">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#q"
|
||||
id="use169"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#r"
|
||||
id="use171"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#s)"
|
||||
transform="translate(1,12)"
|
||||
id="g179">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#t"
|
||||
id="use175"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#u"
|
||||
id="use177"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#v)"
|
||||
transform="translate(1,1.355)"
|
||||
id="g185">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#w"
|
||||
id="use181"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#x"
|
||||
id="use183"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<g
|
||||
filter="url(#y)"
|
||||
transform="translate(1,22.645)"
|
||||
id="g191">
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#z"
|
||||
id="use187"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<use
|
||||
fill="#6b7a86"
|
||||
xlink:href="#A"
|
||||
id="use189"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 14 KiB |
|
|
@ -13,6 +13,7 @@
|
|||
<file>assets/images/admin_selected_custom.svg</file>
|
||||
<file>assets/images/attachment_custom.svg</file>
|
||||
<file>assets/images/auto_answer_custom.svg</file>
|
||||
<file>assets/images/back_custom.svg</file>
|
||||
<file>assets/images/burger_menu_custom.svg</file>
|
||||
<file>assets/images/calendar_participants_custom.svg</file>
|
||||
<file>assets/images/call_accept_custom.svg</file>
|
||||
|
|
@ -54,6 +55,8 @@
|
|||
<file>assets/images/collapsed_custom.svg</file>
|
||||
<file>assets/images/conference_custom.svg</file>
|
||||
<file>assets/images/conference_layout_grid_custom.svg</file>
|
||||
<file>assets/images/conference_layout_grid.svg</file>
|
||||
<file>assets/images/conference_layout_active_speaker.svg</file>
|
||||
<file>assets/images/contact_add_custom.svg</file>
|
||||
<file>assets/images/contact_card_photo_custom.svg</file>
|
||||
<file>assets/images/contact_custom.svg</file>
|
||||
|
|
@ -197,8 +200,10 @@
|
|||
<file>ui/modules/Common/Form/Placements/FormTableLine.qml</file>
|
||||
<file>ui/modules/Common/Form/Placements/FormTable.qml</file>
|
||||
<file>ui/modules/Common/Form/Placements/FormVGroup.qml</file>
|
||||
<file>ui/modules/Common/Form/RadioButton.qml</file>
|
||||
<file>ui/modules/Common/Form/SearchBox.qml</file>
|
||||
<file>ui/modules/Common/Form/Slider.qml</file>
|
||||
<file>ui/modules/Common/Form/StackView.qml</file>
|
||||
<file>ui/modules/Common/Form/StaticListForm.qml</file>
|
||||
<file>ui/modules/Common/Form/Switch.qml</file>
|
||||
<file>ui/modules/Common/Form/Tab/TabBar.qml</file>
|
||||
|
|
@ -251,8 +256,10 @@
|
|||
<file>ui/modules/Common/Styles/Form/Placements/FormTableLineStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/Placements/FormTableStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/Placements/FormVGroupStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/RadioButtonStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/SearchBoxStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/SliderStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/StackViewStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/SwitchStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/Tab/TabButtonStyle.qml</file>
|
||||
<file>ui/modules/Common/Styles/Form/Tab/TabContainerStyle.qml</file>
|
||||
|
|
@ -391,6 +398,9 @@
|
|||
<file>ui/views/App/Calls/CallsWindow.qml</file>
|
||||
<file>ui/views/App/Calls/Conference.qml</file>
|
||||
<file>ui/views/App/Calls/VideoConference.qml</file>
|
||||
<file>ui/views/App/Calls/VideoConferenceActiveSpeaker.qml</file>
|
||||
<file>ui/views/App/Calls/VideoConferenceGrid.qml</file>
|
||||
<file>ui/views/App/Calls/VideoConferenceMenu.qml</file>
|
||||
<file>ui/views/App/Calls/Dialogs/CallSipAddress.qml</file>
|
||||
<file>ui/views/App/Calls/Dialogs/CallTransfer.qml</file>
|
||||
<file>ui/views/App/Calls/Dialogs/ConferenceManager.qml</file>
|
||||
|
|
@ -464,6 +474,7 @@
|
|||
<file>ui/views/App/Styles/Calls/CallsWindowStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/ConferenceStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/VideoConferenceStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/VideoConferenceMenuStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/WaitingRoomStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/Dialogs/CallSipAddressStyle.qml</file>
|
||||
<file>ui/views/App/Styles/Calls/Dialogs/CallTransferStyle.qml</file>
|
||||
|
|
|
|||
|
|
@ -50,12 +50,11 @@ constexpr char AutoAnswerObjectName[] = "auto-answer-timer";
|
|||
}
|
||||
|
||||
CallModel::CallModel (shared_ptr<linphone::Call> call){
|
||||
|
||||
mCall = call;
|
||||
if(mCall)
|
||||
mCall->setData("call-model", *this);
|
||||
|
||||
updateIsInConference();
|
||||
mConferenceVideoLayout = LinphoneEnums::fromLinphone(call->getParams()->getConferenceVideoLayout());
|
||||
|
||||
CoreManager *coreManager = CoreManager::getInstance();
|
||||
|
||||
|
|
@ -403,6 +402,7 @@ void CallModel::handleCallStateChanged (const shared_ptr<linphone::Call> &call,
|
|||
mWasConnected = true;
|
||||
}
|
||||
mPausedByRemote = false;
|
||||
setConferenceVideoLayout(LinphoneEnums::fromLinphone(call->getParams()->getConferenceVideoLayout()));
|
||||
break;
|
||||
}
|
||||
case linphone::Call::State::Connected:
|
||||
|
|
@ -839,6 +839,24 @@ void CallModel::prepareTransfert(shared_ptr<linphone::Call> call, const QString&
|
|||
std::shared_ptr<linphone::Address> CallModel::getRemoteAddress()const{
|
||||
return mRemoteAddress;
|
||||
}
|
||||
|
||||
LinphoneEnums::ConferenceLayout CallModel::getConferenceVideoLayout() const{
|
||||
return LinphoneEnums::fromLinphone(mCall->getParams()->getConferenceVideoLayout());
|
||||
}
|
||||
|
||||
void CallModel::changeConferenceVideoLayout(LinphoneEnums::ConferenceLayout layout){
|
||||
shared_ptr<linphone::CallParams> params = CoreManager::getInstance()->getCore()->createCallParams(mCall);
|
||||
params->setConferenceVideoLayout(LinphoneEnums::toLinphone(layout));
|
||||
mCall->update(params);
|
||||
}
|
||||
|
||||
void CallModel::setConferenceVideoLayout(LinphoneEnums::ConferenceLayout layout){
|
||||
if( mConferenceVideoLayout != layout){
|
||||
mConferenceVideoLayout = layout;
|
||||
emit conferenceVideoLayoutChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
CallModel::CallEncryption CallModel::getEncryption () const {
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@
|
|||
#include <linphone++/linphone.hh>
|
||||
#include "../search/SearchListener.hpp"
|
||||
|
||||
#include "utils/LinphoneEnums.hpp"
|
||||
|
||||
// =============================================================================
|
||||
class ConferenceModel;
|
||||
class ContactModel;
|
||||
|
|
@ -79,6 +81,8 @@ class CallModel : public QObject {
|
|||
|
||||
Q_PROPERTY(QString transferAddress READ getTransferAddress WRITE setTransferAddress NOTIFY transferAddressChanged)
|
||||
|
||||
Q_PROPERTY(LinphoneEnums::ConferenceLayout conferenceVideoLayout READ getConferenceVideoLayout WRITE changeConferenceVideoLayout NOTIFY conferenceVideoLayoutChanged)
|
||||
|
||||
|
||||
|
||||
public:
|
||||
|
|
@ -163,6 +167,10 @@ public:
|
|||
|
||||
std::shared_ptr<linphone::Address> getRemoteAddress()const;
|
||||
|
||||
LinphoneEnums::ConferenceLayout getConferenceVideoLayout() const;
|
||||
void changeConferenceVideoLayout(LinphoneEnums::ConferenceLayout layout); // Make a call request
|
||||
void setConferenceVideoLayout(LinphoneEnums::ConferenceLayout layout); // Called from call state changed ater the new layout has been set.
|
||||
|
||||
static constexpr int DtmfSoundDelay = 200;
|
||||
|
||||
std::shared_ptr<linphone::Call> mCall;
|
||||
|
|
@ -193,6 +201,8 @@ signals:
|
|||
void fullPeerAddressChanged();
|
||||
void transferAddressChanged (const QString &transferAddress);
|
||||
|
||||
void conferenceVideoLayoutChanged();
|
||||
|
||||
public:
|
||||
void handleCallEncryptionChanged (const std::shared_ptr<linphone::Call> &call);
|
||||
void handleCallStateChanged (const std::shared_ptr<linphone::Call> &call, linphone::Call::State state);
|
||||
|
|
@ -265,6 +275,7 @@ private:
|
|||
bool mPausedByRemote = false;
|
||||
bool mPausedByUser = false;
|
||||
bool mRecording = false;
|
||||
LinphoneEnums::ConferenceLayout mConferenceVideoLayout;
|
||||
|
||||
bool mWasConnected = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -80,6 +80,10 @@ void ConferenceListener::onParticipantDeviceMediaAvailabilityChanged(const std::
|
|||
qDebug() << "onParticipantDeviceMediaAvailabilityChanged: " << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Device: " << participantDevice->getAddress()->asString().c_str();
|
||||
emit participantDeviceMediaAvailabilityChanged(participantDevice);
|
||||
}
|
||||
void ConferenceListener::onParticipantDeviceIsSpeakingChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice, bool isSpeaking) {
|
||||
qDebug() << "onParticipantDeviceIsSpeakingChanged: " << participantDevice->getAddress()->asString().c_str() << ". Speaking:" << isSpeaking;
|
||||
emit participantDeviceIsSpeakingChanged(participantDevice, isSpeaking);
|
||||
}
|
||||
void ConferenceListener::onStateChanged(const std::shared_ptr<linphone::Conference> & conference, linphone::Conference::State newState){
|
||||
qDebug() << "onStateChanged";
|
||||
emit conferenceStateChanged(newState);
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ public:
|
|||
virtual void onParticipantDeviceJoined(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & device) override;
|
||||
virtual void onParticipantDeviceIsSpeakingChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice, bool isSpeaking) override;
|
||||
virtual void onStateChanged(const std::shared_ptr<linphone::Conference> & conference, linphone::Conference::State newState) override;
|
||||
virtual void onSubjectChanged(const std::shared_ptr<linphone::Conference> & conference, const std::string & subject) override;
|
||||
virtual void onAudioDeviceChanged(const std::shared_ptr<linphone::Conference> & conference, const std::shared_ptr<const linphone::AudioDevice> & audioDevice) override;
|
||||
|
|
@ -58,6 +59,7 @@ signals:
|
|||
void participantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceIsSpeakingChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice, bool isSpeaking);
|
||||
void conferenceStateChanged(linphone::Conference::State newState);
|
||||
void subjectChanged(const std::string & subject);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ void ConferenceModel::connectTo(ConferenceListener * listener){
|
|||
connect(listener, &ConferenceListener::participantDeviceJoined, this, &ConferenceModel::onParticipantDeviceJoined);
|
||||
connect(listener, &ConferenceListener::participantDeviceMediaCapabilityChanged, this, &ConferenceModel::onParticipantDeviceMediaCapabilityChanged);
|
||||
connect(listener, &ConferenceListener::participantDeviceMediaAvailabilityChanged, this, &ConferenceModel::onParticipantDeviceMediaAvailabilityChanged);
|
||||
connect(listener, &ConferenceListener::participantDeviceIsSpeakingChanged, this, &ConferenceModel::onParticipantDeviceIsSpeakingChanged);
|
||||
connect(listener, &ConferenceListener::conferenceStateChanged, this, &ConferenceModel::onConferenceStateChanged);
|
||||
connect(listener, &ConferenceListener::subjectChanged, this, &ConferenceModel::onSubjectChanged);
|
||||
}
|
||||
|
|
@ -118,6 +119,9 @@ void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged(const std::sha
|
|||
qDebug() << "ConferenceModel::onParticipantDeviceMediaAvailabilityChanged: " << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << ". Me devices : " << mConference->getMe()->getDevices().size();
|
||||
emit participantDeviceMediaAvailabilityChanged(participantDevice);
|
||||
}
|
||||
void ConferenceModel::onParticipantDeviceIsSpeakingChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice, bool isSpeaking){
|
||||
emit participantDeviceIsSpeakingChanged(participantDevice, isSpeaking);
|
||||
}
|
||||
void ConferenceModel::onConferenceStateChanged(linphone::Conference::State newState){
|
||||
emit conferenceStateChanged(newState);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ public:
|
|||
virtual void onParticipantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device);
|
||||
virtual void onParticipantDeviceIsSpeakingChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device, bool isSpeaking);
|
||||
virtual void onConferenceStateChanged(linphone::Conference::State newState);
|
||||
virtual void onSubjectChanged(const std::string& subject);
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
@ -68,6 +69,7 @@ signals:
|
|||
void participantDeviceJoined(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void participantDeviceIsSpeakingChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device, bool isSpeaking);
|
||||
void conferenceStateChanged(linphone::Conference::State newState);
|
||||
void subjectChanged();
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ ParticipantDeviceListModel::ParticipantDeviceListModel (std::shared_ptr<linphone
|
|||
for(auto device : devices){
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, device, isMe(device));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
connect(deviceModel.get(), &ParticipantDeviceModel::isSpeakingChanged, this, &ParticipantDeviceListModel::onParticipantDeviceSpeaking);
|
||||
mList << deviceModel;
|
||||
}
|
||||
}
|
||||
|
|
@ -52,6 +53,7 @@ ParticipantDeviceListModel::ParticipantDeviceListModel (CallModel * callModel, Q
|
|||
for(auto device : devices){
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, device, isMe(device));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
connect(deviceModel.get(), &ParticipantDeviceModel::isSpeakingChanged, this, &ParticipantDeviceListModel::onParticipantDeviceSpeaking);
|
||||
mList << deviceModel;
|
||||
}
|
||||
/*
|
||||
|
|
@ -73,6 +75,7 @@ ParticipantDeviceListModel::ParticipantDeviceListModel (CallModel * callModel, Q
|
|||
connect(conferenceModel.get(), &ConferenceModel::conferenceStateChanged, this, &ParticipantDeviceListModel::onConferenceStateChanged);
|
||||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceMediaCapabilityChanged, this, &ParticipantDeviceListModel::onParticipantDeviceMediaCapabilityChanged);
|
||||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceMediaAvailabilityChanged, this, &ParticipantDeviceListModel::onParticipantDeviceMediaAvailabilityChanged);
|
||||
connect(conferenceModel.get(), &ConferenceModel::participantDeviceIsSpeakingChanged, this, &ParticipantDeviceListModel::onParticipantDeviceIsSpeakingChanged);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -86,6 +89,7 @@ void ParticipantDeviceListModel::updateDevices(std::shared_ptr<linphone::Partici
|
|||
for(auto device : devices){
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, device, isMe(device));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
connect(deviceModel.get(), &ParticipantDeviceModel::isSpeakingChanged, this, &ParticipantDeviceListModel::onParticipantDeviceSpeaking);
|
||||
mList << deviceModel;
|
||||
}
|
||||
endResetModel();
|
||||
|
|
@ -135,6 +139,7 @@ bool ParticipantDeviceListModel::add(std::shared_ptr<linphone::ParticipantDevice
|
|||
|
||||
auto deviceModel = ParticipantDeviceModel::create(mCallModel, deviceToAdd, isMe(deviceToAdd));
|
||||
connect(this, &ParticipantDeviceListModel::securityLevelChanged, deviceModel.get(), &ParticipantDeviceModel::onSecurityLevelChanged);
|
||||
connect(deviceModel.get(), &ParticipantDeviceModel::isSpeakingChanged, this, &ParticipantDeviceListModel::onParticipantDeviceSpeaking);
|
||||
ProxyListModel::add<ParticipantDeviceModel>(deviceModel);
|
||||
qWarning() << "Device added. Count=" << mList.count();
|
||||
return true;
|
||||
|
|
@ -145,7 +150,8 @@ bool ParticipantDeviceListModel::remove(std::shared_ptr<const linphone::Particip
|
|||
for(auto item : mList){
|
||||
auto device = item.objectCast<ParticipantDeviceModel>();
|
||||
if( device->getDevice() == deviceToRemove){
|
||||
device->setIsLeft(true);
|
||||
device->updateVideoEnabled();
|
||||
//device->setIsLeft(true);
|
||||
removeRow(row);
|
||||
return true;
|
||||
}else
|
||||
|
|
@ -310,4 +316,16 @@ void ParticipantDeviceListModel::onParticipantDeviceMediaAvailabilityChanged(con
|
|||
device->updateVideoEnabled();
|
||||
else
|
||||
onParticipantDeviceAdded(participantDevice);
|
||||
}
|
||||
|
||||
void ParticipantDeviceListModel::onParticipantDeviceIsSpeakingChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice, bool isSpeaking){
|
||||
if( isSpeaking){
|
||||
auto device = get(participantDevice);
|
||||
if( device)
|
||||
emit participantSpeaking(device.get());
|
||||
}
|
||||
}
|
||||
|
||||
void ParticipantDeviceListModel::onParticipantDeviceSpeaking(){
|
||||
emit participantSpeaking(qobject_cast<ParticipantDeviceModel*>(sender()));
|
||||
}
|
||||
|
|
@ -60,9 +60,12 @@ public slots:
|
|||
void onConferenceStateChanged(linphone::Conference::State newState);
|
||||
void onParticipantDeviceMediaCapabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void onParticipantDeviceMediaAvailabilityChanged(const std::shared_ptr<const linphone::ParticipantDevice> & participantDevice);
|
||||
void onParticipantDeviceIsSpeakingChanged(const std::shared_ptr<const linphone::ParticipantDevice> & device, bool isSpeaking);
|
||||
void onParticipantDeviceSpeaking();
|
||||
|
||||
signals:
|
||||
void securityLevelChanged(std::shared_ptr<const linphone::Address> device);
|
||||
void participantSpeaking(ParticipantDeviceModel *speakingDevice);
|
||||
|
||||
private:
|
||||
CallModel * mCallModel = nullptr;
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ void ParticipantDeviceModel::setIsSpeaking(bool speaking){
|
|||
}
|
||||
|
||||
void ParticipantDeviceModel::updateVideoEnabled(){
|
||||
bool enabled = !mIsLeft && (mParticipantDevice && mParticipantDevice->getStreamAvailability(linphone::StreamType::Video) &&
|
||||
bool enabled = (mParticipantDevice && mParticipantDevice->isInConference() && mParticipantDevice->getStreamAvailability(linphone::StreamType::Video) &&
|
||||
( mParticipantDevice->getStreamCapability(linphone::StreamType::Video) == linphone::MediaDirection::SendRecv
|
||||
|| mParticipantDevice->getStreamCapability(linphone::StreamType::Video) == linphone::MediaDirection::SendOnly
|
||||
)
|
||||
|
|
@ -158,11 +158,6 @@ void ParticipantDeviceModel::updateVideoEnabled(){
|
|||
}
|
||||
}
|
||||
|
||||
void ParticipantDeviceModel::setIsLeft(bool left) {
|
||||
mIsLeft = left;
|
||||
updateVideoEnabled();
|
||||
}
|
||||
|
||||
bool ParticipantDeviceModel::isMe() const{
|
||||
return mIsMe;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,7 +81,6 @@ public:
|
|||
|
||||
void connectTo(ParticipantDeviceListener * listener);
|
||||
void updateVideoEnabled();
|
||||
void setIsLeft(bool left);
|
||||
|
||||
public slots:
|
||||
void onSecurityLevelChanged(std::shared_ptr<const linphone::Address> device);
|
||||
|
|
@ -99,7 +98,6 @@ private:
|
|||
bool mIsVideoEnabled;
|
||||
bool mIsPaused = false;
|
||||
bool mIsSpeaking = false;
|
||||
bool mIsLeft = false;
|
||||
|
||||
std::shared_ptr<linphone::ParticipantDevice> mParticipantDevice;
|
||||
std::shared_ptr<ParticipantDeviceListener> mParticipantDeviceListener; // This is passed to linpĥone object and must be in shared_ptr
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ void ParticipantDeviceProxyModel::setCallModel(CallModel * callModel){
|
|||
mCallModel = callModel;
|
||||
auto sourceModel = new ParticipantDeviceListModel(mCallModel);
|
||||
connect(sourceModel, &ParticipantDeviceListModel::countChanged, this, &ParticipantDeviceProxyModel::onCountChanged);
|
||||
connect(sourceModel, &ParticipantDeviceListModel::participantSpeaking, this, &ParticipantDeviceProxyModel::participantSpeaking);
|
||||
setSourceModel(sourceModel);
|
||||
emit countChanged();
|
||||
}
|
||||
|
|
@ -85,6 +86,7 @@ void ParticipantDeviceProxyModel::setParticipant(ParticipantModel * participant)
|
|||
setFilterType(0);
|
||||
auto sourceModel = participant->getParticipantDevices().get();
|
||||
connect(sourceModel, &ParticipantDeviceListModel::countChanged, this, &ParticipantDeviceProxyModel::countChanged);
|
||||
connect(sourceModel, &ParticipantDeviceListModel::participantSpeaking, this, &ParticipantDeviceProxyModel::participantSpeaking);
|
||||
setSourceModel(sourceModel);
|
||||
emit countChanged();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ public slots:
|
|||
signals:
|
||||
void callModelChanged();
|
||||
void showMeChanged();
|
||||
void participantSpeaking(ParticipantDeviceModel * speakingDevice);
|
||||
|
||||
protected:
|
||||
virtual bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const override;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,14 @@ LinphoneEnums::CallStatus LinphoneEnums::fromLinphone(const linphone::Call::Stat
|
|||
return static_cast<LinphoneEnums::CallStatus>(data);
|
||||
}
|
||||
|
||||
linphone::ConferenceLayout LinphoneEnums::toLinphone(const LinphoneEnums::ConferenceLayout& layout){
|
||||
return static_cast<linphone::ConferenceLayout>(layout);
|
||||
}
|
||||
|
||||
LinphoneEnums::ConferenceLayout LinphoneEnums::fromLinphone(const linphone::ConferenceLayout& layout){
|
||||
return static_cast<LinphoneEnums::ConferenceLayout>(layout);
|
||||
}
|
||||
|
||||
linphone::Tunnel::Mode LinphoneEnums::toLinphone(const LinphoneEnums::TunnelMode& data){
|
||||
return static_cast<linphone::Tunnel::Mode>(data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,6 +112,15 @@ Q_ENUM_NS(CallStatus)
|
|||
linphone::Call::Status toLinphone(const LinphoneEnums::CallStatus& capability);
|
||||
LinphoneEnums::CallStatus fromLinphone(const linphone::Call::Status& capability);
|
||||
|
||||
enum ConferenceLayout {
|
||||
ConferenceLayoutGrid = int(linphone::ConferenceLayout::Grid),
|
||||
ConferenceLayoutActiveSpeaker = int(linphone::ConferenceLayout::ActiveSpeaker),
|
||||
};
|
||||
Q_ENUM_NS(ConferenceLayout)
|
||||
|
||||
linphone::ConferenceLayout toLinphone(const LinphoneEnums::ConferenceLayout& layout);
|
||||
LinphoneEnums::ConferenceLayout fromLinphone(const linphone::ConferenceLayout& layout);
|
||||
|
||||
enum TunnelMode {
|
||||
TunnelModeDisable = int(linphone::Tunnel::Mode::Disable),
|
||||
TunnelModeEnable= int(linphone::Tunnel::Mode::Enable),
|
||||
|
|
|
|||
56
linphone-app/ui/modules/Common/Form/RadioButton.qml
Normal file
56
linphone-app/ui/modules/Common/Form/RadioButton.qml
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
import QtQuick 2.12
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQml.Models 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
import QtQuick.Controls 2.12 as Control
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Control.RadioButton{
|
||||
id: radio
|
||||
font.weight: checked ? RadioButtonStyle.selectedWeight : RadioButtonStyle.weight
|
||||
font.pointSize: RadioButtonStyle.pointSize
|
||||
spacing: 10
|
||||
FontMetrics{id: fontMetrics}
|
||||
indicator: Rectangle {
|
||||
height: fontMetrics.height - 5
|
||||
width: height
|
||||
//onHeightChanged: height = fontMetrics.height - 5
|
||||
//onWidthChanged: width = fontMetrics.height - 5
|
||||
x: parent.leftPadding
|
||||
y: parent.height / 2 - height / 2
|
||||
radius: width/2
|
||||
border.color: RadioButtonStyle.color
|
||||
property bool checked: parent.checked
|
||||
Rectangle {
|
||||
width: parent.width - 8
|
||||
height: width
|
||||
x: 4
|
||||
y: 4
|
||||
radius: width/2
|
||||
color: RadioButtonStyle.color
|
||||
visible: parent.checked
|
||||
}
|
||||
}
|
||||
contentItem: Text{
|
||||
text: parent.text
|
||||
font: parent.font
|
||||
width: parent.width - (parent.indicator.width + parent.spacing)
|
||||
height: implicitHeight
|
||||
y:0
|
||||
// Override unwanted auto changes
|
||||
onYChanged: y = 0
|
||||
onHeightChanged: height=implicitHeight
|
||||
//---------------------------------------
|
||||
color: RadioButtonStyle.color
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
leftPadding: parent.indicator.width + parent.spacing
|
||||
wrapMode: Text.WordWrap
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
}
|
||||
70
linphone-app/ui/modules/Common/Form/StackView.qml
Normal file
70
linphone-app/ui/modules/Common/Form/StackView.qml
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.12 as Control
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
|
||||
import Utils 1.0
|
||||
|
||||
Control.StackView {
|
||||
id: stack
|
||||
clip:true
|
||||
property string viewsPath
|
||||
signal exit()
|
||||
|
||||
readonly property alias nViews: stack.depth
|
||||
|
||||
function pushView (view, properties) {
|
||||
stack.push(Utils.isString(view) ? viewsPath + view + '.qml' : view,properties)
|
||||
}
|
||||
|
||||
function getView (index) {
|
||||
return stack.get(index)
|
||||
}
|
||||
|
||||
function popView () {
|
||||
if( nViews <= 1 ) {
|
||||
stack.pop()
|
||||
stack.exit()
|
||||
}else
|
||||
stack.pop()
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
popEnter: Transition {
|
||||
YAnimator {
|
||||
duration: StackViewStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: stack.height + StackViewStyle.bottomMargin
|
||||
to: 0
|
||||
}
|
||||
}
|
||||
|
||||
popExit: Transition {
|
||||
XAnimator {
|
||||
duration: StackViewStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: 0
|
||||
to: stack.width + StackViewStyle.rightMargin
|
||||
}
|
||||
}
|
||||
|
||||
pushEnter: Transition {
|
||||
XAnimator {
|
||||
duration: StackViewStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: stack.width + StackViewStyle.rightMargin
|
||||
to: 0
|
||||
}
|
||||
}
|
||||
|
||||
pushExit: Transition {
|
||||
YAnimator {
|
||||
duration: StackViewStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: 0
|
||||
to: stack.height + StackViewStyle.bottomMargin
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
pragma Singleton
|
||||
import QtQml 2.2
|
||||
import QtQuick 2.7
|
||||
|
||||
import Units 1.0
|
||||
import ColorsList 1.0
|
||||
|
||||
// =============================================================================
|
||||
|
||||
QtObject {
|
||||
property string sectionName: 'RadioButton'
|
||||
property color backgroundColor: ColorsList.add(sectionName+'_bg', 'k').color
|
||||
|
||||
property int height: 60
|
||||
property color color: ColorsList.add(sectionName+'_fg', 'j').color
|
||||
property int weight: Font.Normal
|
||||
property int selectedWeight: Font.Bold
|
||||
property int pointSize: Units.dp * 12
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
pragma Singleton
|
||||
import QtQml 2.2
|
||||
|
||||
import ColorsList 1.0
|
||||
|
||||
// =============================================================================
|
||||
|
||||
QtObject {
|
||||
property string sectionName: 'StackView'
|
||||
property int bottomMargin: 35
|
||||
property int leftMargin: 90
|
||||
property int rightMargin: 90
|
||||
property int topMargin: 50
|
||||
|
||||
property QtObject stackAnimation: QtObject {
|
||||
property int duration: 400
|
||||
}
|
||||
}
|
||||
|
|
@ -14,8 +14,10 @@ singleton CheckBoxTextStyle 1.0 Form/CheckBoxTextStyle.qml
|
|||
singleton ComboBoxStyle 1.0 Form/ComboBoxStyle.qml
|
||||
singleton DroppableTextAreaStyle 1.0 Form/DroppableTextAreaStyle.qml
|
||||
singleton ListFormStyle 1.0 Form/ListFormStyle.qml
|
||||
singleton RadioButtonStyle 1.0 Form/RadioButtonStyle.qml
|
||||
singleton SearchBoxStyle 1.0 Form/SearchBoxStyle.qml
|
||||
singleton SliderStyle 1.0 Form/SliderStyle.qml
|
||||
singleton StackViewStyle 1.0 Form/StackViewStyle.qml
|
||||
singleton SwitchStyle 1.0 Form/SwitchStyle.qml
|
||||
singleton CommonItemDelegateStyle 1.0 Form/CommonItemDelegateStyle.qml
|
||||
singleton TransparentTextInputStyle 1.0 Form/TransparentTextInputStyle.qml
|
||||
|
|
|
|||
|
|
@ -27,8 +27,10 @@ ListForm 1.0 Form/ListForm.qml
|
|||
ListItemSelector 1.0 Form/ListItemSelector.qml
|
||||
Mosaic 1.0 Form/Mosaic.qml
|
||||
MouseArea 1.0 Form/MouseArea.qml
|
||||
RadioButton 1.0 Form/RadioButton.qml
|
||||
SearchBox 1.0 Form/SearchBox.qml
|
||||
Slider 1.0 Form/Slider.qml
|
||||
StackView 1.0 Form/StackView.qml
|
||||
StaticListForm 1.0 Form/StaticListForm.qml
|
||||
Switch 1.0 Form/Switch.qml
|
||||
TransparentTextInput 1.0 Form/TransparentTextInput.qml
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ Item {
|
|||
property bool hideCamera: false //callModel.pausedByUser
|
||||
property bool isPaused: false
|
||||
property bool isVideoEnabled: enabled && (!container.currentDevice || (container.currentDevice && container.currentDevice.videoEnabled))
|
||||
onCurrentDeviceChanged: resetActive()
|
||||
function resetActive(){
|
||||
resetTimer.resetActive()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -261,9 +261,9 @@ Window {
|
|||
id: videoConference
|
||||
VideoConference {
|
||||
callModel: window.call
|
||||
enabled: window.visible
|
||||
listCallsOpened: window.callsIsOpened
|
||||
onOpenListCallsRequest: mainPaned.open()
|
||||
enabled: window.visible
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import Common.Styles 1.0
|
|||
import Linphone 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import LinphoneEnums 1.0
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import App.Styles 1.0
|
||||
|
|
@ -168,7 +169,7 @@ Rectangle {
|
|||
anchors.bottom: actionsButtons.top
|
||||
|
||||
anchors.leftMargin: 70
|
||||
anchors.rightMargin: 70
|
||||
anchors.rightMargin: rightMenu.visible ? 70 : 15
|
||||
anchors.topMargin: 15
|
||||
anchors.bottomMargin: 20
|
||||
onClicked: {
|
||||
|
|
@ -177,81 +178,37 @@ Rectangle {
|
|||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
}
|
||||
/*
|
||||
ParticipantDeviceProxyModel{
|
||||
id: participantDevices
|
||||
Component{
|
||||
id: gridComponent
|
||||
VideoConferenceGrid{
|
||||
id: grid
|
||||
callModel: conference.callModel
|
||||
}*/
|
||||
Mosaic {
|
||||
id: grid
|
||||
anchors.fill: parent
|
||||
squaredDisplay: true
|
||||
|
||||
function setTestMode(){
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.defaultList
|
||||
for(var i = 0 ; i < 5 ; ++i)
|
||||
grid.add({color: '#'+ Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
console.log("Setting test mode : count=" + gridModel.defaultList.count)
|
||||
}
|
||||
function setParticipantDevicesMode(){
|
||||
console.log("Setting participant mode : count=" + gridModel.participantDevices.count)
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.participantDevices
|
||||
}
|
||||
|
||||
delegateModel: DelegateModel{
|
||||
id: gridModel
|
||||
property ParticipantDeviceProxyModel participantDevices : ParticipantDeviceProxyModel {
|
||||
id: participantDevices
|
||||
callModel: conference.callModel
|
||||
showMe: true
|
||||
}
|
||||
/*
|
||||
property ListModel defaultList : ListModel{}
|
||||
Component.onCompleted: {
|
||||
if( conference.callModel ){
|
||||
grid.clear()
|
||||
gridModel.model = participantDevices
|
||||
}
|
||||
}
|
||||
model: defaultList
|
||||
*/
|
||||
model: participantDevices
|
||||
onCountChanged: {console.log("Delegate count = "+count+"/"+participantDevices.count)}
|
||||
delegate: Item{
|
||||
id: avatarCell
|
||||
property ParticipantDeviceModel currentDevice: gridModel.participantDevices.getAt(index)
|
||||
onCurrentDeviceChanged: {
|
||||
console.log("currentDevice changed: " +currentDevice+"/"+cameraView.currentDevice + (currentDevice?", me:"+currentDevice.isMe:'')+" ["+index+"]")
|
||||
if(index < 0) cameraView.enabled = false // this is a delegate destruction. We need to stop camera before Qt change its currentDevice (and then, let CameraView to delete wrong renderer)
|
||||
|
||||
}
|
||||
//color: 'black' /*!conference.callModel && gridModel.defaultList.get(index).color ? gridModel.defaultList.get(index).color : */
|
||||
//color: gridModel.model.get(index) && gridModel.model.get(index).color ? gridModel.model.get(index).color : '' // modelIndex is a custom index because by Mosaic modelisation, it is not accessible.
|
||||
//color: $modelData.color ? $modelData.color : ''
|
||||
height: grid.cellHeight - 10
|
||||
width: grid.cellWidth - 10
|
||||
Component.onCompleted: {
|
||||
console.log("Completed: ["+index+"] " +(currentDevice?currentDevice.peerAddress+", isMe:"+currentDevice.isMe : '') )
|
||||
}
|
||||
|
||||
CameraView{
|
||||
id: cameraView
|
||||
enabled: index >=0
|
||||
anchors.fill: parent
|
||||
currentDevice: avatarCell.currentDevice
|
||||
isPaused: callModel.pausedByUser || avatarCell.currentDevice && avatarCell.currentDevice.isPaused //callModel.pausedByUser
|
||||
onCloseRequested: grid.remove( index)
|
||||
color: 'black'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Component{
|
||||
id: activeSpeakerComponent
|
||||
VideoConferenceActiveSpeaker{
|
||||
id: activeSpeaker
|
||||
callModel: conference.callModel
|
||||
}
|
||||
}
|
||||
RowLayout{
|
||||
anchors.fill: parent
|
||||
Loader{
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
sourceComponent: conference.callModel.conferenceVideoLayout == LinphoneEnums.ConferenceLayoutGrid ? gridComponent : activeSpeakerComponent
|
||||
onSourceComponentChanged: console.log(conference.callModel.conferenceVideoLayout)
|
||||
active: conference.callModel
|
||||
}
|
||||
VideoConferenceMenu{
|
||||
id: rightMenu
|
||||
Layout.fillHeight: true
|
||||
Layout.preferredWidth: 400
|
||||
callModel: conference.callModel
|
||||
onClose: rightMenu.visible = !rightMenu.visible
|
||||
}
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------------------------
|
||||
// Action Buttons.
|
||||
|
|
@ -403,7 +360,7 @@ Rectangle {
|
|||
isCustom: true
|
||||
backgroundRadius: width/2
|
||||
colorSet: VideoConferenceStyle.buttons.options
|
||||
visible: false //TODO
|
||||
onClicked: rightMenu.visible = !rightMenu.visible
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,43 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQml.Models 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import App.Styles 1.0
|
||||
|
||||
|
||||
// Temp
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Item {
|
||||
id: grid
|
||||
property alias callModel: participantDevices.callModel
|
||||
anchors.fill: parent
|
||||
|
||||
property ParticipantDeviceProxyModel participantDevices : ParticipantDeviceProxyModel {
|
||||
id: participantDevices
|
||||
showMe: true
|
||||
onParticipantSpeaking: cameraView.currentDevice = speakingDevice
|
||||
}
|
||||
|
||||
CameraView{
|
||||
id: cameraView
|
||||
enabled: index >=0
|
||||
anchors.fill: parent
|
||||
isPaused: callModel.pausedByUser || currentDevice && currentDevice.isPaused //callModel.pausedByUser
|
||||
showCloseButton: false
|
||||
// onCloseRequested: grid.remove( index)
|
||||
color: 'black'
|
||||
}
|
||||
}
|
||||
|
||||
80
linphone-app/ui/views/App/Calls/VideoConferenceGrid.qml
Normal file
80
linphone-app/ui/views/App/Calls/VideoConferenceGrid.qml
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQml.Models 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import App.Styles 1.0
|
||||
|
||||
|
||||
// Temp
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Mosaic {
|
||||
id: grid
|
||||
property alias callModel: participantDevices.callModel
|
||||
anchors.fill: parent
|
||||
squaredDisplay: true
|
||||
|
||||
function setTestMode(){
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.defaultList
|
||||
for(var i = 0 ; i < 5 ; ++i)
|
||||
grid.add({color: '#'+ Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)
|
||||
+Math.floor(Math.random()*255).toString(16)})
|
||||
console.log("Setting test mode : count=" + gridModel.defaultList.count)
|
||||
}
|
||||
function setParticipantDevicesMode(){
|
||||
console.log("Setting participant mode : count=" + gridModel.participantDevices.count)
|
||||
grid.clear()
|
||||
gridModel.model = gridModel.participantDevices
|
||||
}
|
||||
|
||||
delegateModel: DelegateModel{
|
||||
id: gridModel
|
||||
property ParticipantDeviceProxyModel participantDevices : ParticipantDeviceProxyModel {
|
||||
id: participantDevices
|
||||
//callModel: conference.callModel
|
||||
showMe: true
|
||||
}
|
||||
model: participantDevices
|
||||
onCountChanged: {console.log("Delegate count = "+count+"/"+participantDevices.count)}
|
||||
delegate: Item{
|
||||
id: avatarCell
|
||||
property ParticipantDeviceModel currentDevice: gridModel.participantDevices.getAt(index)
|
||||
onCurrentDeviceChanged: {
|
||||
console.log("currentDevice changed: " +currentDevice+"/"+cameraView.currentDevice + (currentDevice?", me:"+currentDevice.isMe:'')+" ["+index+"]")
|
||||
if(index < 0) cameraView.enabled = false // this is a delegate destruction. We need to stop camera before Qt change its currentDevice (and then, let CameraView to delete wrong renderer)
|
||||
|
||||
}
|
||||
//color: 'black' /*!conference.callModel && gridModel.defaultList.get(index).color ? gridModel.defaultList.get(index).color : */
|
||||
//color: gridModel.model.get(index) && gridModel.model.get(index).color ? gridModel.model.get(index).color : '' // modelIndex is a custom index because by Mosaic modelisation, it is not accessible.
|
||||
//color: $modelData.color ? $modelData.color : ''
|
||||
height: grid.cellHeight - 10
|
||||
width: grid.cellWidth - 10
|
||||
Component.onCompleted: {
|
||||
console.log("Completed: ["+index+"] " +(currentDevice?currentDevice.peerAddress+", isMe:"+currentDevice.isMe : '') )
|
||||
}
|
||||
|
||||
CameraView{
|
||||
id: cameraView
|
||||
enabled: index >=0
|
||||
anchors.fill: parent
|
||||
currentDevice: avatarCell.currentDevice
|
||||
isPaused: callModel.pausedByUser || avatarCell.currentDevice && avatarCell.currentDevice.isPaused //callModel.pausedByUser
|
||||
onCloseRequested: grid.remove( index)
|
||||
color: 'black'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
188
linphone-app/ui/views/App/Calls/VideoConferenceMenu.qml
Normal file
188
linphone-app/ui/views/App/Calls/VideoConferenceMenu.qml
Normal file
|
|
@ -0,0 +1,188 @@
|
|||
import QtQuick 2.12
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQml.Models 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
import QtQuick.Controls 2.12
|
||||
import Common 1.0
|
||||
import Common.Styles 1.0
|
||||
import Linphone 1.0
|
||||
import LinphoneUtils 1.0
|
||||
|
||||
import LinphoneEnums 1.0
|
||||
|
||||
import UtilsCpp 1.0
|
||||
|
||||
import App.Styles 1.0
|
||||
|
||||
|
||||
// Temp
|
||||
import 'Incall.js' as Logic
|
||||
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Rectangle{
|
||||
id: mainItem
|
||||
property CallModel callModel
|
||||
signal close()
|
||||
|
||||
height: 500
|
||||
width: 400
|
||||
color: "white"
|
||||
radius: VideoConferenceMenuStyle.radius
|
||||
ButtonGroup{id: modeGroup}
|
||||
ColumnLayout{
|
||||
anchors.fill: parent
|
||||
// HEADER
|
||||
Borders{
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: Math.max(VideoConferenceMenuStyle.header.height, title.implicitHeight+20)
|
||||
bottomColor: VideoConferenceMenuStyle.list.border.color
|
||||
bottomWidth: VideoConferenceMenuStyle.list.border.width
|
||||
RowLayout{
|
||||
anchors.fill: parent
|
||||
ActionButton{
|
||||
//Layout.minimumHeight: VideoConferenceMenuStyle.buttons.back.iconSize
|
||||
//Layout.minimumWidth: VideoConferenceMenuStyle.buttons.back.iconSize
|
||||
backgroundRadius: width/2
|
||||
isCustom: true
|
||||
colorSet: VideoConferenceMenuStyle.buttons.back
|
||||
onClicked: contentsStack.pop()
|
||||
visible: contentsStack.nViews > 1
|
||||
}
|
||||
Text{
|
||||
id: title
|
||||
text: contentsStack.currentItem.objectName == 'settingsMenu' ? 'Paramètres' : 'Modifier la mise en page'
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: implicitHeight
|
||||
horizontalAlignment: Qt.AlignCenter
|
||||
color: VideoConferenceMenuStyle.header.color
|
||||
font.pointSize: VideoConferenceMenuStyle.header.pointSize
|
||||
font.weight: VideoConferenceMenuStyle.header.weight
|
||||
wrapMode: Text.WordWrap
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
ActionButton{
|
||||
Layout.rightMargin: 10
|
||||
backgroundRadius: width/2
|
||||
isCustom: true
|
||||
colorSet: VideoConferenceMenuStyle.buttons.close
|
||||
onClicked: mainItem.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
// CONTENT
|
||||
StackView{
|
||||
id: contentsStack
|
||||
initialItem: settingsMenuComponent
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
Component{
|
||||
id: settingsMenuComponent
|
||||
ColumnLayout{
|
||||
property string objectName: 'settingsMenu'
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Repeater{
|
||||
model: [{text: 'Modifier la mise en page', icon: VideoConferenceMenuStyle.settingsIcons.gridIcon, nextPage:layoutMenu}
|
||||
]
|
||||
delegate:
|
||||
Borders{
|
||||
bottomColor: VideoConferenceMenuStyle.list.border.color
|
||||
bottomWidth: VideoConferenceMenuStyle.list.border.width
|
||||
Layout.preferredHeight: Math.max(settingIcon.height, settingsDescription.implicitHeight) + 20
|
||||
Layout.fillWidth: true
|
||||
RowLayout{
|
||||
anchors.fill: parent
|
||||
Icon{
|
||||
id: settingIcon
|
||||
Layout.minimumWidth: iconWidth
|
||||
Layout.leftMargin: 15
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
icon: modelData.icon
|
||||
overwriteColor: VideoConferenceMenuStyle.list.color
|
||||
iconWidth: VideoConferenceMenuStyle.settingsIcons.width
|
||||
iconHeight: VideoConferenceMenuStyle.settingsIcons.height
|
||||
}
|
||||
Text{
|
||||
id: settingsDescription
|
||||
Layout.fillWidth: true
|
||||
height: implicitHeight
|
||||
wrapMode: Text.WordWrap
|
||||
elide: Text.ElideRight
|
||||
|
||||
text: modelData.text
|
||||
font.pointSize: VideoConferenceMenuStyle.list.pointSize
|
||||
color: VideoConferenceMenuStyle.list.color
|
||||
}
|
||||
ActionButton{
|
||||
Layout.minimumWidth: iconWidth
|
||||
Layout.rightMargin: 10
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
backgroundRadius: width/2
|
||||
isCustom: true
|
||||
colorSet: VideoConferenceMenuStyle.buttons.next
|
||||
}
|
||||
}
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
onClicked: contentsStack.push(modelData.nextPage)
|
||||
}
|
||||
}
|
||||
}
|
||||
Item{// Spacer
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
}
|
||||
}
|
||||
Component{
|
||||
id: layoutMenu
|
||||
ColumnLayout{
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Repeater{
|
||||
model: [{text: 'Mode mosaïque', icon: VideoConferenceMenuStyle.modeIcons.gridIcon, value:LinphoneEnums.ConferenceLayoutGrid}
|
||||
, {text: 'Mode présentateur', icon: VideoConferenceMenuStyle.modeIcons.activeSpeakerIcon, value:LinphoneEnums.ConferenceLayoutActiveSpeaker}
|
||||
]
|
||||
delegate:
|
||||
Borders{
|
||||
bottomColor: VideoConferenceMenuStyle.list.border.color
|
||||
bottomWidth: VideoConferenceMenuStyle.list.border.width
|
||||
Layout.preferredHeight: Math.max(layoutIcon.height, radio.contentItem.implicitHeight) + 20
|
||||
Layout.fillWidth: true
|
||||
RowLayout{
|
||||
anchors.fill: parent
|
||||
|
||||
RadioButton{
|
||||
id: radio
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 15
|
||||
Layout.preferredHeight: contentItem.implicitHeight
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
ButtonGroup.group: modeGroup
|
||||
checked: mainItem.callModel ? modelData.value == mainItem.callModel.conferenceVideoLayout : false
|
||||
text: modelData.text
|
||||
onClicked: mainItem.callModel.conferenceVideoLayout = modelData.value
|
||||
}
|
||||
Icon{
|
||||
id: layoutIcon
|
||||
Layout.minimumWidth: iconWidth
|
||||
Layout.rightMargin: 10
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
icon: modelData.icon
|
||||
iconWidth: VideoConferenceMenuStyle.modeIcons.width
|
||||
iconHeight: VideoConferenceMenuStyle.modeIcons.height
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Item{// Spacer
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,95 +1,41 @@
|
|||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.2
|
||||
import QtQuick.Window 2.2
|
||||
|
||||
import Utils 1.0
|
||||
|
||||
import Common 1.0
|
||||
import App.Styles 1.0
|
||||
|
||||
// =============================================================================
|
||||
|
||||
Item {
|
||||
id: assistant
|
||||
|
||||
readonly property string viewsPath: 'qrc:/ui/views/App/Main/Assistant/'
|
||||
readonly property alias nViews: stack.depth
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function pushView (view, properties) {
|
||||
stack.push(
|
||||
Utils.isString(view) ? viewsPath + view + '.qml' : view,
|
||||
properties
|
||||
)
|
||||
}
|
||||
|
||||
function getView (index) {
|
||||
return stack.get(index)
|
||||
}
|
||||
|
||||
function popView () {
|
||||
if( nViews <= 1 ) {
|
||||
stack.pop()
|
||||
window.setView('Home')
|
||||
}else
|
||||
stack.pop()
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: AssistantStyle.color
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
StackView {
|
||||
id: stack
|
||||
clip:true
|
||||
|
||||
anchors {
|
||||
fill: parent
|
||||
}
|
||||
|
||||
initialItem: assistant.viewsPath + 'AssistantHome.qml'
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
popEnter: Transition {
|
||||
YAnimator {
|
||||
duration: AssistantStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: stack.height + AssistantStyle.bottomMargin
|
||||
to: 0
|
||||
}
|
||||
}
|
||||
|
||||
popExit: Transition {
|
||||
XAnimator {
|
||||
duration: AssistantStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: 0
|
||||
to: stack.width + AssistantStyle.rightMargin
|
||||
}
|
||||
}
|
||||
|
||||
pushEnter: Transition {
|
||||
XAnimator {
|
||||
duration: AssistantStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: stack.width + AssistantStyle.rightMargin
|
||||
to: 0
|
||||
}
|
||||
}
|
||||
|
||||
pushExit: Transition {
|
||||
YAnimator {
|
||||
duration: AssistantStyle.stackAnimation.duration
|
||||
easing.type: Easing.OutBack
|
||||
from: 0
|
||||
to: stack.height + AssistantStyle.bottomMargin
|
||||
}
|
||||
}
|
||||
}
|
||||
id: assistant
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: AssistantStyle.color
|
||||
}
|
||||
function pushView (view, properties) {
|
||||
stack.pushView(view, properties)
|
||||
}
|
||||
|
||||
function getView (index) {
|
||||
return stack.getView(index)
|
||||
}
|
||||
|
||||
function popView () {
|
||||
stack.popView()
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
StackView {
|
||||
id: stack
|
||||
anchors.fill: parent
|
||||
|
||||
viewsPath: 'qrc:/ui/views/App/Main/Assistant/'
|
||||
initialItem: viewsPath + 'AssistantHome.qml'
|
||||
|
||||
onExit:window.setView('Home')
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,11 +58,18 @@ ColumnLayout {
|
|||
texts: [
|
||||
'TERMINEES',
|
||||
'PROGRAMMEES',
|
||||
'INVITATIONS'
|
||||
'INVITATIONS',
|
||||
'TEST'
|
||||
]
|
||||
selectedButton: mainItem.filterType
|
||||
onClicked: {
|
||||
mainItem.filterType = (button === 0 ? ConferenceInfoProxyModel.Ended : button === 1 ?ConferenceInfoProxyModel.Scheduled : ConferenceInfoProxyModel.Invitations);
|
||||
if(button <= 2)
|
||||
mainItem.filterType = (button === 0 ? ConferenceInfoProxyModel.Ended : button === 1 ?ConferenceInfoProxyModel.Scheduled : ConferenceInfoProxyModel.Invitations);
|
||||
else {
|
||||
window.detachVirtualWindow()
|
||||
window.attachVirtualWindow(Qt.resolvedUrl('../Calls/VideoConferenceMenu.qml'))
|
||||
}
|
||||
|
||||
//mainItem.filterType = button
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,87 @@
|
|||
pragma Singleton
|
||||
import QtQml 2.2
|
||||
import QtQuick 2.7
|
||||
|
||||
import Units 1.0
|
||||
import ColorsList 1.0
|
||||
|
||||
// =============================================================================
|
||||
|
||||
QtObject {
|
||||
property string sectionName: 'VideoConferenceMenu'
|
||||
property color backgroundColor: ColorsList.add(sectionName+'_bg', 'k').color
|
||||
property int radius: 8
|
||||
property QtObject header: QtObject{
|
||||
property string name: 'header'
|
||||
property int height: 60
|
||||
property color color: ColorsList.add(sectionName+'_'+name+'_fg', 'j').color
|
||||
property int weight: Font.Bold
|
||||
property int pointSize: Units.dp * 14
|
||||
}
|
||||
property QtObject list : QtObject{
|
||||
property string name: 'list'
|
||||
property int height: 60
|
||||
property color color: ColorsList.add(sectionName+'_'+name+'_fg', 'j').color
|
||||
property int weight: Font.Normal
|
||||
property int selectedWeight: Font.Bold
|
||||
property int pointSize: Units.dp * 12
|
||||
|
||||
property QtObject border: QtObject{
|
||||
property color color: ColorsList.add(sectionName+'_list_border', 'f').color
|
||||
property int width: 2
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject modeIcons: QtObject{
|
||||
property string gridIcon: 'conference_layout_grid'
|
||||
property string activeSpeakerIcon: 'conference_layout_active_speaker'
|
||||
property int width: 80
|
||||
property int height: 50
|
||||
}
|
||||
property QtObject settingsIcons: QtObject{
|
||||
property string gridIcon: 'conference_layout_grid_custom'
|
||||
property string activeSpeakerIcon: 'conference_layout_active_speaker'
|
||||
property int width: 50
|
||||
property int height: 50
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
property QtObject buttons: QtObject{
|
||||
property QtObject close: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'close_custom'
|
||||
property string name : 'close'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_n_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_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
|
||||
}
|
||||
property QtObject back: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'back_custom'
|
||||
property string name : 'back'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_n_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_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
|
||||
}
|
||||
property QtObject next: QtObject {
|
||||
property int iconSize: 40
|
||||
property string icon : 'panel_arrow_custom'
|
||||
property string name : 'next'
|
||||
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_h_b_bg').color
|
||||
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_n_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_h_b_fg').color
|
||||
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_n_b_fg').color
|
||||
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_fg').color
|
||||
}
|
||||
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
}
|
||||
|
|
@ -12,6 +12,7 @@ singleton CallsWindowStyle 1.0 Calls/CallsWindowSt
|
|||
singleton WaitingRoomStyle 1.0 Calls/WaitingRoomStyle.qml
|
||||
singleton ConferenceStyle 1.0 Calls/ConferenceStyle.qml
|
||||
singleton VideoConferenceStyle 1.0 Calls/VideoConferenceStyle.qml
|
||||
singleton VideoConferenceMenuStyle 1.0 Calls/VideoConferenceMenuStyle.qml
|
||||
|
||||
singleton CallSipAddressStyle 1.0 Calls/Dialogs/CallSipAddressStyle.qml
|
||||
singleton CallTransferStyle 1.0 Calls/Dialogs/CallTransferStyle.qml
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit dbc1ed98c46a241a4548c42eccad09332907f4be
|
||||
Subproject commit 45009739fe36bba8f70647e526d354cbcf8c06a4
|
||||
Loading…
Add table
Reference in a new issue