Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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