Commit 7a93bf28 authored by Flavio TARSETTI's avatar Flavio TARSETTI

[widgets][toolchaineditor] generic block type creation capability

parent 71273670
<mxfile host="www.draw.io" modified="2019-11-08T15:52:54.936Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36" etag="1Ma9UdnNdw8-at8-L0FF" version="12.2.3" type="device" pages="1"><diagram id="rtFZ-Xy4-K91k_U5cjYo" name="Page-1">rZRBb4MgFIB/jcclUmqi19l2O2ynHpYdibwKGfoM4tT++mGFquu6rsk8GPje4wEfaEDTonvSrBKvyEEFq5B3Ad0Eq1VMqH0PoB/BmoYjyLXkIyIT2MsjOOjTGsmhXiQaRGVktYQZliVkZsGY1tgu0w6olrNWLIcLsM+YuqRvkhvhthWFE38GmQs/MwldpGA+2YFaMI7tDNFtQFONaMZW0aWgBnfeyzhudyV6XpiG0vxlwDpWYaOPvdBCZEwk7+nL5sFV+WSqcRt2izW9N6CxKTkMRUhAH1shDewrlg3R1h65ZcIUyoUPUqkUFerTWBrHScRjy2uj8QNmkfD02IhbAGgD3dWdkbMve88ACzC6tylugDfcL7vtdF5rh8TsqDxj7obk57qTRNtwHu9wSm87tVXsBYbbPlldjbf6ILvhDH4R+U39bpck/yWYRAvBNLoQTH4QTO4XbLvTB3GKzf4qdPsF</diagram></mxfile>
<mxfile host="www.draw.io" modified="2019-11-08T15:51:32.410Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36" etag="FMHzNpQ6OiY4Fj2sp-DL" version="12.2.3" type="device" pages="1"><diagram id="rtFZ-Xy4-K91k_U5cjYo" name="Page-1">3ZRBb4MgFIB/jcclIpq019l2O2ynHpYdibwKGYpBnNpfP1Sosq7rlmw7jIOR7z0e8EEIcFp0d4pU7FFSEEEU0i7AmyCKVgib7wD6CcQ4nECuOJ0QmsGeH8FCl9ZwCrWXqKUUmlc+zGRZQqY9RpSSrZ92kMKftSI5nIF9RsQ5feJUM7utJJz5PfCcuZlRaCMFcckW1IxQ2S4Q3gY4VVLq6a/oUhCDO+dlGre7ED0tTEGpvzIgXomwUceeKcYywtbP6cPmxlZ5JaKxG7aL1b0zoGRTUhiKoADftoxr2FckG6KtOXLDmC6EDR+4EKkUUo1jcTY2w2ut5AssIuHYTMQuAJSG7uLO0MmXuWcgC9CqNyl2gDPc+912Pq/YIrY4KseIvSH5qe4s0fxYj99wGl13aqqYCwzXfZK6mm71gXfDGXwi8p363W69/inBSeIJxsmZYPSBYPRbgvG/E4z+SrDpzi/OGFs823j7Bg==</diagram></mxfile>
<mxfile host="www.draw.io" modified="2019-11-08T15:49:42.011Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36" etag="yBG1uE0d3HswN5iHmqiN" version="12.2.3" type="device" pages="1"><diagram id="rtFZ-Xy4-K91k_U5cjYo" name="Page-1">rZQ9b4MwEEB/DWMljINE1pLQDu2UoepowQVbNRgZUyC/viYcAYumaaQwIPudzx/vDB6Ni+5Fs4q/qwykF/hZ59GdFwQRofY9gH4EmzAaQa5FNiIyg4M4AUIfaSMyqJ2BRilpROXCVJUlpMZhTGvVusOOSrqrViyHFTikTK7ph8gMx2OF/sxfQeR8Wpn4GCnYNBhBzVmm2gWie4/GWikztoouBjm4m7yMecmV6GVjGkrzn4RNJP1Gn3quOU8Z337Gb7snnOWbyQYPjJs1/WRAq6bMYJiEePS55cLAoWLpEG1tyS3jppAYPgopYyWVPufSJEn2cWR5bbT6gkXEPz82ghsAbaC7ejJy8WXvGagCjO7tEEyYDPdut53rtUHEF6WaGMMbkl/mnSXaBnq8w2lw26mdxV5guO2T1dV4q4+iG2rwh8iV+u32UYLD0BFMw5Vg8otgcr9g250/iHNs8Veh+x8=</diagram></mxfile>
...@@ -40,13 +40,16 @@ from PyQt5.QtGui import QFont ...@@ -40,13 +40,16 @@ from PyQt5.QtGui import QFont
from PyQt5.QtGui import QFontMetrics from PyQt5.QtGui import QFontMetrics
from PyQt5.QtGui import QPainterPath from PyQt5.QtGui import QPainterPath
from PyQt5.QtGui import QTransform from PyQt5.QtGui import QTransform
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QVBoxLayout from PyQt5.QtWidgets import QHBoxLayout
from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QGraphicsView from PyQt5.QtWidgets import QGraphicsView
from PyQt5.QtWidgets import QGraphicsItem from PyQt5.QtWidgets import QGraphicsItem
from PyQt5.QtWidgets import QGraphicsPathItem from PyQt5.QtWidgets import QGraphicsPathItem
from PyQt5.QtWidgets import QGraphicsObject from PyQt5.QtWidgets import QGraphicsObject
from PyQt5.QtWidgets import QToolBar
from PyQt5.QtWidgets import QAction
from ..backend.asset import AssetType from ..backend.asset import AssetType
from ..backend.assetmodel import AssetModel from ..backend.assetmodel import AssetModel
...@@ -369,27 +372,25 @@ class Block(QGraphicsObject): ...@@ -369,27 +372,25 @@ class Block(QGraphicsObject):
dataChanged = pyqtSignal() dataChanged = pyqtSignal()
blockMoved = pyqtSignal() blockMoved = pyqtSignal()
def __init__(self, toolchain, block_details, block_type, style, connection_style): def __init__(self, block_type, style, connection_style):
super().__init__() super().__init__()
# Block information # Block information
self.toolchain = toolchain self.type = block_type
self.name = ""
self.name = block_details["name"] if self.type == BlockType.DATASETS.name:
if block_type == BlockType.DATASETS.name:
self.inputs = None self.inputs = None
else: else:
self.inputs = block_details["inputs"] self.inputs = []
if block_type == BlockType.ANALYZERS.name:
if self.type == BlockType.ANALYZERS.name:
self.outputs = None self.outputs = None
else: else:
self.outputs = block_details["outputs"] self.outputs = []
self.synchronized_channel = None
if "synchronized_channel" in block_details:
self.synchronized_channel = block_details["synchronized_channel"]
else:
self.synchronized_channel = None
self.type = block_type
self.style = style self.style = style
self.connection_style = connection_style self.connection_style = connection_style
...@@ -399,6 +400,21 @@ class Block(QGraphicsObject): ...@@ -399,6 +400,21 @@ class Block(QGraphicsObject):
self.pins["outputs"] = dict() self.pins["outputs"] = dict()
self.set_style(style) self.set_style(style)
def load(self, toolchain, block_details):
self.toolchain = toolchain
self.name = block_details["name"]
if self.type != BlockType.DATASETS.name:
self.inputs = block_details["inputs"]
if self.type != BlockType.ANALYZERS.name:
self.outputs = block_details["outputs"]
if "synchronized_channel" in block_details:
self.synchronized_channel = block_details["synchronized_channel"]
self.set_style(self.style)
self.create_pins() self.create_pins()
def create_pins(self): def create_pins(self):
...@@ -440,14 +456,14 @@ class Block(QGraphicsObject): ...@@ -440,14 +456,14 @@ class Block(QGraphicsObject):
metrics = QFontMetrics(self.text_font) metrics = QFontMetrics(self.text_font)
text_width = metrics.boundingRect(self.name).width() + 14 text_width = metrics.boundingRect(self.name).width() + 14
if self.inputs is not None: if self.inputs is not None and len(self.inputs) > 0:
self.max_inputs_width = ( self.max_inputs_width = (
metrics.boundingRect(max(self.inputs, key=len)).width() + 14 metrics.boundingRect(max(self.inputs, key=len)).width() + 14
) )
else: else:
self.max_inputs_width = 14 self.max_inputs_width = 14
if self.outputs is not None: if self.outputs is not None and len(self.outputs) > 0:
self.max_outputs_width = ( self.max_outputs_width = (
metrics.boundingRect(max(self.outputs, key=len)).width() + 14 metrics.boundingRect(max(self.outputs, key=len)).width() + 14
) )
...@@ -688,9 +704,38 @@ class Toolchain(QWidget): ...@@ -688,9 +704,38 @@ class Toolchain(QWidget):
self.view = ToolchainView(self) self.view = ToolchainView(self)
self.view.setScene(self.scene) self.view.setScene(self.scene)
layout = QVBoxLayout(self)
self.toolbar = QToolBar()
dataset_action = QAction(
QIcon("beat/editor/widgets/dataset_icon.png"), "&Dataset", self
)
dataset_action.triggered.connect(lambda: self.add_block(BlockType.DATASETS))
block_action = QAction(
QIcon("beat/editor/widgets/block_icon.png"), "&Block", self
)
block_action.triggered.connect(lambda: self.add_block(BlockType.BLOCKS))
analyzer_action = QAction(
QIcon("beat/editor/widgets/analyzer_icon.png"), "&Analyzer", self
)
analyzer_action.triggered.connect(lambda: self.add_block(BlockType.ANALYZERS))
self.toolbar.addAction(dataset_action)
self.toolbar.addAction(block_action)
self.toolbar.addAction(analyzer_action)
self.toolbar.setOrientation(Qt.Vertical)
layout = QHBoxLayout(self)
layout.addWidget(self.toolbar)
layout.addWidget(self.view) layout.addWidget(self.view)
def add_block(self, block_type):
self.new_block = Block(
block_type.name, self.block_config, self.connection_config
)
self.scene.addItem(self.new_block)
def clear_space(self): def clear_space(self):
self.scene.clear() self.scene.clear()
self.scene.items().clear() self.scene.items().clear()
...@@ -719,12 +764,9 @@ class Toolchain(QWidget): ...@@ -719,12 +764,9 @@ class Toolchain(QWidget):
for block_type in BlockType: for block_type in BlockType:
for block_item in self.json_object[block_type.value]: for block_item in self.json_object[block_type.value]:
block = Block( block = Block(
self, block_type.name, self.block_config, self.connection_config
block_item,
block_type.name,
self.block_config,
self.connection_config,
) )
block.load(self, block_item)
# Place blocks (x,y) if information is given # Place blocks (x,y) if information is given
if self.editor_gui is not None: if self.editor_gui is not None:
if block.name in self.editor_gui: if block.name in self.editor_gui:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment