[settings] extract tasksettings class

This commit is contained in:
Jan Grewe 2021-03-08 23:30:51 +01:00
parent 4695d60cd1
commit 2b5982eabb
3 changed files with 198 additions and 251 deletions

View File

@ -1,105 +1,13 @@
from PyQt5.QtWidgets import QAction, QComboBox, QFormLayout, QGridLayout, QLabel, QPushButton, QSizePolicy, QSlider, QSpinBox, QSplitter, QTextEdit, QVBoxLayout, QWidget
from PyQt5.QtCore import QPoint, QRandomGenerator, QTimer, Qt, endl, pyqtSignal
from PyQt5.QtWidgets import QAction, QGridLayout, QLabel, QPushButton, QSizePolicy, QSplitter, QVBoxLayout, QWidget
from PyQt5.QtCore import QPoint, QRandomGenerator, QTimer, Qt, pyqtSignal
from PyQt5.QtGui import QColor, QFont, QIcon, QKeySequence, QPainter, QPen, QPixmap
from PyQt5.QtMultimedia import QMediaPlayer
import os
import blipblop.constants as cnst
from blipblop.ui.countdownlabel import CountdownLabel
from blipblop.ui.settings import AuditoryTaskSettings
import datetime as dt
class SettingsPanel(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
self._trial_spinner = QSpinBox()
self._trial_spinner.setMinimum(5)
self._trial_spinner.setMaximum(25)
self._trial_spinner.setValue(5)
self._trial_spinner.setToolTip("Number of consecutive trials (5 - 25)")
self._min_delay_spinner = QSpinBox()
self._min_delay_spinner.setMinimum(1)
self._min_delay_spinner.setMaximum(10)
self._min_delay_spinner.setValue(1)
self._min_delay_spinner.setToolTip("Minimum delay between start of trial and stimulus display [s]")
self._max_delay_spinner = QSpinBox()
self._max_delay_spinner.setMinimum(1)
self._max_delay_spinner.setMaximum(10)
self._max_delay_spinner.setValue(5)
self._max_delay_spinner.setToolTip("Maximum delay between start of trial and stimulus display [s]")
self._countdown_spinner = QSpinBox()
self._countdown_spinner.setMinimum(1)
self._countdown_spinner.setMaximum(10)
self._countdown_spinner.setValue(3)
self._countdown_spinner.setToolTip("Pause between trials [s]")
self._saliency_slider = QSlider(Qt.Horizontal)
self._saliency_slider.setMinimum(0)
self._saliency_slider.setMaximum(100)
self._saliency_slider.setSliderPosition(100)
self._saliency_slider.setTickInterval(25)
self._saliency_slider.setTickPosition(QSlider.TicksBelow)
self._saliency_slider.setToolTip("Saliency of the stimulus, i.e. its loudness")
self._sound_combo = QComboBox()
for k in cnst.SNDS_DICT.keys():
self._sound_combo.addItem(k)
self._instructions = QTextEdit()
self._instructions.setMarkdown("* fixate central cross\n * press start (enter) when ready\n * press space bar as soon as the stimulus occurs")
self._instructions.setMinimumHeight(200)
self._instructions.setReadOnly(True)
form_layout = QFormLayout()
form_layout.addRow("Settings", None)
form_layout.addRow("number of trials", self._trial_spinner)
form_layout.addRow("minimum delay [s]", self._min_delay_spinner)
form_layout.addRow("maximum delay [s]", self._max_delay_spinner)
form_layout.addRow("pause [s]", self._countdown_spinner)
form_layout.addRow("stimulus saliency", self._saliency_slider)
form_layout.addRow("stimulus sound", self._sound_combo)
form_layout.addRow("instructions", self._instructions)
self.setLayout(form_layout)
@property
def trials(self):
return self._trial_spinner.value()
@property
def saliency(self):
return self._saliency_slider.sliderPosition()
@property
def size(self):
return self._size_slider.sliderPosition()
@property
def min_delay(self):
return self._min_delay_spinner.value()
@property
def max_delay(self):
return self._max_delay_spinner.value()
@property
def countdown(self):
return self._countdown_spinner.value()
@property
def sound(self):
return self._sound_combo.currentText()
def set_enabled(self, enabled):
self._trial_spinner.setEnabled(enabled)
self._saliency_slider.setEnabled(enabled)
self._countdown_spinner.setEnabled(enabled)
self._min_delay_spinner.setEnabled(enabled)
self._max_delay_spinner.setEnabled(enabled)
self._sound_combo.setEnabled(enabled)
class AudioBlop(QWidget):
task_done = pyqtSignal()
@ -116,17 +24,17 @@ class AudioBlop(QWidget):
grid.setRowStretch(3, 1)
widget.setLayout(grid)
l = QLabel("Auditory reaction test")
l.setPixmap(QPixmap(":/icons/auditory_task"))
grid.addWidget(l, 0, 0, Qt.AlignLeft)
icon_label = QLabel("Auditory reaction test")
icon_label.setPixmap(QPixmap(":/icons/auditory_task"))
grid.addWidget(icon_label, 0, 0, Qt.AlignLeft)
l2 =QLabel("Measurement of auditory reaction times\npress enter to start")
heading_label = QLabel("Measurement of auditory reaction times\npress enter to start")
font = QFont()
font.setBold(True)
font.setPointSize(20)
l2.setFont(font)
l2.setStyleSheet("color: #2D4B9A")
grid.addWidget(l2, 1, 0, 1, 2, Qt.AlignLeft)
heading_label.setFont(font)
heading_label.setStyleSheet("color: #2D4B9A")
grid.addWidget(heading_label, 1, 0, 1, 2, Qt.AlignLeft)
settings_btn = QPushButton(QIcon(":/icons/settings"), "")
settings_btn.setToolTip("edit task settings")
@ -145,7 +53,7 @@ class AudioBlop(QWidget):
self._draw_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
grid.addWidget(self._draw_area, 2, 1)
self._settings = SettingsPanel()
self._settings = AuditoryTaskSettings()
self._splitter = QSplitter()
self._splitter.addWidget(widget)
@ -206,7 +114,6 @@ class AudioBlop(QWidget):
return
self._countdown_label.start(self._settings.countdown)
def reset_canvas(self):
bkg_color = QColor()
bkg_color.setAlphaF(0.0)
@ -251,6 +158,7 @@ class AudioBlop(QWidget):
self._trial_counter += 1
self._status_label.setText("Trial %i of %i running" % (self._trial_counter, self._settings.trials))
content = cnst.get_sound(self._settings.sound)
self._player.setMedia(content)
self._player.setVolume(self._settings.saliency)

132
blipblop/ui/settings.py Normal file
View File

@ -0,0 +1,132 @@
from PyQt5.QtWidgets import QComboBox, QFormLayout, QSlider, QSpinBox, QTextEdit, QWidget
from PyQt5.QtCore import Qt
import blipblop.constants as cnst
class TaskSettings(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
self._trial_spinner = QSpinBox()
self._trial_spinner.setMinimum(5)
self._trial_spinner.setMaximum(25)
self._trial_spinner.setValue(5)
self._trial_spinner.setToolTip("Number of consecutive trials (5 - 25)")
self._min_delay_spinner = QSpinBox()
self._min_delay_spinner.setMinimum(1)
self._min_delay_spinner.setMaximum(10)
self._min_delay_spinner.setValue(1)
self._min_delay_spinner.setToolTip("Minimum delay between start of trial and stimulus display [s]")
self._max_delay_spinner = QSpinBox()
self._max_delay_spinner.setMinimum(1)
self._max_delay_spinner.setMaximum(10)
self._max_delay_spinner.setValue(5)
self._max_delay_spinner.setToolTip("Maximum delay between start of trial and stimulus display [s]")
self._countdown_spinner = QSpinBox()
self._countdown_spinner.setMinimum(1)
self._countdown_spinner.setMaximum(10)
self._countdown_spinner.setValue(3)
self._countdown_spinner.setToolTip("Pause between trials [s]")
self._saliency_slider = QSlider(Qt.Horizontal)
self._saliency_slider.setMinimum(0)
self._saliency_slider.setMaximum(100)
self._saliency_slider.setSliderPosition(100)
self._saliency_slider.setTickInterval(25)
self._saliency_slider.setTickPosition(QSlider.TicksBelow)
self._instructions = QTextEdit()
self._instructions.setMarkdown("* fixate central cross\n * press start (enter) when ready\n * press space bar as soon as the stimulus occurs")
self._instructions.setMinimumHeight(200)
self._instructions.setReadOnly(True)
self.form_layout = QFormLayout()
self.form_layout.addRow("Settings", None)
self.form_layout.addRow("number of trials", self._trial_spinner)
self.form_layout.addRow("minimum delay [s]", self._min_delay_spinner)
self.form_layout.addRow("maximum delay [s]", self._max_delay_spinner)
self.form_layout.addRow("pause [s]", self._countdown_spinner)
self.form_layout.addRow("stimulus saliency", self._saliency_slider)
self.form_layout.addRow("instructions", self._instructions)
self.setLayout(self.form_layout)
@property
def trials(self):
return self._trial_spinner.value()
@property
def saliency(self):
return self._saliency_slider.sliderPosition()
@property
def size(self):
return self._size_slider.sliderPosition()
@property
def min_delay(self):
return self._min_delay_spinner.value()
@property
def max_delay(self):
return self._max_delay_spinner.value()
@property
def countdown(self):
return self._countdown_spinner.value()
def set_enabled(self, enabled):
self._trial_spinner.setEnabled(enabled)
self._saliency_slider.setEnabled(enabled)
self._countdown_spinner.setEnabled(enabled)
self._min_delay_spinner.setEnabled(enabled)
self._max_delay_spinner.setEnabled(enabled)
class AuditoryTaskSettings(TaskSettings):
def __init__(self, parent=None):
super().__init__(parent=parent)
self._saliency_slider.setToolTip("Saliency of the stimulus, i.e. its loudness")
self._sound_combo = QComboBox()
for k in cnst.SNDS_DICT.keys():
self._sound_combo.addItem(k)
self.form_layout.insertRow(self.form_layout.rowCount() -1, "stimulus sound", self._sound_combo)
def set_enabled(self, enabled):
super().set_enabled(enabled)
self._sound_combo.setEnabled(enabled)
@property
def sound(self):
return self._sound_combo.currentText()
class VisualTaskSettings(TaskSettings):
def __init__(self, parent=None):
super().__init__(parent=parent)
self._saliency_slider.setToolTip("Saliency of the stimulus, i.e. its opacity")
self._size_slider = QSlider(Qt.Horizontal)
self._size_slider.setMinimum(0)
self._size_slider.setMaximum(200)
self._size_slider.setSliderPosition(100)
self._size_slider.setTickInterval(25)
self._size_slider.setTickPosition(QSlider.TicksBelow)
self._size_slider.setToolTip("Diameter of the stimulus in pixel")
self.form_layout.insertRow(self.form_layout.rowCount() -1, "stimulus size", self._size_slider)
def set_enabled(self, enabled):
super().set_enabled(enabled)
self._size_slider.setEnabled(enabled)
@property
def size(self):
return self._size_slider.sliderPosition()

View File

@ -1,104 +1,11 @@
from PyQt5.QtWidgets import QAction, QFormLayout, QGridLayout, QLabel, QLineEdit, QPushButton, QSizePolicy, QSlider, QSpinBox, QSplitter, QTextEdit, QVBoxLayout, QWidget
from PyQt5.QtCore import QPoint, QRandomGenerator, QTimer, Qt, pyqtSignal, QSettings
from PyQt5.QtWidgets import QAction, QGridLayout, QLabel, QPushButton, QSizePolicy, QSplitter, QVBoxLayout, QWidget
from PyQt5.QtCore import QPoint, QRandomGenerator, QTimer, Qt, pyqtSignal
from PyQt5.QtGui import QColor, QFont, QIcon, QKeySequence, QPainter, QBrush, QPen, QPixmap
import os
import blipblop.constants as cnst
from blipblop.ui.countdownlabel import CountdownLabel
from blipblop.ui.settings import VisualTaskSettings
import datetime as dt
class SettingsPanel(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
self._trial_spinner = QSpinBox()
self._trial_spinner.setMinimum(5)
self._trial_spinner.setMaximum(25)
self._trial_spinner.setValue(5)
self._trial_spinner.setToolTip("Number of consecutive trials (5 - 25)")
self._min_delay_spinner = QSpinBox()
self._min_delay_spinner.setMinimum(1)
self._min_delay_spinner.setMaximum(10)
self._min_delay_spinner.setValue(1)
self._min_delay_spinner.setToolTip("Minimum delay between start of trial and stimulus display [s]")
self._max_delay_spinner = QSpinBox()
self._max_delay_spinner.setMinimum(1)
self._max_delay_spinner.setMaximum(10)
self._max_delay_spinner.setValue(5)
self._max_delay_spinner.setToolTip("Maximum delay between start of trial and stimulus display [s]")
self._saliency_slider = QSlider(Qt.Horizontal)
self._saliency_slider.setMinimum(0)
self._saliency_slider.setMaximum(100)
self._saliency_slider.setSliderPosition(100)
self._saliency_slider.setTickInterval(25)
self._saliency_slider.setTickPosition(QSlider.TicksBelow)
self._saliency_slider.setToolTip("Saliency of the stimulus, i.e. its opacity")
self._size_slider = QSlider(Qt.Horizontal)
self._size_slider.setMinimum(0)
self._size_slider.setMaximum(200)
self._size_slider.setSliderPosition(100)
self._size_slider.setTickInterval(25)
self._size_slider.setTickPosition(QSlider.TicksBelow)
self._size_slider.setToolTip("Diameter of the stimulus in pixel")
self._countdown_spinner = QSpinBox()
self._countdown_spinner.setMinimum(2)
self._countdown_spinner.setMaximum(30)
self._countdown_spinner.setValue(5)
self._countdown_spinner.setToolTip("Pause/countdown for next trial")
self._instructions = QTextEdit()
self._instructions.setMarkdown("* fixate central cross\n * press start (enter) when ready\n * press space bar as soon as the stimulus occurs")
self._instructions.setMinimumHeight(200)
self._instructions.setReadOnly(True)
form_layout = QFormLayout()
form_layout.addRow("Settings", None)
form_layout.addRow("number of trials", self._trial_spinner)
form_layout.addRow("pause until next trial [s]", self._countdown_spinner)
form_layout.addRow("minimum delay [s]", self._min_delay_spinner)
form_layout.addRow("maximum delay [s]", self._max_delay_spinner)
form_layout.addRow("stimulus saliency", self._saliency_slider)
form_layout.addRow("stimulus size", self._size_slider)
form_layout.addRow("instructions", self._instructions)
self.setLayout(form_layout)
@property
def trials(self):
return self._trial_spinner.value()
@property
def saliency(self):
return self._saliency_slider.sliderPosition()
@property
def size(self):
return self._size_slider.sliderPosition()
@property
def min_delay(self):
return self._min_delay_spinner.value()
@property
def max_delay(self):
return self._max_delay_spinner.value()
@property
def countdown(self):
return self._countdown_spinner.value()
def set_enabled(self, enabled):
self._trial_spinner.setEnabled(enabled)
self._saliency_slider.setEnabled(enabled)
self._size_slider.setEnabled(enabled)
self._countdown_spinner.setEnabled(enabled)
self._min_delay_spinner.setEnabled(enabled)
self._max_delay_spinner.setEnabled(enabled)
class VisualBlip(QWidget):
task_done = pyqtSignal()
@ -115,17 +22,17 @@ class VisualBlip(QWidget):
grid.setRowStretch(3, 1)
widget.setLayout(grid)
l = QLabel("Visual reaction test")
l.setPixmap(QPixmap(":/icons/visual_task"))
grid.addWidget(l, 0, 0, Qt.AlignLeft)
icon_label = QLabel("Visual reaction test")
icon_label.setPixmap(QPixmap(":/icons/visual_task"))
grid.addWidget(icon_label, 0, 0, Qt.AlignLeft)
l2 = QLabel("Measurement of visual reaction times\npress enter to start")
heading_label = QLabel("Measurement of visual reaction times\npress enter to start")
font = QFont()
font.setBold(True)
font.setPointSize(20)
l2.setFont(font)
l2.setStyleSheet("color: #2D4B9A")
grid.addWidget(l2, 1, 0, 1, 2, Qt.AlignLeft)
heading_label.setFont(font)
heading_label.setStyleSheet("color: #2D4B9A")
grid.addWidget(heading_label, 1, 0, 1, 2, Qt.AlignLeft)
settings_btn = QPushButton(QIcon(":/icons/settings"), "")
settings_btn.setToolTip("edit task settings")
@ -144,7 +51,7 @@ class VisualBlip(QWidget):
self._draw_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
grid.addWidget(self._draw_area, 2, 1)
self._settings = SettingsPanel()
self._settings = VisualTaskSettings()
self._splitter = QSplitter()
self._splitter.addWidget(widget)