summaryrefslogtreecommitdiff
path: root/src/ui_table.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui_table.py')
-rw-r--r--src/ui_table.py222
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))
+