def load_experiment(self, experiment_name): '''Load experiment .pcx file and set fields of experiment tab.''' exp_path = os.path.join(dirs['experiments'], experiment_name + '.pcx') with open(exp_path, 'r') as exp_file: experiment = json.loads(exp_file.read()) self.name_text.setText(experiment['name']) if experiment['task'] in self.GUI_main.available_tasks: self.task_select.setText(experiment['task']) else: self.task_select.setText('select task') if experiment['hardware_test'] in self.GUI_main.available_tasks: self.hardware_test_select.setText(experiment['hardware_test']) else: self.hardware_test_select.setText('no hardware test') cbox_set_item(self.experiment_select, experiment['name']) if 'subset_warning' in experiment.keys(): # New style experiment file. self.subset_warning_checkbox.setChecked( experiment['subset_warning']) self.subjects_table.set_from_dict(experiment['subjects']) else: # Experiment file created with GUI version <= 1.5. self.subset_warning_checkbox.setChecked(True) subjects_dict = { subject: { 'run': True, 'setup': setup } for setup, subject in experiment['subjects'].items() } self.subjects_table.set_from_dict(subjects_dict) self.variables_table.task_changed(experiment['task']) self.data_dir_text.setText(experiment['data_dir']) self.variables_table.set_from_list(experiment['variables']) self.saved_exp_dict = experiment self.saved_exp_path = exp_path self.save_button.setEnabled(False)
def add_subject(self, setup=None, subject=None): '''Add row to table allowing extra subject to be specified.''' setup_cbox = QtGui.QComboBox() setup_cbox.addItems(self.available_setups if self. available_setups else ['select setup']) setup_cbox.activated.connect(self.update_available_setups) remove_button = QtGui.QPushButton('remove') ind = QtCore.QPersistentModelIndex(self.model().index( self.n_subjects, 2)) remove_button.clicked.connect(lambda: self.remove_subject(ind.row())) add_button = QtGui.QPushButton('add') add_button.clicked.connect(self.add_subject) self.setCellWidget(self.n_subjects, 0, setup_cbox) self.setCellWidget(self.n_subjects, 2, remove_button) self.insertRow(self.n_subjects + 1) self.setCellWidget(self.n_subjects + 1, 2, add_button) if setup: cbox_set_item(setup_cbox, setup) if subject: subject_item = QtGui.QTableWidgetItem() subject_item.setText(subject) self.setItem(self.n_subjects, 1, subject_item) self.n_subjects += 1 self.update_available_setups() null_resize(self)
def experiment_changed(self, experiment_name): if experiment_name in self.GUI_main.available_experiments: cbox_set_item(self.experiment_select, 'select experiment', insert=True) if not self.save_dialog(): return self.load_experiment(experiment_name)
def save_experiment(self): '''Store the current state of the experiment tab as a JSON object saved in the experiments folder as .pcx file.''' experiment = self.experiment_dict() exp_path = os.path.join(experiments_dir, self.name_text.text() + '.pcx') with open(exp_path, 'w') as exp_file: exp_file.write(json.dumps(experiment, sort_keys=True, indent=4)) cbox_set_item(self.experiment_select, experiment['name'], insert=True)
def load_vals_from_dict(self, var_name, row_data): self.variable_cbox.addItems([var_name]) cbox_set_item(self.variable_cbox, var_name) self.display_name.setText(row_data["label"]) cbox_set_item(self.input_type_combo, row_data["widget"]) self.spin_min.setText(str(row_data["min"])) self.spin_max.setText(str(row_data["max"])) self.spin_step.setText(str(row_data["step"])) self.suffix.setText(row_data["suffix"]) self.hint.setText(row_data["hint"])
def load_experiment(self, experiment_name): '''Load experiment .pcx file and set fields of experiment tab.''' exp_path = os.path.join(experiments_dir, experiment_name + '.pcx') with open(exp_path, 'r') as exp_file: experiment = json.loads(exp_file.read()) self.name_text.setText(experiment['name']) cbox_set_item(self.task_select, experiment['task']) cbox_set_item(self.hardware_test_select, experiment['hardware_test']) self.variables_table.task_changed(experiment['task']) self.data_dir_text.setText(experiment['data_dir']) self.subjects_table.set_from_dict(experiment['subjects']) self.variables_table.set_from_list(experiment['variables'])
def new_experiment(self, dialog=True): '''Clear experiment configuration.''' if dialog: if not self.save_dialog(): return self.name_text.setText('') self.data_dir_text.setText(dirs['data']) self.custom_dir = False self.subjects_table.reset() self.variables_table.reset() cbox_set_item(self.experiment_select, 'select experiment', insert=True) self.task_select.setText('select task') self.hardware_test_select.setText('no hardware test') self.subset_warning_checkbox.setChecked(True) self.saved_exp_dict = self.experiment_dict() self.saved_exp_path = None
def copy_vals_from_row(self, row_index): var_name = str(self.parent.cellWidget(row_index, 2).currentText()) self.variable_cbox.addItems([var_name]) cbox_set_item(self.variable_cbox, var_name) self.display_name.setText( str(self.parent.cellWidget(row_index, 3).text())) cbox_set_item(self.input_type_combo, str(self.parent.cellWidget(row_index, 4).currentText())) self.spin_min.setText(str(self.parent.cellWidget(row_index, 5).text())) self.spin_max.setText(str(self.parent.cellWidget(row_index, 6).text())) self.spin_step.setText(str( self.parent.cellWidget(row_index, 7).text())) self.suffix.setText(str(self.parent.cellWidget(row_index, 8).text())) self.hint.setText(str(self.parent.cellWidget(row_index, 9).text()))
def add_variable(self, var_dict=None): '''Add a row to the variables table.''' variable_cbox = QtGui.QComboBox() variable_cbox.activated.connect(self.update_available) subject_cbox = QtGui.QComboBox() subject_cbox.activated.connect(self.update_available) persistent = TableCheckbox() summary = TableCheckbox() remove_button = QtGui.QPushButton('remove') ind = QtCore.QPersistentModelIndex(self.model().index( self.n_variables, 2)) remove_button.clicked.connect(lambda: self.remove_variable(ind.row())) remove_button.setIcon(QtGui.QIcon("gui/icons/remove.svg")) add_button = QtGui.QPushButton(' add ') add_button.setIcon(QtGui.QIcon("gui/icons/add.svg")) add_button.clicked.connect(self.add_variable) self.insertRow(self.n_variables + 1) self.setCellWidget(self.n_variables, 0, variable_cbox) self.setCellWidget(self.n_variables, 1, subject_cbox) self.setCellWidget(self.n_variables, 3, persistent) self.setCellWidget(self.n_variables, 4, summary) self.setCellWidget(self.n_variables, 5, remove_button) self.setCellWidget(self.n_variables + 1, 5, add_button) if var_dict: # Set cell values from provided dictionary. variable_cbox.addItems([var_dict['name']]) subject_cbox.addItems([var_dict['subject']]) value_item = QtGui.QTableWidgetItem() value_item.setText(var_dict['value']) self.setItem(self.n_variables, 2, value_item) persistent.setChecked(var_dict['persistent']) summary.setChecked(var_dict['summary']) else: variable_cbox.addItems(['select variable'] + self.available_variables) if self.n_variables > 0: # Set variable to previous variable if available. v_name = str( self.cellWidget(self.n_variables - 1, 0).currentText()) if v_name in self.available_variables: cbox_set_item(variable_cbox, v_name) subject_cbox.addItems(self.available_subjects(v_name)) self.n_variables += 1 self.update_available() null_resize(self)
def save_experiment(self, from_dialog=False): '''Check that experiment setup/subject combinations are valid and unique''' d = {} for s in range(self.subjects_table.n_subjects): try: subject = str(self.subjects_table.item(s, 2).text()) if len(subject) == 0: invalid_save_experiment_dialog( self.subjects_table, 'All subjects must have names.') return False except: invalid_save_experiment_dialog( self.subjects_table, 'All subjects must have names.') return False if subject in d: invalid_save_experiment_dialog(self.subjects_table, 'Duplicate subjects.') return False setup = str(self.subjects_table.cellWidget(s, 1).currentText()) run = self.subjects_table.cellWidget(s, 0).isChecked() d[subject] = {'setup': setup, 'run': run} # add dict subject entry '''Store the current state of the experiment tab as a JSON object saved in the experiments folder as .pcx file.''' experiment = self.experiment_dict() file_name = self.name_text.text() + '.pcx' exp_path = os.path.join(dirs['experiments'], file_name) if os.path.exists(exp_path) and (exp_path != self.saved_exp_path): reply = QtGui.QMessageBox.question( self, 'Replace file', "File '{}' already exists, do you want to replace it?".format( file_name), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.No: return False with open(exp_path, 'w') as exp_file: exp_file.write(json.dumps(experiment, sort_keys=True, indent=4)) if not from_dialog: cbox_set_item(self.experiment_select, experiment['name'], insert=True) self.saved_exp_dict = experiment self.saved_exp_path = exp_path self.save_button.setEnabled(False) return True
def update_available(self, i=None): # Find out what variable-subject combinations already assigned. self.assigned = {v_name: [] for v_name in self.variable_names} for v in range(self.n_variables): v_name = self.cellWidget(v, 0).currentText() s_name = self.cellWidget(v, 1).currentText() if s_name and s_name not in self.subjects_table.subjects + ['all']: cbox_set_item(self.cellWidget(v, 1), '', insert=True) continue if v_name != 'select variable' and s_name: self.assigned[v_name].append(s_name) # Update the variables available: fully_asigned_variables = [ v_n for v_n in self.assigned.keys() if 'all' in self.assigned[v_n] ] if self.subjects_table.subjects: fully_asigned_variables += [ v_n for v_n in self.assigned.keys() if set(self.assigned[v_n]) == set(self.subjects_table.subjects) ] self.available_variables = sorted( list(set(self.variable_names) - set(fully_asigned_variables)), key=str.lower) # Update the available options in the variable and subject comboboxes. for v in range(self.n_variables): v_name = self.cellWidget(v, 0).currentText() s_name = self.cellWidget(v, 1).currentText() cbox_update_options(self.cellWidget(v, 0), self.available_variables) if v_name != 'select variable': # If variable has no subjects assigned, set subjects to 'all'. if not self.assigned[v_name]: self.cellWidget(v, 1).addItems(['all']) self.assigned[v_name] = ['all'] self.available_variables.remove(v_name) cbox_update_options(self.cellWidget(v, 1), self.available_subjects(v_name, s_name))
def add_subject(self, setup=None, subject=None, do_run=None): '''Add row to table allowing extra subject to be specified.''' setup_cbox = QtGui.QComboBox() setup_cbox.addItems(self.available_setups if self. available_setups else ['select setup']) if self.unallocated_setups: setup_cbox.setCurrentIndex( self.available_setups.index(self.unallocated_setups[0])) setup_cbox.activated.connect(self.update_available_setups) remove_button = QtGui.QPushButton('remove') remove_button.setIcon(QtGui.QIcon("gui/icons/remove.svg")) ind = QtCore.QPersistentModelIndex(self.model().index( self.n_subjects, 2)) remove_button.clicked.connect(lambda: self.remove_subject(ind.row())) add_button = QtGui.QPushButton('add') add_button.setIcon(QtGui.QIcon("gui/icons/add.svg")) add_button.clicked.connect(self.add_subject) run_checkbox = TableCheckbox() if do_run == None: run_checkbox.setChecked( True) #new subjects are set to "Run" by default else: run_checkbox.setChecked(do_run) self.setCellWidget(self.n_subjects, 0, run_checkbox) self.setCellWidget(self.n_subjects, 1, setup_cbox) self.setCellWidget(self.n_subjects, 3, remove_button) self.insertRow(self.n_subjects + 1) self.setCellWidget(self.n_subjects + 1, 3, add_button) if setup: cbox_set_item(setup_cbox, setup) if subject: subject_item = QtGui.QTableWidgetItem() subject_item.setText(subject) self.setItem(self.n_subjects, 2, subject_item) self.n_subjects += 1 self.update_available_setups() null_resize(self)
def new_experiment(self, dialog=True): '''Clear experiment configuration.''' if dialog: if not self.save_dialog(): return self.name_text.setText('') self.data_dir_text.setText(data_dir) self.custom_dir = False self.subjects_table.reset() self.variables_table.reset() cbox_set_item(self.experiment_select, 'select experiment', insert=True) cbox_set_item(self.task_select, 'select task', insert=True) cbox_set_item(self.hardware_test_select, ' no hardware test', insert=True)