def __init__(self, parent=None, clone_from_name=None): """Clone environment dialog.""" super(CloneDialog, self).__init__(parent=parent) # Widgets self.label_name = LabelBase("Name:") self.text_name = LineEditBase() self.label_location = LabelBase("Location:") self.label_prefix = LabelBase() self.button_ok = ButtonPrimary('Clone') self.button_cancel = ButtonNormal('Cancel') # Widget setup self.align_labels([self.label_name, self.label_location]) self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Clone from environment: " + clone_from_name) self.text_name.setPlaceholderText("New environment name") self.text_name.setValidator(self.get_regex_validator()) self.label_prefix.setObjectName('environment-location') # Layouts grid = QGridLayout() grid.addWidget(self.label_name, 2, 0) grid.addWidget(SpacerHorizontal(), 2, 1) grid.addWidget(self.text_name, 2, 2) grid.addWidget(SpacerVertical(), 3, 0) grid.addWidget(self.label_location, 4, 0) grid.addWidget(self.label_prefix, 4, 2) 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(grid) layout.addWidget(SpacerVertical()) layout.addWidget(SpacerVertical()) layout.addLayout(layout_buttons) self.setLayout(layout) # Signals self.text_name.textChanged.connect(self.refresh) self.button_ok.clicked.connect(self.accept) self.button_cancel.clicked.connect(self.reject) # Setup self.text_name.setFocus() self.refresh()
class InputDialog(DialogBase): """Input dialog.""" def __init__(self, title='', text='', value=None, value_type=None): """Base message box dialog.""" super(InputDialog, self).__init__() # Widgets self.label = LabelBase(text) self.text = LineEditBase() self.button_ok = ButtonPrimary('Ok') self.button_cancel = ButtonNormal('Cancel') # Widget setup self.setWindowTitle(to_text_string(title)) if value: self.text.setText(str(value)) # Layouts layout = QVBoxLayout() layout_text = QHBoxLayout() layout_text.addWidget(self.label) layout_text.addWidget(SpacerHorizontal()) layout_text.addWidget(self.text) layout_buttons = QHBoxLayout() layout_buttons.addStretch() layout_buttons.addWidget(self.button_cancel) layout_buttons.addWidget(SpacerHorizontal()) layout_buttons.addWidget(self.button_ok) layout.addLayout(layout_text) 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)
def __init__(self, parent=None): """Import environment from environment specification dialog.""" super(ImportDialog, self).__init__(parent=parent) self.environments = None self.env_dirs = None self.selected_file_filter = None # Widgets self.label_name = LabelBase("Name:") self.label_location = LabelBase("Location:") self.label_path = LabelBase("Specification File") self.text_name = LineEditBase() self.label_prefix = LabelBase("") self.text_path = LineEditBase() self.button_path = ButtonNormal("") self.button_cancel = ButtonNormal('Cancel') self.button_ok = ButtonPrimary('Import') # Widgets setup self.align_labels( [self.label_name, self.label_location, self.label_path]) self.label_prefix.setObjectName('environment-location') self.button_path.setObjectName('import') self.button_ok.setDefault(True) self.text_path.setPlaceholderText("File to import from") self.text_name.setPlaceholderText("New environment name") self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Import new environment") self.text_name.setValidator(self.get_regex_validator()) # Layouts 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) layout_grid.addWidget(SpacerHorizontal(), 0, 1) layout_grid.addWidget(self.text_name, 0, 2) layout_grid.addWidget(SpacerVertical(), 1, 0) layout_grid.addWidget(self.label_location, 2, 0) layout_grid.addWidget(SpacerHorizontal(), 2, 1) layout_grid.addWidget(self.label_prefix, 2, 2) layout_grid.addWidget(SpacerVertical(), 3, 0) layout_grid.addWidget(self.label_path, 4, 0) layout_grid.addWidget(SpacerHorizontal(), 4, 1) layout_grid.addLayout(layout_infile, 4, 2) 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_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) # Setup self.text_name.setFocus() self.refresh()
class ImportDialog(EnvironmentActionsDialog): """Import environment from environment specification dialog.""" 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): """Import environment from environment specification dialog.""" super(ImportDialog, self).__init__(parent=parent) self.environments = None self.env_dirs = None self.selected_file_filter = None # Widgets self.label_name = LabelBase("Name:") self.label_location = LabelBase("Location:") self.label_path = LabelBase("Specification File") self.text_name = LineEditBase() self.label_prefix = LabelBase("") self.text_path = LineEditBase() self.button_path = ButtonNormal("") self.button_cancel = ButtonNormal('Cancel') self.button_ok = ButtonPrimary('Import') # Widgets setup self.align_labels( [self.label_name, self.label_location, self.label_path]) self.label_prefix.setObjectName('environment-location') self.button_path.setObjectName('import') self.button_ok.setDefault(True) self.text_path.setPlaceholderText("File to import from") self.text_name.setPlaceholderText("New environment name") self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Import new environment") self.text_name.setValidator(self.get_regex_validator()) # Layouts 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) layout_grid.addWidget(SpacerHorizontal(), 0, 1) layout_grid.addWidget(self.text_name, 0, 2) layout_grid.addWidget(SpacerVertical(), 1, 0) layout_grid.addWidget(self.label_location, 2, 0) layout_grid.addWidget(SpacerHorizontal(), 2, 1) layout_grid.addWidget(self.label_prefix, 2, 2) layout_grid.addWidget(SpacerVertical(), 3, 0) layout_grid.addWidget(self.label_path, 4, 0) layout_grid.addWidget(SpacerHorizontal(), 4, 1) layout_grid.addLayout(layout_infile, 4, 2) 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_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) # Setup self.text_name.setFocus() self.refresh() def choose(self): """Display file dialog to select environment specification.""" path, selected_filter = getopenfilename( caption="Import Environment", basedir=os.path.expanduser('~'), parent=None, filters="{0};;{1};;{2}".format(self.CONDA_ENV_FILES, self.CONDA_SPEC_FILES, self.PIP_REQUIREMENT_FILES)) if path: name = self.name self.selected_file_filter = selected_filter self.text_path.setText(path) self.refresh(path) # Try to get the name key of the file if an environment.yaml file if selected_filter == self.CONDA_ENV_FILES: try: with open(path, 'r') as f: raw = f.read() data = yaml.load(raw) name = data.get('name', name) except Exception: pass self.text_name.setText(name) def refresh(self, text=''): """Update the status of buttons based data entered.""" name = self.name path = self.path self.update_location() if (name and path and os.path.exists(self.path) and self.is_valid_env_name(name)): self.button_ok.setDisabled(False) self.button_ok.setDefault(True) else: self.button_ok.setDisabled(True) self.button_cancel.setDefault(True) @property def path(self): """Return the content of the selected path if it exists.""" path = None if os.path.isfile(self.text_path.text()): path = self.text_path.text() return path
def __init__(self, parent=None): """Create new environment dialog.""" super(CreateDialog, self).__init__(parent=parent) # Widgets self.label_name = LabelBase("Name:") self.label_location = LabelBase("Location:") self.label_prefix = LabelBase('') self.text_name = LineEditBase() self.label_version = LabelBase("Python version") self.label_packages = LabelBase("Packages:") self.combo_version = ComboBoxBase() self.check_python = CheckBoxBase("Python") self.check_r = CheckBoxBase('R') self.button_ok = ButtonPrimary('Create') self.button_cancel = ButtonNormal('Cancel') # Widgets setup self.align_labels( [self.label_name, self.label_location, self.label_packages]) self.text_name.setPlaceholderText("New environment name") self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Create new environment") self.text_name.setValidator(self.get_regex_validator()) self.label_prefix.setObjectName('environment-location') self.combo_version.setObjectName('package-version') # Supported set of python versions versions = self.PYTHON_VERSIONS now = "{}.{}".format(sys.version_info.major, sys.version_info.minor) if now not in versions: # Guard against non-standard version, or the coming 3.6 versions.append(now) versions.sort() versions = list(reversed(versions)) self.combo_version.addItems(versions) self.combo_version.setCurrentIndex(versions.index(now)) # Layouts layout_python = QHBoxLayout() layout_python.addWidget(self.check_python) layout_python.addWidget(self.combo_version) layout_python.addStretch() layout_r = QHBoxLayout() layout_r.addWidget(self.check_r) grid = QGridLayout() grid.addWidget(self.label_name, 0, 0) grid.addWidget(SpacerHorizontal(), 0, 1) grid.addWidget(self.text_name, 0, 2) grid.addWidget(SpacerVertical(), 1, 0) grid.addWidget(self.label_location, 2, 0) grid.addWidget(SpacerHorizontal(), 2, 1) grid.addWidget(self.label_prefix, 2, 2) grid.addWidget(SpacerVertical(), 3, 0) grid.addWidget(self.label_packages, 4, 0) grid.addLayout(layout_python, 4, 2) grid.addWidget(SpacerVertical(), 5, 0) grid.addLayout(layout_r, 6, 2) layout_buttons = QHBoxLayout() layout_buttons.addStretch() layout_buttons.addWidget(self.button_cancel) layout_buttons.addWidget(SpacerHorizontal()) layout_buttons.addWidget(self.button_ok) main_layout = QVBoxLayout() main_layout.addLayout(grid) main_layout.addWidget(SpacerVertical()) main_layout.addWidget(SpacerVertical()) main_layout.addLayout(layout_buttons) self.setLayout(main_layout) # Signals self.button_ok.clicked.connect(self.accept) self.button_cancel.clicked.connect(self.reject) self.text_name.textChanged.connect(self.refresh) self.check_python.stateChanged.connect(self.refresh) self.check_r.stateChanged.connect(self.refresh) # Setup self.text_name.setFocus() self.check_python.setChecked(True) self.check_r.setChecked(False) self.refresh()
def __init__(self, parent=None, api=None): """Create new environment dialog.""" super(CreateDialog, self).__init__(parent=parent, api=api) # Widgets self.label_name = LabelBase("Name:") self.label_location = LabelBase("Location:") self.label_prefix = LabelBase('') self.text_name = LineEditBase() self.label_version = LabelBase("Python version") self.label_packages = LabelBase("Packages:") self.combo_version = ComboBoxBase() self.check_python = CheckBoxBase("Python") self.check_r = CheckBoxBase('R') self.combo_r_type = ComboBoxBase() self.button_ok = ButtonPrimary('Create') self.button_cancel = ButtonNormal('Cancel') # Widgets setup self.align_labels( [self.label_name, self.label_location, self.label_packages] ) self.text_name.setPlaceholderText("New environment name") self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Create new environment") self.text_name.setValidator(self.get_regex_validator()) self.label_prefix.setObjectName('environment-location') self.combo_version.setObjectName('package-version') self.combo_r_type.setObjectName('r-type') # Supported set of python versions self.combo_version.setDisabled(True) r_types = [self.R] self.combo_r_type.clear() self.combo_r_type.addItems(r_types) self.combo_r_type.setCurrentIndex(0) self.combo_r_type.setEnabled(len(r_types) != 1) # Layouts layout_packages = QGridLayout() layout_packages.addWidget(self.check_python, 0, 0) layout_packages.addWidget(SpacerHorizontal(), 0, 1) layout_packages.addWidget(self.combo_version, 0, 2) layout_packages.addWidget(SpacerVertical(), 1, 0) layout_packages.addWidget(self.check_r, 2, 0) layout_packages.addWidget(SpacerHorizontal(), 2, 1) layout_packages.addWidget(self.combo_r_type, 2, 2) grid = QGridLayout() grid.addWidget(self.label_name, 0, 0, 1, 1) grid.addWidget(SpacerHorizontal(), 0, 1, 1, 1) grid.addWidget(self.text_name, 0, 2, 1, 4) grid.addWidget(SpacerVertical(), 1, 0, 1, 1) grid.addWidget(self.label_location, 2, 0, 1, 1) grid.addWidget(SpacerHorizontal(), 2, 1, 1, 1) grid.addWidget(self.label_prefix, 2, 2, 1, 4) grid.addWidget(SpacerVertical(), 3, 0, 1, 1) grid.addWidget(self.label_packages, 4, 0, 1, 1) grid.addWidget(SpacerHorizontal(), 4, 1, 1, 1) grid.addLayout(layout_packages, 4, 2, 3, 1) layout_buttons = QHBoxLayout() layout_buttons.addStretch() layout_buttons.addWidget(self.button_cancel) layout_buttons.addWidget(SpacerHorizontal()) layout_buttons.addWidget(self.button_ok) main_layout = QVBoxLayout() main_layout.addLayout(grid) main_layout.addWidget(SpacerVertical()) main_layout.addWidget(SpacerVertical()) main_layout.addLayout(layout_buttons) self.setLayout(main_layout) # Signals self.button_ok.clicked.connect(self.accept) self.button_cancel.clicked.connect(self.reject) self.text_name.textChanged.connect(self.refresh) self.check_python.stateChanged.connect(self.refresh) self.check_r.stateChanged.connect(self.refresh) self.sig_setup_ready.connect(self.update_mro) self.sig_setup_ready.connect(self.update_pyversions) # Setup self.text_name.setFocus() self.check_python.setChecked(True) self.check_r.setChecked(False) self.refresh()
class CreateDialog(EnvironmentActionsDialog): """Create new environment dialog.""" MRO = 'mro' R = 'r' PYTHON_VERSIONS = [u'2.7', u'3.5', u'3.6', u'3.7'] MRO_MAC_MIN_VERSION = (10, 11) def __init__(self, parent=None, api=None): """Create new environment dialog.""" super(CreateDialog, self).__init__(parent=parent, api=api) # Widgets self.label_name = LabelBase("Name:") self.label_location = LabelBase("Location:") self.label_prefix = LabelBase('') self.text_name = LineEditBase() self.label_version = LabelBase("Python version") self.label_packages = LabelBase("Packages:") self.combo_version = ComboBoxBase() self.check_python = CheckBoxBase("Python") self.check_r = CheckBoxBase('R') self.combo_r_type = ComboBoxBase() self.button_ok = ButtonPrimary('Create') self.button_cancel = ButtonNormal('Cancel') # Widgets setup self.align_labels( [self.label_name, self.label_location, self.label_packages] ) self.text_name.setPlaceholderText("New environment name") self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Create new environment") self.text_name.setValidator(self.get_regex_validator()) self.label_prefix.setObjectName('environment-location') self.combo_version.setObjectName('package-version') self.combo_r_type.setObjectName('r-type') # Supported set of python versions self.combo_version.setDisabled(True) r_types = [self.R] self.combo_r_type.clear() self.combo_r_type.addItems(r_types) self.combo_r_type.setCurrentIndex(0) self.combo_r_type.setEnabled(len(r_types) != 1) # Layouts layout_packages = QGridLayout() layout_packages.addWidget(self.check_python, 0, 0) layout_packages.addWidget(SpacerHorizontal(), 0, 1) layout_packages.addWidget(self.combo_version, 0, 2) layout_packages.addWidget(SpacerVertical(), 1, 0) layout_packages.addWidget(self.check_r, 2, 0) layout_packages.addWidget(SpacerHorizontal(), 2, 1) layout_packages.addWidget(self.combo_r_type, 2, 2) grid = QGridLayout() grid.addWidget(self.label_name, 0, 0, 1, 1) grid.addWidget(SpacerHorizontal(), 0, 1, 1, 1) grid.addWidget(self.text_name, 0, 2, 1, 4) grid.addWidget(SpacerVertical(), 1, 0, 1, 1) grid.addWidget(self.label_location, 2, 0, 1, 1) grid.addWidget(SpacerHorizontal(), 2, 1, 1, 1) grid.addWidget(self.label_prefix, 2, 2, 1, 4) grid.addWidget(SpacerVertical(), 3, 0, 1, 1) grid.addWidget(self.label_packages, 4, 0, 1, 1) grid.addWidget(SpacerHorizontal(), 4, 1, 1, 1) grid.addLayout(layout_packages, 4, 2, 3, 1) layout_buttons = QHBoxLayout() layout_buttons.addStretch() layout_buttons.addWidget(self.button_cancel) layout_buttons.addWidget(SpacerHorizontal()) layout_buttons.addWidget(self.button_ok) main_layout = QVBoxLayout() main_layout.addLayout(grid) main_layout.addWidget(SpacerVertical()) main_layout.addWidget(SpacerVertical()) main_layout.addLayout(layout_buttons) self.setLayout(main_layout) # Signals self.button_ok.clicked.connect(self.accept) self.button_cancel.clicked.connect(self.reject) self.text_name.textChanged.connect(self.refresh) self.check_python.stateChanged.connect(self.refresh) self.check_r.stateChanged.connect(self.refresh) self.sig_setup_ready.connect(self.update_mro) self.sig_setup_ready.connect(self.update_pyversions) # Setup self.text_name.setFocus() self.check_python.setChecked(True) self.check_r.setChecked(False) self.refresh() def update_pyversions(self): """""" python_pks = self._packages.get('python', {}) python_versions = python_pks.get('versions', []) pyvers = set(['.'.join(v.split('.')[:2]) for v in python_versions]) final_pyvers = [] for pyver in self.PYTHON_VERSIONS: if pyver in pyvers: final_pyvers.append(pyver) versions = self.PYTHON_VERSIONS now = "{}.{}".format(sys.version_info.major, sys.version_info.minor) if now not in final_pyvers: # Guard against non-standard version, or the coming 3.7 final_pyvers.append(now) final_pyvers.sort() final_pyvers = list(reversed(final_pyvers)) self.combo_version.addItems(final_pyvers) self.combo_version.setCurrentIndex(versions.index(now)) self.combo_version.setEnabled(True) def update_mro(self): """""" # Operating systems with MRO support r_types = [self.R] if self.api: is_mro_available = self.api._conda_api.is_package_available( 'mro-base', channels=self.channels, ) if is_mro_available and BITS_64: if ((MAC and MAC_VERSION_INFO > self.MRO_MAC_MIN_VERSION) or WIN or LINUX): r_types = [self.MRO, self.R] self.combo_r_type.clear() self.combo_r_type.addItems(r_types) self.combo_r_type.setCurrentIndex(0) self.combo_r_type.setEnabled(len(r_types) != 1) def refresh(self, text=''): """Update status of buttons based on data.""" name = self.name self.update_location() if self.environments: check = self.install_python or self.install_r if check and self.is_valid_env_name(name): self.button_ok.setDisabled(False) else: self.button_ok.setDisabled(True) self.combo_version.setEnabled(self.install_python) self.combo_r_type.setEnabled(self.install_r) @property def python_version(self): """Return the python version if python was selected for install.""" version = None if self.install_python: version = self.combo_version.currentText() return version @property def install_python(self): """Return if python was selected for install.""" return bool(self.check_python.checkState()) @property def install_r(self): """Return if r was selected for install.""" return bool(self.check_r.checkState()) @property def r_type(self): """Return if r was selected for install.""" return bool(self.combo_r_type.currentText())