#!/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:
'
'- Carpe Simiam Model Distribution v1.0
')
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:" \
"
- Add individuals to the population. To do this, " \
"select Data > Manage Individuals...
" \
"- Import labeled data for training. Choose the appropriate " \
"entry from the Data menu.
" \
"- Run prediction on images using the Predict Images... button.
" \
"
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)