Skip to content

Commit 9a62bbc

Browse files
committed
cleaned up and consolidated code
1 parent 16e849c commit 9a62bbc

File tree

3 files changed

+59
-78
lines changed

3 files changed

+59
-78
lines changed

gui/configure_experiment_tab.py

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from config.paths import dirs
77
from gui.dialogs import invalid_run_experiment_dialog, invalid_save_experiment_dialog,unrun_subjects_dialog
8-
from gui.utility import TableCheckbox, cbox_update_options, cbox_set_item, null_resize, variable_constants, init_keyboard_shortcuts
8+
from gui.utility import TableCheckbox, cbox_update_options, cbox_set_item, null_resize, variable_constants, init_keyboard_shortcuts,menuSelect
99

1010
# --------------------------------------------------------------------------------
1111
# Experiments_tab
@@ -46,9 +46,9 @@ def __init__(self, parent=None):
4646
self.name_label = QtGui.QLabel('Experiment name:')
4747
self.name_text = QtGui.QLineEdit()
4848
self.task_label = QtGui.QLabel('Task:')
49-
self.task_select = QtGui.QPushButton('select task')
49+
self.task_select = menuSelect(dirs['tasks'],'select task')
5050
self.hardware_test_label = QtGui.QLabel('Hardware test:')
51-
self.hardware_test_select = QtGui.QPushButton('no hardware test')
51+
self.hardware_test_select = menuSelect(dirs['tasks'],'no hardware test',add_default=True)
5252
self.data_dir_label = QtGui.QLabel('Data dir:')
5353
self.data_dir_text = QtGui.QLineEdit(dirs['data'])
5454
self.data_dir_button = QtGui.QPushButton('')
@@ -85,6 +85,7 @@ def __init__(self, parent=None):
8585
self.variables_groupbox = QtGui.QGroupBox('Variables')
8686
self.variablesbox_layout = QtGui.QHBoxLayout(self.variables_groupbox)
8787
self.variables_table = VariablesTable(self)
88+
self.task_select.set_callback(self.variables_table.task_changed)
8889
self.variablesbox_layout.addWidget(self.variables_table)
8990

9091
# Initialise widgets
@@ -132,50 +133,11 @@ def experiment_changed(self, experiment_name):
132133
return
133134
self.load_experiment(experiment_name)
134135

135-
def create_callback(self,btn,text):
136-
def fxn():
137-
if btn.text() != text:
138-
btn.setText(text)
139-
btn.adjustSize()
140-
self.variables_table.task_changed(text)
141-
return fxn
142-
143-
def create_menu(self,menuButton):
144-
taskMenu = QtGui.QMenu()
145-
task_root = dirs['tasks']
146-
147-
if menuButton is self.hardware_test_select:
148-
taskMenu.addAction('no hardware test',self.create_callback(menuButton,'no hardware test'))
149-
taskMenu.addSeparator()
150-
previous_menu = taskMenu
151-
current_menu = taskMenu
152-
for dirName, subdirList, fileList in os.walk(task_root):
153-
subfolder = dirName.split(task_root)[1][1:]
154-
if subfolder:
155-
if any(".py" in filename for filename in fileList): # only add submenu if there are .py files inside
156-
sub_menu = current_menu.addMenu(subfolder.split(os.path.sep)[-1])
157-
for filename in fileList:
158-
if filename.endswith('.py'):
159-
menuItem = filename[:-3]
160-
sub_menu.addAction(menuItem,self.create_callback(menuButton,os.path.join(subfolder,menuItem)))
161-
if subdirList: # continue down to next level
162-
previous_menu = current_menu
163-
current_menu = sub_menu
164-
else: # return up to previous level
165-
current_menu = previous_menu
166-
else: # list top level files
167-
for filename in fileList:
168-
if filename.endswith('.py'):
169-
menuItem = filename[:-3]
170-
taskMenu.addAction(menuItem,self.create_callback(menuButton,menuItem))
171-
return taskMenu
172-
173-
174136
def refresh(self):
175137
'''Called periodically when not running to update available task, ports, experiments.'''
176138
if self.GUI_main.available_tasks_changed:
177-
self.task_select.setMenu(self.create_menu(self.task_select))
178-
self.hardware_test_select.setMenu(self.create_menu(self.hardware_test_select))
139+
self.task_select.update_menu()
140+
self.hardware_test_select.update_menu()
179141
self.GUI_main.available_tasks_changed = False
180142
if self.GUI_main.available_experiments_changed:
181143
cbox_update_options(self.experiment_select, self.GUI_main.available_experiments)

gui/run_task_tab.py

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from gui.dialogs import Variables_dialog
1414
from gui.plotting import Task_plot
15-
from gui.utility import init_keyboard_shortcuts
15+
from gui.utility import init_keyboard_shortcuts,menuSelect
1616

1717
# Run_task_gui ------------------------------------------------------------------------
1818

@@ -105,7 +105,8 @@ def __init__(self, parent=None):
105105
self.task_groupbox = QtGui.QGroupBox('Task')
106106

107107
self.task_label = QtGui.QLabel('Task:')
108-
self.task_select = QtGui.QPushButton('select task')
108+
self.task_select = menuSelect(dirs['tasks'],'select task')
109+
self.task_select.set_callback(self.task_changed)
109110
self.upload_button = QtGui.QPushButton('Upload')
110111
self.upload_button.setIcon(QtGui.QIcon("gui/icons/circle-arrow-up.svg"))
111112
self.variables_button = QtGui.QPushButton('Variables')
@@ -186,13 +187,6 @@ def __init__(self, parent=None):
186187

187188
self.disconnect() # Set initial state as disconnected.
188189

189-
def create_callback(self,text):
190-
def fxn():
191-
if self.task_select.text() != text:
192-
self.task_changed()
193-
self.task_select.setText(text)
194-
return fxn
195-
196190
# General methods
197191

198192
def print_to_log(self, print_string, end='\n'):
@@ -225,30 +219,7 @@ def refresh(self):
225219
else: # No setups available to connect to.
226220
self.connect_button.setEnabled(False)
227221
if self.GUI_main.available_tasks_changed:
228-
taskMenu = QtGui.QMenu()
229-
task_root = dirs['tasks']
230-
previous_menu = taskMenu
231-
current_menu = taskMenu
232-
for dirName, subdirList, fileList in os.walk(task_root):
233-
subfolder = dirName.split(task_root)[1][1:]
234-
if subfolder:
235-
if any(".py" in filename for filename in fileList): # only add submenu if there are .py files inside
236-
sub_menu = current_menu.addMenu(subfolder.split(os.path.sep)[-1])
237-
for filename in fileList:
238-
if filename.endswith('.py'):
239-
menuItem = filename[:-3]
240-
sub_menu.addAction(menuItem,self.create_callback(os.path.join(subfolder,menuItem)))
241-
if subdirList: # continue down to next level
242-
previous_menu = current_menu
243-
current_menu = sub_menu
244-
else: # return up to previous level
245-
current_menu = previous_menu
246-
else: # list top level files
247-
for filename in fileList:
248-
if filename.endswith('.py'):
249-
menuItem = filename[:-3]
250-
taskMenu.addAction(menuItem,self.create_callback(menuItem))
251-
self.task_select.setMenu(taskMenu)
222+
self.task_select.update_menu()
252223
if self.GUI_main.data_dir_changed and not self.custom_dir:
253224
self.data_dir_text.setText(dirs['data'])
254225
if self.task:
@@ -315,7 +286,7 @@ def disconnect(self):
315286
self.task_changed()
316287
self.connected = False
317288

318-
def task_changed(self):
289+
def task_changed(self,task=None):
319290
self.uploaded = False
320291
self.upload_button.setText('Upload')
321292
self.upload_button.setIcon(QtGui.QIcon("gui/icons/circle-arrow-up.svg"))

gui/utility.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from pyqtgraph.Qt import QtGui, QtCore, QtWidgets
2+
import os
23

34
# --------------------------------------------------------------------------------
45
# GUI utility functions, classes, variables.
@@ -291,3 +292,50 @@ def dropEvent(self, event):
291292
'''
292293
self.dragDropedPos = event.pos()
293294
QtWidgets.QTabBar.dropEvent(self, event)
295+
296+
class menuSelect(QtGui.QPushButton):
297+
def __init__(self,root_folder,initial_text,add_default = False):
298+
self.callback = lambda task: None
299+
self.menu = QtGui.QMenu()
300+
self.menu_root = root_folder
301+
self.add_default = add_default
302+
self.default_text = initial_text
303+
super().__init__(initial_text)
304+
305+
def set_callback(self,callback_fxn):
306+
self.callback = callback_fxn
307+
308+
def create_action(self,text):
309+
def fxn():
310+
if self.text() != text:
311+
self.callback(text)
312+
self.setText(text)
313+
return fxn
314+
315+
def update_menu(self):
316+
self.menu.clear()
317+
if self.add_default:
318+
self.menu.addAction(self.default_text,self.create_action(self.default_text))
319+
self.menu.addSeparator()
320+
previous_menu = self.menu
321+
current_menu = self.menu
322+
for dirName, subdirList, fileList in os.walk(self.menu_root):
323+
subfolder = dirName.split(self.menu_root)[1][1:]
324+
if subfolder:
325+
if any(".py" in filename for filename in fileList): # only add submenu if there are .py files inside
326+
sub_menu = current_menu.addMenu(subfolder.split(os.path.sep)[-1])
327+
for filename in fileList:
328+
if filename.endswith('.py'):
329+
menuItem = filename[:-3]
330+
sub_menu.addAction(menuItem,self.create_action(os.path.join(subfolder,menuItem)))
331+
if subdirList: # continue down to next level
332+
previous_menu = current_menu
333+
current_menu = sub_menu
334+
else: # return up to previous level
335+
current_menu = previous_menu
336+
else: # list top level files
337+
for filename in fileList:
338+
if filename.endswith('.py'):
339+
menuItem = filename[:-3]
340+
self.menu.addAction(menuItem,self.create_action(menuItem))
341+
self.setMenu(self.menu)

0 commit comments

Comments
 (0)