# -*- coding: utf-8 -*-
#
# Copyright © Spyder Project Contributors
# Licensed under the terms of the MIT License
# (see spyder/__init__.py for details)
"""
IPython Console restart dialog for preferences.
"""
# Third party imports
from qtpy.QtCore import Qt
from qtpy.QtWidgets import (QButtonGroup, QCheckBox, QDialog, QLabel,
QPushButton, QVBoxLayout)
# Local imports
from spyder.config.base import _
class ConsoleRestartDialog(QDialog):
"""
Dialog to apply preferences that need a restart of the console kernel.
"""
# Constants for actions when Preferences require a kernel restart
NO_RESTART = 1
RESTART_CURRENT = 2
RESTART_ALL = 3
def __init__(self, parent):
super(ConsoleRestartDialog, self).__init__(parent)
self.setWindowFlags(Qt.Dialog | Qt.WindowTitleHint)
self._parent = parent
self._action = self.NO_RESTART
self._action_string = {
self.NO_RESTART: _("Keep Existing Kernels"),
self.RESTART_CURRENT: _("Restart Current Kernel"),
self.RESTART_ALL: _("Restart All Kernels")
}
# Dialog widgets
# Text
self._text_label = QLabel(
_("By default, some IPython console preferences will be "
"applied to new consoles only. To apply preferences to "
"existing consoles, select from the options below.
"
"Please note: applying changes to running consoles will force"
" a kernel restart and all current work will be lost."),
self)
self._text_label.setWordWrap(True)
self._text_label.setFixedWidth(450)
# Checkboxes
self._restart_current = QCheckBox(
_("Apply to current console and restart kernel"), self)
self._restart_all = QCheckBox(
_("Apply to all existing consoles and restart all kernels"), self)
self._checkbox_group = QButtonGroup(self)
self._checkbox_group.setExclusive(False)
self._checkbox_group.addButton(
self._restart_current, id=self.RESTART_CURRENT)
self._checkbox_group.addButton(
self._restart_all, id=self.RESTART_ALL)
self._action_button = QPushButton(
self._action_string[self.NO_RESTART], parent=self)
# Dialog Layout
layout = QVBoxLayout(self)
layout.addWidget(self._text_label)
layout.addSpacing(5)
layout.addWidget(self._restart_current)
layout.addWidget(self._restart_all)
layout.addSpacing(10)
layout.addWidget(self._action_button, 0, Qt.AlignRight)
layout.setContentsMargins(20, 20, 20, 20)
self.setLayout(layout)
# Signals
self._checkbox_group.buttonToggled.connect(
self.update_action_button_text)
self._action_button.clicked.connect(self.accept)
def update_action_button_text(self, checkbox, is_checked):
"""
Update action button text.
Takes into account the given checkbox to update the text.
"""
checkbox_id = self._checkbox_group.id(checkbox)
if is_checked:
text = self._action_string[checkbox_id]
self._checkbox_group.buttonToggled.disconnect(
self.update_action_button_text)
self._restart_current.setChecked(False)
self._restart_all.setChecked(False)
checkbox.setChecked(True)
self._checkbox_group.buttonToggled.connect(
self.update_action_button_text)
else:
text = self._action_string[self.NO_RESTART]
self._action_button.setText(text)
def get_action_value(self):
"""
Return tuple indicating True or False for the available actions.
"""
restart_current = self._restart_current.isChecked()
restart_all = self._restart_all.isChecked()
no_restart = not any([restart_all, restart_current])
return restart_all, restart_current, no_restart