Skip to content

Commit

Permalink
Merge pull request #23578 from jsbautista/changeDefaultEnvironment
Browse files Browse the repository at this point in the history
PR: Restore functionality to open Main interpreter preferences from Python env statusbar widget
  • Loading branch information
ccordoba12 authored Jan 31, 2025
2 parents e70160c + 572b610 commit 877513f
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 1 deletion.
13 changes: 13 additions & 0 deletions spyder/plugins/ipythonconsole/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,10 @@ def on_initialize(self):
widget = self.get_widget()

# Main widget signals
# Connect signal to open preferences
widget.sig_open_preferences_requested.connect(
self._open_interpreter_preferences
)
widget.sig_append_to_history_requested.connect(
self.sig_append_to_history_requested)
widget.sig_switch_to_plugin_requested.connect(self.switch_to_plugin)
Expand Down Expand Up @@ -597,6 +601,15 @@ def _rename_remote_clients(self, server_id):
def _update_envs(self, envs):
self.get_widget().update_envs(envs)

def _open_interpreter_preferences(self):
"""Open the Preferences dialog in the main interpreter section."""
self._main.show_preferences()
preferences = self._main.preferences
container = preferences.get_container()
dlg = container.dialog
index = dlg.get_index_by_name("main_interpreter")
dlg.set_current_index(index)

# ---- Public API
# -------------------------------------------------------------------------

Expand Down
7 changes: 7 additions & 0 deletions spyder/plugins/ipythonconsole/widgets/main_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,11 @@ class IPythonConsoleWidget(PluginMainWidget, CachedKernelMixin):
"""

# Signals
sig_open_preferences_requested = Signal()
"""
Signal to open the main interpreter preferences.
"""

sig_append_to_history_requested = Signal(str, str)
"""
This signal is emitted when the plugin requires to add commands to a
Expand Down Expand Up @@ -388,6 +393,8 @@ def __init__(self, name=None, plugin=None, parent=None):
self.pythonenv_status.sig_interpreter_changed.connect(
self.sig_interpreter_changed
)
self.pythonenv_status.sig_open_preferences_requested.connect(
self.sig_open_preferences_requested)

# Initial value for the current working directory
self._current_working_directory = get_home_dir()
Expand Down
51 changes: 50 additions & 1 deletion spyder/plugins/ipythonconsole/widgets/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,24 @@
# Standard library imports
import functools
import logging
import os
import sys
import textwrap

# Third-party imports
from IPython.core import release as ipython_release
from qtpy.QtCore import Signal
from qtpy.QtCore import QPoint, Signal
from qtpy.QtGui import QFontMetrics
from spyder_kernels.comms.frontendcomm import CommError
from spyder_kernels.utils.pythonenv import PythonEnvInfo, PythonEnvType

# Local imports
from spyder.api.shellconnect.status import ShellConnectStatusBarWidget
from spyder.api.translations import _
from spyder.api.widgets.menus import SpyderMenu
from spyder.config.base import running_in_ci
from spyder.utils.qthelpers import add_actions, create_action
from spyder.utils.stylesheet import MAC, WIN


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -176,12 +181,20 @@ class PythonEnvironmentStatus(ShellConnectStatusBarWidget):

ID = 'pythonenv_status'
CONF_SECTION = 'ipython_console'
INTERACT_ON_CLICK = True

sig_interpreter_changed = Signal(str)

sig_open_preferences_requested = Signal()
"""
Signal to open the main interpreter preferences.
"""

def __init__(self, parent):
self._current_env_info: PythonEnvInfo | None = None
super().__init__(parent)
self.menu = SpyderMenu(self)
self.sig_clicked.connect(self.show_menu)

# ---- StatusBarWidget API
# -------------------------------------------------------------------------
Expand Down Expand Up @@ -255,3 +268,39 @@ def on_kernel_start(self, shellwidget):
else:
self.set_shellwidget(shellwidget)
self.show()

def show_menu(self):
"""Display a menu when clicking on the widget."""
self.menu.clear_actions()
text = _("Change default environment in Preferences...")
change_action = self.create_action(
"change_environment",
text=text,
triggered=self.open_interpreter_preferences,
register_action=False,
)
self.add_item_to_menu(change_action, self.menu)

x_offset = (
# Margin of menu items to left and right
2 * SpyderMenu.HORIZONTAL_MARGIN_FOR_ITEMS
# Padding of menu items to left and right
+ 2 * SpyderMenu.HORIZONTAL_PADDING_FOR_ITEMS
)
y_offset = 4 if MAC else (3 if WIN else 2)

metrics = QFontMetrics(self.font())
rect = self.contentsRect()
pos = self.mapToGlobal(
rect.topLeft()
+ QPoint(
-metrics.width(text) // 2 + x_offset,
-2 * self.parent().height() + y_offset,
)
)

self.menu.popup(pos)

def open_interpreter_preferences(self):
"""Request to open the main interpreter preferences."""
self.sig_open_preferences_requested.emit()

0 comments on commit 877513f

Please sign in to comment.