188 lines
5.5 KiB
Python
188 lines
5.5 KiB
Python
class DataPlot(QSplitter):
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
|
|
self.setOrientation(Qt.Vertical)
|
|
|
|
self.plots = pg.GraphicsLayoutWidget()
|
|
|
|
self.addWidget(self.plots)
|
|
|
|
self.bottom = QSplitter()
|
|
self.bottom.setOrientation(Qt.Horizontal)
|
|
|
|
self.addWidget(self.bottom)
|
|
|
|
self.h5_path_shown = None
|
|
|
|
def update_from_h5(self, h5_path):
|
|
if self.h5_path_shown != h5_path or self.data_extractor.local_data_changed:
|
|
self.h5_path_shown = h5_path
|
|
self.update(*self.data_extractor.extract_data(h5_path))
|
|
|
|
|
|
class QuickDataPlot(DataPlot):
|
|
def __init__(self, ap, **kwargs):
|
|
|
|
super().__init__(**kwargs)
|
|
|
|
self.plot = self.plots.addPlot()
|
|
|
|
for key in self.plot.axes:
|
|
ax = self.plot.getAxis(key)
|
|
# Fix Z value making the grid on top of the image
|
|
ax.setZValue(1)
|
|
self.ap = ap
|
|
self.h5_paths_shown = []
|
|
|
|
self.table = QTableWidget()
|
|
self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
|
|
|
|
self.bottom.addWidget(self.table)
|
|
|
|
self.plot_setting = PlotSettings(self.plot)
|
|
|
|
self.bottom.addWidget(self.plot_setting)
|
|
|
|
def update_from_h5(self, h5_path=None):
|
|
self.update_data_extractor()
|
|
if self.data_extractor.local_data_changed or collections.Counter(self.h5_paths_shown) != collections.Counter(
|
|
self.ap.h5_paths_selected):
|
|
self.h5_paths_shown = self.ap.h5_paths_selected
|
|
self.update()
|
|
|
|
|
|
class ExtendedCombo(QComboBox):
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
|
|
self.setFocusPolicy(Qt.StrongFocus)
|
|
self.setEditable(True)
|
|
self.completer = QCompleter(self)
|
|
|
|
# always show all completions
|
|
self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
|
|
self.pFilterModel = QSortFilterProxyModel(self)
|
|
self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
|
|
|
|
self.completer.setPopup(self.view())
|
|
|
|
self.setCompleter(self.completer)
|
|
|
|
self.lineEdit().textEdited[str].connect(self.pFilterModel.setFilterFixedString)
|
|
self.completer.activated.connect(self.setTextIfCompleterIsClicked)
|
|
|
|
def setModel(self, model):
|
|
super().setModel(model)
|
|
self.pFilterModel.setSourceModel(model)
|
|
self.completer.setModel(self.pFilterModel)
|
|
|
|
def setModelColumn(self, column):
|
|
self.completer.setCompletionColumn(column)
|
|
self.pFilterModel.setFilterKeyColumn(column)
|
|
super().setModelColumn(column)
|
|
|
|
def view(self):
|
|
return self.completer.popup()
|
|
|
|
def index(self):
|
|
return self.currentIndex()
|
|
|
|
def setTextIfCompleterIsClicked(self, text):
|
|
if text:
|
|
index = self.findText(text)
|
|
self.setCurrentIndex(index)
|
|
|
|
|
|
class PlotSettings(QTableWidget):
|
|
def __init__(self, plot, **kwargs):
|
|
super().__init__(**kwargs)
|
|
|
|
self.plot = plot
|
|
self.setColumnCount(3)
|
|
self.setColumnWidth(0, 100)
|
|
self.setColumnWidth(1, 100)
|
|
|
|
self.setHorizontalHeaderLabels(['parameter', 'setting', 'units'])
|
|
|
|
self.setRowCount(4)
|
|
|
|
# title
|
|
i = 0
|
|
self.le_title = QLineEdit()
|
|
|
|
self.setCellWidget(i, 0, QLabel('title'))
|
|
self.setCellWidget(i, 1, self.le_title)
|
|
|
|
self.le_title.textChanged[str].connect(self.set_title)
|
|
|
|
# xlabel
|
|
i += 1
|
|
self.le_xlabel = QLineEdit()
|
|
self.le_xlabel_unit = QLineEdit()
|
|
|
|
self.setCellWidget(i, 0, QLabel('xlabel'))
|
|
self.setCellWidget(i, 1, self.le_xlabel)
|
|
self.setCellWidget(i, 2, self.le_xlabel_unit)
|
|
|
|
self.le_xlabel.textChanged[str].connect(self.set_xlabel)
|
|
self.le_xlabel_unit.textChanged[str].connect(self.set_xlabel)
|
|
|
|
# ylabel
|
|
i += 1
|
|
self.le_ylabel = QLineEdit()
|
|
self.le_ylabel_unit = QLineEdit()
|
|
|
|
self.setCellWidget(i, 0, QLabel('ylabel'))
|
|
self.setCellWidget(i, 1, self.le_ylabel)
|
|
self.setCellWidget(i, 2, self.le_ylabel_unit)
|
|
|
|
self.le_ylabel.textChanged[str].connect(self.set_ylabel)
|
|
self.le_ylabel_unit.textChanged[str].connect(self.set_ylabel)
|
|
|
|
# grid
|
|
i += 1
|
|
self.cb_grid = QCheckBox()
|
|
self.setCellWidget(i, 0, QLabel('grid'))
|
|
self.setCellWidget(i, 1, self.cb_grid)
|
|
|
|
self.cb_grid.stateChanged.connect(self.set_grid)
|
|
|
|
def set_title(self):
|
|
self.plot.setTitle(self.le_title.text())
|
|
|
|
def set_xlabel(self):
|
|
self.plot.setLabel('bottom', self.le_xlabel.text(), units=self.le_xlabel_unit.text())
|
|
|
|
def set_ylabel(self):
|
|
self.plot.setLabel('left', self.le_ylabel.text(), units=self.le_ylabel_unit.text())
|
|
|
|
def set_grid(self):
|
|
self.plot.showGrid(x=self.cb_grid.isChecked(), y=self.cb_grid.isChecked(), alpha=0.3)
|
|
|
|
|
|
class NumericDataCombo(ExtendedCombo):
|
|
|
|
def __init__(self, df, **kwargs):
|
|
|
|
super().__init__(**kwargs)
|
|
self.update_model(df)
|
|
|
|
def update_model(self, df):
|
|
model = QtGui.QStandardItemModel()
|
|
|
|
item = QtGui.QStandardItem('shot number')
|
|
model.setItem(0, 0, item)
|
|
|
|
i = 1
|
|
for midx in df.columns:
|
|
if is_numeric_dtype(df.dtypes[midx]):
|
|
column_name = ','.join([x for x in midx if x])
|
|
item = QtGui.QStandardItem(column_name)
|
|
model.setItem(i, 0, item)
|
|
i += 1
|
|
|
|
self.setModel(model)
|
|
|
|
def get_idx(self):
|
|
return tuple(str(self.currentText()).split(',')) |