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