Merge branch 'qt-gui-update' of https://github.com/CopterExpress/clever-show into qt-gui-update

This commit is contained in:
Arthur Golubtsov
2020-01-22 11:23:47 +03:00
4 changed files with 42 additions and 54 deletions

View File

@@ -686,11 +686,14 @@ class ConfigTreeWidget(QTreeView):
class ConfigDialog(QtWidgets.QDialog):
copter_editor_signal = QtCore.pyqtSignal(object, object)
def __init__(self, parent=None):
super(ConfigDialog, self).__init__(parent)
self.ui = config_editor.Ui_config_dialog()
self.model = ConfigModel(widget=self)
self.setupUi()
self.copter_editor_signal.connect(self._call_copter_dialog)
def setupModel(self, data, pure_dict=False, convert_types=False):
if pure_dict:
@@ -749,6 +752,11 @@ class ConfigDialog(QtWidgets.QDialog):
return True
def call_copter_dialog(self, client, value):
self.copter_editor_signal.emit(client, value)
@pyqtSlot(object, object)
def _call_copter_dialog(self, client, value):
logging.info("Opening dialog")
config_dict, spec_dict = value["config"], value["configspec"]
cfg = config.ConfigManager()
cfg.load_from_dict(config_dict, spec_dict)

View File

@@ -14,8 +14,6 @@ import copter_table_models as table
class CopterTableWidget(QTableView):
config_dialog_signal = QtCore.pyqtSignal(object, object)
def __init__(self, model, data_model=table.StatedCopterData):
QTableView.__init__(self)
@@ -45,8 +43,6 @@ class CopterTableWidget(QTableView):
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.open_menu)
self.config_dialog_signal.connect(lambda x: x)
# Adjust properties
self.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.resizeColumnsToContents()
@@ -121,14 +117,8 @@ class CopterTableWidget(QTableView):
@pyqtSlot()
def edit_config(self, copter):
try:
self.config_dialog_signal.disconnect()
except (TypeError, RuntimeError) as error:
logging.error(f"Disconnection of signal failed: {error}")
else:
call = ConfigDialog().call_copter_dialog
self.config_dialog_signal.connect(call)
copter.client.get_response("config", self.config_dialog_signal.emit)
dialog = ConfigDialog()
copter.client.get_response("config", dialog.call_copter_dialog)
# def _selfcheck_shortener(self, data): # TODO!!!
# shortened = []

View File

@@ -29,23 +29,6 @@ from copter_table import CopterTableWidget
from visual_land_dialog import VisualLandDialog
from config_editor_models import ConfigDialog
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s [%(name)-7.7s] [%(threadName)-19.19s] [%(levelname)-7.7s] %(message)s",
handlers=[
logging.FileHandler("server_logs/{}.log".format(now)),
logging.StreamHandler(sys.stdout)
])
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s [%(name)-7.7s] [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s")
handler.setFormatter(formatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
def multi_glob(*patterns):
return itertools.chain.from_iterable(glob.iglob(pattern) for pattern in patterns)
@@ -65,10 +48,10 @@ def confirmation_required(text="Are you sure?", label="Confirm operation?"):
QMessageBox.Yes | QMessageBox.No, QMessageBox.No
)
if reply == QMessageBox.Yes:
logger.debug("Dialog accepted")
logging.debug("Dialog accepted")
return f(*args, **kwargs)
logger.debug("Dialog declined")
logging.debug("Dialog declined")
return wrapper
@@ -205,26 +188,26 @@ class MainWindow(QtWidgets.QMainWindow):
return list(self.iterate_selected(lambda copter: copter.client.send_message(command, command_args)))
def new_client_connected(self, client: Client):
logger.debug("Added client {}".format(client))
logging.debug("Added client {}".format(client))
self.ui.copter_table.add_client(copter_id=client.copter_id, client=client)
def client_connection_changed(self, client: Client):
logger.debug("Connection {} changed {}".format(client, client.connected))
logging.debug("Connection {} changed {}".format(client, client.connected))
row_data = self.model.get_row_by_attr("client", client)
if row_data is None:
logger.error("No row for client presented")
logging.error("No row for client presented")
return
if self.server.config.table_remove_disconnected and (not client.connected):
client.remove()
self.ui.copter_table.remove_client_data(row_data)
logger.debug("Removing from table")
logging.debug("Removing from table")
else:
row_num = self.model.get_row_index(row_data)
if row_num is not None:
self.ui.copter_table.update_data(row_num, 0, client.connected, table.ModelStateRole)
logger.debug("Client status updated")
logging.debug("Client status updated")
@pyqtSlot()
def selfcheck_selected(self):
@@ -250,7 +233,7 @@ class MainWindow(QtWidgets.QMainWindow):
for key, value in telems.items():
col = cols_dict.get(key, None)
if col is None:
logger.error("No column {} present!".format(key))
logging.error("No column {} present!".format(key))
continue
row_data = self.model.get_row_by_attr("client", client)
@@ -264,18 +247,18 @@ class MainWindow(QtWidgets.QMainWindow):
copter.client.remove()
if not self.server.config.table_remove_disconnected:
self.ui.copter_table.remove_client_data(copter)
logger.info("Client removed from table!")
logging.info("Client removed from table!")
@pyqtSlot()
@confirmation_required("This operation will takeoff selected copters with delay and start animation. Proceed?")
def send_start_time_selected(self):
time_now = server.time_now()
dt = self.ui.start_delay_spin.value()
logger.info('Wait {} seconds to start animation'.format(dt))
logging.info('Wait {} seconds to start animation'.format(dt))
if self.ui.music_checkbox.isChecked():
music_dt = self.ui.music_delay_spin.value()
asyncio.ensure_future(self.play_music_at_time(music_dt + time_now), loop=loop)
logger.info('Wait {} seconds to play music'.format(music_dt))
logging.info('Wait {} seconds to play music'.format(music_dt))
# self.selfcheck_selected()
for copter in filter(self.model.checks.all_checks, self.model.user_selected()):
server.send_starttime(copter.client, dt + time_now)
@@ -346,7 +329,7 @@ class MainWindow(QtWidgets.QMainWindow):
for num, file in enumerate(files):
filepath, filename = os.path.split(file)
logger.info("Preparing file for sending: {} {}".format(filepath, filename))
logging.info("Preparing file for sending: {} {}".format(filepath, filename))
if match_id:
name = os.path.splitext(filename)[0]
@@ -355,10 +338,10 @@ class MainWindow(QtWidgets.QMainWindow):
to_send = copters
if not to_send:
logger.error(f"No copters to send file {filename} to")
logging.error(f"No copters to send file {filename} to")
continue
logger.info(f"Sending file {filename} to clients: {to_send}")
logging.info(f"Sending file {filename} to clients: {to_send}")
filename = client_filename.format(num, filename) or filename
for copter in to_send:
@@ -440,7 +423,7 @@ class MainWindow(QtWidgets.QMainWindow):
@pyqtSlot()
def send_fcu_parameters(self):
def request_callback(client, value):
logger.info("Send parameters to {} success: {}".format(client.copter_id, value))
logging.info("Send parameters to {} success: {}".format(client.copter_id, value))
def callback(copter):
copter.client.get_response("load_params", request_callback)
@@ -462,7 +445,7 @@ class MainWindow(QtWidgets.QMainWindow):
config = cfg.ConfigManager()
config.load_only_config(path)
data = config.full_dict
logger.info(f"Loaded config from {path}")
logging.info(f"Loaded config from {path}")
copters = self.model.user_selected()
for copter in copters:
@@ -489,10 +472,10 @@ class MainWindow(QtWidgets.QMainWindow):
@pyqtSlot()
def play_music(self):
if self.player.mediaStatus() == QtMultimedia.QMediaPlayer.InvalidMedia:
logger.info("Can't play media")
logging.info("Can't play media")
return
if self.player.mediaStatus() == QtMultimedia.QMediaPlayer.NoMedia:
logger.info("No media file")
logging.info("No media file")
return
if self.player.state() == QtMultimedia.QMediaPlayer.StoppedState or \
@@ -506,24 +489,24 @@ class MainWindow(QtWidgets.QMainWindow):
@pyqtSlot()
def stop_music(self):
if self.player.mediaStatus() == QtMultimedia.QMediaPlayer.InvalidMedia:
logger.error("Can't stop media")
logging.error("Can't stop media")
return
if self.player.mediaStatus() == QtMultimedia.QMediaPlayer.NoMedia:
logger.error("No media file")
logging.error("No media file")
return
self.player.stop()
@asyncio.coroutine
def play_music_at_time(self, t):
if self.player.mediaStatus() == QtMultimedia.QMediaPlayer.InvalidMedia:
logger.error("Can't play media")
logging.error("Can't play media")
return
if self.player.mediaStatus() == QtMultimedia.QMediaPlayer.NoMedia:
logger.error("No media file")
logging.error("No media file")
return
self.player.stop()
yield from asyncio.sleep(t - time.time())
logger.info("Playing music")
logging.info("Playing music")
self.player.play()
@pyqtSlot()

View File

@@ -8,6 +8,7 @@ import random
import logging
import threading
import collections
import traceback
from contextlib import closing
@@ -392,9 +393,15 @@ class ConnectionManager(object):
logger.debug(
"Request {} successfully closed with value {}".format(request, message.content["value"])
)
print(self, "CALLBACK", request.callback, "VAL", value, "ARGS",request.callback_args, request.callback_kwargs)
try:
request.callback(self, value, *request.callback_args, **request.callback_kwargs)
print(1)
except Exception as e:
logging.error("Error during callback call of request") # TODO more info
traceback.print_exc()
print(e)
f = request.callback
f(self, value, *request.callback_args, **request.callback_kwargs)
else:
logger.warning("Unexpected response!")