spikeRedetector/SpikeRedetectGui.py

134 lines
4.0 KiB
Python

from PyQt5.QtWidgets import QWidget, QPushButton, QSizePolicy, QLineEdit,\
QMessageBox, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QFrame,\
QDoubleSpinBox, QComboBox
from PyQt5.QtCore import pyqtSlot
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class SpikeRedetectGui(QWidget):
def __init__(self, data_provider):
super().__init__()
self.data_provider = data_provider
self.title = 'Spike Redetection'
self.left = 10
self.top = 10
self.width = 640
self.height = 400
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# Middle:
middle = QHBoxLayout()
# Canvas for matplotlib figure
m = PlotCanvas(self, width=5, height=4)
m.move(0, 0)
middle.addWidget(m)
middle.addWidget(QVLine())
# Side (options) panel
panel = QFrame()
panel_layout = QVBoxLayout()
button = QPushButton('Button!', self)
button.setToolTip('A nice button!')
button.clicked.connect(lambda: threshold_spinbox.setValue(1))
button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
panel_layout.addWidget(button)
repro_label = QLabel("Repro:")
panel_layout.addWidget(repro_label)
self.repro_box = QComboBox()
self.repro_box.addItem("placeholder repro")
panel_layout.addWidget(self.repro_box)
stim_val_label = QLabel("Stimulus value:")
panel_layout.addWidget(stim_val_label)
self.stim_val_box = QComboBox()
self.stim_val_box.addItem("placeholder stim_value")
panel_layout.addWidget(self.stim_val_box)
filler = QFill(maxh=20)
panel_layout.addWidget(filler)
self.status_label = QLabel("Done x/15 Stimulus Values")
panel_layout.addWidget(self.status_label)
filler = QFill()
panel_layout.addWidget(filler)
threshold_label = QLabel("Threshold:")
panel_layout.addWidget(threshold_label)
threshold_spinbox = QDoubleSpinBox(self)
threshold_spinbox.setValue(1)
threshold_spinbox.setSingleStep(0.5)
threshold_spinbox.valueChanged.connect(lambda: m.plot(threshold_spinbox.value()))
panel_layout.addWidget(threshold_spinbox)
button = QPushButton('Accept!', self)
button.setToolTip('Accept the threshold for current stimulus value')
panel_layout.addWidget(button)
panel.setLayout(panel_layout)
middle.addWidget(panel)
self.setLayout(middle)
self.show()
class PlotCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.plot()
@pyqtSlot()
def plot(self, mean=1):
x = np.arange(0, 1, 0.0001)
data = np.sin(x*np.pi*2*mean)
ax = self.axes
ax.clear()
ax.plot(data, 'r-')
ax.set_title('Sinus Example')
self.draw()
class QHLine(QFrame):
def __init__(self):
super(QHLine, self).__init__()
self.setFrameShape(QFrame.HLine)
self.setFrameShadow(QFrame.Sunken)
class QVLine(QFrame):
def __init__(self):
super(QVLine, self).__init__()
self.setFrameShape(QFrame.VLine)
self.setFrameShadow(QFrame.Sunken)
class QFill(QFrame):
def __init__(self, maxh=int(2**24)-1, maxw=int(2**24)-1):
super(QFill, self).__init__()
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.setMaximumSize(maxw, maxh)