From 33fad4ad103f55bbd24dfed20566c60b3f231829 Mon Sep 17 00:00:00 2001 From: Andreas Bolin <andbo467@student.liu.se> Date: Mon, 1 Aug 2022 17:14:05 +0200 Subject: [PATCH] workspace dump --- b_asic/scheduler-gui/graphics_axes_item.py | 6 +- .../scheduler-gui/graphics_component_item.py | 7 +- b_asic/scheduler-gui/graphics_graph_event.py | 4 +- .../scheduler-gui/graphics_timeline_item.py | 5 +- b_asic/scheduler-gui/main_window.py | 103 ++++++++++++++++-- b_asic/scheduler-gui/main_window.ui | 9 +- 6 files changed, 117 insertions(+), 17 deletions(-) diff --git a/b_asic/scheduler-gui/graphics_axes_item.py b/b_asic/scheduler-gui/graphics_axes_item.py index c8f8476a..02b84900 100644 --- a/b_asic/scheduler-gui/graphics_axes_item.py +++ b/b_asic/scheduler-gui/graphics_axes_item.py @@ -10,7 +10,7 @@ import sys from typing import Any, Optional from pprint import pprint from typing import Any, Union, Optional, overload, Dict, List, TypeAlias -from typing_extensions import Self +# from typing_extensions import Self import numpy as np from copy import deepcopy from math import cos, sin, pi @@ -151,12 +151,12 @@ class GraphicsAxesItem(QGraphicsItemGroup): """Register an object that receives events.""" self._event_items.append(item) - def set_height(self, height: int) -> "Self": + def set_height(self, height: int) -> "GraphicsAxesItem": # TODO: implement, docstring raise NotImplemented return self - def set_width(self, width: int) -> "Self": + def set_width(self, width: int) -> "GraphicsAxesItem": # TODO: docstring assert width >= 0, f"'width' greater or equal to 0 expected, got: {width}." delta_width = width - self._width diff --git a/b_asic/scheduler-gui/graphics_component_item.py b/b_asic/scheduler-gui/graphics_component_item.py index d7cce989..c2b8e787 100644 --- a/b_asic/scheduler-gui/graphics_component_item.py +++ b/b_asic/scheduler-gui/graphics_component_item.py @@ -23,7 +23,7 @@ from qtpy.QtCore import ( Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, Slot, QEvent) from qtpy.QtGui import ( QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap, - QLinearGradient, QTransform) + QLinearGradient, QTransform, QCursor) from qtpy.QtWidgets import ( QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, @@ -36,6 +36,7 @@ from qtpy.QtCore import ( # B-ASIC import logger from b_asic.schedule import Schedule +# from b_asic.graph_component import GraphComponent class GraphicsComponentItem(QGraphicsItemGroup): @@ -62,8 +63,10 @@ class GraphicsComponentItem(QGraphicsItemGroup): self._port_items = [] 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.setCursor(QCursor(Qt.OpenHandCursor)) # default cursor when hovering over object self._make_component() diff --git a/b_asic/scheduler-gui/graphics_graph_event.py b/b_asic/scheduler-gui/graphics_graph_event.py index 857b65a6..ab354462 100644 --- a/b_asic/scheduler-gui/graphics_graph_event.py +++ b/b_asic/scheduler-gui/graphics_graph_event.py @@ -178,7 +178,9 @@ class GraphicsGraphEvent(QGraphicsItem): stores the current position in item's parent coordinates. 'event' will 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.""" - 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.setCursor(QCursor(Qt.ClosedHandCursor)) event.accept() diff --git a/b_asic/scheduler-gui/graphics_timeline_item.py b/b_asic/scheduler-gui/graphics_timeline_item.py index 0bfff160..3ce7775c 100644 --- a/b_asic/scheduler-gui/graphics_timeline_item.py +++ b/b_asic/scheduler-gui/graphics_timeline_item.py @@ -25,7 +25,7 @@ from qtpy.QtCore import ( Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, qAbs, QLineF) from qtpy.QtGui import ( QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap, - QLinearGradient, QTransform, QPolygonF) + QLinearGradient, QTransform, QPolygonF, QCursor) from qtpy.QtWidgets import ( QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, @@ -64,8 +64,9 @@ class GraphicsTimelineItem(QGraphicsLineItem): super().__init__(*args, **kwargs) 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.setCursor(QCursor(Qt.SizeHorCursor)) # default cursor when hovering over object self._delta_time_label = QGraphicsTextItem() self._delta_time_label.hide() diff --git a/b_asic/scheduler-gui/main_window.py b/b_asic/scheduler-gui/main_window.py index a62996bc..95db2806 100644 --- a/b_asic/scheduler-gui/main_window.py +++ b/b_asic/scheduler-gui/main_window.py @@ -10,7 +10,7 @@ import os import sys from pathlib import Path 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 matplotlib.pyplot import bar #from diagram import * @@ -36,11 +36,12 @@ from qtpy.QtGui import ( from qtpy.QtWidgets import ( QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsScale, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, - QGraphicsItem, QGraphicsItemGroup, QGraphicsRectItem) + QGraphicsItem, QGraphicsItemGroup, QGraphicsRectItem, QHeaderView) # B-ASIC import logger from b_asic.schedule import Schedule +from b_asic.graph_component import GraphComponent from graphics_graph_item import GraphicsGraphItem from graphics_axes_item import GraphicsAxesItem from graphics_component_item import GraphicsComponentItem @@ -117,6 +118,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): _debug_rects: QGraphicsItemGroup _splitter_pos: int _splitter_min: int + _table_items: Dict[str, QTableWidgetItem] def __init__(self): @@ -126,6 +128,14 @@ class MainWindow(QMainWindow, Ui_MainWindow): self._open_file_dialog_opened = False self._scale = 75 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') log.debug('themeName: \'{}\''.format(QIcon.themeName())) @@ -156,15 +166,20 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.closeEvent = self._close_event # Setup info table + self.info_table.horizontalHeader().setDefaultAlignment(Qt.AlignLeft) self.info_table.setHorizontalHeaderLabels(['Property','Value']) # test = '#b085b2' # self.info_table.setStyleSheet('alternate-background-color: lightGray;background-color: white;') self.info_table.setStyleSheet('alternate-background-color: #fadefb;background-color: #ebebeb;') - for i in range(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) + self.info_table.setSpan(0, 0, 1, 2) # Span 'Schedule' over 2 columns + self.info_table.setSpan(1, 0, 1, 2) # Span 'Operator' over 2 columns + self.info_table.setItem(0, 0, QTableWidgetItem('Schedule')) + self.info_table.setItem(1, 0, QTableWidgetItem('Operator')) + self.info_table.item(0, 0).setBackground(Qt.gray) + self.info_table.item(1, 0).setBackground(Qt.gray) + + + # Init central-widget splitter self._splitter_min = self.splitter.minimumSizeHint().height() @@ -181,7 +196,80 @@ class MainWindow(QMainWindow, Ui_MainWindow): GraphicsComponentItem._scale = self._scale GraphicsAxesItem._scale = self._scale 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): # self._scene.setSceneRect(self._scene.itemsBoundingRect()) self.update_statusbar(self.tr('Schedule loaded successfully')) + self.fill_info_table_schedule(self._graph.schedule) @Slot() def save(self) -> None: diff --git a/b_asic/scheduler-gui/main_window.ui b/b_asic/scheduler-gui/main_window.ui index 030acc47..99e0ed0e 100644 --- a/b_asic/scheduler-gui/main_window.ui +++ b/b_asic/scheduler-gui/main_window.ui @@ -74,7 +74,7 @@ <enum>QAbstractItemView::SelectRows</enum> </property> <property name="rowCount"> - <number>0</number> + <number>2</number> </property> <property name="columnCount"> <number>2</number> @@ -88,6 +88,11 @@ <attribute name="verticalHeaderVisible"> <bool>false</bool> </attribute> + <attribute name="verticalHeaderDefaultSectionSize"> + <number>21</number> + </attribute> + <row/> + <row/> <column/> <column/> </widget> @@ -101,7 +106,7 @@ <x>0</x> <y>0</y> <width>800</width> - <height>20</height> + <height>22</height> </rect> </property> <widget class="QMenu" name="menuFile"> -- GitLab