diff options
Diffstat (limited to 'src/ui_table.py')
-rw-r--r-- | src/ui_table.py | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/src/ui_table.py b/src/ui_table.py new file mode 100644 index 0000000..3d9a6fa --- /dev/null +++ b/src/ui_table.py @@ -0,0 +1,222 @@ +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)) + |