New Layout : Active Speaker (without miniatures)

New settings menu to change layout.
New GUI object : StackView and RadioButton.
This commit is contained in:
Julien Wadel 2022-04-28 17:15:41 +02:00
parent 19ad53d654
commit efcb67944e
35 changed files with 1722 additions and 173 deletions

View 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

View 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

View 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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -261,9 +261,9 @@ Window {
id: videoConference
VideoConference {
callModel: window.call
enabled: window.visible
listCallsOpened: window.callsIsOpened
onOpenListCallsRequest: mainPaned.open()
enabled: window.visible
}
}

View file

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

View file

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

View 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'
}
}
}
}

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

View file

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

View file

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

View file

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

View file

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