123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #!/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: <ul>'
- '<li>Carpe Simiam Model Distribution v1.0</li></ul>')
- 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 = "" \
- "<p>You can now take the following steps to get started:" \
- "<ul><li>Add individuals to the population. To do this, " \
- "select <em>Data</em> > <em>Manage Individuals...</em></li>" \
- "<li>Import labeled data for training. Choose the appropriate " \
- "entry from the <em>Data</em> menu.</li>" \
- "<li>Run prediction on images using the <em>Predict Images...</em> button.</li>" \
- "</ul></p><p>Configuration:<br>" + str(w._project_config) + "</p>"
- 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)
|