Source code for spyder.api.widgets.dialogs

# -*- coding: utf-8 -*-
#
# Copyright © Spyder Project Contributors
# Licensed under the terms of the MIT License
# (see spyder/__init__.py for details)

"""
Spyder dialog widgets.
"""

# Third-party imports
from qtpy import QT6
from qtpy.QtCore import Qt
from qtpy.QtGui import QIcon
from qtpy.QtWidgets import QDialogButtonBox, QProxyStyle, QStyle

# Local imports
from spyder.utils.stylesheet import AppStyle


class _SpyderButtonsProxyStyle(QProxyStyle):
    """Style adjustments for SpyderDialogButtonBox."""

    def styleHint(self, hint, option=None, widget=None, return_data=None):
        if hint == QStyle.SH_DialogButtonLayout:
            # Use the Windows buttons layout to have a uniform layout in all
            # platforms. We selected that layout because Windows is our most
            # popular platform.
            # Solution found in https://stackoverflow.com/a/35907926/438386
            if QT6:  # PySide6/PyQt6
                return QDialogButtonBox.ButtonLayout.WinLayout.value
            else:  # PySide2/PyQt5
                return int(QDialogButtonBox.ButtonLayout.WinLayout)


        return super().styleHint(hint, option, widget, return_data)


[docs] class SpyderDialogButtonBox(QDialogButtonBox): """QDialogButtonBox widget for Spyder.""" def __init__(self, buttons=None, orientation=Qt.Horizontal, parent=None): if buttons: super().__init__(buttons, orientation, parent) elif orientation: super().__init__(orientation=orientation, parent=parent) else: super().__init__(parent=parent) # Don't display icons on standard buttons. This is a problem on Linux button_constants = [ QDialogButtonBox.Ok, QDialogButtonBox.Open, QDialogButtonBox.Save, QDialogButtonBox.Cancel, QDialogButtonBox.Close, QDialogButtonBox.Discard, QDialogButtonBox.Apply, QDialogButtonBox.Reset, QDialogButtonBox.RestoreDefaults, QDialogButtonBox.Help, QDialogButtonBox.SaveAll, QDialogButtonBox.Yes, QDialogButtonBox.YesToAll, QDialogButtonBox.No, QDialogButtonBox.NoToAll, QDialogButtonBox.Abort, QDialogButtonBox.Retry, QDialogButtonBox.Ignore, ] for constant in button_constants: button = self.button(constant) if button is not None: button.setIcon(QIcon()) # Set a reasonable spacing between buttons. This is a problem on Mac self.layout().setSpacing(2 * AppStyle.MarginSize) # Set style style = _SpyderButtonsProxyStyle(None) style.setParent(self) self.setStyle(style)