NewProjectWizard.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #!/usr/bin/env python
  2. """NewProjectWizard: Wizard to create new projects."""
  3. import os
  4. from PyQt5 import QtWidgets, QtGui
  5. class NewProjectWizard(QtWidgets.QWizard):
  6. def _get_project_config(self):
  7. return self._project_config
  8. project_config = property(_get_project_config)
  9. def _get_project_root(self):
  10. return self._project_root
  11. project_root = property(_get_project_root)
  12. def __init__(self, parent=None):
  13. self._project_config = None
  14. self._project_root = None
  15. QtWidgets.QWizard.__init__(self, parent=parent)
  16. self.addPage(IntroductionPage(self))
  17. self.addPage(ProjectFolderPage(self))
  18. self.addPage(ModelPage(self))
  19. self.addPage(DonePage(self))
  20. self.setPixmap(QtWidgets.QWizard.LogoPixmap, QtGui.QPixmap(':/icons/banner.jpg'))
  21. self.setWindowTitle('New Project')
  22. # (0) Introduction
  23. class IntroductionPage(QtWidgets.QWizardPage):
  24. def __init__(self, parent=None):
  25. QtWidgets.QWizardPage.__init__(self, parent=parent)
  26. self.setTitle('Introduction')
  27. self.setPixmap(QtWidgets.QWizard.WatermarkPixmap, QtGui.QPixmap(':/icons/banner.jpg'))
  28. label = QtWidgets.QLabel('This wizard will create a new project. Please verify that the '
  29. 'following prerequisites are available to you: <ul>'
  30. '<li>Carpe Simiam Model Distribution v1.0</li></ul>')
  31. label.setWordWrap(True)
  32. layout = QtWidgets.QVBoxLayout()
  33. layout.addWidget(label)
  34. self.setLayout(layout)
  35. # (1) Project Folder
  36. class ProjectFolderPage(QtWidgets.QWizardPage):
  37. def __init__(self, parent=None):
  38. QtWidgets.QWizardPage.__init__(self, parent=parent)
  39. self._valid = False
  40. self.setTitle('Project Details')
  41. self.setSubTitle('')
  42. projectNameLabel = QtWidgets.QLabel("Project name:")
  43. projectNameLineEdit = QtWidgets.QLineEdit()
  44. projectNameLabel.setBuddy(projectNameLineEdit)
  45. projectDescriptionLabel = QtWidgets.QLabel("Project description:")
  46. projectDescriptionLineEdit = QtWidgets.QLineEdit()
  47. projectDescriptionLabel.setBuddy(projectDescriptionLineEdit)
  48. projectFolderLabel = QtWidgets.QLabel("Project folder:")
  49. self.projectFolderLineEdit = QtWidgets.QLineEdit()
  50. projectFolderLabel.setBuddy(self.projectFolderLineEdit)
  51. self.validationLabel = QtWidgets.QLabel()
  52. self.validationLabel.setStyleSheet("QLabel{ color: red }")
  53. projectFolderButton = QtWidgets.QPushButton("Browse...")
  54. projectFolderButton.clicked.connect(self.onProjectFolderBrowse)
  55. self.projectFolderLineEdit.textChanged.connect(self.onProjectFolderChanged)
  56. layout = QtWidgets.QVBoxLayout()
  57. folderLine = QtWidgets.QHBoxLayout()
  58. layout.addWidget(projectNameLabel)
  59. layout.addWidget(projectNameLineEdit)
  60. layout.addWidget(projectDescriptionLabel)
  61. layout.addWidget(projectDescriptionLineEdit)
  62. layout.addWidget(projectFolderLabel)
  63. layout.addLayout(folderLine)
  64. layout.addWidget(self.validationLabel)
  65. folderLine.addWidget(self.projectFolderLineEdit)
  66. folderLine.addWidget(projectFolderButton)
  67. self.setLayout(layout)
  68. self.registerField("projectFolder*", self.projectFolderLineEdit)
  69. self.registerField("projectName*", projectNameLineEdit)
  70. self.registerField("projectDescription", projectDescriptionLineEdit)
  71. def onProjectFolderBrowse(self):
  72. selection = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Project Folder')
  73. if len(selection) > 0:
  74. self.projectFolderLineEdit.setText(selection)
  75. def onProjectFolderChanged(self):
  76. def validate(text):
  77. if len(text) == 0:
  78. return 'Please enter a valid destination for your project.'
  79. elif not os.path.exists(text):
  80. return 'The specified folder does not exist.'
  81. elif len(os.listdir(text)) > 0:
  82. return 'The specified folder is not empty.'
  83. return None
  84. result = validate(self.projectFolderLineEdit.text())
  85. self._valid = result is None
  86. if result is not None:
  87. self.validationLabel.setText(str(result))
  88. else:
  89. self.validationLabel.setText('')
  90. def validatePage(self):
  91. self.onProjectFolderChanged()
  92. return self._valid and QtWidgets.QWizardPage.validatePage(self)
  93. # (2) Model Distribution
  94. class ModelPage(QtWidgets.QWizardPage):
  95. def __init__(self, parent=None):
  96. QtWidgets.QWizardPage.__init__(self, parent=parent)
  97. self._valid = False
  98. self.setTitle("Model Distribution")
  99. self.setSubTitle("Specify the folder where the Carpe Simiam Model Distribution v1.0 is located.")
  100. # self.setCommitPage(True)
  101. modelFolderLabel = QtWidgets.QLabel("Model distribution folder:")
  102. modelFolderLineEdit = QtWidgets.QLineEdit()
  103. modelFolderLabel.setBuddy(modelFolderLineEdit)
  104. validationLabel = QtWidgets.QLabel("")
  105. validationLabel.setStyleSheet("QLabel{ color: red }")
  106. modelFolderButton = QtWidgets.QPushButton("Browse...")
  107. modelFolderButton.clicked.connect(self.onModelFolderBrowse)
  108. modelFolderLineEdit.textChanged.connect(self.onModelFolderChanged)
  109. layout = QtWidgets.QVBoxLayout()
  110. folderLine = QtWidgets.QHBoxLayout()
  111. layout.addWidget(modelFolderLabel)
  112. layout.addLayout(folderLine)
  113. layout.addWidget(validationLabel)
  114. folderLine.addWidget(modelFolderLineEdit)
  115. folderLine.addWidget(modelFolderButton)
  116. self.setLayout(layout)
  117. self.registerField("modelFolder*", modelFolderLineEdit)
  118. self.modelFolderLineEdit = modelFolderLineEdit
  119. self.validationLabel = validationLabel
  120. def onModelFolderBrowse(self):
  121. selection = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Model Distribution Folder')
  122. if len(selection) > 0:
  123. self.modelFolderLineEdit.setText(selection)
  124. def onModelFolderChanged(self):
  125. def validate(text):
  126. if len(text) == 0:
  127. return 'Please enter a valid model distribution location.'
  128. if not os.path.exists(text):
  129. return 'The specified folder does not exist.'
  130. if "distribution.json" not in os.listdir(text):
  131. return 'The specified folder does not contain a model distribution'
  132. return None
  133. result = validate(self.modelFolderLineEdit.text())
  134. self._valid = result is None
  135. if result is not None:
  136. self.validationLabel.setText(str(result))
  137. else:
  138. self.validationLabel.setText('')
  139. def validatePage(self):
  140. return self._valid and QtWidgets.QWizardPage.validatePage(self)
  141. # (4) Done
  142. class DonePage(QtWidgets.QWizardPage):
  143. def initializePage(self):
  144. # Collect fields
  145. w = self.wizard()
  146. w._project_config = {
  147. 'description': self.field('projectDescription'),
  148. 'name': self.field('projectName'),
  149. 'pipeline': {
  150. 'model-distribution': self.field('modelFolder')
  151. }
  152. }
  153. w._project_root = self.field('projectFolder')
  154. # TODO insert summary of project here
  155. done_message = "" \
  156. "<p>You can now take the following steps to get started:" \
  157. "<ul><li>Add individuals to the population. To do this, " \
  158. "select <em>Data</em> &gt; <em>Manage Individuals...</em></li>" \
  159. "<li>Import labeled data for training. Choose the appropriate " \
  160. "entry from the <em>Data</em> menu.</li>" \
  161. "<li>Run prediction on images using the <em>Predict Images...</em> button.</li>" \
  162. "</ul></p><p>Configuration:<br>" + str(w._project_config) + "</p>"
  163. self.doneLabel.setText(done_message)
  164. def __init__(self, parent=None):
  165. QtWidgets.QWizardPage.__init__(self, parent=parent)
  166. self.doneLabel = QtWidgets.QLabel('Done.')
  167. self.doneLabel.setWordWrap(True)
  168. layout = QtWidgets.QVBoxLayout()
  169. layout.addWidget(self.doneLabel)
  170. self.setLayout(layout)