class ImportDialog(DialogBase): """Import project from folder or specification files.""" CONDA_ENV_FILES = 'Conda environment files (*.yaml *.yml)' CONDA_SPEC_FILES = 'Conda explicit specification files (*.txt)' PIP_REQUIREMENT_FILES = 'Pip requirement files (*.txt)' def __init__(self, parent=None, projects=None): """Import project from folder or environment files.""" super(ImportDialog, self).__init__(parent=parent) self.projects = projects if projects else {} self.selected_file_filter = None self._path = None # Widgets self.label_info = LabelSpecInfo('', parent=self) self.label_name = QLabel("Project name") self.label_path = QLabel("Specification File") self.text_name = QLineEdit() self.text_path = QLineEdit() self.button_path = ButtonNormal("") self.radio_folder = QRadioButton('From folder') self.radio_spec = QRadioButton('From specification file') self.button_cancel = ButtonNormal('Cancel') self.button_ok = ButtonPrimary('Import') # Widgets setup self.button_path.setObjectName('import') self.button_ok.setDefault(True) self.text_path.setPlaceholderText("File to import from") self.text_name.setPlaceholderText("New project name") self.setMinimumWidth(380) self.setWindowTitle("Import new project") self.text_name.setValidator(get_regex_validator()) # Layouts layout_radio = QHBoxLayout() layout_radio.addWidget(self.radio_folder) layout_radio.addWidget(SpacerHorizontal()) layout_radio.addWidget(self.radio_spec) layout_infile = QHBoxLayout() layout_infile.addWidget(self.text_path) layout_infile.addWidget(SpacerHorizontal()) layout_infile.addWidget(self.button_path) layout_grid = QGridLayout() layout_grid.addWidget(self.label_name, 0, 0, 1, 2) layout_grid.addWidget(SpacerHorizontal(), 0, 2) layout_grid.addWidget(self.text_name, 0, 3) layout_grid.addWidget(SpacerVertical(), 1, 0) layout_grid.addWidget(self.label_path, 2, 0) layout_grid.addWidget(self.label_info, 2, 1) layout_grid.addWidget(SpacerHorizontal(), 2, 2) layout_grid.addLayout(layout_infile, 2, 3) layout_buttons = QHBoxLayout() layout_buttons.addStretch() layout_buttons.addWidget(self.button_cancel) layout_buttons.addWidget(SpacerHorizontal()) layout_buttons.addWidget(self.button_ok) layout = QVBoxLayout() layout.addLayout(layout_radio) layout.addWidget(SpacerVertical()) layout.addLayout(layout_grid) layout.addWidget(SpacerVertical()) layout.addWidget(SpacerVertical()) layout.addLayout(layout_buttons) self.setLayout(layout) # Signals self.button_ok.clicked.connect(self.accept) self.button_cancel.clicked.connect(self.reject) self.button_path.clicked.connect(self.choose) self.text_path.textChanged.connect(self.refresh) self.text_name.textChanged.connect(self.refresh) self.radio_folder.toggled.connect(self.refresh) self.radio_spec.toggled.connect(self.refresh) # Setup self.radio_folder.toggle() self.refresh() def refresh(self, text=''): """Update the status of buttons based on radio selection.""" if self.radio_folder.isChecked(): self.text_path.setPlaceholderText("Folder to import from") self.label_path.setText('Folder') self.label_info.setVisible(False) else: self.label_info.setVisible(True) self.label_path.setText('File ') self.text_path.setPlaceholderText("File to import from") text = self.text_name.text() path = self.text_path.text() if (text and path and os.path.exists(path) and is_valid_project_name(text, self.projects)): self.button_ok.setDisabled(False) self.button_ok.setDefault(True) else: self.button_ok.setDisabled(True) self.button_cancel.setDefault(True) def choose(self): """Display file dialog to select environment specification.""" selected_filter = None if self.radio_spec.isChecked(): path, selected_filter = getopenfilename( caption="Import Project", basedir=HOME_PATH, parent=None, filters="{0};;{1};;{2}".format(self.CONDA_ENV_FILES, self.CONDA_SPEC_FILES, self.PIP_REQUIREMENT_FILES)) else: path = getexistingdirectory( caption="Import Project", basedir=HOME_PATH, parent=None, ) if path: name = self.text_name.text() self.selected_file_filter = selected_filter self.text_path.setText(path) self.refresh(path) self.text_name.setText(name) @property def name(self): """Return the project name.""" return self.text_name.text().strip() @property def path(self): """Return the project path to import (file or folder).""" return self.text_path.text()