from ..Qt import QtWidgets, QtCore from .._py.guidelinewidget import Ui_Form class DrawingsWidget(QtWidgets.QWidget, Ui_Form): def __init__(self, parent=None): super().__init__(parent=parent) self.connected_figure=None self.setupUi(self) def __call__(self, graphs): for gid, name in graphs: self.graph_comboBox.addItem(name, userData=gid) def clear(self): self.graph_comboBox.clear() @QtCore.pyqtSlot(int, name='on_mode_comboBox_currentIndexChanged') def change_draw_type(self, idx: int): self.stackedWidget.setCurrentIndex(idx) """ self.lines = {} self.comments = {} self.vh_pos_lineEdit.setValidator(QtGui.QDoubleValidator()) self.tableWidget.installEventFilter(self) @QtCore.pyqtSlot(name='on_pushButton_clicked') def make_line(self): invalid = True idx = self.mode_comboBox.currentIndex() try: pos = float(self.vh_pos_lineEdit.text()) # Vertical: idx=0; horizontal: idx = 1 angle = 90*abs(1-idx) invalid = False except ValueError: pos = None angle = None pass if invalid: QtWidgets.QMessageBox().information(self, 'Invalid input', 'Input is not a valid number') return qcolor = QtGui.QColor.fromRgb(*self.color_comboBox.value.rgb()) comment = self.comment_lineEdit.text() line = LogInfiniteLine(pos=pos, angle=angle, movable=self.drag_checkBox.isChecked(), pen=qcolor) line.sigPositionChanged.connect(self.move_line) self.make_table_row(pos, angle, qcolor, comment) graph_id = self.graph_comboBox.currentData() try: self.lines[graph_id].append(line) self.comments[graph_id].append(comment) except KeyError: self.lines[graph_id] = [line] self.comments[graph_id] = [comment] self.line_created.emit(line, graph_id) def set_graphs(self, graphs: list): for graph_id, name in graphs: self.graph_comboBox.addItem(name, userData=graph_id) def remove_graph(self, graph_id: str): idx = self.graph_comboBox.findData(graph_id) if idx != -1: self.graph_comboBox.removeItem(idx) if graph_id in self.lines: del self.lines[graph_id] @QtCore.pyqtSlot(int, name='on_graph_comboBox_currentIndexChanged') def change_graph(self, idx: int): self.tableWidget.clear() self.tableWidget.setRowCount(0) graph_id = self.graph_comboBox.itemData(idx) if graph_id in self.lines: lines = self.lines[graph_id] comments = self.comments[graph_id] for i, line in enumerate(lines): self.make_table_row(line.pos(), line.angle, line.pen.color(), comments[i]) def make_table_row(self, position, angle, color, comment): if angle == 0: try: pos_label = 'x = ' + str(position.y()) except AttributeError: pos_label = 'x = {position}' elif angle == 90: try: pos_label = f'y = {position.x()}' except AttributeError: pos_label = f'y = {position}' else: raise ValueError('Only horizontal or vertical lines are supported') item = QtWidgets.QTableWidgetItem(pos_label) item.setFlags(QtCore.Qt.ItemIsSelectable) item.setForeground(QtGui.QBrush(QtGui.QColor('black'))) row_count = self.tableWidget.rowCount() self.tableWidget.setRowCount(row_count+1) self.tableWidget.setItem(row_count, 0, item) item2 = QtWidgets.QTableWidgetItem(comment) self.tableWidget.setItem(row_count, 1, item2) colitem = QtWidgets.QTableWidgetItem(' ') colitem.setBackground(QtGui.QBrush(color)) colitem.setFlags(QtCore.Qt.ItemIsSelectable) self.tableWidget.setVerticalHeaderItem(row_count, colitem) def eventFilter(self, src: QtCore.QObject, evt: QtCore.QEvent) -> bool: if evt.type() == QtCore.QEvent.KeyPress: if evt.key() == QtCore.Qt.Key_Delete: self.delete_line() return True return super().eventFilter(src, evt) def delete_line(self): remove_rows = sorted([item.row() for item in self.tableWidget.selectedItems()]) graph_id = self.graph_comboBox.currentData() current_lines = self.lines[graph_id] for i in reversed(remove_rows): self.tableWidget.removeRow(i) self.line_deleted.emit(current_lines[i], graph_id) current_lines.pop(i) self.comments[graph_id].pop(i) @QtCore.pyqtSlot(object) def move_line(self, line: InfiniteLine): current_idx = self.graph_comboBox.currentData() graphs = self.lines[current_idx] i = -1 for i, line_i in enumerate(graphs): if line == line_i: break pos = line.value() text_item = self.tableWidget.item(i, 0) text_item.setText(text_item.text()[:4]+f'{pos:.4g}') """