#!/usr/bin/env python """NewProjectWizard: Wizard to create new projects.""" import os from PyQt5 import QtWidgets, QtGui class NewProjectWizard(QtWidgets.QWizard): def _get_project_config(self): return self._project_config project_config = property(_get_project_config) def _get_project_root(self): return self._project_root project_root = property(_get_project_root) def __init__(self, parent=None): self._project_config = None self._project_root = None QtWidgets.QWizard.__init__(self, parent=parent) self.addPage(IntroductionPage(self)) self.addPage(ProjectFolderPage(self)) self.addPage(ModelPage(self)) self.addPage(DonePage(self)) self.setPixmap(QtWidgets.QWizard.LogoPixmap, QtGui.QPixmap(':/icons/banner.jpg')) self.setWindowTitle('New Project') # (0) Introduction class IntroductionPage(QtWidgets.QWizardPage): def __init__(self, parent=None): QtWidgets.QWizardPage.__init__(self, parent=parent) self.setTitle('Introduction') self.setPixmap(QtWidgets.QWizard.WatermarkPixmap, QtGui.QPixmap(':/icons/banner.jpg')) label = QtWidgets.QLabel('This wizard will create a new project. Please verify that the ' 'following prerequisites are available to you: ') label.setWordWrap(True) layout = QtWidgets.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) # (1) Project Folder class ProjectFolderPage(QtWidgets.QWizardPage): def __init__(self, parent=None): QtWidgets.QWizardPage.__init__(self, parent=parent) self._valid = False self.setTitle('Project Details') self.setSubTitle('') projectNameLabel = QtWidgets.QLabel("Project name:") projectNameLineEdit = QtWidgets.QLineEdit() projectNameLabel.setBuddy(projectNameLineEdit) projectDescriptionLabel = QtWidgets.QLabel("Project description:") projectDescriptionLineEdit = QtWidgets.QLineEdit() projectDescriptionLabel.setBuddy(projectDescriptionLineEdit) projectFolderLabel = QtWidgets.QLabel("Project folder:") self.projectFolderLineEdit = QtWidgets.QLineEdit() projectFolderLabel.setBuddy(self.projectFolderLineEdit) self.validationLabel = QtWidgets.QLabel() self.validationLabel.setStyleSheet("QLabel{ color: red }") projectFolderButton = QtWidgets.QPushButton("Browse...") projectFolderButton.clicked.connect(self.onProjectFolderBrowse) self.projectFolderLineEdit.textChanged.connect(self.onProjectFolderChanged) layout = QtWidgets.QVBoxLayout() folderLine = QtWidgets.QHBoxLayout() layout.addWidget(projectNameLabel) layout.addWidget(projectNameLineEdit) layout.addWidget(projectDescriptionLabel) layout.addWidget(projectDescriptionLineEdit) layout.addWidget(projectFolderLabel) layout.addLayout(folderLine) layout.addWidget(self.validationLabel) folderLine.addWidget(self.projectFolderLineEdit) folderLine.addWidget(projectFolderButton) self.setLayout(layout) self.registerField("projectFolder*", self.projectFolderLineEdit) self.registerField("projectName*", projectNameLineEdit) self.registerField("projectDescription", projectDescriptionLineEdit) def onProjectFolderBrowse(self): selection = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Project Folder') if len(selection) > 0: self.projectFolderLineEdit.setText(selection) def onProjectFolderChanged(self): def validate(text): if len(text) == 0: return 'Please enter a valid destination for your project.' elif not os.path.exists(text): return 'The specified folder does not exist.' elif len(os.listdir(text)) > 0: return 'The specified folder is not empty.' return None result = validate(self.projectFolderLineEdit.text()) self._valid = result is None if result is not None: self.validationLabel.setText(str(result)) else: self.validationLabel.setText('') def validatePage(self): self.onProjectFolderChanged() return self._valid and QtWidgets.QWizardPage.validatePage(self) # (2) Model Distribution class ModelPage(QtWidgets.QWizardPage): def __init__(self, parent=None): QtWidgets.QWizardPage.__init__(self, parent=parent) self._valid = False self.setTitle("Model Distribution") self.setSubTitle("Specify the folder where the Carpe Simiam Model Distribution v1.0 is located.") # self.setCommitPage(True) modelFolderLabel = QtWidgets.QLabel("Model distribution folder:") modelFolderLineEdit = QtWidgets.QLineEdit() modelFolderLabel.setBuddy(modelFolderLineEdit) validationLabel = QtWidgets.QLabel("") validationLabel.setStyleSheet("QLabel{ color: red }") modelFolderButton = QtWidgets.QPushButton("Browse...") modelFolderButton.clicked.connect(self.onModelFolderBrowse) modelFolderLineEdit.textChanged.connect(self.onModelFolderChanged) layout = QtWidgets.QVBoxLayout() folderLine = QtWidgets.QHBoxLayout() layout.addWidget(modelFolderLabel) layout.addLayout(folderLine) layout.addWidget(validationLabel) folderLine.addWidget(modelFolderLineEdit) folderLine.addWidget(modelFolderButton) self.setLayout(layout) self.registerField("modelFolder*", modelFolderLineEdit) self.modelFolderLineEdit = modelFolderLineEdit self.validationLabel = validationLabel def onModelFolderBrowse(self): selection = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Model Distribution Folder') if len(selection) > 0: self.modelFolderLineEdit.setText(selection) def onModelFolderChanged(self): def validate(text): if len(text) == 0: return 'Please enter a valid model distribution location.' if not os.path.exists(text): return 'The specified folder does not exist.' if "distribution.json" not in os.listdir(text): return 'The specified folder does not contain a model distribution' return None result = validate(self.modelFolderLineEdit.text()) self._valid = result is None if result is not None: self.validationLabel.setText(str(result)) else: self.validationLabel.setText('') def validatePage(self): return self._valid and QtWidgets.QWizardPage.validatePage(self) # (4) Done class DonePage(QtWidgets.QWizardPage): def initializePage(self): # Collect fields w = self.wizard() w._project_config = { 'description': self.field('projectDescription'), 'name': self.field('projectName'), 'pipeline': { 'model-distribution': self.field('modelFolder') } } w._project_root = self.field('projectFolder') # TODO insert summary of project here done_message = "" \ "

You can now take the following steps to get started:" \ "

Configuration:
" + str(w._project_config) + "

" self.doneLabel.setText(done_message) def __init__(self, parent=None): QtWidgets.QWizardPage.__init__(self, parent=parent) self.doneLabel = QtWidgets.QLabel('Done.') self.doneLabel.setWordWrap(True) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.doneLabel) self.setLayout(layout)