Skip to content
Snippets Groups Projects
Commit 33fad4ad authored by Andreas Bolin's avatar Andreas Bolin
Browse files

workspace dump

parent 73b1e433
No related branches found
No related tags found
1 merge request!78Add scheduler GUI
Pipeline #73377 passed
...@@ -10,7 +10,7 @@ import sys ...@@ -10,7 +10,7 @@ import sys
from typing import Any, Optional from typing import Any, Optional
from pprint import pprint from pprint import pprint
from typing import Any, Union, Optional, overload, Dict, List, TypeAlias from typing import Any, Union, Optional, overload, Dict, List, TypeAlias
from typing_extensions import Self # from typing_extensions import Self
import numpy as np import numpy as np
from copy import deepcopy from copy import deepcopy
from math import cos, sin, pi from math import cos, sin, pi
...@@ -151,12 +151,12 @@ class GraphicsAxesItem(QGraphicsItemGroup): ...@@ -151,12 +151,12 @@ class GraphicsAxesItem(QGraphicsItemGroup):
"""Register an object that receives events.""" """Register an object that receives events."""
self._event_items.append(item) self._event_items.append(item)
def set_height(self, height: int) -> "Self": def set_height(self, height: int) -> "GraphicsAxesItem":
# TODO: implement, docstring # TODO: implement, docstring
raise NotImplemented raise NotImplemented
return self return self
def set_width(self, width: int) -> "Self": def set_width(self, width: int) -> "GraphicsAxesItem":
# TODO: docstring # TODO: docstring
assert width >= 0, f"'width' greater or equal to 0 expected, got: {width}." assert width >= 0, f"'width' greater or equal to 0 expected, got: {width}."
delta_width = width - self._width delta_width = width - self._width
......
...@@ -23,7 +23,7 @@ from qtpy.QtCore import ( ...@@ -23,7 +23,7 @@ from qtpy.QtCore import (
Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, Slot, QEvent) Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, Slot, QEvent)
from qtpy.QtGui import ( from qtpy.QtGui import (
QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap, QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap,
QLinearGradient, QTransform) QLinearGradient, QTransform, QCursor)
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsView, QGraphicsScene, QGraphicsWidget,
QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout,
...@@ -36,6 +36,7 @@ from qtpy.QtCore import ( ...@@ -36,6 +36,7 @@ from qtpy.QtCore import (
# B-ASIC # B-ASIC
import logger import logger
from b_asic.schedule import Schedule from b_asic.schedule import Schedule
# from b_asic.graph_component import GraphComponent
class GraphicsComponentItem(QGraphicsItemGroup): class GraphicsComponentItem(QGraphicsItemGroup):
...@@ -62,8 +63,10 @@ class GraphicsComponentItem(QGraphicsItemGroup): ...@@ -62,8 +63,10 @@ class GraphicsComponentItem(QGraphicsItemGroup):
self._port_items = [] self._port_items = []
self.setFlag(QGraphicsItem.ItemIsMovable) # mouse move events self.setFlag(QGraphicsItem.ItemIsMovable) # mouse move events
self.setAcceptHoverEvents(True) # mouse hover events self.setFlag(QGraphicsItem.ItemIsSelectable) # mouse move events
# self.setAcceptHoverEvents(True) # mouse hover events
self.setAcceptedMouseButtons(Qt.LeftButton) # accepted buttons for movements self.setAcceptedMouseButtons(Qt.LeftButton) # accepted buttons for movements
self.setCursor(QCursor(Qt.OpenHandCursor)) # default cursor when hovering over object
self._make_component() self._make_component()
......
...@@ -178,7 +178,9 @@ class GraphicsGraphEvent(QGraphicsItem): ...@@ -178,7 +178,9 @@ class GraphicsGraphEvent(QGraphicsItem):
stores the current position in item's parent coordinates. 'event' will stores the current position in item's parent coordinates. 'event' will
by default be accepted, and this item is then the mouse grabber. This by default be accepted, and this item is then the mouse grabber. This
allows the item to receive future move, release and double-click events.""" allows the item to receive future move, release and double-click events."""
item = self.scene().mouseGrabberItem() item: GraphicsComponentItem = self.scene().mouseGrabberItem()
# op = self.schedule.sfg.find_by_id(item.op_id)
# emit fill_info_table_component(op)
self._current_pos = item.mapToParent(event.pos()) self._current_pos = item.mapToParent(event.pos())
self.setCursor(QCursor(Qt.ClosedHandCursor)) self.setCursor(QCursor(Qt.ClosedHandCursor))
event.accept() event.accept()
......
...@@ -25,7 +25,7 @@ from qtpy.QtCore import ( ...@@ -25,7 +25,7 @@ from qtpy.QtCore import (
Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, qAbs, QLineF) Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, qAbs, QLineF)
from qtpy.QtGui import ( from qtpy.QtGui import (
QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap, QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap,
QLinearGradient, QTransform, QPolygonF) QLinearGradient, QTransform, QPolygonF, QCursor)
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsView, QGraphicsScene, QGraphicsWidget,
QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout,
...@@ -64,8 +64,9 @@ class GraphicsTimelineItem(QGraphicsLineItem): ...@@ -64,8 +64,9 @@ class GraphicsTimelineItem(QGraphicsLineItem):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.setFlag(QGraphicsItem.ItemIsMovable) # mouse move events self.setFlag(QGraphicsItem.ItemIsMovable) # mouse move events
self.setAcceptHoverEvents(True) # mouse hover events # self.setAcceptHoverEvents(True) # mouse hover events
self.setAcceptedMouseButtons(Qt.LeftButton) # accepted buttons for movements self.setAcceptedMouseButtons(Qt.LeftButton) # accepted buttons for movements
self.setCursor(QCursor(Qt.SizeHorCursor)) # default cursor when hovering over object
self._delta_time_label = QGraphicsTextItem() self._delta_time_label = QGraphicsTextItem()
self._delta_time_label.hide() self._delta_time_label.hide()
......
...@@ -10,7 +10,7 @@ import os ...@@ -10,7 +10,7 @@ import os
import sys import sys
from pathlib import Path from pathlib import Path
from types import ModuleType from types import ModuleType
from typing import Any, Iterable, List, Sequence, Type from typing import Any, Iterable, List, Sequence, Type, Dict
from pprint import pprint from pprint import pprint
#from matplotlib.pyplot import bar #from matplotlib.pyplot import bar
#from diagram import * #from diagram import *
...@@ -36,11 +36,12 @@ from qtpy.QtGui import ( ...@@ -36,11 +36,12 @@ from qtpy.QtGui import (
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsScale, QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsScale,
QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout,
QGraphicsItem, QGraphicsItemGroup, QGraphicsRectItem) QGraphicsItem, QGraphicsItemGroup, QGraphicsRectItem, QHeaderView)
# B-ASIC # B-ASIC
import logger import logger
from b_asic.schedule import Schedule from b_asic.schedule import Schedule
from b_asic.graph_component import GraphComponent
from graphics_graph_item import GraphicsGraphItem from graphics_graph_item import GraphicsGraphItem
from graphics_axes_item import GraphicsAxesItem from graphics_axes_item import GraphicsAxesItem
from graphics_component_item import GraphicsComponentItem from graphics_component_item import GraphicsComponentItem
...@@ -117,6 +118,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -117,6 +118,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
_debug_rects: QGraphicsItemGroup _debug_rects: QGraphicsItemGroup
_splitter_pos: int _splitter_pos: int
_splitter_min: int _splitter_min: int
_table_items: Dict[str, QTableWidgetItem]
def __init__(self): def __init__(self):
...@@ -126,6 +128,14 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -126,6 +128,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self._open_file_dialog_opened = False self._open_file_dialog_opened = False
self._scale = 75 self._scale = 75
self._debug_rects = None self._debug_rects = None
self._table_items: Dict[str, QTableWidgetItem]= {
'schedule_time': QTableWidgetItem(), # Schedule related part
'cyclic': QTableWidgetItem(),
'resolution': QTableWidgetItem(),
'id': QTableWidgetItem(), # Component realtaed part
'name': QTableWidgetItem(),
'inports': QTableWidgetItem(),
'outports': QTableWidgetItem()}
QIcon.setThemeName('breeze') QIcon.setThemeName('breeze')
log.debug('themeName: \'{}\''.format(QIcon.themeName())) log.debug('themeName: \'{}\''.format(QIcon.themeName()))
...@@ -156,15 +166,20 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -156,15 +166,20 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.closeEvent = self._close_event self.closeEvent = self._close_event
# Setup info table # Setup info table
self.info_table.horizontalHeader().setDefaultAlignment(Qt.AlignLeft)
self.info_table.setHorizontalHeaderLabels(['Property','Value']) self.info_table.setHorizontalHeaderLabels(['Property','Value'])
# test = '#b085b2' # test = '#b085b2'
# self.info_table.setStyleSheet('alternate-background-color: lightGray;background-color: white;') # self.info_table.setStyleSheet('alternate-background-color: lightGray;background-color: white;')
self.info_table.setStyleSheet('alternate-background-color: #fadefb;background-color: #ebebeb;') self.info_table.setStyleSheet('alternate-background-color: #fadefb;background-color: #ebebeb;')
for i in range(10): self.info_table.setSpan(0, 0, 1, 2) # Span 'Schedule' over 2 columns
self.info_table.insertRow(i) self.info_table.setSpan(1, 0, 1, 2) # Span 'Operator' over 2 columns
item = QTableWidgetItem('this is a very very very very long string that says abolutly nothing') self.info_table.setItem(0, 0, QTableWidgetItem('Schedule'))
self.info_table.setItem(i,0, QTableWidgetItem('property {}: '.format(i))) self.info_table.setItem(1, 0, QTableWidgetItem('Operator'))
self.info_table.setItem(i,1,item) self.info_table.item(0, 0).setBackground(Qt.gray)
self.info_table.item(1, 0).setBackground(Qt.gray)
# Init central-widget splitter # Init central-widget splitter
self._splitter_min = self.splitter.minimumSizeHint().height() self._splitter_min = self.splitter.minimumSizeHint().height()
...@@ -181,7 +196,80 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -181,7 +196,80 @@ class MainWindow(QMainWindow, Ui_MainWindow):
GraphicsComponentItem._scale = self._scale GraphicsComponentItem._scale = self._scale
GraphicsAxesItem._scale = self._scale GraphicsAxesItem._scale = self._scale
self._scene.changed.connect(self.shrink_scene_to_min_size) self._scene.changed.connect(self.shrink_scene_to_min_size)
def fill_info_table_schedule(self, schedule: Schedule) -> None:
self._table_items['schedule_time'].setText(str(schedule.schedule_time))
self._table_items['cyclic'].setText(str(schedule.cyclic))
self._table_items['resolution'].setText(str(schedule.resolution))
self.info_table.insertRow(1)
self.info_table.insertRow(1)
self.info_table.insertRow(1)
self.info_table.setItem(1, 0, QTableWidgetItem('Schedule Time'))
self.info_table.setItem(2, 0, QTableWidgetItem('Cyclic'))
self.info_table.setItem(3, 0, QTableWidgetItem('Resolution'))
self.info_table.setItem(1, 1 ,self._table_items['schedule_time'])
self.info_table.setItem(2, 1 ,self._table_items['cyclic'])
self.info_table.setItem(3, 1 ,self._table_items['resolution'])
# self.info_table.setVerticalHeaderItem(0, mydict['test'])
# self._table_items['schedule_time'].setText('test item updated text')
for i in range(5,10):
self.info_table.insertRow(i)
item = QTableWidgetItem('this is a very very very very long string that says abolutly nothing')
self.info_table.setItem(i,0, QTableWidgetItem('property {}: '.format(i)))
self.info_table.setItem(i,1,item)
def fill_info_table_component(self, op: GraphComponent) -> None:
si = len(self._table_items) + 1 # si = start index
self.info_table.insertRow(si)
self.info_table.insertRow(si)
self.info_table.setItem(si + 0, 0, QTableWidgetItem('Graph ID'))
self.info_table.setItem(si + 0, 1, QTableWidgetItem(str(op.graph_id)))
self.info_table.setItem(si + 1, 0, QTableWidgetItem('Name'))
self.info_table.setItem(si + 1, 1, QTableWidgetItem(str(op.name)))
si += 2
params = [(k,v) for k,v in op.params]
for i in range(len(params)):
self.info_table.insertRow(si + i)
self.info_table.setItem(si + i, 0, QTableWidgetItem(params[i][0]))
self.info_table.setItem(si + i, 1, QTableWidgetItem(params[i][1]))
# graph_id
# name
# params (dict)
self._table_items['schedule_time'].setText(str(schedule.schedule_time))
self._table_items['cyclic'].setText(str(schedule.cyclic))
self._table_items['resolution'].setText(str(schedule.resolution))
self.info_table.insertRow(si)
self.info_table.insertRow(si)
self.info_table.insertRow(si)
self.info_table.setItem(si + 0, 0, QTableWidgetItem('ID'))
self.info_table.setItem(si + 1, 0, QTableWidgetItem('Name'))
self.info_table.setItem(si + 3, 0, QTableWidgetItem('Inports'))
self.info_table.setItem(si + 3, 0, QTableWidgetItem('Outports'))
self.info_table.setItem(si + 1, 1 ,self._table_items['id'])
self.info_table.setItem(si + 2, 1 ,self._table_items['name'])
self.info_table.setItem(si + 3, 1 ,self._table_items['inports'])
self.info_table.setItem(si + 3, 1 ,self._table_items['outports'])
# self.info_table.setVerticalHeaderItem(0, mydict['test'])
# self._table_items['schedule_time'].setText('test item updated text')
for i in range(5,10):
self.info_table.insertRow(i)
item = QTableWidgetItem('this is a very very very very long string that says abolutly nothing')
self.info_table.setItem(i,0, QTableWidgetItem('property {}: '.format(i)))
self.info_table.setItem(i,1,item)
def clear_info_table_schedule(self) -> None:
for _ in range(3): # Remove Schedule info
self.info_table.removeRow(1)
def clear_info_table_component(self) -> None:
for _ in range(5): # Remove component info
self.info_table.removeRow(2)
############### ###############
...@@ -286,6 +374,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -286,6 +374,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# self._scene.setSceneRect(self._scene.itemsBoundingRect()) # self._scene.setSceneRect(self._scene.itemsBoundingRect())
self.update_statusbar(self.tr('Schedule loaded successfully')) self.update_statusbar(self.tr('Schedule loaded successfully'))
self.fill_info_table_schedule(self._graph.schedule)
@Slot() @Slot()
def save(self) -> None: def save(self) -> None:
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
<enum>QAbstractItemView::SelectRows</enum> <enum>QAbstractItemView::SelectRows</enum>
</property> </property>
<property name="rowCount"> <property name="rowCount">
<number>0</number> <number>2</number>
</property> </property>
<property name="columnCount"> <property name="columnCount">
<number>2</number> <number>2</number>
...@@ -88,6 +88,11 @@ ...@@ -88,6 +88,11 @@
<attribute name="verticalHeaderVisible"> <attribute name="verticalHeaderVisible">
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<attribute name="verticalHeaderDefaultSectionSize">
<number>21</number>
</attribute>
<row/>
<row/>
<column/> <column/>
<column/> <column/>
</widget> </widget>
...@@ -101,7 +106,7 @@ ...@@ -101,7 +106,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>20</height> <height>22</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment