diff --git a/pyproject.toml b/pyproject.toml
index aa7864d..b93f79d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -16,11 +16,12 @@ classifiers = [
"Intended Audience :: End Users/Desktop",
]
include = [
- { path = "pyproject.toml" }
+ { path = "pyproject.toml" },
+ "pyrelacs/resources.py"
]
[tool.poetry.dependencies]
-python = "^3.12"
+python = "^3.10"
uldaq = "^1.2.3"
typer = "^0.12.5"
matplotlib = "^3.9.2"
diff --git a/pyrelacs/app.py b/pyrelacs/app.py
index db65e36..5aff135 100644
--- a/pyrelacs/app.py
+++ b/pyrelacs/app.py
@@ -1,7 +1,7 @@
import sys
import pathlib
-from PyQt6.QtCore import QSettings
+from PyQt6.QtCore import QSettings, Qt
from PyQt6.QtWidgets import QApplication
from . import info
@@ -9,12 +9,14 @@ from .ui.mainwindow import PyRelacs
from .util.logging import config_logging
log = config_logging()
+from . import resources
def main():
app = QApplication(sys.argv)
app.setApplicationName(info.NAME)
app.setApplicationVersion(str(info.VERSION))
app.setOrganizationDomain(info.ORGANIZATION)
+ # app.setAttribute(Qt.ApplicationAttribute.AA_DontShowIconsInMenus, False)
# read window settings
settings = QSettings(info.ORGANIZATION, info.NAME)
diff --git a/pyrelacs/icons/connect.png b/pyrelacs/icons/connect.png
new file mode 100644
index 0000000..0ea0bc4
--- /dev/null
+++ b/pyrelacs/icons/connect.png
@@ -0,0 +1,738 @@
+
+
+
+
+ PylonRecorder/connect.png at master - PylonRecorder - Neuroetho git repository
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pyrelacs/icons/disconnect.png b/pyrelacs/icons/disconnect.png
new file mode 100644
index 0000000..5ffb319
--- /dev/null
+++ b/pyrelacs/icons/disconnect.png
@@ -0,0 +1,738 @@
+
+
+
+
+ PylonRecorder/disconnect.png at master - PylonRecorder - Neuroetho git repository
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pyrelacs/icons/exit.png b/pyrelacs/icons/exit.png
new file mode 100644
index 0000000..1be01ac
--- /dev/null
+++ b/pyrelacs/icons/exit.png
@@ -0,0 +1,738 @@
+
+
+
+
+ PylonRecorder/exit.png at master - PylonRecorder - Neuroetho git repository
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pyrelacs/icons/record.png b/pyrelacs/icons/record.png
new file mode 100644
index 0000000..4ef1915
--- /dev/null
+++ b/pyrelacs/icons/record.png
@@ -0,0 +1,738 @@
+
+
+
+
+ PylonRecorder/record.png at master - PylonRecorder - Neuroetho git repository
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pyrelacs/icons/stop.png b/pyrelacs/icons/stop.png
new file mode 100644
index 0000000..9b2ab09
--- /dev/null
+++ b/pyrelacs/icons/stop.png
@@ -0,0 +1,738 @@
+
+
+
+
+ PylonRecorder/stop.png at master - PylonRecorder - Neuroetho git repository
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pyrelacs/info.py b/pyrelacs/info.py
index 46ee0a1..cd2e46e 100644
--- a/pyrelacs/info.py
+++ b/pyrelacs/info.py
@@ -3,6 +3,7 @@ import pathlib
def load_project_settings(project_root):
+ print(project_root)
# Read the pyproject.toml file
with open(pathlib.Path.joinpath(project_root, "pyproject.toml"), "r") as f:
pyproject_content = f.read()
diff --git a/pyrelacs/resources.qrc b/pyrelacs/resources.qrc
new file mode 100644
index 0000000..da26e63
--- /dev/null
+++ b/pyrelacs/resources.qrc
@@ -0,0 +1,9 @@
+
+
+ icons/exit.png
+ icons/connect.png
+ icons/disconnect.png
+ icons/record.png
+ icons/stop.png
+
+
\ No newline at end of file
diff --git a/pyrelacs/ui/mainwindow.py b/pyrelacs/ui/mainwindow.py
index 6f1d2d0..f19a619 100644
--- a/pyrelacs/ui/mainwindow.py
+++ b/pyrelacs/ui/mainwindow.py
@@ -1,13 +1,14 @@
-from PyQt6.QtGui import QAction
-from PyQt6.QtCore import QSize, QThreadPool
+from PyQt6.QtGui import QAction, QIcon, QKeySequence
+from PyQt6.QtCore import Qt, QSize, QThreadPool
from PyQt6.QtWidgets import (
- QApplication,
QGridLayout,
QPushButton,
QToolBar,
QWidget,
QMainWindow,
QPlainTextEdit,
+ QMenuBar,
+ QStatusBar
)
import uldaq
import pathlib
@@ -15,9 +16,10 @@ import numpy as np
import nixio as nix
import pyqtgraph as pg
+from importlib.resources import files as rsrc_files
from scipy.signal import welch, find_peaks
-from ..worker import Worker
+from pyrelacs.worker import Worker
from ..repros.repros import Repro
from ..util.logging import config_logging
log = config_logging()
@@ -27,6 +29,7 @@ from IPython import embed
class PyRelacs(QMainWindow):
def __init__(self):
super().__init__()
+ # self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) # Ensure icons are displayed with text
self.setWindowTitle("PyRelacs")
self.setMinimumSize(1000, 1000)
self.plot_graph = pg.PlotWidget()
@@ -34,32 +37,20 @@ class PyRelacs(QMainWindow):
self.threadpool = QThreadPool()
self.repros = Repro()
- self.daq_connect_button = QPushButton("Connect Daq")
- self.daq_connect_button.setCheckable(True)
- self.daq_connect_button.clicked.connect(self.connect_dac)
-
- self.daq_disconnect_button = QPushButton("Disconnect Daq")
- self.daq_disconnect_button.setCheckable(True)
- self.daq_disconnect_button.clicked.connect(self.disconnect_dac)
-
- self.plot_calibration_button = QPushButton("Plot Calibration")
- self.plot_calibration_button.setCheckable(True)
- self.plot_calibration_button.clicked.connect(self.plot_calibration)
-
self.text = QPlainTextEdit()
self.text.setReadOnly(True)
+ self.setMenuBar(QMenuBar(self))
+ self.setStatusBar(QStatusBar(self))
+ self.create_actions()
+ self.create_buttons()
+ self.create_toolbars()
+
layout = QGridLayout()
layout.addWidget(self.plot_calibration_button, 0, 0)
layout.addWidget(self.daq_disconnect_button, 0, 1)
layout.addWidget(self.text, 3, 0, 1, 2)
layout.addWidget(self.plot_graph, 2, 0, 1, 2)
-
- self.toolbar = QToolBar("Repros")
- self.addToolBar(self.toolbar)
- self.repros_to_toolbar()
-
- # self.setFixedSize(QSize(400, 300))
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
@@ -69,6 +60,85 @@ class PyRelacs(QMainWindow):
str(filename), nix.FileMode.Overwrite
)
+ def create_actions(self):
+ icon_path = str(rsrc_files("pyrelacs.icons").joinpath("exit.png"))
+ self._rlx_exitaction = QAction(QIcon(":icons/exit.png"), "Exit", self)
+ self._rlx_exitaction.setStatusTip("Close relacs")
+ self._rlx_exitaction.setShortcut(QKeySequence("Alt+q"))
+ self._rlx_exitaction.triggered.connect(self.on_exit)
+
+ # icon_path = str(rsrc_files("pyrelacs.icons").joinpath("connect.png"))
+ self._daq_connectaction = QAction(QIcon(":/icons/connect.png"), "Connect DAQ", self)
+ self._daq_connectaction.setStatusTip("Connect to daq device")
+ # self._daq_connectaction.setShortcut(QKeySequence("Alt+d"))
+ self._daq_connectaction.triggered.connect(self.connect_dac)
+
+ icon_path = str(rsrc_files("pyrelacs.icons").joinpath("disconnect.png"))
+ self._daq_disconnectaction = QAction(QIcon(icon_path), "Disconnect DAQ", self)
+ self._daq_disconnectaction.setStatusTip("Disconnect the DAQ device")
+ # self._daq_connectaction.setShortcut(QKeySequence("Alt+d"))
+ self._daq_disconnectaction.triggered.connect(self.disconnect_dac)
+
+ # icon_path = str(rsrc_files("pyrelacs.icons").joinpath("calibration.png"))
+ self._daq_calibaction = QAction(QIcon(icon_path), "Plot calibration", self)
+ self._daq_calibaction.setStatusTip("Calibrate the attenuator device")
+ # self._daq_calibaction.setShortcut(QKeySequence("Alt+d"))
+ self._daq_calibaction.triggered.connect(self.plot_calibration)
+ self.create_menu()
+
+ def create_menu(self):
+ menu = self.menuBar()
+ file_menu = menu.addMenu("&File")
+ file_menu.addAction(self._rlx_exitaction)
+
+ device_menu = menu.addMenu("&DAQ")
+ device_menu.addAction(self._daq_connectaction)
+ device_menu.addAction(self._daq_disconnectaction)
+ device_menu.addSeparator()
+ device_menu.addAction(self._daq_calibaction)
+
+ help_menu = menu.addMenu("&Help")
+ help_menu.addSeparator()
+ # help_menu.addAction(self._about_action)
+ # help_menu.addAction(self._help_action)
+ self.setMenuBar(menu)
+
+ def create_toolbars(self):
+ rlx_toolbar = QToolBar("Relacs")
+ rlx_toolbar.addAction(self._rlx_exitaction)
+ rlx_toolbar.setIconSize(QSize(24, 24))
+
+ self.addToolBar(Qt.ToolBarArea.TopToolBarArea, rlx_toolbar)
+ daq_toolbar = QToolBar("DAQ")
+ daq_toolbar.addAction(self._daq_connectaction)
+ daq_toolbar.addAction(self._daq_disconnectaction)
+ daq_toolbar.addAction(self._daq_calibaction)
+ self.addToolBar(Qt.ToolBarArea.TopToolBarArea, daq_toolbar)
+
+ repro_toolbar = QToolBar("Repros")
+ repro_names, file_names = self.repros.names_of_repros()
+ for rep, fn in zip(repro_names, file_names):
+ individual_repro_button = QAction(rep, self)
+ individual_repro_button.setStatusTip(rep)
+ individual_repro_button.triggered.connect(
+ lambda checked, n=rep, f=fn: self.run_repro(n, f)
+ )
+ repro_toolbar.addAction(individual_repro_button)
+ self.addToolBar(Qt.ToolBarArea.TopToolBarArea, repro_toolbar)
+
+ def create_buttons(self):
+ self.daq_connect_button = QPushButton("Connect Daq")
+ self.daq_connect_button.setCheckable(True)
+ self.daq_connect_button.clicked.connect(self.connect_dac)
+
+ self.daq_disconnect_button = QPushButton("Disconnect Daq")
+ self.daq_disconnect_button.setCheckable(True)
+ self.daq_disconnect_button.clicked.connect(self.disconnect_dac)
+
+ self.plot_calibration_button = QPushButton("Plot Calibration")
+ self.plot_calibration_button.setCheckable(True)
+ self.plot_calibration_button.clicked.connect(self.plot_calibration)
+
def plot_calibration(self):
def decibel(power, ref_power=1.0, min_power=1e-20):
"""Transform power to decibel relative to ref_power.
@@ -135,7 +205,7 @@ class PyRelacs(QMainWindow):
log.debug("Connected")
except IndexError:
log.debug("DAQ is not connected, closing")
- QApplication.quit()
+ self.on_exit()
self.daq_connect_button.setDisabled(True)
def disconnect_dac(self):
@@ -168,6 +238,10 @@ class PyRelacs(QMainWindow):
self.threadpool.start(worker)
+ def on_exit(self):
+ print("exit button!")
+ self.close()
+
def print_output(self, s):
print(s)