Skip to content
Snippets Groups Projects

Fixed save/load, sfg creating, simulation, bug fixes

Merged Jacob Wahlman requested to merge gui-bug-fixes into develop
4 files
+ 15
12
Compare changes
  • Side-by-side
  • Inline
Files
4
+ 66
12
@@ -101,6 +101,8 @@ class MainWindow(QMainWindow):
self.shortcut_save.activated.connect(self.save_work)
self.shortcut_help = QShortcut(QKeySequence("Ctrl+?"), self)
self.shortcut_help.activated.connect(self.display_faq_page)
self.shortcut_signal = QShortcut(QKeySequence(Qt.Key_Space), self)
self.shortcut_signal.activated.connect(self._connect_button)
self.logger.info("Finished setting up GUI")
self.logger.info("For questions please refer to 'Ctrl+?', or visit the 'Help' section on the toolbar.")
@@ -212,6 +214,7 @@ class MainWindow(QMainWindow):
for op in sfg.split():
self.operationDragDict[op].setToolTip(sfg.name)
self.opToSFG[self.operationDragDict[op]] = sfg
self.sfg_dict[sfg.name] = sfg
self.logger.info(f"Loaded sfg from path: {module}.")
@@ -257,11 +260,55 @@ class MainWindow(QMainWindow):
sfg = SFG(inputs=inputs, outputs=outputs, name=name)
self.logger.info(f"Created SFG with name: {name} from selected operations.")
sfg_operations = sfg.operations.copy()
for op in self.pressed_operations:
operation = [op_ for op_ in sfg_operations if op_.type_name() == op.operation.type_name()][0]
op.operation = operation
sfg_operations.remove(operation)
def check_equality(signal, signal_2):
if not (signal.source.operation.type_name() == signal_2.source.operation.type_name() \
and signal.destination.operation.type_name() == signal_2.destination.operation.type_name()):
return False
if hasattr(signal.source.operation, "value") and hasattr(signal_2.source.operation, "value") \
and hasattr(signal.destination.operation, "value") and hasattr(signal_2.destination.operation, "value"):
if not (signal.source.operation.value == signal_2.source.operation.value \
and signal.destination.operation.value == signal_2.destination.operation.value):
return False
if hasattr(signal.source.operation, "name") and hasattr(signal_2.source.operation, "name") \
and hasattr(signal.destination.operation, "name") and hasattr(signal_2.destination.operation, "name"):
if not (signal.source.operation.name == signal_2.source.operation.name \
and signal.destination.operation.name == signal_2.destination.operation.name):
return False
try:
_signal_source_index = [signal.source.operation.outputs.index(port) for port in signal.source.operation.outputs if signal in port.signals]
_signal_2_source_index = [signal_2.source.operation.outputs.index(port) for port in signal_2.source.operation.outputs if signal_2 in port.signals]
except ValueError:
return False # Signal output connections not matching
try:
_signal_destination_index = [signal.destination.operation.inputs.index(port) for port in signal.destination.operation.inputs if signal in port.signals]
_signal_2_destination_index = [signal_2.destination.operation.inputs.index(port) for port in signal_2.destination.operation.inputs if signal_2 in port.signals]
except ValueError:
return False # Signal input connections not matching
if not (_signal_source_index == _signal_2_source_index and _signal_destination_index == _signal_2_destination_index):
return False
return True
for pressed_op in self.pressed_operations:
for operation in sfg.operations:
for input_ in operation.inputs:
for signal in input_.signals:
for line in self.signalPortDict:
if check_equality(line.signal, signal):
line.source.operation.operation = signal.source.operation
line.destination.operation.operation = signal.destination.operation
for output_ in operation.outputs:
for signal in output_.signals:
for line in self.signalPortDict:
if check_equality(line.signal, signal):
line.source.operation.operation = signal.source.operation
line.destination.operation.operation = signal.destination.operation
for op in self.pressed_operations:
op.setToolTip(sfg.name)
@@ -328,7 +375,6 @@ class MainWindow(QMainWindow):
self.add_operations_from_namespace(namespace, self.ui.custom_operations_list)
def create_operation(self, op, position=None):
self.logger.info(f"Creating operation of type: {op.type_name()}.")
try:
attr_button = DragButton(op.graph_id, op, op.type_name().lower(), True, window = self)
if position is None:
@@ -352,10 +398,9 @@ class MainWindow(QMainWindow):
attr_button.setParent(None)
attr_button_scene = self.scene.addWidget(attr_button)
if position is None:
attr_button_scene.moveBy(self.move_button_index * 100, 0)
attr_button_scene.moveBy(int(self.scene.width() / 2), int(self.scene.height() / 2))
attr_button_scene.setFlag(attr_button_scene.ItemIsSelectable, True)
self.move_button_index += 1
operation_label = QGraphicsTextItem(op.type_name(), attr_button_scene)
operation_label = QGraphicsTextItem(op.name, attr_button_scene)
if not self.is_show_names:
operation_label.setOpacity(0)
operation_label.setTransformOriginPoint(operation_label.boundingRect().center())
@@ -394,7 +439,7 @@ class MainWindow(QMainWindow):
self.pressed_operations.clear()
super().keyPressEvent(event)
def _connect_button(self, event):
def _connect_button(self, *event):
if len(self.pressed_ports) < 2:
self.logger.warning("Can't connect less than two ports. Please select more.")
return
@@ -403,6 +448,11 @@ class MainWindow(QMainWindow):
source = self.pressed_ports[i] if isinstance(self.pressed_ports[i].port, OutputPort) else self.pressed_ports[i + 1]
destination = self.pressed_ports[i + 1] if source is not self.pressed_ports[i + 1] else self.pressed_ports[i]
if source.port.operation is destination.port.operation:
self.logger.warning("Can't connect to the same port")
continue
if type(source.port) == type(destination.port):
self.logger.warning(f"Can't connect port of type: {type(source.port).__name__} to port of type: {type(destination.port).__name__}.")
continue
self.connect_button(source, destination)
@@ -411,9 +461,13 @@ class MainWindow(QMainWindow):
port.select_port()
def connect_button(self, source, destination):
signal_exists = any([signal.destination is destination.port for signal in source.port.signals])
signal_exists = (signal for signal in source.port.signals if signal.destination is destination.port)
self.logger.info(f"Connecting: {source.operation.operation.type_name()} -> {destination.operation.operation.type_name()}.")
line = Arrow(source, destination, self, create_signal=not signal_exists)
try:
line = Arrow(source, destination, self, signal=next(signal_exists))
except StopIteration:
line = Arrow(source, destination, self)
if line not in self.signalPortDict:
self.signalPortDict[line] = []
Loading