mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-09 22:49:53 +08:00
Supervision improvements (#3002)
* [supervision] disable build and clean buttons during build/clean. * [supervision] Move AC color at the left. * [supervision] Add shortcuts and rename "flash" to "upload". * [supervision] Fix telemetry select base path. * [supervision] return key terminate program. * [supervision] Add option to keep "build" programs after they finished.
This commit is contained in:
@@ -15,6 +15,7 @@ class AppSettings(QDialog, Ui_AppSettingsDialog):
|
||||
self.text_editor_edit.setText(settings.value("text_editor", "", str))
|
||||
self.terminal_emulator_edit.setText(settings.value("terminal_emulator", "", str))
|
||||
self.keep_changes_checkbox.setChecked(settings.value("always_keep_changes", False, bool))
|
||||
self.keep_build_programs_checkbox.setChecked(settings.value("keep_build_programs", False, bool))
|
||||
self.finished.connect(self.handle_finished)
|
||||
|
||||
def handle_finished(self, result):
|
||||
@@ -26,3 +27,5 @@ class AppSettings(QDialog, Ui_AppSettingsDialog):
|
||||
settings.setValue("terminal_emulator", terminal_emulator)
|
||||
keep_changes = self.keep_changes_checkbox.isChecked()
|
||||
settings.setValue("always_keep_changes", keep_changes)
|
||||
keep_build_programs = self.keep_build_programs_checkbox.isChecked()
|
||||
settings.setValue("keep_build_programs", keep_build_programs)
|
||||
|
||||
@@ -27,7 +27,7 @@ class FlashMode:
|
||||
|
||||
class BuildWidget(Ui_Build, QWidget):
|
||||
|
||||
spawn_program = QtCore.pyqtSignal(str, list, str)
|
||||
spawn_program = QtCore.pyqtSignal(str, list, str, object)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
QWidget.__init__(self, parent=parent)
|
||||
@@ -93,13 +93,15 @@ class BuildWidget(Ui_Build, QWidget):
|
||||
cmd.append("PRINT_CONFIG=1")
|
||||
shortname = "Build {}".format(self.ac.name)
|
||||
self.conf.save(False)
|
||||
self.spawn_program.emit(shortname, cmd, None)
|
||||
self.enable_buttons(False)
|
||||
self.spawn_program.emit(shortname, cmd, None, lambda: self.enable_buttons(True))
|
||||
|
||||
def clean(self):
|
||||
cmd = ["make", "-C", utils.PAPARAZZI_HOME, "-f", "Makefile.ac",
|
||||
"AIRCRAFT={}".format(self.ac.name), "clean_ac"]
|
||||
shortname = "Clean {}".format(self.ac.name)
|
||||
self.spawn_program.emit(shortname, cmd, None)
|
||||
self.enable_buttons(False)
|
||||
self.spawn_program.emit(shortname, cmd, None, lambda: self.enable_buttons(True))
|
||||
|
||||
def flash(self):
|
||||
target = self.target_combo.currentText()
|
||||
@@ -115,5 +117,8 @@ class BuildWidget(Ui_Build, QWidget):
|
||||
cmd = ["make", "-C", utils.PAPARAZZI_HOME, "-f", "Makefile.ac",
|
||||
"AIRCRAFT={}".format(self.ac.name)] + vars + ["{}.upload".format(target)]
|
||||
shortname = "Flash {}".format(self.ac.name)
|
||||
self.spawn_program.emit(shortname, cmd, None)
|
||||
self.spawn_program.emit(shortname, cmd, None, None)
|
||||
|
||||
def enable_buttons(self, enable: bool):
|
||||
self.build_button.setEnabled(enable)
|
||||
self.clean_button.setEnabled(enable)
|
||||
|
||||
@@ -11,9 +11,9 @@ class ConfFileWidget(QWidget, Ui_FileConf):
|
||||
file_changed = QtCore.pyqtSignal()
|
||||
edit_alt = QtCore.pyqtSignal(str)
|
||||
|
||||
def __init__(self, title: str, parent=None):
|
||||
def __init__(self, title: str, conf_subdir: str, parent=None):
|
||||
QWidget.__init__(self, parent=parent)
|
||||
self.nature = title.lower().replace(" ", "_") + "s"
|
||||
self.conf_subdir = conf_subdir
|
||||
self.path = None
|
||||
self.setupUi(self)
|
||||
self.edit_alt_button.hide()
|
||||
@@ -31,9 +31,8 @@ class ConfFileWidget(QWidget, Ui_FileConf):
|
||||
utils.edit_file(self.path)
|
||||
|
||||
def select_file(self):
|
||||
base_path = os.path.join(utils.CONF_DIR, self.nature)
|
||||
print(base_path)
|
||||
(path, _) = QFileDialog().getOpenFileName(self, "Select {} file".format(self.nature),
|
||||
base_path = os.path.join(utils.CONF_DIR, self.conf_subdir)
|
||||
(path, _) = QFileDialog().getOpenFileName(self, "Select {} file".format(self.title_label.text()),
|
||||
base_path, "Xml (*.xml)")
|
||||
if path != "":
|
||||
self.path = os.path.relpath(path, utils.CONF_DIR)
|
||||
|
||||
@@ -15,17 +15,17 @@ class ConfWidget(QWidget):
|
||||
def __init__(self, parent=None):
|
||||
QWidget.__init__(self, parent=parent)
|
||||
lay = QVBoxLayout(self)
|
||||
self.airframe = ConfFileWidget("Airframe", self)
|
||||
self.airframe = ConfFileWidget("Airframe", "airframes", self)
|
||||
self.airframe.file_changed.connect(self.conf_changed)
|
||||
self.flight_plan = ConfFileWidget("Flight Plan", self)
|
||||
self.flight_plan = ConfFileWidget("Flight Plan", "flight_plans", self)
|
||||
self.flight_plan.file_changed.connect(self.conf_changed)
|
||||
self.flight_plan.edit_alt_button.show()
|
||||
self.flight_plan.edit_alt_button.setText("Edit GCS")
|
||||
self.settings = ConfSettingsWidget(self)
|
||||
self.settings.settings_changed.connect(self.setting_changed)
|
||||
self.radio = ConfFileWidget("Radio", self)
|
||||
self.radio = ConfFileWidget("Radio", "radios", self)
|
||||
self.radio.file_changed.connect(self.conf_changed)
|
||||
self.telemetry = ConfFileWidget("Telemetry", self)
|
||||
self.telemetry = ConfFileWidget("Telemetry", "telemetry", self)
|
||||
self.telemetry.file_changed.connect(self.conf_changed)
|
||||
|
||||
self.settings.settings.itemDoubleClicked.connect(self.edit_setting)
|
||||
|
||||
@@ -7,9 +7,6 @@ from conf import *
|
||||
from programs_conf import parse_tools
|
||||
import subprocess
|
||||
|
||||
# TODO make a setting ?
|
||||
REMOVE_PROGRAMS_FINISHED = True
|
||||
|
||||
|
||||
class ConfigurationPanel(QWidget, Ui_ConfigurationPanel):
|
||||
|
||||
@@ -82,14 +79,17 @@ class ConfigurationPanel(QWidget, Ui_ConfigurationPanel):
|
||||
subprocess.Popen(cmd)
|
||||
# self.launch_program(self.flight_plan_editor.name, cmd, self.flight_plan_editor.icon)
|
||||
|
||||
def launch_program(self, shortname, cmd, icon):
|
||||
def launch_program(self, shortname, cmd, icon, cb):
|
||||
pw = ProgramWidget(shortname, cmd, icon, self.programs_widget)
|
||||
self.programs_widget.layout().addWidget(pw)
|
||||
pw.ready_read_stderr.connect(lambda: self.console_widget.handle_stderr(pw))
|
||||
pw.ready_read_stdout.connect(lambda: self.console_widget.handle_stdout(pw))
|
||||
pw.finished.connect(lambda c, s: self.console_widget.handle_program_finished(pw, c, s))
|
||||
if cb is not None:
|
||||
pw.finished.connect(cb)
|
||||
pw.remove.connect(lambda: self.remove_program(pw))
|
||||
if REMOVE_PROGRAMS_FINISHED:
|
||||
settings = utils.get_settings()
|
||||
if not settings.value("keep_build_programs", False, bool):
|
||||
pw.finished.connect(lambda: self.remove_program(pw))
|
||||
pw.start_program()
|
||||
|
||||
|
||||
@@ -22,24 +22,32 @@ class Ui_AppSettingsDialog(object):
|
||||
self.text_editor_edit = QtWidgets.QLineEdit(AppSettingsDialog)
|
||||
self.text_editor_edit.setObjectName("text_editor_edit")
|
||||
self.gridLayout.addWidget(self.text_editor_edit, 0, 1, 1, 1)
|
||||
self.label_3 = QtWidgets.QLabel(AppSettingsDialog)
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
|
||||
self.buttonBox = QtWidgets.QDialogButtonBox(AppSettingsDialog)
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
|
||||
self.buttonBox.setObjectName("buttonBox")
|
||||
self.gridLayout.addWidget(self.buttonBox, 5, 0, 1, 2)
|
||||
self.keep_changes_checkbox = QtWidgets.QCheckBox(AppSettingsDialog)
|
||||
self.keep_changes_checkbox.setText("")
|
||||
self.keep_changes_checkbox.setObjectName("keep_changes_checkbox")
|
||||
self.gridLayout.addWidget(self.keep_changes_checkbox, 2, 1, 1, 1)
|
||||
self.label_2 = QtWidgets.QLabel(AppSettingsDialog)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
|
||||
self.terminal_emulator_edit = QtWidgets.QLineEdit(AppSettingsDialog)
|
||||
self.terminal_emulator_edit.setObjectName("terminal_emulator_edit")
|
||||
self.gridLayout.addWidget(self.terminal_emulator_edit, 1, 1, 1, 1)
|
||||
self.label_3 = QtWidgets.QLabel(AppSettingsDialog)
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
|
||||
self.keep_changes_checkbox = QtWidgets.QCheckBox(AppSettingsDialog)
|
||||
self.keep_changes_checkbox.setText("")
|
||||
self.keep_changes_checkbox.setObjectName("keep_changes_checkbox")
|
||||
self.gridLayout.addWidget(self.keep_changes_checkbox, 2, 1, 1, 1)
|
||||
self.buttonBox = QtWidgets.QDialogButtonBox(AppSettingsDialog)
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
|
||||
self.buttonBox.setObjectName("buttonBox")
|
||||
self.gridLayout.addWidget(self.buttonBox, 3, 0, 1, 2)
|
||||
self.label_4 = QtWidgets.QLabel(AppSettingsDialog)
|
||||
self.label_4.setWordWrap(True)
|
||||
self.label_4.setObjectName("label_4")
|
||||
self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
|
||||
self.keep_build_programs_checkbox = QtWidgets.QCheckBox(AppSettingsDialog)
|
||||
self.keep_build_programs_checkbox.setText("")
|
||||
self.keep_build_programs_checkbox.setObjectName("keep_build_programs_checkbox")
|
||||
self.gridLayout.addWidget(self.keep_build_programs_checkbox, 3, 1, 1, 1)
|
||||
|
||||
self.retranslateUi(AppSettingsDialog)
|
||||
self.buttonBox.accepted.connect(AppSettingsDialog.accept)
|
||||
@@ -50,5 +58,6 @@ class Ui_AppSettingsDialog(object):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
AppSettingsDialog.setWindowTitle(_translate("AppSettingsDialog", "Settings"))
|
||||
self.label.setText(_translate("AppSettingsDialog", "Text editor"))
|
||||
self.label_2.setText(_translate("AppSettingsDialog", "Terminal Emulator"))
|
||||
self.label_3.setText(_translate("AppSettingsDialog", "Keep changes on exit"))
|
||||
self.label_2.setText(_translate("AppSettingsDialog", "Terminal Emulator"))
|
||||
self.label_4.setText(_translate("AppSettingsDialog", "keep build programs"))
|
||||
|
||||
@@ -86,10 +86,13 @@ class Ui_Build(object):
|
||||
self.label_14.setText(_translate("Build", "Target"))
|
||||
self.clean_button.setToolTip(_translate("Build", "Clean"))
|
||||
self.clean_button.setText(_translate("Build", "..."))
|
||||
self.clean_button.setShortcut(_translate("Build", "Ctrl+C"))
|
||||
self.build_button.setToolTip(_translate("Build", "Build"))
|
||||
self.build_button.setText(_translate("Build", "..."))
|
||||
self.build_button.setShortcut(_translate("Build", "Ctrl+B"))
|
||||
self.print_config_checkbox.setToolTip(_translate("Build", "print config at build time"))
|
||||
self.groupBox_2.setTitle(_translate("Build", "Flash"))
|
||||
self.groupBox_2.setTitle(_translate("Build", "Upload"))
|
||||
self.label_15.setText(_translate("Build", "Device"))
|
||||
self.flash_button.setToolTip(_translate("Build", "Upload"))
|
||||
self.flash_button.setText(_translate("Build", "Flash"))
|
||||
self.flash_button.setShortcut(_translate("Build", "Ctrl+U"))
|
||||
|
||||
@@ -16,15 +16,15 @@ class Ui_ConfHeader(object):
|
||||
ConfHeader.resize(664, 192)
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout(ConfHeader)
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.id_spinBox = QtWidgets.QSpinBox(ConfHeader)
|
||||
self.id_spinBox.setMaximum(255)
|
||||
self.id_spinBox.setObjectName("id_spinBox")
|
||||
self.horizontalLayout.addWidget(self.id_spinBox)
|
||||
self.color_button = QtWidgets.QToolButton(ConfHeader)
|
||||
self.color_button.setStyleSheet("")
|
||||
self.color_button.setText("")
|
||||
self.color_button.setObjectName("color_button")
|
||||
self.horizontalLayout.addWidget(self.color_button)
|
||||
self.id_spinBox = QtWidgets.QSpinBox(ConfHeader)
|
||||
self.id_spinBox.setMaximum(255)
|
||||
self.id_spinBox.setObjectName("id_spinBox")
|
||||
self.horizontalLayout.addWidget(self.id_spinBox)
|
||||
self.ac_combo = QtWidgets.QComboBox(ConfHeader)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
@@ -85,8 +85,10 @@ class Ui_ConfHeader(object):
|
||||
ConfHeader.setWindowTitle(_translate("ConfHeader", "Form"))
|
||||
self.refresh_button.setToolTip(_translate("ConfHeader", "refresh Aircraft"))
|
||||
self.refresh_button.setText(_translate("ConfHeader", "..."))
|
||||
self.refresh_button.setShortcut(_translate("ConfHeader", "Ctrl+R"))
|
||||
self.save_button.setToolTip(_translate("ConfHeader", "save conf"))
|
||||
self.save_button.setText(_translate("ConfHeader", "..."))
|
||||
self.save_button.setShortcut(_translate("ConfHeader", "Ctrl+S"))
|
||||
self.label_4.setText(_translate("ConfHeader", "Set"))
|
||||
self.new_ac_action.setText(_translate("ConfHeader", "New AC"))
|
||||
self.remove_ac_action.setText(_translate("ConfHeader", "Remove"))
|
||||
|
||||
@@ -45,6 +45,8 @@ class ProgramWidget(QWidget, Ui_Program):
|
||||
if self.process.state() == QProcess.NotRunning:
|
||||
self.cmd = self.program_lineedit.text().split(" ")
|
||||
self.start_program()
|
||||
elif self.process.state() == QProcess.Running:
|
||||
self.terminate()
|
||||
|
||||
def handle_run(self):
|
||||
if self.process.state() == QProcess.NotRunning:
|
||||
|
||||
@@ -24,16 +24,6 @@
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="text_editor_edit"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Terminal Emulator</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="terminal_emulator_edit"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
@@ -41,6 +31,16 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="keep_changes_checkbox">
|
||||
<property name="text">
|
||||
@@ -48,13 +48,30 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Terminal Emulator</string>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="terminal_emulator_edit"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>keep build programs</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QCheckBox" name="keep_build_programs_checkbox">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
<iconset theme="edit-clear">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+C</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@@ -69,6 +72,9 @@
|
||||
<iconset theme="system-run">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+B</string>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
<enum>Qt::ToolButtonIconOnly</enum>
|
||||
</property>
|
||||
@@ -96,7 +102,7 @@
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Flash</string>
|
||||
<string>Upload</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
@@ -127,6 +133,9 @@
|
||||
<iconset theme="emblem-downloads">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+U</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
@@ -14,13 +14,6 @@
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="id_spinBox">
|
||||
<property name="maximum">
|
||||
<number>255</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="color_button">
|
||||
<property name="styleSheet">
|
||||
@@ -31,6 +24,13 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="id_spinBox">
|
||||
<property name="maximum">
|
||||
<number>255</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="ac_combo">
|
||||
<property name="sizePolicy">
|
||||
@@ -70,6 +70,9 @@
|
||||
<iconset theme="view-refresh">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+R</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@@ -84,6 +87,9 @@
|
||||
<iconset theme="document-save">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+S</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
Reference in New Issue
Block a user