# -*- coding: utf-8 -*- # ----------------------------------------------------------------------------- # Copyright (c) 2016-2017 Anaconda, Inc. # # May be copied and distributed freely only as part of an Anaconda or # Miniconda installation. # ----------------------------------------------------------------------------- """Dialogs for conflicting situations.""" __all__ = ['ConflictDialog'] from qtpy import QtCore from qtpy import QtWidgets from anaconda_navigator import widgets from . import common class ConflictDialog(common.EnvironmentActionsDialog): # pylint: disable=too-many-instance-attributes """Create new environment dialog if navigator conflicts with deps.""" def __init__(self, parent=None, package=None, extra_message='', current_prefix=None): """Create new environment dialog if navigator conflicts with deps.""" super().__init__(parent=parent) parts = package.split('=') self.package = parts[0] if '=' in package else package self.package_version = parts[-1] if '=' in package else '' self.current_prefix = current_prefix base_message = f'{package} cannot be installed on this environment.' base_message = extra_message or base_message # Widgets self.label_info = widgets.LabelBase( base_message + '

' 'Do you want to install the package in an existing ' 'environment or
create a new environment?' ) self.label_name = widgets.LabelBase('Name:') self.label_prefix = widgets.LabelBase(' ' * 100) self.label_location = widgets.LabelBase('Location:') self.combo_name = widgets.ComboBoxBase() self.button_ok = widgets.ButtonPrimary('Create') self.button_cancel = widgets.ButtonNormal('Cancel') # Widgets setup self.align_labels([self.label_name, self.label_location]) self.combo_name.setEditable(True) self.combo_name.setCompleter(None) self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle(f'Create new environment for \'{package}\'') self.label_prefix.setObjectName('environment-location') self.combo_name.setObjectName('environment-selection') # Layouts grid_layout = QtWidgets.QGridLayout() grid_layout.addWidget(self.label_name, 0, 0) grid_layout.addWidget(widgets.SpacerHorizontal(), 0, 1) grid_layout.addWidget(self.combo_name, 0, 2) grid_layout.addWidget(widgets.SpacerVertical(), 1, 0) grid_layout.addWidget(self.label_location, 2, 0) grid_layout.addWidget(widgets.SpacerHorizontal(), 2, 1) grid_layout.addWidget(self.label_prefix, 2, 2) layout_buttons = QtWidgets.QHBoxLayout() layout_buttons.addStretch() layout_buttons.addWidget(self.button_cancel) layout_buttons.addWidget(widgets.SpacerHorizontal()) layout_buttons.addWidget(self.button_ok) main_layout = QtWidgets.QVBoxLayout() main_layout.addWidget(self.label_info) main_layout.addWidget(widgets.SpacerVertical()) main_layout.addWidget(widgets.SpacerVertical()) main_layout.addLayout(grid_layout) main_layout.addWidget(widgets.SpacerVertical()) main_layout.addWidget(widgets.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.combo_name.setCurrentText(self.package) self.combo_name.currentTextChanged.connect(self.refresh) self.button_ok.setDisabled(True) def new_env_name(self): """Generate a unique environment name.""" pkg_name_version = self.package + '-' + self.package_version if self.environments: if self.package not in self.environments.values(): env_name = self.package elif pkg_name_version not in self.environments.values(): env_name = pkg_name_version else: for i in range(1, 1000): # pylint: disable=invalid-name new_pkg_name = pkg_name_version + '_' + str(i) if new_pkg_name not in self.environments.values(): env_name = new_pkg_name break else: env_name = self.package return env_name def setup(self, worker, info, error): """Setup the dialog conda information as a result of a worker.""" super().setup(worker, info, error) self.combo_name.blockSignals(True) self.combo_name.clear() new_env_name = self.new_env_name() self.combo_name.addItem(new_env_name, new_env_name) for i, (env_prefix, env_name) in enumerate(self.environments.items()): # pylint: disable=invalid-name # Do not include the env where the conflict was found! if self.current_prefix != env_prefix: self.combo_name.addItem(env_name, env_prefix) self.combo_name.setItemData(i, env_prefix, QtCore.Qt.ToolTipRole) self.combo_name.setCurrentText(new_env_name) self.combo_name.blockSignals(False) self.refresh() def refresh(self): """Refresh state of buttons based on content.""" self.update_location() if self.environments: self.button_ok.setEnabled(bool(self.name)) @property def name(self): """Return the name of the environment.""" return self.combo_name.currentText()