Skip to content

Commit

Permalink
Merge pull request #705 from int-brain-lab/iblrigv8dev
Browse files Browse the repository at this point in the history
8.22.0
  • Loading branch information
bimac authored Aug 7, 2024
2 parents b7957e1 + 560e82a commit 201894d
Show file tree
Hide file tree
Showing 6 changed files with 226 additions and 47 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ Changelog
=========


8.22.0
------
* add UI components for selecting remote devices

8.21.2
------
* fix: remote devices show as task parameters (regression)
Expand Down
2 changes: 1 addition & 1 deletion iblrig/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# 5) git tag the release in accordance to the version number below (after merge!)
# >>> git tag 8.15.6
# >>> git push origin --tags
__version__ = '8.21.2'
__version__ = '8.22.0'


from iblrig.version_management import get_detailed_version_string
Expand Down
46 changes: 44 additions & 2 deletions iblrig/gui/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,24 @@
import numpy as np
import pandas as pd
from PyQt5 import QtGui
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, QObject, QRunnable, Qt, QThreadPool, QVariant, pyqtProperty, pyqtSignal
from PyQt5.QtWidgets import QProgressBar
from PyQt5.QtCore import (
QAbstractTableModel,
QModelIndex,
QObject,
QRunnable,
Qt,
QThreadPool,
QVariant,
pyqtProperty,
pyqtSignal,
pyqtSlot,
)
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QListView, QProgressBar

from iblrig.constants import BASE_PATH
from iblrig.net import get_remote_devices
from iblrig.pydantic_definitions import RigSettings
from iblutil.util import dir_size


Expand Down Expand Up @@ -341,3 +355,31 @@ def setData(self, index, value, role=Qt.DisplayRole):
col = self._dataFrame.columns[index.column()]
self._dataFrame.at[row, col] = value
self.dataChanged.emit(index, index, [role])


class RemoteDevicesListView(QListView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setMouseTracking(True) # needed for status tips

def getDevices(self):
out = []
for idx in self.selectedIndexes():
out.append(self.model().itemData(idx)[Qt.UserRole])
return out


class RemoteDevicesItemModel(QStandardItemModel):
def __init__(self, *args, iblrig_settings: RigSettings, **kwargs):
super().__init__(*args, **kwargs)
self.remote_devices = get_remote_devices(iblrig_settings=iblrig_settings)
self.update()

@pyqtSlot()
def update(self):
self.clear()
for device_name, device_address in self.remote_devices.items():
item = QStandardItem(device_name)
item.setStatusTip(f'Remote Device "{device_name}" - {device_address}')
item.setData(device_name, Qt.UserRole)
self.appendRow(item)
79 changes: 60 additions & 19 deletions iblrig/gui/ui_wizard.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Form implementation generated from reading ui file 'iblrig/gui/ui_wizard.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
# Created by: PyQt5 UI code generator 5.15.10
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
Expand All @@ -21,7 +21,7 @@ def setupUi(self, wizard):
sizePolicy.setHeightForWidth(wizard.sizePolicy().hasHeightForWidth())
wizard.setSizePolicy(sizePolicy)
wizard.setMinimumSize(QtCore.QSize(450, 0))
wizard.setMaximumSize(QtCore.QSize(600, 800))
wizard.setMaximumSize(QtCore.QSize(600, 1000))
wizard.setSizeIncrement(QtCore.QSize(0, 0))
wizard.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
icon = QtGui.QIcon()
Expand Down Expand Up @@ -61,6 +61,7 @@ def setupUi(self, wizard):
self.formLayout.setContentsMargins(0, 0, 0, 0)
self.formLayout.setObjectName("formLayout")
self.labelUser = QtWidgets.QLabel(self.uiGroupParameters)
self.labelUser.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labelUser.setObjectName("labelUser")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.labelUser)
self.widget_2 = QtWidgets.QWidget(self.uiGroupParameters)
Expand All @@ -79,6 +80,7 @@ def setupUi(self, wizard):
self.horizontalLayout_4.setStretch(1, 1)
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.widget_2)
self.labelSubject = QtWidgets.QLabel(self.uiGroupParameters)
self.labelSubject.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labelSubject.setObjectName("labelSubject")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.labelSubject)
self.widget_4 = QtWidgets.QWidget(self.uiGroupParameters)
Expand Down Expand Up @@ -109,6 +111,7 @@ def setupUi(self, wizard):
self.horizontalLayout.setStretch(1, 1)
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.widget_4)
self.labelProject = QtWidgets.QLabel(self.uiGroupParameters)
self.labelProject.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labelProject.setObjectName("labelProject")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.labelProject)
self.uiListProjects = QtWidgets.QListView(self.uiGroupParameters)
Expand Down Expand Up @@ -146,6 +149,7 @@ def setupUi(self, wizard):
self.uiListProjects.setObjectName("uiListProjects")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.uiListProjects)
self.labelProcedure = QtWidgets.QLabel(self.uiGroupParameters)
self.labelProcedure.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labelProcedure.setObjectName("labelProcedure")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.labelProcedure)
self.uiListProcedures = QtWidgets.QListView(self.uiGroupParameters)
Expand Down Expand Up @@ -182,9 +186,17 @@ def setupUi(self, wizard):
self.uiListProcedures.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.uiListProcedures.setObjectName("uiListProcedures")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.uiListProcedures)
self.labelTask = QtWidgets.QLabel(self.uiGroupParameters)
self.labelTask.setObjectName("labelTask")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.labelTask)
self.listViewRemoteDevices = RemoteDevicesListView(self.uiGroupParameters)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.listViewRemoteDevices.sizePolicy().hasHeightForWidth())
self.listViewRemoteDevices.setSizePolicy(sizePolicy)
self.listViewRemoteDevices.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.listViewRemoteDevices.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.listViewRemoteDevices.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.listViewRemoteDevices.setObjectName("listViewRemoteDevices")
self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.listViewRemoteDevices)
self.uiComboTask = QtWidgets.QComboBox(self.uiGroupParameters)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
Expand All @@ -194,21 +206,30 @@ def setupUi(self, wizard):
self.uiComboTask.setMinimumSize(QtCore.QSize(0, 0))
self.uiComboTask.setObjectName("uiComboTask")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.uiComboTask)
self.labelSettings = QtWidgets.QLabel(self.uiGroupParameters)
self.labelSettings.setObjectName("labelSettings")
self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.labelSettings)
self.labelTask = QtWidgets.QLabel(self.uiGroupParameters)
self.labelTask.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labelTask.setObjectName("labelTask")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.labelTask)
self.scrollArea = QtWidgets.QScrollArea(self.uiGroupParameters)
self.scrollArea.setMinimumSize(QtCore.QSize(0, 110))
self.scrollArea.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.uiGroupTaskParameters = QtWidgets.QWidget()
self.uiGroupTaskParameters.setGeometry(QtCore.QRect(0, 0, 357, 161))
self.uiGroupTaskParameters.setGeometry(QtCore.QRect(0, 0, 352, 108))
self.uiGroupTaskParameters.setObjectName("uiGroupTaskParameters")
self.formLayout_2 = QtWidgets.QFormLayout(self.uiGroupTaskParameters)
self.formLayout_2.setObjectName("formLayout_2")
self.scrollArea.setWidget(self.uiGroupTaskParameters)
self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.scrollArea)
self.labelSettings = QtWidgets.QLabel(self.uiGroupParameters)
self.labelSettings.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.labelSettings.setObjectName("labelSettings")
self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.labelSettings)
self.labelRemoteDevices = QtWidgets.QLabel(self.uiGroupParameters)
self.labelRemoteDevices.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTop|QtCore.Qt.AlignTrailing)
self.labelRemoteDevices.setObjectName("labelRemoteDevices")
self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.labelRemoteDevices)
self.verticalLayoutSession.addWidget(self.uiGroupParameters)
self.widget_3 = QtWidgets.QWidget(self.tabSession)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
Expand Down Expand Up @@ -253,24 +274,24 @@ def setupUi(self, wizard):
self.horizontalLayout_8.addWidget(self.uiGroupTools)
self.uiGroupSessionControl = QtWidgets.QGroupBox(self.widget_3)
self.uiGroupSessionControl.setObjectName("uiGroupSessionControl")
self.gridLayout_2 = QtWidgets.QGridLayout(self.uiGroupSessionControl)
self.gridLayout_2.setObjectName("gridLayout_2")
self.verticalLayout = QtWidgets.QVBoxLayout(self.uiGroupSessionControl)
self.verticalLayout.setObjectName("verticalLayout")
self.uiCheckAppend = QtWidgets.QCheckBox(self.uiGroupSessionControl)
self.uiCheckAppend.setObjectName("uiCheckAppend")
self.gridLayout_2.addWidget(self.uiCheckAppend, 3, 2, 1, 1)
self.verticalLayout.addWidget(self.uiCheckAppend)
self.uiPushStart = QtWidgets.QPushButton(self.uiGroupSessionControl)
self.uiPushStart.setStyleSheet("QPushButton { background-color: red; }")
self.uiPushStart.setObjectName("uiPushStart")
self.gridLayout_2.addWidget(self.uiPushStart, 2, 2, 1, 1)
self.verticalLayout.addWidget(self.uiPushStart)
self.uiPushPause = QtWidgets.QPushButton(self.uiGroupSessionControl)
self.uiPushPause.setEnabled(False)
self.uiPushPause.setCheckable(True)
self.uiPushPause.setChecked(False)
self.uiPushPause.setObjectName("uiPushPause")
self.gridLayout_2.addWidget(self.uiPushPause, 2, 1, 1, 1)
self.verticalLayout.addWidget(self.uiPushPause)
self.horizontalLayout_8.addWidget(self.uiGroupSessionControl)
self.horizontalLayout_8.setStretch(0, 3)
self.horizontalLayout_8.setStretch(1, 5)
self.horizontalLayout_8.setStretch(0, 1)
self.horizontalLayout_8.setStretch(1, 1)
self.verticalLayoutSession.addWidget(self.widget_3)
icon4 = QtGui.QIcon()
icon4.addPixmap(QtGui.QPixmap(":/images/wheel"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
Expand Down Expand Up @@ -308,10 +329,26 @@ def setupUi(self, wizard):
self.labelProcedure.setBuddy(self.uiListProcedures)
self.labelTask.setBuddy(self.uiComboTask)
self.labelSettings.setBuddy(self.scrollArea)
self.labelRemoteDevices.setBuddy(self.listViewRemoteDevices)

self.retranslateUi(wizard)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(wizard)
wizard.setTabOrder(self.tabWidget, self.uiLineEditUser)
wizard.setTabOrder(self.uiLineEditUser, self.uiPushButtonLogIn)
wizard.setTabOrder(self.uiPushButtonLogIn, self.uiComboSubject)
wizard.setTabOrder(self.uiComboSubject, self.lineEditSubject)
wizard.setTabOrder(self.lineEditSubject, self.uiListProjects)
wizard.setTabOrder(self.uiListProjects, self.uiListProcedures)
wizard.setTabOrder(self.uiListProcedures, self.uiComboTask)
wizard.setTabOrder(self.uiComboTask, self.scrollArea)
wizard.setTabOrder(self.scrollArea, self.listViewRemoteDevices)
wizard.setTabOrder(self.listViewRemoteDevices, self.uiPushFlush)
wizard.setTabOrder(self.uiPushFlush, self.uiPushReward)
wizard.setTabOrder(self.uiPushReward, self.uiPushStatusLED)
wizard.setTabOrder(self.uiPushStatusLED, self.uiCheckAppend)
wizard.setTabOrder(self.uiCheckAppend, self.uiPushStart)
wizard.setTabOrder(self.uiPushStart, self.uiPushPause)

def retranslateUi(self, wizard):
_translate = QtCore.QCoreApplication.translate
Expand All @@ -327,11 +364,14 @@ def retranslateUi(self, wizard):
self.lineEditSubject.setPlaceholderText(_translate("wizard", "Filter"))
self.labelProject.setText(_translate("wizard", "&Project"))
self.uiListProjects.setStatusTip(_translate("wizard", "Select one or several projects"))
self.labelProcedure.setText(_translate("wizard", "P&rocedure"))
self.labelProcedure.setText(_translate("wizard", "P&rocedures"))
self.uiListProcedures.setStatusTip(_translate("wizard", "Select one or several procedures"))
self.labelTask.setText(_translate("wizard", "&Task"))
self.listViewRemoteDevices.setStatusTip(_translate("wizard", "Select remote devices"))
self.uiComboTask.setStatusTip(_translate("wizard", "Select a task for the session"))
self.labelTask.setText(_translate("wizard", "&Task"))
self.labelSettings.setText(_translate("wizard", "Settings"))
self.labelRemoteDevices.setText(_translate("wizard", "Remote\n"
"&Devices"))
self.uiGroupTools.setTitle(_translate("wizard", "Tools"))
self.uiPushFlush.setStatusTip(_translate("wizard", "Click to flush the Bpod\'s valve"))
self.uiPushFlush.setText(_translate("wizard", " &Flush Valve "))
Expand All @@ -341,7 +381,7 @@ def retranslateUi(self, wizard):
self.uiPushStatusLED.setText(_translate("wizard", " Status &LED "))
self.uiGroupSessionControl.setTitle(_translate("wizard", "Session Control"))
self.uiCheckAppend.setStatusTip(_translate("wizard", "append to previous session"))
self.uiCheckAppend.setText(_translate("wizard", "Append"))
self.uiCheckAppend.setText(_translate("wizard", "append to previous Session"))
self.uiPushStart.setStatusTip(_translate("wizard", "Click to start the session"))
self.uiPushStart.setText(_translate("wizard", "Start"))
self.uiPushPause.setStatusTip(_translate("wizard", "Click to pause the session after the current trial"))
Expand All @@ -352,6 +392,7 @@ def retranslateUi(self, wizard):
self.uiActionCalibrateFrame2ttl.setText(_translate("wizard", "Calibrate Frame2TTL"))
self.uiActionCalibrateValve.setText(_translate("wizard", "Calibrate Valve"))
self.uiActionValidateHardware.setText(_translate("wizard", "Validate System"))
from iblrig.gui.tools import RemoteDevicesListView
from iblrig.gui import resources_rc


Expand Down
Loading

0 comments on commit 201894d

Please sign in to comment.