summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gui/server_normal/mainwindow.ui29
-rw-r--r--icons/cf_icon_cam.svg28
-rw-r--r--icons/cf_icon_eye.svg18
-rw-r--r--icons/cf_icon_lock.svg18
-rw-r--r--icons/trash.svg1187
-rw-r--r--pvsmgr.qrc1
-rw-r--r--src/server/connectionframe/connectionframe.cpp18
-rw-r--r--src/server/connectionframe/connectionframe.h5
-rw-r--r--src/server/mainwindow/mainwindow.cpp275
-rw-r--r--src/server/mainwindow/mainwindow.h8
-rw-r--r--src/server/net/client.cpp17
-rw-r--r--src/server/net/client.h2
12 files changed, 1467 insertions, 139 deletions
diff --git a/gui/server_normal/mainwindow.ui b/gui/server_normal/mainwindow.ui
index 6d29c97..8ab1c05 100644
--- a/gui/server_normal/mainwindow.ui
+++ b/gui/server_normal/mainwindow.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>838</width>
- <height>607</height>
+ <width>1246</width>
+ <height>858</height>
</rect>
</property>
<property name="windowTitle">
@@ -46,6 +46,28 @@
<property name="lineWidth">
<number>2</number>
</property>
+ <widget class="QLabel" name="trash">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>111</width>
+ <height>121</height>
+ </rect>
+ </property>
+ <property name="acceptDrops">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../pvsmgr.qrc">:/trash</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
</widget>
</item>
</layout>
@@ -181,7 +203,7 @@
</action>
<action name="action_StopProjection">
<property name="icon">
- <iconset resource="../../pvsclient.qrc">
+ <iconset resource="../../pvsmgr.qrc">
<normaloff>:/reset</normaloff>:/reset</iconset>
</property>
<property name="text">
@@ -218,7 +240,6 @@
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
- <include location="../../pvsclient.qrc"/>
<include location="../../pvsmgr.qrc"/>
</resources>
<connections/>
diff --git a/icons/cf_icon_cam.svg b/icons/cf_icon_cam.svg
index cd1599d..c51ab6d 100644
--- a/icons/cf_icon_cam.svg
+++ b/icons/cf_icon_cam.svg
@@ -22,6 +22,14 @@
<defs
id="defs4">
<linearGradient
+ id="linearGradient5208"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5210" />
+ </linearGradient>
+ <linearGradient
id="linearGradient3765">
<stop
style="stop-color:#000000;stop-opacity:1;"
@@ -76,20 +84,20 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.7559525"
- inkscape:cx="-102.56898"
- inkscape:cy="47.623858"
+ inkscape:zoom="5.511905"
+ inkscape:cx="76.742745"
+ inkscape:cy="65.372119"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
objecttolerance="10000"
gridtolerance="10000"
guidetolerance="10000"
- inkscape:window-width="1262"
- inkscape:window-height="693"
- inkscape:window-x="583"
- inkscape:window-y="111"
- inkscape:window-maximized="0">
+ inkscape:window-width="1280"
+ inkscape:window-height="1000"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid2410"
@@ -118,8 +126,8 @@
style="display:inline;filter:url(#filter3249)"
transform="translate(0,96)">
<path
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="M 26.506119,-95.99996 C 11.874743,-95.99996 0,-83.87831 0,-68.942709 c 0,9.631705 4.9381305,18.090939 12.369524,22.885922 l 0,29.424765 c 0,3.99726 3.15246,7.2152714 7.068296,7.2152714 l 13.871538,0 -21.021393,34.1909936 c -0.978965,1.730866 -0.392394,3.938647 1.303177,4.937954 l 3.04823,1.803817 c 1.695632,0.999312 3.858421,0.400555 4.837381,-1.330322 l 24.069573,-39.6024426 7.863482,0 24.069623,39.6024426 c 0.978954,1.730866 3.141748,2.329613 4.837324,1.330322 l 3.048231,-1.803817 c 1.69563,-0.999318 2.282191,-3.207104 1.303232,-4.937954 l -21.021392,-34.1909936 17.405684,0 c 3.915838,0 7.068298,-3.2180114 7.068298,-7.2152714 l 0,-3.968395 c 2.540348,-1.203699 11.993052,-5.004891 20.498062,0.360752 4.0334,2.544611 4.44853,8.999808 8.48197,11.5444257 2.70567,1.7069772 5.06943,1.7069772 7.77512,0 2.01669,-1.2723054 0.70379,-3.3521357 0.70677,-5.7722107 0.0128,-12.025439 0.0128,-21.164789 0,-33.190229 -0.003,-2.420075 1.30988,-4.499899 -0.70677,-5.772211 -2.70569,-1.706988 -5.06945,-1.706988 -7.77512,0 -4.03344,2.544611 -4.44857,8.999805 -8.48197,11.544427 -8.50593,5.36626 -17.958965,1.541446 -20.498062,0.33818 l 0,-4.509541 C 97.5522,-50.851807 102.49033,-59.311045 102.49033,-68.942749 102.49033,-83.878351 90.615589,-96 75.984214,-96 64.705818,-96 55.071346,-88.802714 51.245167,-78.660813 47.418934,-88.802676 37.784464,-95.99996 26.506119,-95.99996 z"
+ style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.06365538;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 27.497854,-94.616806 c -14.315166,0 -25.933274,11.85968 -25.933274,26.472495 0,9.423546 4.8314088,17.699961 12.102197,22.391317 l 0,28.788841 c 0,3.910873 3.084329,7.0593383 6.915538,7.0593383 l 13.571748,0 L 13.58698,23.547251 c -0.957808,1.693458 -0.383914,3.853524 1.275013,4.831235 l 2.982353,1.764834 c 1.658986,0.977715 3.775033,0.391898 4.732836,-1.301572 l 23.549385,-38.7465627 7.693541,0 23.549433,38.7465627 c 0.957797,1.693458 3.073851,2.279266 4.732782,1.301572 l 2.982353,-1.764834 c 1.658984,-0.977721 2.232868,-3.137793 1.275067,-4.831235 l -20.567082,-33.4520657 17.029515,0 c 3.831212,0 6.91554,-3.1484653 6.91554,-7.0593383 l 0,-3.882629 c 2.485446,-1.177684 11.733864,-4.896726 20.055064,0.352956 3.94622,2.489616 4.35239,8.805305 8.29865,11.2949293 2.64719,1.6700861 4.95988,1.6700861 7.60709,0 1.9731,-1.2448093 0.68858,-3.2796903 0.69149,-5.6474633 0.0126,-11.765547 0.0126,-20.70738 0,-32.472929 -0.003,-2.367772 1.28157,-4.402648 -0.69149,-5.647463 -2.64721,-1.670097 -4.9599,-1.670097 -7.60709,0 -3.94626,2.489618 -4.35243,8.805304 -8.29865,11.294931 -8.3221,5.250286 -17.570842,1.508133 -20.055064,0.330872 l 0,-4.412081 c 7.270786,-4.691356 12.102184,-12.967774 12.102184,-22.391321 0,-14.612816 -11.618096,-26.472494 -25.933259,-26.472494 -11.034651,0 -20.460906,7.041739 -24.204393,16.964456 -3.743541,-9.92268 -13.169794,-16.964417 -24.204394,-16.964417 z"
id="rect3212"
sodipodi:nodetypes="csccccccccccccccccccssssssssccsscc"
inkscape:connector-curvature="0" />
diff --git a/icons/cf_icon_eye.svg b/icons/cf_icon_eye.svg
index 06d6f85..6f7f3f8 100644
--- a/icons/cf_icon_eye.svg
+++ b/icons/cf_icon_eye.svg
@@ -36,23 +36,23 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1156"
+ inkscape:window-width="1280"
+ inkscape:window-height="1000"
id="namedview8"
showgrid="true"
- inkscape:zoom="4.2142857"
- inkscape:cx="-20.387675"
- inkscape:cy="53.464011"
- inkscape:window-x="-2"
- inkscape:window-y="-3"
+ inkscape:zoom="5.9599"
+ inkscape:cx="42.050215"
+ inkscape:cy="67.037619"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
showguides="false"
inkscape:snap-page="false"
inkscape:snap-grids="true" />
<path
- style="fill:#cccccc;fill-opacity:1;stroke:none"
+ style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:connector-curvature="0"
id="path6"
- d="m 118.85716,-192 q -10.85723,-16.38893 -27.214316,-24.51387 4.357145,7.22224 4.357145,15.62497 0,12.84723 -9.392852,21.97913 -9.392856,9.13197 -22.607145,9.13197 -13.214287,0 -22.607146,-9.13197 -9.392851,-9.1319 -9.392851,-21.97913 0,-8.40273 4.357146,-15.62497 -16.357142,8.12494 -27.2142853,24.51387 9.5000023,14.23607 23.8214253,22.6736 14.321429,8.4375 31.035711,8.4375 16.714283,0 31.035714,-8.4375 14.321374,-8.43753 23.821454,-22.6736 z m -51.428602,-26.6667 q 0,-1.38887 -0.999996,-2.36103 -0.999992,-0.97224 -2.42857,-0.97224 -8.92857,0 -15.321428,6.21524 -6.392856,6.2153 -6.392856,14.89583 0,1.38887 1,2.36113 1.000001,0.97227 2.428576,0.97227 1.42857,0 2.428566,-0.97227 1,-0.97226 1,-2.36113 0,-5.97213 4.357144,-10.2083 4.357141,-4.23613 10.499998,-4.23613 1.428578,0 2.42857,-0.97227 0.999996,-0.97217 0.999996,-2.3611 z M 128,-192 q 0,2.36107 -1.42855,4.79167 -10.00001,15.9722 -26.892896,25.59033 Q 82.785705,-152 63.999992,-152 45.214281,-152 28.321426,-161.65287 11.428572,-171.3056 1.4285712,-187.20833 0,-189.63893 0,-192 0,-194.3611 1.4285712,-196.7917 11.428572,-212.6944 28.321426,-222.34713 45.214281,-232 63.999992,-232 q 18.785713,0 35.678562,9.65287 16.892886,9.65273 26.892896,25.55543 Q 128,-194.3611 128,-192 z" />
+ d="m 118.02062,-192 q -10.67506,-16.11394 -26.757696,-24.10255 4.284038,7.10106 4.284038,15.3628 0,12.63167 -9.235251,21.61034 -9.235255,8.97875 -22.227825,8.97875 -12.992567,0 -22.227825,-8.97875 -9.23525,-8.97867 -9.23525,-21.61034 0,-8.26174 4.284038,-15.3628 -16.082688,7.98861 -26.757662,24.10255 9.340603,13.9972 23.42173,22.29316 14.081132,8.29593 30.514969,8.29593 16.433837,0 30.514972,-8.29593 Q 108.67994,-178.0028 118.02062,-192 z m -50.565695,-26.21926 q 0,-1.36558 -0.983217,-2.32142 -0.983214,-0.95593 -2.387822,-0.95593 -8.778759,0 -15.064353,6.11096 -6.285591,6.11102 -6.285591,14.6459 0,1.36556 0.983221,2.32151 0.983223,0.95595 2.387828,0.95595 1.4046,0 2.387817,-0.95595 0.983222,-0.95595 0.983222,-2.32151 0,-5.87193 4.284036,-10.03702 4.284033,-4.16506 10.32382,-4.16506 1.404608,0 2.387822,-0.95596 0.983217,-0.95585 0.983217,-2.32147 z M 127.01005,-192 q 0,2.32146 -1.40458,4.71127 -9.83222,15.7042 -26.441665,25.16096 -16.609408,9.45662 -35.079919,9.45662 -18.470509,0 -35.079922,-9.49091 -16.609413,-9.49077 -26.441625,-25.12667 -1.4046014,-2.38981 -1.4046014,-4.71127 0,-2.32149 1.4046014,-4.7113 9.832212,-15.63587 26.441625,-25.12664 16.609413,-9.49091 35.079922,-9.49091 18.470511,0 35.079919,9.49091 16.609445,9.49077 26.441665,25.12664 1.40458,2.38981 1.40458,4.7113 z" />
</svg>
diff --git a/icons/cf_icon_lock.svg b/icons/cf_icon_lock.svg
index 40eac88..ceff44b 100644
--- a/icons/cf_icon_lock.svg
+++ b/icons/cf_icon_lock.svg
@@ -36,25 +36,25 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1156"
+ inkscape:window-width="1280"
+ inkscape:window-height="1000"
id="namedview2995"
showgrid="false"
- inkscape:zoom="0.26339286"
- inkscape:cx="1103.7208"
- inkscape:cy="559.2271"
- inkscape:window-x="-2"
- inkscape:window-y="-3"
+ inkscape:zoom="0.37249375"
+ inkscape:cx="377.5311"
+ inkscape:cy="1119.8752"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:current-layer="svg2989" />
<g
transform="matrix(1.269571,0,0,-1.269571,170.84746,1536)"
id="g2991"
- style="fill:#cccccc">
+ style="fill:#cccccc;stroke:none;stroke-opacity:1;stroke-width:7.87667644999999972;stroke-miterlimit:4;stroke-dasharray:none">
<path
d="m 704,512 q 0,53 -37.5,90.5 Q 629,640 576,640 523,640 485.5,602.5 448,565 448,512 q 0,-37 19,-67 19,-30 51,-47 L 449,169 q -5,-15 5,-28 10,-13 26,-13 h 192 q 16,0 26,13 10,13 5,28 l -69,229 q 32,17 51,47 19,30 19,67 z M 320,768 h 512 v 192 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 V 768 z m 832,-96 V 96 Q 1152,56 1124,28 1096,0 1056,0 H 96 Q 56,0 28,28 0,56 0,96 v 576 q 0,40 28,68 28,28 68,28 h 32 v 192 q 0,184 132,316 132,132 316,132 184,0 316,-132 132,-132 132,-316 V 768 h 32 q 40,0 68,-28 28,-28 28,-68 z"
id="path2993"
inkscape:connector-curvature="0"
- style="fill:#cccccc" />
+ style="fill:#cccccc;stroke:none;stroke-opacity:1;stroke-width:7.87667644999999972;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</svg>
diff --git a/icons/trash.svg b/icons/trash.svg
new file mode 100644
index 0000000..e217a09
--- /dev/null
+++ b/icons/trash.svg
@@ -0,0 +1,1187 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="521.23871"
+ height="529.31995"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ sodipodi:docname="trash.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.0"
+ inkscape:export-filename="/home/hrum/Pictures/openclipart/trash.png"
+ inkscape:export-xdpi="29"
+ inkscape:export-ydpi="29">
+ <title
+ id="title162">trash</title>
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective160" />
+ <linearGradient
+ id="linearGradient3482"
+ inkscape:collect="always">
+ <stop
+ id="stop3484"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0.75138122" />
+ <stop
+ id="stop3486"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3470">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3472" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3438">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3440" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3442" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3398">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3400" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3390">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3392" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3394" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3334">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3336" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3338" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3308"
+ inkscape:collect="always">
+ <stop
+ id="stop3310"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.28729282" />
+ <stop
+ id="stop3312"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3274">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3276" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3278" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3250">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3252" />
+ <stop
+ id="stop3258"
+ offset="0.72804081"
+ style="stop-color:#000000;stop-opacity:0.81081081" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3254" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3240">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3242" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3244" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3228">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3230" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3232" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3137">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3139" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3141" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3129">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3131" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3133" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3121">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3123" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3125" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2958">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2960" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2962" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2898">
+ <stop
+ style="stop-color:#eceee9;stop-opacity:1;"
+ offset="0"
+ id="stop2900" />
+ <stop
+ style="stop-color:#c6b6b6;stop-opacity:0;"
+ offset="1"
+ id="stop2902" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient2904"
+ cx="204.14012"
+ cy="464.34125"
+ fx="199.9191"
+ fy="598.38995"
+ r="171.42857"
+ gradientTransform="matrix(0.9261318,-4.6209423e-8,6.1492962e-8,1.9887236,45.685314,-460.63562)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient2916"
+ cx="398.48984"
+ cy="499.07516"
+ fx="398.48984"
+ fy="499.07516"
+ r="171.42857"
+ gradientTransform="matrix(1.155248,0,0,0.5,-61.864707,180.4668)"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="linearGradient2944"
+ x1="368.31082"
+ y1="546.77179"
+ x2="502.32489"
+ y2="546.77179"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect"
+ gradientTransform="translate(119.198,32.324881)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient2970"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient2972"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient2980"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient2982"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient2990"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient2992"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient3000"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient3002"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient3010"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient3012"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient3086"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient3088"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient3090"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient3092"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3121"
+ id="linearGradient3127"
+ x1="396.95291"
+ y1="442.70932"
+ x2="365.05893"
+ y2="360.93362"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3129"
+ id="linearGradient3135"
+ x1="449.62631"
+ y1="486.28427"
+ x2="349.36731"
+ y2="314.88644"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3137"
+ id="linearGradient3143"
+ x1="356.7598"
+ y1="756.88354"
+ x2="368.41394"
+ y2="205.34026"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(119.198,32.324881)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2898"
+ id="radialGradient3196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="252.53815"
+ fy="545.35742"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2958"
+ id="radialGradient3198"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)"
+ cx="264.65997"
+ cy="564.4585"
+ fx="277.07745"
+ fy="552.4173"
+ r="24.243662" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="radialGradient3234"
+ cx="285.71426"
+ cy="532.36218"
+ fx="292.74445"
+ fy="648.23889"
+ r="171.42857"
+ gradientTransform="matrix(0.91304489,2.7805358e-8,0,0.81625055,24.844341,12.106971)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="linearGradient3246"
+ x1="342.85715"
+ y1="551.68921"
+ x2="411.42856"
+ y2="551.68921"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(119.198,32.324881)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3250"
+ id="radialGradient3256"
+ cx="284.86301"
+ cy="667.49408"
+ fx="343.45184"
+ fy="706.10431"
+ r="173.74623"
+ gradientTransform="matrix(1,0,0,0.3662791,0,423.00496)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3274"
+ id="linearGradient3272"
+ x1="312.56506"
+ y1="728.25836"
+ x2="500.29697"
+ y2="590.70825"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="radialGradient3286"
+ cx="400.02036"
+ cy="588.42487"
+ fx="400.02036"
+ fy="588.42487"
+ r="107.07617"
+ gradientTransform="matrix(0.1717355,0.708083,-1.4748645,0.2180553,1268.1112,213.41957)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3274"
+ id="linearGradient3296"
+ x1="738.84052"
+ y1="935.02405"
+ x2="300.94659"
+ y2="534.75629"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3121"
+ id="linearGradient3300"
+ gradientUnits="userSpaceOnUse"
+ x1="393.42719"
+ y1="410.52774"
+ x2="476.02936"
+ y2="498.66617" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3308"
+ id="radialGradient3304"
+ cx="388.66751"
+ cy="655.15833"
+ fx="394.22461"
+ fy="754.88953"
+ r="107.07617"
+ gradientTransform="matrix(1,0,0,1.1603773,0,-101.8667)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3129"
+ id="linearGradient3322"
+ x1="519.14221"
+ y1="639.38013"
+ x2="452.30872"
+ y2="645.0625"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3334"
+ id="radialGradient3340"
+ cx="196.99835"
+ cy="623.29962"
+ fx="196.99835"
+ fy="623.29962"
+ r="69.276512"
+ gradientTransform="matrix(0.9798086,0.199938,-0.4666067,2.2866349,419.62974,-785.85654)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ id="filter3382"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.1557008"
+ id="feGaussianBlur3384" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3390"
+ id="radialGradient3396"
+ cx="401.50946"
+ cy="662.97162"
+ fx="401.50946"
+ fy="662.97162"
+ r="112.07617"
+ gradientTransform="matrix(0.8217788,-0.4200565,0.7942332,0.7930358,-439.66434,275.57864)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3398"
+ id="linearGradient3404"
+ x1="415.92352"
+ y1="170.45996"
+ x2="508.94351"
+ y2="585.60388"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3390"
+ id="linearGradient3416"
+ x1="353.55341"
+ y1="625.84088"
+ x2="78.791908"
+ y2="532.90686"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(119.198,32.324881)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3438"
+ id="radialGradient3444"
+ cx="210.11172"
+ cy="721.03217"
+ fx="210.11172"
+ fy="721.03217"
+ r="54.548237"
+ gradientTransform="matrix(1,0,0,0.2592593,0,534.0979)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="radialGradient3456"
+ cx="154.01448"
+ cy="570.1958"
+ fx="154.01448"
+ fy="570.1958"
+ r="18.40757"
+ gradientTransform="matrix(0.4422318,-1.5187565,3.8424618,1.1188486,-2050.2279,199.92413)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="radialGradient3466"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1818728,-1.2150059,3.9579448,0.5924599,-2066.1621,442.31135)"
+ cx="192.24854"
+ cy="571.40808"
+ fx="192.24854"
+ fy="571.40808"
+ r="18.40757" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3470"
+ id="linearGradient3476"
+ x1="159.61343"
+ y1="600.21936"
+ x2="158.57143"
+ y2="590.93365"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1182618,0,0,1.1182618,24.14155,-48.055699)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3482"
+ id="linearGradient3480"
+ gradientUnits="userSpaceOnUse"
+ x1="168.73528"
+ y1="618.07648"
+ x2="173.021"
+ y2="604.50507"
+ gradientTransform="matrix(1.1182618,0,0,1.1182618,24.14155,-48.055699)" />
+ <filter
+ inkscape:collect="always"
+ id="filter3534"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.3702702"
+ id="feGaussianBlur3536" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="232.89597"
+ inkscape:cy="237.45225"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1053"
+ inkscape:window-height="815"
+ inkscape:window-x="163"
+ inkscape:window-y="208" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>trash</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>hrum</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-105.05586,-268.4838)">
+ <rect
+ style="opacity:0.75138119;fill:none;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3538"
+ width="521.23871"
+ height="529.31995"
+ x="105.05586"
+ y="268.4838"
+ inkscape:export-filename="C:\Documents and Settings\kostia.VVCDC\trash.png"
+ inkscape:export-xdpi="31.965542"
+ inkscape:export-ydpi="31.965542" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.85405405;fill:url(#radialGradient3256);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3248"
+ sodipodi:cx="284.86301"
+ sodipodi:cy="667.49408"
+ sodipodi:rx="173.74623"
+ sodipodi:ry="63.63961"
+ d="m 458.60924,667.49408 c 0,35.14719 -77.78884,63.63961 -173.74623,63.63961 -95.9574,0 -173.74623,-28.49242 -173.74623,-63.63961 0,-35.14719 77.78883,-63.63961 173.74623,-63.63961 95.95739,0 173.74623,28.49242 173.74623,63.63961 z"
+ transform="matrix(0.968254,0,0,1.0952381,112.07883,-53.469344)" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3143);stroke-width:6.93961;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 587.05514,398.98113 -341.1461,1.40625 c 12.9324,29.80885 43.88459,269.80279 44.13271,270.09375 -0.002,0.1258 0,0.249 0,0.375 0,30.92582 56.59151,56.03125 126.3125,56.03125 68.3945,0 124.122,-24.13691 126.21875,-54.25 0.5855,-0.25227 0.90625,-0.51736 0.90625,-0.8125 0,-8.57146 43.57589,-272.84375 43.57589,-272.84375 z"
+ id="path2314"
+ sodipodi:nodetypes="cccsscsc" />
+ <path
+ sodipodi:nodetypes="cccsscsc"
+ id="path2918"
+ d="m 589.198,398.98113 -346.1461,1.40625 c 12.9324,29.80885 46.74173,269.80279 46.98985,270.09375 -0.002,0.1258 0,0.249 0,0.375 0,30.92582 56.59151,56.03125 126.3125,56.03125 68.3945,0 124.122,-24.13691 126.21875,-54.25 0.5855,-0.25227 0.90625,-0.51736 0.90625,-0.8125 0,-8.57146 45.71875,-272.84375 45.71875,-272.84375 z"
+ style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.93961;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:url(#linearGradient2944);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.93961;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 589.198,398.98113 -346.1461,1.40625 c 12.9324,29.80885 46.74173,269.80279 46.98985,270.09375 -0.002,0.1258 0,0.249 0,0.375 0,30.92582 56.59151,56.03125 126.3125,56.03125 68.3945,0 124.122,-24.13691 126.21875,-54.25 0.5855,-0.25227 0.90625,-0.51736 0.90625,-0.8125 0,-8.57146 45.71875,-272.84375 45.71875,-272.84375 z"
+ id="path2936"
+ sodipodi:nodetypes="cccsscsc" />
+ <path
+ style="fill:url(#radialGradient3340);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3382)"
+ d="m 246.47722,755.37733 c 0,0 42.42641,4.04061 76.77159,-4.04061 34.34519,-8.08122 46.46702,-28.28427 46.46702,-28.28427 0,0 16.16244,-191.92898 -24.24366,-218.19295 -40.4061,-26.26396 -64.64976,12.12183 -80.8122,44.44671 -16.16244,32.32489 -30.30458,80.81221 -30.30458,94.95434 0,14.14214 6.06092,44.44672 6.06092,54.54824 0,10.10153 2.0203,54.54824 6.06091,56.56854 z"
+ id="path3332" />
+ <path
+ transform="matrix(1.0032055,0,0,0.7897442,129.71073,109.64182)"
+ d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z"
+ sodipodi:ry="85.714287"
+ sodipodi:rx="171.42857"
+ sodipodi:cy="360.93362"
+ sodipodi:cx="285.71429"
+ id="path2312"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3135);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2906"
+ sodipodi:cx="285.71429"
+ sodipodi:cy="360.93362"
+ sodipodi:rx="171.42857"
+ sodipodi:ry="85.714287"
+ d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z"
+ transform="matrix(1.0032055,0,0,0.7897442,129.71073,109.64182)" />
+ <path
+ transform="matrix(1.0032055,0,0,0.7897442,129.71073,109.64182)"
+ d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z"
+ sodipodi:ry="85.714287"
+ sodipodi:rx="171.42857"
+ sodipodi:cy="360.93362"
+ sodipodi:cx="285.71429"
+ id="path2908"
+ style="fill:url(#radialGradient2916);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3127);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2310"
+ sodipodi:cx="285.71429"
+ sodipodi:cy="360.93362"
+ sodipodi:rx="171.42857"
+ sodipodi:ry="85.714287"
+ d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z"
+ transform="matrix(0.9572542,0,0,0.7535704,142.83967,101.0245)" />
+ <path
+ transform="matrix(0.9572542,0,0,0.7535704,142.83967,101.0245)"
+ d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z"
+ sodipodi:ry="85.714287"
+ sodipodi:rx="171.42857"
+ sodipodi:cy="360.93362"
+ sodipodi:cx="285.71429"
+ id="path2319"
+ style="fill:url(#radialGradient2904);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <g
+ style="opacity:0.65405405"
+ id="g3054"
+ transform="matrix(0.3717798,-0.06856265,0.1813592,0.9834169,-57.014971,-14.546594)" />
+ <path
+ style="fill:url(#linearGradient3246);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 490.62657,458.97278 c 0,0 8.57143,111.42857 2.85714,148.57143 -5.71428,37.14285 -31.42857,40 -31.42857,80 0,40 14.28572,28.57142 14.28572,28.57142 0,0 -2.85715,-2.85714 25.71428,-45.71428 28.57143,-42.85714 28.57143,-42.85714 28.57143,-62.85714 0,-20 -8.57143,-105.71429 -8.57143,-120 0,-14.28572 0,-37.14286 0,-37.14286 l -31.42857,8.57143 z"
+ id="path3238" />
+ <g
+ id="g3200"
+ transform="matrix(0.9718673,-0.00766365,0.00766365,0.9718673,124.65597,46.271524)">
+ <g
+ transform="matrix(0.7437115,-0.01685799,0.02266156,0.9997432,52.198924,0.4117641)"
+ id="g2966">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2946"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path2956"
+ style="fill:url(#radialGradient2972);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ style="opacity:0.65405405"
+ id="g2974"
+ transform="matrix(0.3764442,0.0347959,-0.09204074,0.9957552,380.98036,-41.344669)">
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path2976"
+ style="fill:url(#radialGradient2980);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2982);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2978"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ </g>
+ <g
+ style="opacity:0.57297297"
+ id="g2984"
+ transform="matrix(0.5242633,0.01154367,-0.02201351,0.9997577,236.86728,-5.0007997)">
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path2986"
+ style="fill:url(#radialGradient2990);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2988"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ </g>
+ <g
+ style="opacity:0.80540544"
+ transform="matrix(0.5971844,-0.02121212,0.03549783,0.9993698,138.23081,4.0638809)"
+ id="g2994">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3000);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2996"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path2998"
+ style="fill:url(#radialGradient3002);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ style="opacity:0.43243247"
+ id="g3004"
+ transform="matrix(0.4508564,0.01809985,-0.04011317,0.9991951,303.27718,-22.616052)">
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path3006"
+ style="fill:url(#radialGradient3010);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3012);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3008"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ </g>
+ <g
+ transform="matrix(0.8044485,0,0,1,31.514287,4.2857143)"
+ id="g3188">
+ <path
+ transform="matrix(0.4234159,-0.07808524,0.206548,1.1200026,-69.993098,-86.387186)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path3056"
+ style="fill:url(#radialGradient3196);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3198);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3058"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(0.4234159,-0.07808524,0.206548,1.1200026,-64.993098,-82.101472)" />
+ </g>
+ <g
+ id="g3066"
+ transform="matrix(0.5950001,-0.05526423,0.092483,0.9957144,6.7072288,8.0794777)"
+ style="opacity:0.80540544">
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path3068"
+ style="fill:url(#radialGradient3086);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3088);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3070"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ </g>
+ <g
+ transform="matrix(0.4466271,-0.06421316,0.1423102,0.9898221,-15.116484,2.3949092)"
+ id="g3072"
+ style="opacity:0.43243247">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3090);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3074"
+ sodipodi:cx="264.65997"
+ sodipodi:cy="564.4585"
+ sodipodi:rx="24.243662"
+ sodipodi:ry="100.0051"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" />
+ <path
+ transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)"
+ d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z"
+ sodipodi:ry="100.0051"
+ sodipodi:rx="24.243662"
+ sodipodi:cy="564.4585"
+ sodipodi:cx="264.65997"
+ id="path3076"
+ style="fill:url(#radialGradient3092);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3234);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3226"
+ sodipodi:cx="285.71429"
+ sodipodi:cy="360.93362"
+ sodipodi:rx="171.42857"
+ sodipodi:ry="85.714287"
+ d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z"
+ transform="matrix(0.9572542,0,0,0.7535704,142.83967,101.0245)" />
+ <path
+ style="fill:#ffffff;fill-rule:evenodd;stroke:none"
+ d="m 473.48371,433.25849 17.14286,22.85714 31.42857,-2.85714 -14.28571,-25.71428 -34.28572,5.71428 z"
+ id="path3236" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3260"
+ sodipodi:cx="400.02042"
+ sodipodi:cy="635.16919"
+ sodipodi:rx="107.07617"
+ sodipodi:ry="124.24876"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ transform="matrix(0.8461547,0.1741128,-0.2230954,1.1776509,66.856969,-211.22664)" />
+ <path
+ transform="matrix(0.8461547,0.1741128,-0.2230954,1.1776509,66.856969,-211.22664)"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ sodipodi:ry="124.24876"
+ sodipodi:rx="107.07617"
+ sodipodi:cy="635.16919"
+ sodipodi:cx="400.02042"
+ id="path3264"
+ style="fill:url(#linearGradient3272);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ sodipodi:ry="124.24876"
+ sodipodi:rx="107.07617"
+ sodipodi:cy="635.16919"
+ sodipodi:cx="400.02042"
+ id="path3262"
+ style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3286);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3282"
+ sodipodi:cx="400.02042"
+ sodipodi:cy="635.16919"
+ sodipodi:rx="107.07617"
+ sodipodi:ry="124.24876"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ transform="matrix(0.8461547,0.1741128,-0.2230954,1.1776509,66.856969,-211.22664)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3280"
+ sodipodi:cx="400.02042"
+ sodipodi:cy="635.16919"
+ sodipodi:rx="107.07617"
+ sodipodi:ry="124.24876"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" />
+ <path
+ transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ sodipodi:ry="124.24876"
+ sodipodi:rx="107.07617"
+ sodipodi:cy="635.16919"
+ sodipodi:cx="400.02042"
+ id="path3288"
+ style="fill:url(#linearGradient3296);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient3300);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3298"
+ sodipodi:cx="400.02042"
+ sodipodi:cy="635.16919"
+ sodipodi:rx="107.07617"
+ sodipodi:ry="124.24876"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" />
+ <path
+ transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ sodipodi:ry="124.24876"
+ sodipodi:rx="107.07617"
+ sodipodi:cy="635.16919"
+ sodipodi:cx="400.02042"
+ id="path3302"
+ style="fill:url(#radialGradient3304);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:url(#linearGradient3322);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3314"
+ sodipodi:cx="400.02042"
+ sodipodi:cy="635.16919"
+ sodipodi:rx="107.07617"
+ sodipodi:ry="124.24876"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient3404);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3396);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3386"
+ sodipodi:cx="400.02042"
+ sodipodi:cy="635.16919"
+ sodipodi:rx="107.07617"
+ sodipodi:ry="124.24876"
+ d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z"
+ transform="matrix(0.6935881,0.1427193,-0.1828699,0.9653135,72.073668,-71.215779)" />
+ <path
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3534)"
+ d="m 167,627.93361 11.42857,-0.71428 5,-15 c 0,0 -2.14286,2.14285 0,-6.42858 2.14286,-8.57143 5.71429,-7.85714 6.42857,-13.57143 0.71429,-5.71428 -1.42857,-5.71428 0.71429,-10 2.14286,-4.28571 3.57143,-7.85714 3.57143,-17.14285 0,-9.28572 5.71428,-15.71429 5.71428,-15.71429 L 202,540.79075 208.42857,527.93361 195.57143,526.50504 192,542.21932 l 0,10.71429 c 0,0 -0.71429,10 -2.85714,15 -2.14286,5 -6.42857,15 -6.42857,18.57143 0,3.57143 2.14285,7.14286 -0.71429,11.42857 -2.85714,4.28571 -6.42857,13.57143 -6.42857,13.57143 l -5,7.14286 L 167,627.93361 z"
+ id="path3492"
+ transform="matrix(1.1182618,0,0,1.1182618,24.14155,-48.055699)" />
+ <path
+ style="fill:url(#linearGradient3416);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 171.72593,706.89001 0,-18.18274 c 0,0 107.07617,-149.50258 111.11678,-181.82746 4.04061,-32.32488 4.04061,-34.34519 4.04061,-34.34519 l 6.06092,-2.0203 -16.16244,-2.02031 c 0,0 -16.16244,-14.14214 -32.32488,-6.06091 -16.16245,8.08122 -52.52794,26.26396 -60.60916,54.54823 -8.08122,28.28427 -16.16244,70.71068 -16.16244,90.91373 0,20.20305 -8.08122,40.4061 -8.08122,40.4061 0,0 2.02031,56.56855 12.12183,58.58885 z"
+ id="path3408" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3444);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3436"
+ sodipodi:cx="210.11172"
+ sodipodi:cy="721.03217"
+ sodipodi:rx="54.548237"
+ sodipodi:ry="14.142136"
+ d="m 264.65996,721.03217 c 0,7.81048 -24.42208,14.14213 -54.54824,14.14213 -30.12615,0 -54.54823,-6.33165 -54.54823,-14.14213 0,-7.81049 24.42208,-14.14214 54.54823,-14.14214 30.12616,0 54.54824,6.33165 54.54824,14.14214 z"
+ transform="matrix(1.4285714,0,0,1.4285714,-57.723001,-280.72952)" />
+ <path
+ style="fill:#b3b3b3;fill-rule:evenodd;stroke:none"
+ d="m 246.99514,555.25215 7.18884,-15.17641 -13.5789,0 -3.99379,16.77393 10.38385,-1.59752 z"
+ id="path3490" />
+ <path
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.11826181px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 235.81252,548.06332 9.58511,6.39007 -9.58511,2.39628 -11.98138,-9.58511 11.98138,0.79876 z"
+ id="path3488" />
+ <path
+ style="fill:#434343;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z"
+ id="path3446" />
+ <path
+ id="path3448"
+ d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z"
+ style="fill:url(#radialGradient3456);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ style="fill:url(#radialGradient3466);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z"
+ id="path3464" />
+ <path
+ id="path3468"
+ d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z"
+ style="opacity:0.7845304;fill:url(#linearGradient3476);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ style="opacity:0.7845304;fill:url(#linearGradient3480);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z"
+ id="path3478" />
+ </g>
+</svg>
diff --git a/pvsmgr.qrc b/pvsmgr.qrc
index 3837cee..40df258 100644
--- a/pvsmgr.qrc
+++ b/pvsmgr.qrc
@@ -15,6 +15,7 @@
<file alias="reset">icons/keyboard_key.svg</file>
<file alias="student2tutorextension">icons/student2tutor_extension.svg</file>
<file alias="helpme">icons/help.svg</file>
+ <file alias="trash">icons/trash.svg</file>
<file alias="AUTHORS">AUTHORS</file>
<file alias="TRANSLATION">TRANSLATION</file>
<file alias="pvsmgr.qm">build/pvsmgr_de_DE.qm</file>
diff --git a/src/server/connectionframe/connectionframe.cpp b/src/server/connectionframe/connectionframe.cpp
index b09139c..dbe408c 100644
--- a/src/server/connectionframe/connectionframe.cpp
+++ b/src/server/connectionframe/connectionframe.cpp
@@ -50,7 +50,7 @@ static QIcon *term = NULL, *cam = NULL, *eye = NULL, *lock = NULL;
* @param height
*/
ConnectionFrame::ConnectionFrame(QWidget *parent, int width, int height) :
- QGroupBox(parent), _client(NULL), _timerId(0), _timerCounter(0), _selected(false), _isTutor(false)
+ QGroupBox(parent), _client(NULL), _timerId(0), _timerCounter(0), _isSelected(false), _isTutor(false)
{
//defines the ui-stuff
@@ -101,7 +101,11 @@ ConnectionFrame::ConnectionFrame(QWidget *parent, int width, int height) :
ConnectionFrame::~ConnectionFrame()
{
- //
+ if (_client != NULL)
+ {
+ _client->deleteLater();
+ }
+ _iconLayout->deleteLater();
}
/**
@@ -295,9 +299,9 @@ void ConnectionFrame::timerEvent(QTimerEvent* event)
*/
void ConnectionFrame::setSelection(bool selected)
{
- if (_selected == selected)
+ if (_isSelected == selected)
return;
- _selected = selected;
+ _isSelected = selected;
this->updateAppearance();
}
@@ -322,7 +326,7 @@ void ConnectionFrame::updateAppearance()
if (_client == NULL)
{
// Unconnected Frame
- if (_selected)
+ if (_isSelected)
this->setStyleSheet(style_selectedStudent);
else
this->setStyleSheet(style_disconnected);
@@ -336,13 +340,13 @@ void ConnectionFrame::updateAppearance()
// Normal client, no special stuff active
- if (_selected && _isTutor){
+ if (_isSelected && _isTutor){
this->setStyleSheet(style_selectedTutor);
}
else if (_isTutor){
this->setStyleSheet(style_tutor);
}
- else if (_selected){
+ else if (_isSelected){
this->setStyleSheet(style_selectedStudent);
}
diff --git a/src/server/connectionframe/connectionframe.h b/src/server/connectionframe/connectionframe.h
index 72f641d..5a4e1df 100644
--- a/src/server/connectionframe/connectionframe.h
+++ b/src/server/connectionframe/connectionframe.h
@@ -32,7 +32,7 @@ private:
Client *_client;
int _timerId, _timerCounter;
- bool _selected;
+ bool _isSelected;
bool _isTutor;
static const int _startDragDistance = 40;
@@ -51,9 +51,10 @@ public:
const QPixmap& getFramePixmap() const { return _remoteScreen; }
void setSize(int width, int height);
+ const inline QPoint& getPreviousPosition() const { return _previousPosition; }
void assignClient(Client *client);
void setSelection(bool selected);
- const inline bool selected() const { return _selected; }
+ const inline bool isSelected() const { return _isSelected; }
const QString& computerId() const { return _computerId; }
Client* client() const { return _client; }
diff --git a/src/server/mainwindow/mainwindow.cpp b/src/server/mainwindow/mainwindow.cpp
index a6c90c0..a52690f 100644
--- a/src/server/mainwindow/mainwindow.cpp
+++ b/src/server/mainwindow/mainwindow.cpp
@@ -44,6 +44,8 @@ const QString MainWindow::sStrSourceOffline = tr("The projection source is offli
const QString MainWindow::sStrDestNdef = tr("Please select a projection destination.");
const QString MainWindow::sStrDestOffline = tr("The projection destination is offline.");
const QString MainWindow::sStrSourceDestSame = tr("Selected projection target is tutor.");
+const QString MainWindow::sStrClientOnline = tr("Selected client is currently online.");
+const QString MainWindow::sStrNoDestAv = tr("No projection destination available.");
/***************************************************************************//**
* Initialize MainWindow and ListenServer.
@@ -53,11 +55,8 @@ const QString MainWindow::sStrSourceDestSame = tr("Selected projection target is
MainWindow::MainWindow(QString ipListUrl, QWidget* parent) :
QMainWindow(parent), ui(new Ui::MainWindow), _tbIconSize(24), _tbArea(Qt::LeftToolBarArea)
{
-
- _tutorFrame = NULL;
- _selectedFrame = NULL;
_mode = Mode::Multicast;
- _streamingSource = NULL;
+ _streamingSource = 0;
_sessionNameWindow = new SessionNameWindow(this);
_helpWindow = new HelpWindow(this);
@@ -81,6 +80,9 @@ MainWindow::MainWindow(QString ipListUrl, QWidget* parent) :
ui->action_Exit->setStatusTip(tr("Exit"));
ui->action_Lock->setStatusTip(tr("Lock or Unlock all Clients"));
+ _tileWidth = 10;
+ _tileHeight = 10;
+
// Initialize FileDownloader.
if (!ipListUrl.isEmpty())
{
@@ -128,9 +130,6 @@ MainWindow::MainWindow(QString ipListUrl, QWidget* parent) :
setUnifiedTitleAndToolBarOnMac(true);
this->showMaximized(); // show the Mainwindow maximized
- _tileWidth = 10;
- _tileHeight = 10;
-
_listenServer = new ListenServer(CLIENT_PORT);
connect(_listenServer, SIGNAL(newClient(Client*)), this, SLOT(onClientConnected(Client*)));
_discoveryListener = new DiscoveryListener();
@@ -266,27 +265,22 @@ void MainWindow::tellClientCurrentSituation(Client* client)
if (_mode == Mode::Broadcast){
// _watchers.insert(client->id(), client);
client->setWatcher(true);
- client->startVncClient(_streamingSource);
+ Client* c = getClientFromId(_streamingSource);
+ if (c != NULL) {
+ client->startVncClient(c);
+ }
}
else if (_mode == Mode::LockedMulticast)
client->lockScreen(true);
+
}
/***************************************************************************//**
- * Checks if client and manager runs on same machine.
- * @param client
- * @return Return true, if pvsmanager is running on client.
+ * Returns connected client which belongs to given id.
+ * Iterating over ConnectionFrames and comparing id to given id.
+ * @param id
+ * @return Client with given id, if not NULL.
*/
-bool MainWindow::isManagerMachine(Client* client)
-{
- foreach (const QHostAddress &address, QNetworkInterface::allAddresses())
- if (address != QHostAddress(QHostAddress::LocalHost)
- && client != NULL
- && client->ip() == address.toString())
- return true;
- return false;
-}
-
Client* MainWindow::getClientFromId(int id)
{
for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
@@ -300,6 +294,38 @@ Client* MainWindow::getClientFromId(int id)
return NULL;
}
+/***************************************************************************//**
+ * Return the Frame, which is currently beeing Tutor.
+ * Iterating over all ConnectionFrames, and looking for flag _isTutor.
+ * @return Frame with flag _isTutor = true,
+ * else NULL if no Tutor is available.
+ */
+ConnectionFrame* MainWindow::getTutorFrame()
+{
+ for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
+ {
+ if (((*it) != NULL) && ((*it)->isTutor()))
+ return (*it);
+ }
+ return NULL;
+}
+
+/***************************************************************************//**
+ * Return the Frame, which is currently selected by user.
+ * Iterating over all ConnectionFrame and looking for flag _isSelected.
+ * @return Frame with flag _isSelected = true,
+ * else NULL if no frame is selected.
+ */
+ConnectionFrame* MainWindow::getSelectedFrame()
+{
+ for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
+ {
+ if (((*it) != NULL) && ((*it)->isSelected()))
+ return (*it);
+ }
+ return NULL;
+}
+
/*
* Overridden methods
*/
@@ -345,6 +371,14 @@ void MainWindow::resizeEvent(QResizeEvent* e)
(*it)->move((oldpos.x() / _tileWidth) * nw, (oldpos.y() / _tileHeight) * nh);
(*it)->setSize(nw, nh);
}
+
+ // Resize trash and set position.
+ const int width = ui->frmRoom->geometry().width() - (nw + 1);
+ const int height = ui->frmRoom->geometry().height() - (nh + 1);
+ ui->trash->move(width, height);
+ ui->trash->resize(nw, nh);
+ // qDebug() << "Trash pos: " << ui->trash->pos();
+
_tileWidth = nw;
_tileHeight = nh;
}
@@ -366,9 +400,9 @@ void MainWindow::mouseReleaseEvent(QMouseEvent* e)
const QSize frame(ui->frmRoom->size());
if (frame.width() > pos.x() && frame.height() > pos.y())
{
- if (_selectedFrame != NULL) {
- _selectedFrame->setSelection(false);
- _selectedFrame = NULL;
+ if (getSelectedFrame() != NULL)
+ {
+ getSelectedFrame()->setSelection(false);
}
}
}
@@ -384,8 +418,8 @@ void MainWindow::reset()
(*it)->client()->lockScreen(false);
// Stop server (Clients get stopped on ACK)
- if (_streamingSource != NULL)
- _streamingSource->stopVncServer();
+ if (getClientFromId(_streamingSource) != NULL)
+ getClientFromId(_streamingSource)->stopVncServer();
}
/*
@@ -425,6 +459,35 @@ void MainWindow::onPlaceFrame(ConnectionFrame* frame)
y = 0;
else if (y > s.height() - _tileHeight)
y = (_tilesY - 1) * _tileHeight;
+
+ const QRect &trashCenter = ui->trash->geometry();
+ // Check if x coordinate is in trash position.
+ if (trashCenter.contains(p))
+ {
+ // Do not offer deleting online client.
+ if (frame->client() != NULL)
+ {
+ QMessageBox::critical(this, tr("Selection"), sStrClientOnline);
+ frame->move(frame->getPreviousPosition());
+ return;
+ }
+ else
+ {
+ int ret = QMessageBox::question(this, "Warning", "Sure, You want to delete selected client?", 0, 1, 2);
+ if (ret == 1)
+ {
+ frame->hide();
+ frame->deleteLater();
+ _clientFrames.removeOne(frame);
+ return;
+ }
+ else
+ {
+ frame->move(frame->getPreviousPosition());
+ return;
+ }
+ }
+ }
qDebug("Move D");
frame->move(x, y);
savePosition(frame);
@@ -447,15 +510,18 @@ void MainWindow::onPlaceFrame(ConnectionFrame* frame)
void MainWindow::onFrameClicked(ConnectionFrame* frame)
{
// If same frame is clicked again,, do nothing
- if (_selectedFrame == frame)
+ if (getSelectedFrame() == frame)
return;
// If another frame has been selected, unselect it
// Set the ui selected and set a new reference
- if (_selectedFrame != NULL)
- _selectedFrame->setSelection(false);
- _selectedFrame = frame;
- _selectedFrame->setSelection(true);
+ if (getSelectedFrame() != NULL)
+ {
+ getSelectedFrame()->setSelection(false);
+ }
+ frame->setSelection(true);
+ qDebug() << "ID of frame: " << frame->computerId();
+ qDebug() << "ID of selectedFrame: " << getSelectedFrame()->computerId();
}
/***************************************************************************//**
@@ -471,6 +537,14 @@ void MainWindow::onSessionNameClick()
*/
void MainWindow::onSessionNameUpdate()
{
+ // Stop all projections and clear all clients, which where connected to old sessionName.
+ reset();
+ for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
+ {
+ (*it)->hide();
+ (*it)->deleteLater();
+ }
+ _clientFrames.clear();
_sessionNameLabel->setText(tr("Session Name: %1 [click to edit]").arg(Global::sessionName()));
}
@@ -489,7 +563,7 @@ void MainWindow::changeProjection(Client *from, Mode mode, Client *to)
// Set all clients as watchers
for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
{
- if ((*it)->client() != NULL && (*it)->client() != _streamingSource)
+ if ((*it)->client() != NULL && (*it)->client() != getClientFromId(_streamingSource))
{
// _watchers.insert((*it)->client()->id(), (*it)->client());
(*it)->client()->setWatcher(true);
@@ -528,17 +602,20 @@ void MainWindow::changeProjection(Client *from, Mode mode, Client *to)
_mode = mode;
// if there is a server running which is not "from" stop it.
- if (_streamingSource != NULL && _streamingSource != from)
- _streamingSource->stopVncServer();
+ if (getClientFromId(_streamingSource) != NULL && getClientFromId(_streamingSource) != from)
+ getClientFromId(_streamingSource)->stopVncServer();
// Set new streaming source
- _streamingSource = from;
+ _streamingSource = from->id();
// If streaming source is already active avoid a restart
- if (_streamingSource->isActiveVncServer())
- this->onVncServerStateChange(_streamingSource);
- else // Could not take shortcut, (re)start VNC server on source
- _streamingSource->startVncServer();
+ Client* c = getClientFromId(_streamingSource);
+ if (c != NULL) {
+ if (c->isActiveVncServer())
+ this->onVncServerStateChange(c);
+ else // Could not take shortcut, (re)start VNC server on source
+ c->startVncServer();
+ }
}
/***************************************************************************//**
@@ -558,12 +635,14 @@ void MainWindow::onButtonTutorToAll()
{
ui->action_Lock->setChecked(false);
- if (_tutorFrame == NULL)
+ if (getTutorFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorNdef);
- else if (_tutorFrame->client() == NULL)
+ else if (getTutorFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorOffline);
+ else if (_clientFrames.size() == 1)
+ QMessageBox::critical(this, tr("Projection"), sStrNoDestAv);
else
- changeProjection(_tutorFrame->client(), Mode::Broadcast);
+ changeProjection(getTutorFrame()->client(), Mode::Broadcast);
}
/***************************************************************************//**
@@ -575,12 +654,12 @@ void MainWindow::onButtonStudentToAll()
{
ui->action_Lock->setChecked(false);
- if (_selectedFrame == NULL)
+ if (getSelectedFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrSourceNdef);
- if (_selectedFrame->client() == NULL)
+ if (getSelectedFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrSourceOffline);
else
- changeProjection(_selectedFrame->client(), Mode::Broadcast);
+ changeProjection(getSelectedFrame()->client(), Mode::Broadcast);
}
/***************************************************************************//**
@@ -591,18 +670,18 @@ void MainWindow::onButtonTutorToStudent()
{
ui->action_Lock->setChecked(false);
- if (_selectedFrame == NULL)
+ if (getSelectedFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrDestNdef);
- else if (_tutorFrame == NULL)
+ else if (getTutorFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorNdef);
- else if (_selectedFrame == _tutorFrame)
+ else if (getSelectedFrame() == getTutorFrame())
QMessageBox::critical(this, tr("Projection"), sStrSourceDestSame);
- else if (_selectedFrame->client() == NULL)
+ else if (getSelectedFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrDestOffline);
- else if (_tutorFrame->client() == NULL)
+ else if (getTutorFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorOffline);
else
- changeProjection(_tutorFrame->client(), Mode::Multicast, _selectedFrame->client());
+ changeProjection(getTutorFrame()->client(), Mode::Multicast, getSelectedFrame()->client());
}
/***************************************************************************//**
@@ -613,18 +692,18 @@ void MainWindow::onButtonStudentToTutor()
{
ui->action_Lock->setChecked(false);
- if (_selectedFrame == NULL)
+ if (getSelectedFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrSourceNdef);
- else if (_tutorFrame == NULL)
+ else if (getTutorFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorNdef);
- else if (_tutorFrame == _selectedFrame)
+ else if (getTutorFrame() == getSelectedFrame())
QMessageBox::critical(this, tr("Projection"), sStrSourceDestSame);
- else if (_selectedFrame->client() == NULL)
+ else if (getSelectedFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrSourceOffline);
- else if (_tutorFrame->client() == NULL)
+ else if (getTutorFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorOffline);
else
- changeProjection(_selectedFrame->client(), Mode::Multicast, _tutorFrame->client());
+ changeProjection(getSelectedFrame()->client(), Mode::Multicast, getTutorFrame()->client());
}
@@ -635,18 +714,18 @@ void MainWindow::onButtonStudentToTutorExclusive()
{
ui->action_Lock->setChecked(false);
- if (_selectedFrame == NULL)
+ if (getSelectedFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrSourceNdef);
- else if (_tutorFrame == NULL)
+ else if (getTutorFrame() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorNdef);
- else if (_tutorFrame == _selectedFrame)
+ else if (getTutorFrame() == getSelectedFrame())
QMessageBox::critical(this, tr("Projection"), sStrSourceDestSame);
- else if (_selectedFrame->client() == NULL)
+ else if (getSelectedFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrSourceOffline);
- else if (_tutorFrame->client() == NULL)
+ else if (getTutorFrame()->client() == NULL)
QMessageBox::critical(this, tr("Projection"), sStrTutorOffline);
else
- changeProjection(_selectedFrame->client(), Mode::LockedMulticast, _tutorFrame->client());
+ changeProjection(getSelectedFrame()->client(), Mode::LockedMulticast, getTutorFrame()->client());
}
@@ -674,9 +753,7 @@ void MainWindow::onButtonLock(bool checked)
for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
{
- // Check if client is Tutor or the manager is also running on this machine.
- bool isManager = isManagerMachine((*it)->client());
- if ((*it)->client() == NULL || isManager)
+ if ((*it)->client() == NULL)
continue;
(*it)->client()->lockScreen(checked);
}
@@ -699,30 +776,33 @@ void MainWindow::onButtonSetAsTutor()
ui->action_Lock->setChecked(false);
// If no frame is selected, warning.
- if (_selectedFrame == NULL)
+ if (getSelectedFrame() == NULL)
{
QMessageBox::critical(this, tr("Selection"), tr("No client is selected."));
return;
}
// If frame of inactive client has been selected unselect it
- if (_selectedFrame->client() == NULL)
+ if (getSelectedFrame()->client() == NULL)
{
QMessageBox::critical(this, tr("Selection"), tr("The selected client is not connected."));
return;
}
else // If selected client is locked, first unlock
- _selectedFrame->client()->lockScreen(false);
+ {
+ getSelectedFrame()->client()->lockScreen(false);
+ }
// If same frame is already tutor, do nothing
- if (_selectedFrame == _tutorFrame)
+ if (getSelectedFrame() == getTutorFrame())
return;
// Else unset the old and set the new tutor
- if (_tutorFrame != NULL)
- _tutorFrame->setTutor(false);
- _tutorFrame = _selectedFrame;
- _tutorFrame->setTutor(true);
+ if (getTutorFrame() != NULL)
+ {
+ getTutorFrame()->setTutor(false);
+ }
+ getSelectedFrame()->setTutor(true);
}
/***************************************************************************//**
@@ -882,7 +962,7 @@ void MainWindow::onClientAuthenticated(Client* client)
*/
void MainWindow::onVncServerStateChange(Client* client)
{
- if (client == _streamingSource)
+ if (client == getClientFromId(_streamingSource))
EnableButtons();
if (client->isActiveVncServer())
@@ -910,7 +990,7 @@ void MainWindow::onVncServerStateChange(Client* client)
if ( (*it)->client() != NULL)
{
// if (_watchers.contains((*it)->client()->id()))
- if (getClientFromId((*it)->client()->id())->isWatcher())
+ if ((*it)->client()->isWatcher())
{
// Unlock destination and connect VNCclient
(*it)->client()->lockScreen(false);
@@ -924,8 +1004,7 @@ void MainWindow::onVncServerStateChange(Client* client)
else
{
// Lock others and stop their clients
- bool isManager = isManagerMachine((*it)->client());
- (*it)->client()->lockScreen(_mode == Mode::LockedMulticast && isManager != true);
+ (*it)->client()->lockScreen(_mode == Mode::LockedMulticast);
(*it)->client()->stopVncClient();
}
}
@@ -957,25 +1036,33 @@ void MainWindow::onVncServerStateChange(Client* client)
*/
void MainWindow::onVncClientStateChange(Client* client)
{
- // VNC Client stopped -> remove from watchers
- if (!client->isActiveVncClient()){
- // _watchers.remove(client->id());
- getClientFromId(client->id())->setWatcher(false);
-
- // If noboody is watching the multicast stop VNC server
- // if (_watchers.isEmpty() && _mode != Mode::Broadcast)
- // _streamingSource->stopVncServer();
- bool noWatchers = true;
- for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
- {
- if ((*it)->client() != NULL)
+ if (client != NULL)
+ {
+ // VNC Client stopped -> remove from watchers
+ if (!client->isActiveVncClient()){
+ // _watchers.remove(client->id());
+ if (getClientFromId(client->id()) != NULL)
+ getClientFromId(client->id())->setWatcher(false);
+
+ // If noboody is watching the multicast stop VNC server
+ // if (_watchers.isEmpty() && _mode != Mode::Broadcast)
+ // _streamingSource->stopVncServer();
+ bool noWatchers = true;
+ for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it)
{
- if ((*it)->client()->isWatcher())
- noWatchers = false;
+ if ((*it)->client() != NULL)
+ {
+ if ((*it)->client()->isWatcher())
+ noWatchers = false;
+ }
+ }
+ if (noWatchers && _mode != Mode::Broadcast)
+ {
+ Client* c = getClientFromId(_streamingSource);
+ if (c != NULL)
+ c->stopVncServer();
}
}
- if (noWatchers && _mode != Mode::Broadcast)
- _streamingSource->stopVncServer();
}
}
diff --git a/src/server/mainwindow/mainwindow.h b/src/server/mainwindow/mainwindow.h
index fffa49a..524a0b1 100644
--- a/src/server/mainwindow/mainwindow.h
+++ b/src/server/mainwindow/mainwindow.h
@@ -39,7 +39,6 @@ private:
int _tbIconSize;
Qt::ToolBarArea _tbArea;
int _tileWidth, _tileHeight;
- ConnectionFrame *_tutorFrame, *_selectedFrame;
static const int _tilesX = 9;
static const int _tilesY = 7;
@@ -54,7 +53,7 @@ private:
Multicast,
LockedMulticast
} _mode;
- Client * _streamingSource;
+ int _streamingSource;
QMap<int, Client*> _watchers;
QList<ConnectionFrame*> _clientFrames;
@@ -70,6 +69,8 @@ private:
static const QString sStrDestNdef;
static const QString sStrDestOffline;
static const QString sStrSourceDestSame;
+ static const QString sStrClientOnline;
+ static const QString sStrNoDestAv;
void placeFrameInFreeSlot(ConnectionFrame* frame);
ConnectionFrame* createFrame();
@@ -77,7 +78,6 @@ private:
void savePosition(ConnectionFrame *cf);
void changeProjection(Client *from, Mode mode = Mode::Broadcast, Client *to = NULL);
void tellClientCurrentSituation(Client* client);
- bool isManagerMachine(Client* client);
void reset();
void closeEvent(QCloseEvent *e);
@@ -86,6 +86,8 @@ private:
void mouseReleaseEvent(QMouseEvent* e);
Client* getClientFromId(int id);
+ ConnectionFrame* getTutorFrame();
+ ConnectionFrame* getSelectedFrame();
protected slots:
void onTutorListDownloaded(QByteArray& tutorList);
diff --git a/src/server/net/client.cpp b/src/server/net/client.cpp
index 135157c..584b254 100644
--- a/src/server/net/client.cpp
+++ b/src/server/net/client.cpp
@@ -11,6 +11,7 @@
#include "../../shared/util.h"
#include <QPixmap>
#include <cassert>
+#include <QNetworkInterface>
#define CHALLENGE_LEN 20
@@ -310,10 +311,24 @@ void Client::stopVncClient()
}
}
+/***************************************************************************//**
+ * Checks if client and manager runs on same machine.
+ * @return Return true, if pvsmanager is running on client.
+ */
+bool Client::isManagerMachine()
+{
+ foreach (const QHostAddress &address, QNetworkInterface::allAddresses())
+ if (address != QHostAddress(QHostAddress::LocalHost)
+ && this != NULL
+ && this->ip() == address.toString())
+ return true;
+ return false;
+}
+
/******************************************************************************/
void Client::lockScreen(bool lock)
{
- if (!_isTutor && _locked != lock){
+ if (!_isTutor && _locked != lock && !isManagerMachine()){
_locked = lock;
NetworkMessage msg;
msg.setField(_ID, _LOCK);
diff --git a/src/server/net/client.h b/src/server/net/client.h
index 1031838..6872959 100644
--- a/src/server/net/client.h
+++ b/src/server/net/client.h
@@ -71,6 +71,8 @@ private:
static int _clientIdCounter;
+ bool isManagerMachine();
+
void handleMsg();
void sendMessage(NetworkMessage& message);