python paparazzi center tools impovement (#2445)

* [Python supervision] Change tool Menu. #2093

* [Python supervision] Adds tool icons.

* [Python supervision] Separates tools from control panel.

* [Python supervision] Adds blacklist feature.

* [Python supervision] Clean test code.

* [Python supervision] Allows tools override.

* [Python supervision] Removes useless constants.

* [Tools] Adds script to convert old xml tools format to the new one.

* [Python supervision] Handles new tools definition.

* Reduce diff with master

* [tools] adds reference to icons in tools xmls.
This commit is contained in:
Fabien-B
2019-07-05 15:45:45 +02:00
committed by Gautier Hattenberger
parent a369cea81c
commit 096209b787
24 changed files with 1173 additions and 241 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
<!--program name="Server" command="sw/ground_segment/tmtc/server">
<arg flag="-b" constant="192.168.1.255:2010"/>
</program>
<program name="GCS" command="sw/ground_segment/cockpit/gcs">
<program name="GCS" command="sw/ground_segment/cockpit/gcs" icon="gcs.svg" favorite="True">
<arg flag="-layout" constant="large_left_col.xml"/>
<arg flag="-osm"/>
</program-->
+1 -1
View File
@@ -1,4 +1,4 @@
<program command="sw/ground_segment/cockpit/gcs" name="GCS">
<program command="sw/ground_segment/cockpit/gcs" name="GCS" icon="gcs.svg" favorite="true">
<arg constant="large_left_col.xml" flag="-layout" />
</program>
+1 -1
View File
@@ -1,4 +1,4 @@
<program command="sw/ground_segment/joystick/input2ivy" name="Joystick">
<program command="sw/ground_segment/joystick/input2ivy" name="Joystick" icon="joystick.svg">
<arg constant="@AIRCRAFT" flag="-ac" />
<arg flag="xbox_gamepad.xml" />
</program>
+1 -1
View File
@@ -1,2 +1,2 @@
<program command="sw/logalizer/logplotter" name="Log Plotter" />
<program command="sw/logalizer/logplotter" name="Log Plotter" icon="plotter.svg"/>
+1 -1
View File
@@ -1,2 +1,2 @@
<program command="sw/ground_segment/misc/natnet2ivy" name="NatNet" />
<program command="sw/ground_segment/misc/natnet2ivy" name="NatNet" icon="natnet.svg"/>
+1 -1
View File
@@ -1,2 +1,2 @@
<program command="sw/ground_segment/python/natnet3.x/natnet2ivy.py" name="NatNet3" />
<program command="sw/ground_segment/python/natnet3.x/natnet2ivy.py" name="NatNet3" icon="natnet3.svg" />
+1 -1
View File
@@ -1,2 +1,2 @@
<program command="sw/logalizer/plotter" name="Real-time Plotter" />
<program command="sw/logalizer/plotter" name="Real-time Plotter" icon="plotter.svg"/>
+1 -1
View File
@@ -1,2 +1,2 @@
<program command="sw/ground_segment/python/real_time_plot/realtimeplotapp.py" name="Real-time Plotter (Python)" />
<program command="sw/ground_segment/python/real_time_plot/realtimeplotapp.py" name="Real-time Plotter (Python)" icon="plotter_python.svg"/>
+1 -1
View File
@@ -1,4 +1,4 @@
<program command="sw/simulator/pprzsim-launch" name="Simulator">
<program command="sw/simulator/pprzsim-launch" name="Simulator" icon="simulator.png">
<arg constant="@AIRCRAFT" flag="-a" />
</program>
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 3.4 KiB

+115
View File
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
viewBox="0 0 60.000001 60.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="gcs.svg">
<defs
id="defs4">
<linearGradient
id="linearGradient5611"
osb:paint="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop5613" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313709"
inkscape:cx="34.116437"
inkscape:cy="36.947784"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1855"
inkscape:window-height="1056"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-992.36216)">
<path
style="fill:#c6e9af;fill-rule:evenodd;"
d="M 0.00552427,992.352 0,1052.3661 l 60.015625,0 0,-59.99222 z"
id="path4142"
inkscape:connector-curvature="0" />
<path
style="fill:#80b3ff;fill-rule:evenodd"
d="m 60.006697,1017.9755 c -14.189295,-4.9806 -28.403195,-2.5039 -34.136363,5.8994 -5.733168,8.4034 -9.546506,22.5293 7.330843,28.4756 l 26.636006,0.02 z"
id="path3336"
inkscape:connector-curvature="0"
sodipodi:nodetypes="czccc" />
<ellipse
style="fill:none;stroke:#aa0040;stroke-width:1.255;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
id="path4165"
cx="24.616156"
cy="1027.2157"
rx="17.771315"
ry="18.213257" />
<path
style="fill:#ff6600;fill-rule:evenodd;stroke:#004a0b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 20.417708,996.41234 35.708893,23.51126 0,0 0,0 0,0"
id="path5617"
inkscape:connector-curvature="0" />
<rect
style="fill:#ff6600;stroke:#004a0b;stroke-width:1.18065214;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5621"
width="1.1645379"
height="1.2265272"
x="-573.12646"
y="650.15668"
transform="matrix(0.60083109,-0.79937601,0.56046237,0.82817989,0,0)" />
<rect
style="fill:#ff6600;stroke:#004a0b;stroke-width:1.08908677;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5621-3"
width="1.0759317"
height="1.1296064"
x="-573.2724"
y="706.99121"
transform="matrix(0.62625458,-0.77961863,0.58603841,0.81028327,0,0)" />
<rect
style="fill:#ff6600;stroke:#aa0040;stroke-width:1.08908677;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5621-3-6"
width="1.0759317"
height="1.1296064"
x="-604.40564"
y="685.46643"
transform="matrix(0.62625458,-0.77961863,0.58603841,0.81028327,0,0)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

+92
View File
@@ -0,0 +1,92 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60mm"
height="60mm"
viewBox="0 0 212.59843 212.59842"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="joystick.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="89.19507"
inkscape:cy="97.81045"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1855"
inkscape:window-height="1056"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-839.76378)">
<rect
style="fill:#ff5555;fill-opacity:1;stroke:#ff5555;stroke-width:22.45006943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4152"
width="6.0523648"
height="15.252442"
x="44.584351"
y="984.24414" />
<rect
style="fill:#9da8b5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4144"
width="18.400154"
height="83.987801"
x="96.613365"
y="886.76813" />
<ellipse
style="fill:#ff5555;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4142"
cx="105.81346"
cy="869.85187"
rx="26.858292"
ry="25.522793" />
<ellipse
style="fill:#2c5aa0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4146"
cx="105.81346"
cy="999.69165"
rx="40.341286"
ry="32.955318" />
<rect
style="fill:#729bd9;fill-opacity:1;stroke:#729bd9;stroke-width:20.78569603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4150"
width="157.08221"
height="41.051701"
x="27.272345"
y="992.50067" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

+156
View File
@@ -0,0 +1,156 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60mm"
height="60mm"
viewBox="0 0 212.59843 212.59842"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="natnet.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2"
inkscape:cx="-20.178352"
inkscape:cy="110.68655"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1855"
inkscape:window-height="1056"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-839.76378)">
<rect
style="fill:#f4fad2;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4234"
width="212.60373"
height="212.60242"
x="0"
y="839.76453"
ry="40.5"
rx="41.000004" />
<ellipse
style="fill:#f3a0a0;fill-opacity:1;stroke:#ec6767;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168"
cx="331.97409"
cy="929.93909"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<ellipse
style="fill:#a0f3a3;fill-opacity:1;stroke:#139417;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168-5"
cx="317.31598"
cy="949.04773"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<ellipse
style="fill:#f3a0a0;fill-opacity:1;stroke:#ea5b5b;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168-3"
cx="287.89499"
cy="939.74615"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<ellipse
style="fill:#a0f3a3;fill-opacity:1;stroke:#139417;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168-56"
cx="302.39594"
cy="920.62213"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:4.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 80.033849,992.35893 -48.604334,-104.31604 0,0"
id="path4236"
inkscape:connector-curvature="0" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:4.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 102.8485,864.29323 79.867532,992.27956"
id="path4238"
inkscape:connector-curvature="0" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:3.95667362;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 103.52464,919.03102 79.814548,992.34254"
id="path4240"
inkscape:connector-curvature="0" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:4.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 79.991454,991.90456 89.007066,-113.13709 0,0"
id="path4242"
inkscape:connector-curvature="0" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244"
cx="167.23438"
cy="880.25281"
rx="3.8906219"
ry="3.7343719" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244-2"
cx="102.65626"
cy="865.87781"
rx="2.9374986"
ry="2.9062486" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244-9"
cx="31.312502"
cy="888.48718"
rx="3.2656233"
ry="2.8593733" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244-1"
cx="102.69675"
cy="921.44513"
rx="3.8124182"
ry="3.4222531" />
<rect
style="fill:none;fill-opacity:1;stroke:#38383a;stroke-width:5.83041477;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4166"
width="136.19814"
height="64.277"
x="774.3078"
y="982.42017"
rx="0"
ry="0"
transform="matrix(0.97797175,0.20873731,-0.70810621,0.70610593,0,0)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

+168
View File
@@ -0,0 +1,168 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60mm"
height="60mm"
viewBox="0 0 212.59843 212.59842"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="natnet3.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="89.497965"
inkscape:cy="128.63427"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1855"
inkscape:window-height="1056"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-839.76378)">
<rect
style="fill:#ded2fa;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4234"
width="212.60373"
height="212.60242"
x="0"
y="839.76453"
ry="40.5"
rx="41.000004" />
<ellipse
style="fill:#f3a0a0;fill-opacity:1;stroke:#ec6767;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168"
cx="331.97409"
cy="929.93909"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<ellipse
style="fill:#a0f3a3;fill-opacity:1;stroke:#139417;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168-5"
cx="317.31598"
cy="949.04773"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<ellipse
style="fill:#f3a0a0;fill-opacity:1;stroke:#ea5b5b;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168-3"
cx="287.89499"
cy="939.74615"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<ellipse
style="fill:#a0f3a3;fill-opacity:1;stroke:#139417;stroke-width:1.00029337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4168-56"
cx="302.39594"
cy="920.62213"
rx="15.491298"
ry="9.7330666"
transform="matrix(0.96399679,0.26591387,-0.23275074,0.97253642,0,0)" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:4.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 80.033849,992.35893 -48.604334,-104.31604 0,0"
id="path4236"
inkscape:connector-curvature="0" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:4.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 102.8485,864.29323 79.867532,992.27956"
id="path4238"
inkscape:connector-curvature="0" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:3.95667362;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 103.52464,919.03102 79.814548,992.34254"
id="path4240"
inkscape:connector-curvature="0" />
<path
style="fill:#a02c2c;fill-rule:evenodd;stroke:#1557a7;stroke-width:4.00000024;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 79.991454,991.90456 89.007066,-113.13709 0,0"
id="path4242"
inkscape:connector-curvature="0" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244"
cx="167.23438"
cy="880.25281"
rx="3.8906219"
ry="3.7343719" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244-2"
cx="102.65626"
cy="865.87781"
rx="2.9374986"
ry="2.9062486" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244-9"
cx="31.312502"
cy="888.48718"
rx="3.2656233"
ry="2.8593733" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#6770ec;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4244-1"
cx="102.69675"
cy="921.44513"
rx="3.8124182"
ry="3.4222531" />
<rect
style="fill:none;fill-opacity:1;stroke:#38383a;stroke-width:5.83041477;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4166"
width="136.19814"
height="64.277"
x="774.3078"
y="982.42017"
rx="0"
ry="0"
transform="matrix(0.97797175,0.20873731,-0.70810621,0.70610593,0,0)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:90.00000763px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="142.31371"
y="1023.9627"
id="text4292"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4294"
x="142.31371"
y="1023.9627"
style="font-size:90.00000763px">3</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

+83
View File
@@ -0,0 +1,83 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
viewBox="0 0 60.000001 60.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="plotter.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="15.632958"
inkscape:cy="28.364596"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1855"
inkscape:window-height="1056"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-992.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 56.323978,1028.0972 2.5446,1.6294 -2.5446,1.4732 0,0"
id="path4138-3"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99317914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.98635831, 0.99317916;stroke-dashoffset:0;stroke-opacity:1"
d="m 0.35714286,1029.6836 58.30357214,0 0,0"
id="path3338"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99749428;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.99498861, 0.9974943;stroke-dashoffset:0;stroke-opacity:1"
d="m 6.3394947,1052.0918 -0.0897,-58.62801 0,0"
id="path4140"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#d60000;stroke-width:1.97455215;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 0.87918672,1040.6757 12.00433728,-29.2099 3.044578,7.3248 8.524819,-18.93725 2.174699,2.76915 2.435663,-2.5905 4.001445,-1.87586 3.131566,4.73436 21.399036,31.6217 0,0"
id="path4142"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="M 4.6205357,996.04519 6.25,993.50055 l 1.4732143,2.54464 0,0"
id="path4138"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1,95 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
viewBox="0 0 60.000001 60.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="plotter (copie).svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="19.848836"
inkscape:cy="41.400325"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1855"
inkscape:window-height="1056"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-992.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 56.323978,1028.0972 2.5446,1.6294 -2.5446,1.4732 0,0"
id="path4138-3"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99317914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.98635831, 0.99317916;stroke-dashoffset:0;stroke-opacity:1"
d="m 0.35714286,1029.6836 58.30357214,0 0,0"
id="path3338"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99749428;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.99498861, 0.9974943;stroke-dashoffset:0;stroke-opacity:1"
d="m 6.3394947,1052.0918 -0.0897,-58.62801 0,0"
id="path4140"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#d60000;stroke-width:1.97455215;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 0.87918672,1040.6757 12.00433728,-29.2099 3.044578,7.3248 8.524819,-18.93725 2.174699,2.76915 2.435663,-2.5905 4.001445,-1.87586 3.131566,4.73436 21.399036,31.6217 0,0"
id="path4142"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="M 4.6205357,996.04519 6.25,993.50055 l 1.4732143,2.54464 0,0"
id="path4138"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#4584b6;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="38.550461"
y="1002.6459"
id="text4136"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4138"
x="38.550461"
y="1002.6459"
style="font-size:17.5px;fill:#4584b6;fill-opacity:1">py</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

+10 -8
View File
@@ -43,6 +43,8 @@ import shutil
###############################################################################
# [Constants]
DEFAULT_TOOL_ICON = "default_tool_icon.svg"
LOGGER = logging.getLogger("[HMI]")
CONF_PATH = env.PAPARAZZI_CONF
@@ -54,6 +56,7 @@ ERROR_QPIXMAP = "icons/dialog-error.svg"
START_ICON = "icons/media-playback-start.svg"
STOP_ICON = "icons/process-stop.svg"
CHANGED_ICON = "icons/dialog-warning-symbolic.svg"
ICONS_TOOLS_PATH = "data/pictures/tools_icons/"
UNKNOWN_VALUE = "---"
@@ -545,14 +548,13 @@ class Hmi(Widgets.QMainWindow):
-> Fill the 'Tools' menu with the names found in 'control_panel.xml'
-> Connect each action to the corresponding tool process.
"""
self.ui.menuTools.clear()
sorted_names = parser.sorted_tools_names(self.data.tools)
for name in sorted_names:
action = Widgets.QAction(name, self)
self.ui.menuTools.addAction(action)
for action in self.ui.menuTools.actions():
action.triggered.connect(functools.partial(
self.add_program_to_session, self.data.tools[action.text()]))
# The tools are sorted first by whether they are favorite or not, then by their names
for tool in sorted(self.data.tools.values(), key=lambda tool: (not tool.favorite, tool.name)):
if not tool.blacklisted:
command = functools.partial(self.add_program_to_session, tool)
icon_name = tool.icon if tool.icon is not None else DEFAULT_TOOL_ICON
icon_path = "/".join([env.PAPARAZZI_HOME, ICONS_TOOLS_PATH, icon_name])
self.ui.tools_menu.add_item(tool.name, icon_path, command)
def fullscreen_view(self):
if self.isMaximized():
+6 -3
View File
@@ -134,14 +134,17 @@ class Session(object):
class Program(object):
"""Class to define a Program (old tool) object."""
def __init__(self, name, command, options):
def __init__(self, name, command, options, icon=None, favorite=None, blacklisted=None):
self.name = name
self.command = command
self.options = options
self.icon = icon
self.favorite = favorite
self.blacklisted = blacklisted
def __repr__(self):
string = "\t| name = {!s:<30} | command = {!s:<60} | options = {!s:<70} |"
format_string = string.format(self.name, self.command, self.options)
string = "\t| name = {!s:<30} | command = {!s:<60} | options = {!s:<70} | icon={!s} |"
format_string = string.format(self.name, self.command, self.options, self.icon)
return format_string
+58 -27
View File
@@ -30,12 +30,16 @@ import os
import re
import logging
import time
from typing import List, Dict
import shutil
###############################################################################
# [Constants]
STRINGS_FALSE = ["False", "false", None, "0"]
LOGGER = logging.getLogger("[PARSER]")
XML_EXT = ".xml"
@@ -47,6 +51,7 @@ VALUE_REF = "value"
CONSTANT_REF = "constant"
VARIABLE_REF = "variable"
MODE_REF = "mode"
FAVORITE_REF = "favorite"
# REFERENCES AND STRUCTURES OF CONF XML FILES :
# CONF_STRUCTURE = [(node_name, [node_attributes],
@@ -128,6 +133,9 @@ DEVICE_STRUCTURE = [(DEVICE, [],
DEFAULT_DEVICE_NAME = " __Default__ "
DEFAULT_DEVICE = db.Device(DEFAULT_DEVICE_NAME)
# TOOLS
TOOLS = "tools"
# CONTROL_PANEL :
CONTROL_PANEL = "control_panel"
CONTROL_PANEL_FILE = CONTROL_PANEL + XML_EXT
@@ -136,10 +144,10 @@ SECTION_REF = "section"
PROGRAM_REF = "program"
SESSION_REF = "session"
COMMAND_REF = "command"
ICON_REF = "icon"
FLAG_REF = "flag"
OPTION_REF = "arg"
PROGRAM_TAG_REF = "/".join((SECTION_REF, PROGRAM_REF))
SESSION_TAG_REF = "/".join((SECTION_REF, SESSION_REF))
CONTROL_PANEL_STRUCTURE = [(CONTROL_PANEL, [NAME_REF],
@@ -389,6 +397,10 @@ def load_init_files(conf_path):
cp_file = cp_path
else:
raise Exception("%s not found!"% conf_path)
tools_path = conf_path + "/" + TOOLS
if not os.path.exists(tools_path):
raise Exception("%s not found!" % tools_path)
for root, dirs, files in os.walk(conf_path):
for file in files:
@@ -417,7 +429,7 @@ def load_init_files(conf_path):
LOGGER.debug(file)
LOGGER.debug("'control_panel' file(s) :")
LOGGER.debug(cp_file)
return conf_files, cp_file, devices_files, info
return conf_files, cp_file, tools_path, devices_files, info
###############################################################################
@@ -633,29 +645,46 @@ def parse_arg_option(option_tag):
return option
def parse_tools(cp_file):
def parse_tools(tools_path):
"""
:param cp_file:
-> Parse all tools in the 'control_panel' file given.
:param tools_path:
-> Parse all tools files in the 'tools_path' directory.
-> Except an incorrect XML format and raise ERROR.
"""
tools = {}
try:
cp_tree = Et.parse(cp_file)
tools_tags = cp_tree.findall(PROGRAM_TAG_REF)
for tool_tag in tools_tags:
tool_name = tool_tag.get(NAME_REF)
tool_command = tool_tag.get(COMMAND_REF)
options = []
for option_tag in tool_tag:
option = parse_arg_option(option_tag)
options.append(option)
tool_object = db.Program(tool_name, tool_command, options)
tools[tool_name] = tool_object
blacklisted_tools = []
blacklist = tools_path + "/" + "blacklisted"
if os.path.exists(blacklist):
with open(blacklist, 'r') as blacklist_fic:
for line in blacklist_fic:
line = line.strip()
if line != "" and line[0] != "#":
blacklisted_tools.append(line)
except Et.ParseError as msg:
LOGGER.error("ERROR in syntax of XML file : '%s'. "
"Original message : '%s'.", cp_file, msg)
for file in os.listdir(tools_path):
if file.endswith(".xml"):
file_path = tools_path + "/" + file
try:
tree = Et.parse(file_path)
tool_tag = tree.getroot()
if tool_tag.tag == PROGRAM_REF:
tool_name = tool_tag.get(NAME_REF)
tool_command = tool_tag.get(COMMAND_REF)
icon = tool_tag.get(ICON_REF)
fav = tool_tag.get(FAVORITE_REF)
favorite = fav if fav is None else (fav not in STRINGS_FALSE)
options = []
for option_tag in tool_tag:
option = parse_arg_option(option_tag)
options.append(option)
blacklisted = True if tool_name in blacklisted_tools else False
tool_object = db.Program(tool_name, tool_command, options, icon, favorite=favorite, blacklisted=blacklisted)
tools[tool_name] = tool_object
except Et.ParseError as msg:
LOGGER.error("ERROR in syntax of XML file : '%s'. "
"Original message : '%s'.", file, msg)
return tools
@@ -691,14 +720,15 @@ def parse_sessions(cp_file, tools):
return sessions
def load_sessions_and_programs(cp_file):
def load_sessions_and_programs(cp_file, tools_path):
"""
:param cp_file:
-> Parse the tools and sessions from the 'control_panel.xml' file.
:param tools_path:
-> Parse the tools and sessions from the 'tools:*xml' files.
-> Add the default sessions 'simulation' & replay.
-> Show the result of scan if DEBUG mode is on (main.py)
"""
tools = parse_tools(cp_file)
tools = parse_tools(tools_path)
sessions = parse_sessions(cp_file, tools)
sessions[SIMULATION_SESSION.name] = SIMULATION_SESSION
@@ -764,6 +794,7 @@ class Data(object):
self.conf_files = []
self.devices_file = None
self.cp_file = None
self.tools_path = None
self.cache = {}
self.configurations = {}
@@ -796,7 +827,7 @@ class Data(object):
def load_conf_files(self):
LOGGER.info("Scanning current directory...")
self.conf_files, self.cp_file, self.devices_file, load_info = \
self.conf_files, self.cp_file, self.tools_path, self.devices_file, load_info = \
load_init_files(self.conf_path)
LOGGER.debug(load_info)
LOGGER.info("End of scan.\n")
@@ -819,10 +850,10 @@ class Data(object):
def load_sessions_and_programs(self):
LOGGER.info("Loading programs and sessions...")
if self.cp_file is not None:
if self.cp_file is not None and self.tools_path is not None:
self.tools, self.sessions, \
load_info = load_sessions_and_programs(self.cp_file)
load_info = load_sessions_and_programs(self.cp_file, self.tools_path)
LOGGER.debug(load_info)
LOGGER.info("Programs and sessions loaded.\n")
else:
LOGGER.error("ERROR : control_panel.xml not found!")
LOGGER.error("ERROR : control_panel.xml or tools.xml not found!")
+89
View File
@@ -0,0 +1,89 @@
from PyQt5 import QtCore, QtGui, QtWidgets
ICON_SIZE = (60, 60)
POPUP_SIZE = (1000, 400)
POPUP_GRID_WIDTH = 4
SC_MINIMUM_SIZE = (200, 130)
ICON_NUMBER = 6
class ToolList(QtWidgets.QScrollArea):
def __init__(self):
super(ToolList, self).__init__()
self.frame = QtWidgets.QFrame()
self.gridLayout = QtWidgets.QGridLayout()
self.frame.setLayout(self.gridLayout)
self.setWidget(self.frame)
self.setWidgetResizable(True)
def add(self, button):
count = self.gridLayout.count()
row = count // POPUP_GRID_WIDTH
col = count % POPUP_GRID_WIDTH
self.gridLayout.addWidget(button, row, col)
def focusOutEvent(self, QFocusEvent):
self.close()
class ToolsMenu(QtWidgets.QFrame):
def __init__(self, parent):
super(ToolsMenu, self).__init__(parent)
self.hlayout = QtWidgets.QHBoxLayout(self)
self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
self.toolsFrame = QtWidgets.QFrame()
self.toolsLayout = QtWidgets.QHBoxLayout(self.toolsFrame)
self.scrollArea = QtWidgets.QScrollArea()
self.scrollArea.setWidget(self.toolsFrame)
self.hlayout.addWidget(self.scrollArea)
self.scrollArea.setMinimumSize(*SC_MINIMUM_SIZE)
self.setMinimumSize(SC_MINIMUM_SIZE[0] + 10, SC_MINIMUM_SIZE[1] + 100)
self.toolsLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.scrollArea.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
self.button_more = None
self.popup = ToolList()
self.popup.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.popup.setMinimumSize(*POPUP_SIZE)
self.buttons = []
self.toolsLayout.addStretch(0)
self._add_more_button()
def _add_more_button(self):
if self.button_more is None:
self.button_more = QtWidgets.QToolButton()
more_icon = QtGui.QIcon("ui/icons/tools_more.svg")
self.button_more.setIcon(more_icon)
self.button_more.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)
self.hlayout.addWidget(self.button_more, QtCore.Qt.AlignRight)
self.button_more.clicked.connect(self.open_popup)
def add_item(self, name, image_path, callback):
button = QtWidgets.QToolButton()
button.setText(name)
button.setIcon(QtGui.QIcon(image_path))
button.setIconSize(QtCore.QSize(*ICON_SIZE))
button.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
button.clicked.connect(callback)
self.buttons.append(button)
if self.toolsLayout.count() <= ICON_NUMBER:
self.toolsLayout.insertWidget(self.toolsLayout.count() - 1, button, QtCore.Qt.AlignLeft)
else:
self.popup.add(button)
button.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
button.show()
self.popup.adjustSize()
def open_popup(self):
bottomLeft = self.mapToGlobal(self.hlayout.geometry().bottomLeft())
self.popup.move(bottomLeft)
self.popup.show()
self.popup.setFocus(QtCore.Qt.PopupFocusReason)
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
version="1.1"
id="svg2"
viewBox="0 0 2.8811265 1.8181867"
height="0.51313269mm"
width="0.81311792mm">
<defs
id="defs4" />
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-1.3678973,-0.7353429)"
id="layer1">
<path
id="path3336"
d="M 2.3833287,1.2353429 2.7779195,1.748311 3.1961858,1.2353429 Z"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+72 -68
View File
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'main_window.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
# Created by: PyQt5 UI code generator 5.5.1
#
# WARNING! All changes made in this file will be lost!
@@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(833, 481)
MainWindow.resize(833, 568)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
@@ -226,7 +226,7 @@ class Ui_MainWindow(object):
self.scrollArea_3.setWidgetResizable(True)
self.scrollArea_3.setObjectName("scrollArea_3")
self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 162, 622))
self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 162, 607))
self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")
self.gridLayout_4 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_3)
self.gridLayout_4.setObjectName("gridLayout_4")
@@ -572,6 +572,9 @@ class Ui_MainWindow(object):
self.sessions_tab.setObjectName("sessions_tab")
self.gridLayout_2 = QtWidgets.QGridLayout(self.sessions_tab)
self.gridLayout_2.setObjectName("gridLayout_2")
self.label_7 = QtWidgets.QLabel(self.sessions_tab)
self.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 5, 0, 1, 2)
self.programs = QtWidgets.QListWidget(self.sessions_tab)
self.programs.setMinimumSize(QtCore.QSize(0, 0))
self.programs.setMaximumSize(QtCore.QSize(16777215, 16777215))
@@ -579,29 +582,12 @@ class Ui_MainWindow(object):
self.programs.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.programs.setIconSize(QtCore.QSize(10, 10))
self.programs.setObjectName("programs")
self.gridLayout_2.addWidget(self.programs, 1, 2, 3, 1)
self.gridLayout_2.addWidget(self.programs, 2, 2, 3, 1)
self.label_8 = QtWidgets.QLabel(self.sessions_tab)
self.label_8.setObjectName("label_8")
self.gridLayout_2.addWidget(self.label_8, 1, 0, 1, 2)
self.gridLayout_2.addWidget(self.label_8, 2, 0, 1, 2)
spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem4, 2, 3, 1, 1)
self.play_stop_program = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.play_stop_program.sizePolicy().hasHeightForWidth())
self.play_stop_program.setSizePolicy(sizePolicy)
self.play_stop_program.setMinimumSize(QtCore.QSize(0, 50))
self.play_stop_program.setMaximumSize(QtCore.QSize(16777215, 50))
icon7 = QtGui.QIcon()
icon7.addPixmap(QtGui.QPixmap("icons/media-playback-start.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.play_stop_program.setIcon(icon7)
self.play_stop_program.setAutoDefault(False)
self.play_stop_program.setObjectName("play_stop_program")
self.gridLayout_2.addWidget(self.play_stop_program, 1, 3, 1, 1)
self.label_7 = QtWidgets.QLabel(self.sessions_tab)
self.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 4, 0, 1, 2)
self.gridLayout_2.addItem(spacerItem4, 3, 3, 1, 1)
self.start_all_button = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -618,11 +604,50 @@ class Ui_MainWindow(object):
font.setStrikeOut(False)
font.setKerning(True)
self.start_all_button.setFont(font)
icon7 = QtGui.QIcon()
icon7.addPixmap(QtGui.QPixmap("icons/media-playback-start.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.start_all_button.setIcon(icon7)
self.start_all_button.setObjectName("start_all_button")
self.gridLayout_2.addWidget(self.start_all_button, 4, 3, 1, 1)
self.gridLayout_2.addWidget(self.start_all_button, 5, 3, 1, 1)
spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem5, 6, 2, 1, 1)
self.gridLayout_2.addItem(spacerItem5, 7, 2, 1, 1)
self.play_stop_program = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.play_stop_program.sizePolicy().hasHeightForWidth())
self.play_stop_program.setSizePolicy(sizePolicy)
self.play_stop_program.setMinimumSize(QtCore.QSize(0, 50))
self.play_stop_program.setMaximumSize(QtCore.QSize(16777215, 50))
self.play_stop_program.setIcon(icon7)
self.play_stop_program.setAutoDefault(False)
self.play_stop_program.setObjectName("play_stop_program")
self.gridLayout_2.addWidget(self.play_stop_program, 2, 3, 1, 1)
self.options = QtWidgets.QListWidget(self.sessions_tab)
self.options.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.options.setObjectName("options")
self.gridLayout_2.addWidget(self.options, 5, 2, 2, 1)
self.remove_program = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.remove_program.sizePolicy().hasHeightForWidth())
self.remove_program.setSizePolicy(sizePolicy)
self.remove_program.setMinimumSize(QtCore.QSize(30, 30))
self.remove_program.setMaximumSize(QtCore.QSize(30, 30))
self.remove_program.setText("")
self.remove_program.setIcon(icon1)
self.remove_program.setAutoDefault(False)
self.remove_program.setObjectName("remove_program")
self.gridLayout_2.addWidget(self.remove_program, 4, 0, 1, 1)
self.session = QtWidgets.QComboBox(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.session.sizePolicy().hasHeightForWidth())
self.session.setSizePolicy(sizePolicy)
self.session.setObjectName("session")
self.gridLayout_2.addWidget(self.session, 1, 2, 1, 1)
self.kill_all_button = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -644,35 +669,10 @@ class Ui_MainWindow(object):
icon8.addPixmap(QtGui.QPixmap("icons/process-stop.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.kill_all_button.setIcon(icon8)
self.kill_all_button.setObjectName("kill_all_button")
self.gridLayout_2.addWidget(self.kill_all_button, 3, 3, 1, 1)
self.session = QtWidgets.QComboBox(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.session.sizePolicy().hasHeightForWidth())
self.session.setSizePolicy(sizePolicy)
self.session.setObjectName("session")
self.gridLayout_2.addWidget(self.session, 0, 2, 1, 1)
self.options = QtWidgets.QListWidget(self.sessions_tab)
self.options.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.options.setObjectName("options")
self.gridLayout_2.addWidget(self.options, 4, 2, 2, 1)
self.gridLayout_2.addWidget(self.kill_all_button, 4, 3, 1, 1)
self.label_4 = QtWidgets.QLabel(self.sessions_tab)
self.label_4.setObjectName("label_4")
self.gridLayout_2.addWidget(self.label_4, 0, 0, 1, 2)
self.remove_program = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.remove_program.sizePolicy().hasHeightForWidth())
self.remove_program.setSizePolicy(sizePolicy)
self.remove_program.setMinimumSize(QtCore.QSize(30, 30))
self.remove_program.setMaximumSize(QtCore.QSize(30, 30))
self.remove_program.setText("")
self.remove_program.setIcon(icon1)
self.remove_program.setAutoDefault(False)
self.remove_program.setObjectName("remove_program")
self.gridLayout_2.addWidget(self.remove_program, 3, 0, 1, 1)
self.gridLayout_2.addWidget(self.label_4, 1, 0, 1, 2)
self.add_program = QtWidgets.QPushButton(self.sessions_tab)
self.add_program.setEnabled(False)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
@@ -686,7 +686,7 @@ class Ui_MainWindow(object):
self.add_program.setIcon(icon3)
self.add_program.setAutoDefault(False)
self.add_program.setObjectName("add_program")
self.gridLayout_2.addWidget(self.add_program, 3, 1, 1, 1)
self.gridLayout_2.addWidget(self.add_program, 4, 1, 1, 1)
self.remove_option = QtWidgets.QPushButton(self.sessions_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -699,7 +699,7 @@ class Ui_MainWindow(object):
self.remove_option.setIcon(icon1)
self.remove_option.setAutoDefault(False)
self.remove_option.setObjectName("remove_option")
self.gridLayout_2.addWidget(self.remove_option, 5, 0, 1, 1)
self.gridLayout_2.addWidget(self.remove_option, 6, 0, 1, 1)
self.add_option = QtWidgets.QPushButton(self.sessions_tab)
self.add_option.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
@@ -713,7 +713,14 @@ class Ui_MainWindow(object):
self.add_option.setIcon(icon3)
self.add_option.setAutoDefault(False)
self.add_option.setObjectName("add_option")
self.gridLayout_2.addWidget(self.add_option, 5, 1, 1, 1)
self.gridLayout_2.addWidget(self.add_option, 6, 1, 1, 1)
self.tools_menu = ToolsMenu(self.sessions_tab)
self.tools_menu.setMinimumSize(QtCore.QSize(0, 0))
self.tools_menu.setBaseSize(QtCore.QSize(200, 140))
self.tools_menu.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.tools_menu.setFrameShadow(QtWidgets.QFrame.Raised)
self.tools_menu.setObjectName("tools_menu")
self.gridLayout_2.addWidget(self.tools_menu, 0, 2, 1, 1)
self.main_tab.addTab(self.sessions_tab, "")
self.console_tab = QtWidgets.QWidget()
self.console_tab.setObjectName("console_tab")
@@ -953,8 +960,6 @@ class Ui_MainWindow(object):
self.menuConfiguration.setObjectName("menuConfiguration")
self.menuMenu = QtWidgets.QMenu(self.menubar)
self.menuMenu.setObjectName("menuMenu")
self.menuTools = QtWidgets.QMenu(self.menubar)
self.menuTools.setObjectName("menuTools")
self.menuView = QtWidgets.QMenu(self.menubar)
self.menuView.setObjectName("menuView")
self.menuHelp = QtWidgets.QMenu(self.menubar)
@@ -1056,7 +1061,7 @@ class Ui_MainWindow(object):
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 162, 598))
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 151, 583))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.gridLayout_13 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
self.gridLayout_13.setObjectName("gridLayout_13")
@@ -1209,7 +1214,7 @@ class Ui_MainWindow(object):
self.scrollArea_2.setWidgetResizable(True)
self.scrollArea_2.setObjectName("scrollArea_2")
self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 162, 598))
self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 151, 583))
self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
self.gridLayout_15 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_2)
self.gridLayout_15.setObjectName("gridLayout_15")
@@ -1503,12 +1508,11 @@ class Ui_MainWindow(object):
self.menubar.addAction(self.menuSet.menuAction())
self.menubar.addAction(self.menuConfiguration.menuAction())
self.menubar.addAction(self.menuSession.menuAction())
self.menubar.addAction(self.menuTools.menuAction())
self.menubar.addAction(self.menuView.menuAction())
self.menubar.addAction(self.menuHelp.menuAction())
self.retranslateUi(MainWindow)
self.main_tab.setCurrentIndex(3)
self.main_tab.setCurrentIndex(2)
self.stackedWidget.setCurrentIndex(0)
self.main_tab.currentChanged['int'].connect(self.stackedWidget.setCurrentIndex)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
@@ -1578,19 +1582,19 @@ class Ui_MainWindow(object):
self.label_9.setText(_translate("MainWindow", "Result :"))
self.main_tab.setTabText(self.main_tab.indexOf(self.build_flash_tab), _translate("MainWindow", "Build / Flash"))
self.main_tab.setTabToolTip(self.main_tab.indexOf(self.build_flash_tab), _translate("MainWindow", "Tab to build and flash the current configuration"))
self.label_7.setText(_translate("MainWindow", "Options :"))
self.programs.setToolTip(_translate("MainWindow", "Programs running (green) and stopped (red)"))
self.label_8.setText(_translate("MainWindow", "Programs :"))
self.play_stop_program.setToolTip(_translate("MainWindow", "Start / stop the selected program"))
self.play_stop_program.setText(_translate("MainWindow", "Start"))
self.label_7.setText(_translate("MainWindow", "Options :"))
self.start_all_button.setToolTip(_translate("MainWindow", "Kill & restart all programs"))
self.start_all_button.setText(_translate("MainWindow", "Start all"))
self.play_stop_program.setToolTip(_translate("MainWindow", "Start / stop the selected program"))
self.play_stop_program.setText(_translate("MainWindow", "Start"))
self.options.setToolTip(_translate("MainWindow", "Options of the selected program"))
self.remove_program.setToolTip(_translate("MainWindow", "Remove a programs from the session"))
self.session.setToolTip(_translate("MainWindow", "Current session"))
self.kill_all_button.setToolTip(_translate("MainWindow", "Kill all running programs"))
self.kill_all_button.setText(_translate("MainWindow", "Kill all"))
self.session.setToolTip(_translate("MainWindow", "Current session"))
self.options.setToolTip(_translate("MainWindow", "Options of the selected program"))
self.label_4.setText(_translate("MainWindow", "Session :"))
self.remove_program.setToolTip(_translate("MainWindow", "Remove a programs from the session"))
self.add_program.setToolTip(_translate("MainWindow", "Add a programs to the session"))
self.remove_option.setToolTip(_translate("MainWindow", "Remove the selected option"))
self.add_option.setToolTip(_translate("MainWindow", "Add an option to the selected program"))
@@ -1625,7 +1629,6 @@ class Ui_MainWindow(object):
self.menuSet.setTitle(_translate("MainWindow", "Set"))
self.menuConfiguration.setTitle(_translate("MainWindow", "Configuration"))
self.menuMenu.setTitle(_translate("MainWindow", "Menu"))
self.menuTools.setTitle(_translate("MainWindow", "Tools"))
self.menuView.setTitle(_translate("MainWindow", "View"))
self.menuHelp.setTitle(_translate("MainWindow", "Help"))
self.menuSession.setTitle(_translate("MainWindow", "Session"))
@@ -1709,3 +1712,4 @@ class Ui_MainWindow(object):
self.actionRestore_default_state.setText(_translate("MainWindow", "Restore default app state"))
self.actionHide_overviews.setText(_translate("MainWindow", "Hide overviews"))
from tools_menu import ToolsMenu
+150 -126
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>833</width>
<height>481</height>
<height>568</height>
</rect>
</property>
<property name="sizePolicy">
@@ -278,7 +278,7 @@
<enum>QTabWidget::Triangular</enum>
</property>
<property name="currentIndex">
<number>3</number>
<number>2</number>
</property>
<property name="elideMode">
<enum>Qt::ElideNone</enum>
@@ -579,7 +579,7 @@
<x>0</x>
<y>0</y>
<width>162</width>
<height>622</height>
<height>607</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_4">
@@ -1537,7 +1537,14 @@
<string>Tab to launch and customize the current session</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="2" rowspan="3">
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Options :</string>
</property>
</widget>
</item>
<item row="2" column="2" rowspan="3">
<widget class="QListWidget" name="programs">
<property name="minimumSize">
<size>
@@ -1568,14 +1575,14 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Programs :</string>
</property>
</widget>
</item>
<item row="2" column="3">
<item row="3" column="3">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -1588,49 +1595,7 @@
</property>
</spacer>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="play_stop_program">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>50</height>
</size>
</property>
<property name="toolTip">
<string>Start / stop the selected program</string>
</property>
<property name="text">
<string>Start</string>
</property>
<property name="icon">
<iconset>
<normaloff>icons/media-playback-start.svg</normaloff>icons/media-playback-start.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Options :</string>
</property>
</widget>
</item>
<item row="4" column="3">
<item row="5" column="3">
<widget class="QPushButton" name="start_all_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@@ -1672,7 +1637,7 @@
</property>
</widget>
</item>
<item row="6" column="2">
<item row="7" column="2">
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -1685,7 +1650,103 @@
</property>
</spacer>
</item>
<item row="3" column="3">
<item row="2" column="3">
<widget class="QPushButton" name="play_stop_program">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>50</height>
</size>
</property>
<property name="toolTip">
<string>Start / stop the selected program</string>
</property>
<property name="text">
<string>Start</string>
</property>
<property name="icon">
<iconset>
<normaloff>icons/media-playback-start.svg</normaloff>icons/media-playback-start.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="2" rowspan="2">
<widget class="QListWidget" name="options">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Options of the selected program</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QPushButton" name="remove_program">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>Remove a programs from the session</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>icons/list-remove.svg</normaloff>icons/list-remove.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="session">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Current session</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QPushButton" name="kill_all_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@@ -1730,75 +1791,14 @@
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="session">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Current session</string>
</property>
</widget>
</item>
<item row="4" column="2" rowspan="2">
<widget class="QListWidget" name="options">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Options of the selected program</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Session :</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="remove_program">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>Remove a programs from the session</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>icons/list-remove.svg</normaloff>icons/list-remove.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QPushButton" name="add_program">
<property name="enabled">
<bool>false</bool>
@@ -1836,7 +1836,7 @@
</property>
</widget>
</item>
<item row="5" column="0">
<item row="6" column="0">
<widget class="QPushButton" name="remove_option">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -1871,7 +1871,7 @@
</property>
</widget>
</item>
<item row="5" column="1">
<item row="6" column="1">
<widget class="QPushButton" name="add_option">
<property name="enabled">
<bool>true</bool>
@@ -1909,6 +1909,28 @@
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="ToolsMenu" name="tools_menu">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>200</width>
<height>140</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="console_tab">
@@ -2467,11 +2489,6 @@ p, li { white-space: pre-wrap; }
<addaction name="separator"/>
<addaction name="actionQuit_Paparazzi_UAV"/>
</widget>
<widget class="QMenu" name="menuTools">
<property name="title">
<string>Tools</string>
</property>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
<string>View</string>
@@ -2499,7 +2516,6 @@ p, li { white-space: pre-wrap; }
<addaction name="menuSet"/>
<addaction name="menuConfiguration"/>
<addaction name="menuSession"/>
<addaction name="menuTools"/>
<addaction name="menuView"/>
<addaction name="menuHelp"/>
</widget>
@@ -2699,8 +2715,8 @@ p, li { white-space: pre-wrap; }
<rect>
<x>0</x>
<y>0</y>
<width>162</width>
<height>598</height>
<width>151</width>
<height>583</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_13">
@@ -3090,8 +3106,8 @@ p, li { white-space: pre-wrap; }
<rect>
<x>0</x>
<y>0</y>
<width>162</width>
<height>598</height>
<width>151</width>
<height>583</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_15">
@@ -3822,6 +3838,14 @@ p, li { white-space: pre-wrap; }
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>ToolsMenu</class>
<extends>QFrame</extends>
<header>tools_menu.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>