def create_project(self, project_name: str, visualization: bool = False, stimulus: bool = False, analysis: bool = False) -> None: """Create a new project with a template and open it.""" icon = QIcon() icon_name = 'icon_sti' if visualization: icon_name = 'icon_viz' item = QListWidgetItem( self.parent_frame.listWidget_projects_visualizations) default_project = '_default_visualization' self.mode = 'visualization' elif stimulus: icon_name = 'icon_sti' item = QListWidgetItem( self.parent_frame.listWidget_projects_delivery) default_project = '_default_stimuli_delivery' self.mode = 'delivery' elif analysis: icon_name = 'icon_ana' item = QListWidgetItem( self.parent_frame.listWidget_projects_analysis) default_project = '_default_data_analysis' self.mode = 'analysis' item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsDragEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setText(project_name) item.previous_name = project_name item.path = self.normalize_path(project_name) ext = 0 while item.path in os.listdir(self.projects_dir): ext += 1 item.path = f"{self.normalize_path(project_name)}{ext}" icon.addFile(f"bci:primary/{icon_name}.svg", QSize(), QIcon.Normal, QIcon.Off) item.setIcon(icon) item.icon_name = icon_name source = os.path.join(os.getenv('BCISTREAM_ROOT'), 'default_extensions', default_project) target = os.path.join(self.projects_dir, item.path) shutil.copytree(source, target) pickle.dump({ 'name': project_name, 'files': [] }, open(os.path.join(self.projects_dir, item.path, BCIFR_FILE), 'wb')) self.open_project(item.path)
def load_projects(self) -> None: """Load projects.""" self.parent_frame.listWidget_projects_visualizations.clear() self.parent_frame.listWidget_projects_analysis.clear() self.parent_frame.listWidget_projects_delivery.clear() projects = os.listdir(self.projects_dir) projects = filter( lambda f: os.path.isdir(os.path.join(self.projects_dir, f)), projects) projects = filter(lambda f: not f.startswith('__'), projects) if (not self.parent_frame.checkBox_projects_show_tutorials.isChecked() ) and ('--local' in sys.argv): projects = filter(lambda f: not f.startswith('_'), projects) projects = sorted(list(projects)) for project_dir in projects: project = project_dir if os.path.exists( os.path.join(self.projects_dir, project_dir, BCIFR_FILE)): bcifr = pickle.load( open( os.path.join(self.projects_dir, project_dir, BCIFR_FILE), 'rb')) if isinstance(bcifr, set): pickle.dump({ 'name': project, 'files': bcifr }, open( os.path.join(self.projects_dir, project_dir, BCIFR_FILE), 'wb')) elif isinstance(bcifr, dict): project = bcifr.get('name', project) else: pickle.dump({ 'name': project, 'files': [] }, open( os.path.join(self.projects_dir, project_dir, BCIFR_FILE), 'wb')) if project.startswith( 'Tutorial |' ) and not self.parent_frame.checkBox_projects_show_tutorials.isChecked( ): continue if project.startswith( 'Tutorial: ' ) and not self.parent_frame.checkBox_projects_show_tutorials.isChecked( ): continue with open(os.path.join(self.projects_dir, project_dir, 'main.py'), 'r') as file: lines = file.readlines() modules = { LINE_VISUALIZATION: (self.parent_frame.listWidget_projects_visualizations, 'icon_viz'), LINE_DELIVERY: (self.parent_frame.listWidget_projects_delivery, 'icon_sti'), LINE_ANALYSIS: (self.parent_frame.listWidget_projects_analysis, 'icon_ana'), } for module in modules: if [ line for line in lines if module in ' '.join(line.split()) and not line.strip().startswith("#") ]: widget, icon_name = modules[module] break widget, icon_name = modules[LINE_ANALYSIS] item = QListWidgetItem(widget) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsDragEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setText(project) item.previous_name = project item.path = project_dir icon = QIcon() icon.addFile(f"bci:/primary/{icon_name}.svg", QSize(), QIcon.Normal, QIcon.Off) item.setIcon(icon) item.icon_name = icon_name