diff --git a/Server/copter_table_models.py b/Server/copter_table_models.py index b36332e..527c8ae 100644 --- a/Server/copter_table_models.py +++ b/Server/copter_table_models.py @@ -26,7 +26,7 @@ class CopterData: class CopterDataModel(QtCore.QAbstractTableModel): checks = {} - #selected_available = QtCore.pyqtSignal(bool) + selected_ready_signal = QtCore.pyqtSignal(bool) def __init__(self, parent=None): super(CopterDataModel, self).__init__(parent) @@ -45,8 +45,9 @@ class CopterDataModel(QtCore.QAbstractTableModel): def user_selected(self): return filter(lambda x: x.checked == Qt.Checked, self.data_contents) - def self_checked(self): - return filter(lambda x: all_checks(x), self.data_contents) + def selfchecked_ready(self, contents=()): + contents = contents or self.data_contents + return filter(lambda x: all_checks(x), contents) def rowCount(self, n=None): return len(self.data_contents) @@ -92,6 +93,9 @@ class CopterDataModel(QtCore.QAbstractTableModel): if role == Qt.CheckStateRole: self.data_contents[index.row()].checked = value + # check if all selected are selfcheck and ok (ready) + self.selected_ready_signal.emit(set(self.user_selected()).issubset(self.selfchecked_ready())) + elif role == Qt.EditRole: self.data_contents[index.row()][index.column()] = value self.update_model(index) @@ -191,17 +195,6 @@ class CopterProxyModel(QtCore.QSortFilterProxyModel): return self.human_sort_prepare(leftData) < self.human_sort_prepare(rightData) -''' - def sort(self, col, order): - self.layoutAboutToBeChanged.emit() - - self.data_contents = sorted(self.data_contents, key=lambda item: self.sorter(item[col]), - reverse=(order == Qt.DescendingOrder)) - - self.layoutChanged.emit() -''' - - class SignalManager(QtCore.QObject): update_data_signal = QtCore.pyqtSignal(int, int, QtCore.QVariant) add_client_signal = QtCore.pyqtSignal(object) diff --git a/Server/server_qt.py b/Server/server_qt.py index 6dc7804..f1caf2d 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -41,14 +41,19 @@ class MainWindow(QtWidgets.QMainWindow): self.proxy_model.setDynamicSortFilter(True) self.proxy_model.setSourceModel(self.model) - # Initing table and table self.model + # Initiate table and table self.model self.ui.tableView.setModel(self.proxy_model) self.ui.tableView.horizontalHeader().setStretchLastSection(True) self.ui.tableView.setSortingEnabled(True) + # Connect signals to manipulate model from threads self.signals.update_data_signal.connect(self.model.update_item) self.signals.add_client_signal.connect(self.model.add_client) + # Connect model signals to UI + self.model.selected_ready_signal.connect(self.ui.start_button.setEnabled) + self.model.selected_ready_signal.connect(self.ui.takeoff_button.setEnabled) + def client_connected(self, client: Client): self.signals.add_client_signal.emit(CopterData(copter_id=client.copter_id, client=client)) @@ -69,6 +74,10 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.action_send_configurations.triggered.connect(self.send_configurations) self.ui.action_send_Aruco_map.triggered.connect(self.send_aruco) + # Set most safety-important buttons disabled + self.ui.start_button.setEnabled(False) + self.ui.takeoff_button.setEnabled(False) + @pyqtSlot() def selfcheck_selected(self): for copter_data in self.model.user_selected(): @@ -80,9 +89,6 @@ class MainWindow(QtWidgets.QMainWindow): copter.get_response("selfcheck", self._set_copter_data, callback_args=(4, copter_data.copter_id)) copter.get_response("time", self._set_copter_data, callback_args=(5, copter_data.copter_id)) - #self.ui.start_button.setEnabled(True) - #self.ui.takeoff_button.setEnabled(True) - def _set_copter_data(self, value, col, copter_id): row = self.model.data_contents.index(next( filter(lambda x: x.copter_id == copter_id, self.model.data_contents)))