import numpy as np from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from ui import GUI, Pens from ui_widgets import * class ElementEditorWindow(QMainWindow): windows = list() @staticmethod def open(pol): win = ElementEditorWindow(pol) win.show() ElementEditorWindow.windows.append(win) @staticmethod def close_all(pol=None): for win in ElementEditorWindow.windows: if pol is None or pol == win.pol: win.close() del(win) def __init__(self, pol): super().__init__(flags=Qt.Dialog) self.pol = pol self.setWindowTitle("Element editor") root = QVBoxLayout() root_fucking_random_container = QWidget() root_fucking_random_container.setLayout(root) self.setCentralWidget(root_fucking_random_container) # Name box = QHBoxLayout() root.addLayout(box) box.addWidget(QLabel("Name")) self.name = QLineEdit(self.pol.name) self.name.textChanged.connect(self.change_name) box.addWidget(self.name) # OPTICS root.addWidget(MeinGroßLabel("Optics")) # Type combo self.type = QComboBox() self.type.addItem("Linear", "linear",) self.type.addItem("Quarterwave plate", "quarterwave") self.type.setCurrentIndex(0 if pol.type == "linear" else 1) self.type.currentIndexChanged.connect(self.change_type) root.addWidget(self.type) # TRANSMITTANCE root.addWidget(MeinGroßLabel("Transmittance")) box = QHBoxLayout() root.addLayout(box) box.addWidget(QLabel("T")) self.t1 = QLineEdit("%g" % self.pol.t1) self.t1.textChanged.connect(self.change_t) box.addWidget(self.t1) self.t2 = QLineEdit("%g" % self.pol.t2) self.t2.textChanged.connect(self.change_t) box.addWidget(self.t2) # ARRANGEMENT root.addWidget(MeinGroßLabel("Arrangement")) # Angle reference self.ref = QComboBox() self.populate_ref() self.ref.currentIndexChanged.connect(update) root.addWidget(self.ref) # Delta angle self.delta = AngleSlider("Delta") self.delta.on_change = self.change_delta root.addLayout(self.delta) root.addItem(ExpandingSpacer()) # Done self.done = QPushButton("Done") self.done.pressed.connect(self.close) root.addWidget(self.done) def change_name(self): self.pol.name = self.name.text() self.pol.row.optbox.name.setText(self.pol.name) def change_type(self): self.pol.set_type(self.type.currentData()) update() def change_delta(self): try: self.pol.delta = self.delta.angle / 180 * np.pi update() except ValueError: pass def change_t(self): try: self.pol.t1 = float(self.t1.text()) self.pol.t2 = float(self.t2.text()) update() except ValueError: pass def populate_ref(self): self.ref.addItem("Absolute", False) for i, _ in enumerate(system.elements): if i >= self.pol.rownum - 1: continue self.ref.addItem("Relative to #%d" % (i + 1), i) if self.pol.ref is not False and i == self.pol.ref: self.ref.setCurrentIndex(self.pol.ref + 1) class OptBox(QVBoxLayout): def __init__(self, row, pol): super().__init__() self.row = row # Name self.name = MeinGroßLabel(pol.name) self.name.setContextMenuPolicy(Qt.CustomContextMenu) self.name.customContextMenuRequested.connect(lambda pos: OptBox.open_menu(self, pos)) self.addWidget(self.name) # Enable checkbox self.enable = QCheckBox("Enable") self.enable.setChecked(True) self.enable.stateChanged.connect(self.change_enable) self.addWidget(self.enable) # Angle self.angle = AngleSlider() self.angle.setValue(pol.angle * 180 / np.pi) self.angle.on_change = lambda: TableRow.angle_change(row) self.addLayout(self.angle) self.addItem(ExpandingSpacer()) def open_menu(self, pos): menu = QMenu() menu.addAction("Edit", lambda: ElementEditorWindow.open(self.row.pol)) menu.addAction("Insert before", lambda: half_assed_element_creation(self.rownum - 1)) menu.addAction("Insert after", lambda: half_assed_element_creation(self.rownum)) menu.addAction("Delete", lambda: half_assed_element_deletion(self.rownum - 1)) menu.exec_(self.name.mapToGlobal(pos)) def change_enable(self): self.row.pol.enable = self.enable.isChecked() update() class SystemTableRow: def __init__(self, parent, pol, row_number): self.parent = parent self.pol = pol pol.row = self self.angle = pol.angle self.delta = pol.delta self.ref = pol.ref self.optbox = OptBox(self, pol) parent.setCellWidget(row_number, 0, LayoutWrapper(self.optbox)) self.ellipse = EllipseWidget(pol) parent.setCellWidget(row_number, 1, self.ellipse) self.info = QVBoxLayout() self.info_angle = MeinLabel() self.info_angle.setAlignment(Qt.AlignLeft) self.info.addWidget(self.info_angle) self.info.addWidget(QLabel("Polarization state")) self.info_jones = MeinLabel() self.info_jones.setAlignment(Qt.AlignLeft) self.info.addWidget(self.info_jones) self.info.addItem(ExpandingSpacer()) parent.setCellWidget(row_number, 2, LayoutWrapper(self.info)) @staticmethod def angle_change(row): row.angle = row.optbox.angle.angle / 180 * np.pi row.pol.angle = row.angle update() class SystemTable(QTableWidget): def __init__(self): super().__init__() self.rows = list() self.setColumnCount(3) # this won't change self.hh = self.horizontalHeader() self.hh.setSectionResizeMode(QHeaderView.ResizeToContents) #self.hh.hide() self.vh = self.verticalHeader() self.vh.setSectionResizeMode(QHeaderView.ResizeToContents) def populate(self, system): self.system = system self.rows = list() self.clearContents() self.setRowCount(len(system.elements)) for i, pol in enumerate(system.elements): self.rows.append(SystemTableRow(self, pol, i))