class ConflictDialog(EnvironmentActionsDialog): """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(ConflictDialog, self).__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 = ('<b>{0}</b> cannot be installed on this ' 'environment.').format(package) base_message = extra_message or base_message # Widgets self.label_info = LabelBase( base_message + '<br><br>' 'Do you want to install the package in an existing ' 'environment or <br>create a new environment?' ''.format(package)) self.label_name = LabelBase('Name:') self.label_prefix = LabelBase(' ' * 100) self.label_location = LabelBase('Location:') self.combo_name = ComboBoxBase() self.button_ok = ButtonPrimary('Create') self.button_cancel = ButtonNormal('Cancel') # Widgets setup self.align_labels([self.label_name, self.label_location]) self.combo_name.setEditable(True) self.combo_name.setCompleter(None) self.combo_name.setValidator(self.get_regex_validator()) self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Create new environment for '{}'".format(package)) self.label_prefix.setObjectName('environment-location') self.combo_name.setObjectName('environment-selection') # Layouts grid_layout = QGridLayout() grid_layout.addWidget(self.label_name, 0, 0) grid_layout.addWidget(SpacerHorizontal(), 0, 1) grid_layout.addWidget(self.combo_name, 0, 2) grid_layout.addWidget(SpacerVertical(), 1, 0) grid_layout.addWidget(self.label_location, 2, 0) grid_layout.addWidget(SpacerHorizontal(), 2, 1) grid_layout.addWidget(self.label_prefix, 2, 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.addWidget(self.label_info) main_layout.addWidget(SpacerVertical()) main_layout.addWidget(SpacerVertical()) main_layout.addLayout(grid_layout) 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.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): 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(ConflictDialog, self).setup(worker, info, error) self.combo_name.blockSignals(True) self.combo_name.clear() new_env_name = self.new_env_name() for i, (env_prefix, env_name) in enumerate(self.environments.items()): # 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.setCurrentText(new_env_name) self.combo_name.setItemData(i, env_prefix, 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()
def __init__(self, parent=None, package=None, extra_message='', current_prefix=None): """Create new environment dialog if navigator conflicts with deps.""" super(ConflictDialog, self).__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 = ('<b>{0}</b> cannot be installed on this ' 'environment.').format(package) base_message = extra_message or base_message # Widgets self.label_info = LabelBase( base_message + '<br><br>' 'Do you want to install the package in an existing ' 'environment or <br>create a new environment?' ''.format(package)) self.label_name = LabelBase('Name:') self.label_prefix = LabelBase(' ' * 100) self.label_location = LabelBase('Location:') self.combo_name = ComboBoxBase() self.button_ok = ButtonPrimary('Create') self.button_cancel = ButtonNormal('Cancel') # Widgets setup self.align_labels([self.label_name, self.label_location]) self.combo_name.setEditable(True) self.combo_name.setCompleter(None) self.combo_name.setValidator(self.get_regex_validator()) self.setMinimumWidth(self.BASE_DIALOG_WIDTH) self.setWindowTitle("Create new environment for '{}'".format(package)) self.label_prefix.setObjectName('environment-location') self.combo_name.setObjectName('environment-selection') # Layouts grid_layout = QGridLayout() grid_layout.addWidget(self.label_name, 0, 0) grid_layout.addWidget(SpacerHorizontal(), 0, 1) grid_layout.addWidget(self.combo_name, 0, 2) grid_layout.addWidget(SpacerVertical(), 1, 0) grid_layout.addWidget(self.label_location, 2, 0) grid_layout.addWidget(SpacerHorizontal(), 2, 1) grid_layout.addWidget(self.label_prefix, 2, 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.addWidget(self.label_info) main_layout.addWidget(SpacerVertical()) main_layout.addWidget(SpacerVertical()) main_layout.addLayout(grid_layout) 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.combo_name.setCurrentText(self.package) self.combo_name.currentTextChanged.connect(self.refresh) self.button_ok.setDisabled(True)
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, log_folder=LOG_FOLDER, log_filename=LOG_FILENAME, ): """ Logger widget. Parameters ---------- log_folder: str Folder where logs are located log_filename: str Basic name for the rotating log files. """ super(LogViewerDialog, self).__init__(parent=parent) self._data = None self._columns = ['level', 'time', 'module', 'method', 'message'] self._headers = [c.capitalize() for c in self._columns] self._log_filename = log_filename self._log_folder = log_folder # Widgets self.label = QLabel('Select log file:') self.combobox = ComboBoxBase() self.table_logs = QTableWidget(self) self.button_copy = ButtonPrimary('Copy') self.text_search = LineEditSearch() # Widget setup self.table_logs.setAttribute(Qt.WA_LayoutUsesWidgetRect, True) horizontal_header = self.table_logs.horizontalHeader() vertical_header = self.table_logs.verticalHeader() horizontal_header.setStretchLastSection(True) horizontal_header.setSectionResizeMode(QHeaderView.Fixed) vertical_header.setSectionResizeMode(QHeaderView.Fixed) self.table_logs.setSelectionBehavior(QTableWidget.SelectRows) self.table_logs.setEditTriggers(QTableWidget.NoEditTriggers) self.setWindowTitle('Log Viewer') self.setMinimumWidth(800) self.setMinimumHeight(500) self.text_search.setPlaceholderText("Search...") # Layouts top_layout = QHBoxLayout() top_layout.addWidget(self.label) top_layout.addWidget(SpacerHorizontal()) top_layout.addWidget(self.combobox) top_layout.addStretch() top_layout.addWidget(SpacerHorizontal()) top_layout.addWidget(self.text_search) top_layout.addWidget(SpacerHorizontal()) top_layout.addWidget(self.button_copy) layout = QVBoxLayout() layout.addLayout(top_layout) layout.addWidget(SpacerVertical()) layout.addWidget(self.table_logs) self.setLayout(layout) # Signals self.combobox.currentIndexChanged.connect(self.update_text) self.button_copy.clicked.connect(self.copy_item) self.text_search.textChanged.connect(self.filter_text) # Setup() self.setup() self.update_style_sheet()
class LogViewerDialog(DialogBase): """Logger widget.""" def __init__( self, parent=None, log_folder=LOG_FOLDER, log_filename=LOG_FILENAME, ): """ Logger widget. Parameters ---------- log_folder: str Folder where logs are located log_filename: str Basic name for the rotating log files. """ super(LogViewerDialog, self).__init__(parent=parent) self._data = None self._columns = ['level', 'time', 'module', 'method', 'message'] self._headers = [c.capitalize() for c in self._columns] self._log_filename = log_filename self._log_folder = log_folder # Widgets self.label = QLabel('Select log file:') self.combobox = ComboBoxBase() self.table_logs = QTableWidget(self) self.button_copy = ButtonPrimary('Copy') self.text_search = LineEditSearch() # Widget setup self.table_logs.setAttribute(Qt.WA_LayoutUsesWidgetRect, True) horizontal_header = self.table_logs.horizontalHeader() vertical_header = self.table_logs.verticalHeader() horizontal_header.setStretchLastSection(True) horizontal_header.setSectionResizeMode(QHeaderView.Fixed) vertical_header.setSectionResizeMode(QHeaderView.Fixed) self.table_logs.setSelectionBehavior(QTableWidget.SelectRows) self.table_logs.setEditTriggers(QTableWidget.NoEditTriggers) self.setWindowTitle('Log Viewer') self.setMinimumWidth(800) self.setMinimumHeight(500) self.text_search.setPlaceholderText("Search...") # Layouts top_layout = QHBoxLayout() top_layout.addWidget(self.label) top_layout.addWidget(SpacerHorizontal()) top_layout.addWidget(self.combobox) top_layout.addStretch() top_layout.addWidget(SpacerHorizontal()) top_layout.addWidget(self.text_search) top_layout.addWidget(SpacerHorizontal()) top_layout.addWidget(self.button_copy) layout = QVBoxLayout() layout.addLayout(top_layout) layout.addWidget(SpacerVertical()) layout.addWidget(self.table_logs) self.setLayout(layout) # Signals self.combobox.currentIndexChanged.connect(self.update_text) self.button_copy.clicked.connect(self.copy_item) self.text_search.textChanged.connect(self.filter_text) # Setup() self.setup() self.update_style_sheet() def update_style_sheet(self, style_sheet=None): """Update custom CSS stylesheet.""" if style_sheet is None: style_sheet = load_style_sheet() self.setStyleSheet(style_sheet) def setup(self): """Setup widget content.""" self.combobox.clear() paths = log_files( log_folder=self._log_folder, log_filename=self._log_filename, ) files = [os.path.basename(p) for p in paths] self.combobox.addItems(files) def filter_text(self): """Search for text in the selected log file.""" search = self.text_search.text().lower() for i, data in enumerate(self._data): if any(search in str(d).lower() for d in data.values()): self.table_logs.showRow(i) else: self.table_logs.hideRow(i) def row_data(self, row): """Give the current row data concatenated with spaces.""" data = {} if self._data: length = len(self._data) if 0 >= row < length: data = self._data[row] return data def update_text(self, index): """Update logs based on combobox selection.""" path = os.path.join(self._log_folder, self.combobox.currentText()) self._data = load_log(path) self.table_logs.clear() self.table_logs.setSortingEnabled(False) self.table_logs.setRowCount(len(self._data)) self.table_logs.setColumnCount(len(self._columns)) self.table_logs.setHorizontalHeaderLabels(self._headers) for row, data in enumerate(self._data): for col, col_key in enumerate(self._columns): item = QTableWidgetItem(data.get(col_key, '')) self.table_logs.setItem(row, col, item) for c in [0, 2, 3]: self.table_logs.resizeColumnToContents(c) self.table_logs.resizeRowsToContents() self.table_logs.setSortingEnabled(True) self.table_logs.scrollToBottom() self.table_logs.scrollToTop() self.table_logs.sortByColumn(1, Qt.AscendingOrder) # Make sure there is always a selected row self.table_logs.setCurrentCell(0, 0) def copy_item(self): """Copy selected item to clipboard in markdown format.""" app = QApplication.instance() items = self.table_logs.selectedIndexes() if items: rows = set(sorted(i.row() for i in items)) if self._data: all_data = [self._data[row] for row in rows] dump = json.dumps(all_data, sort_keys=True, indent=4) app.clipboard().setText('```json\n' + dump + '\n```')
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())