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)