Source code for ccpn.ui.gui.widgets.DialogButtonBox

"""
Module Documentation here
"""
#=========================================================================================
# Licence, Reference and Credits
#=========================================================================================
__copyright__ = "Copyright (C) CCPN project (http://www.ccpn.ac.uk) 2014 - 2021"
__credits__ = ("Ed Brooksbank, Joanna Fox, Victoria A Higman, Luca Mureddu, Eliza Płoskoń",
               "Timothy J Ragan, Brian O Smith, Gary S Thompson & Geerten W Vuister")
__licence__ = ("CCPN licence. See http://www.ccpn.ac.uk/v3-software/downloads/license")
__reference__ = ("Skinner, S.P., Fogh, R.H., Boucher, W., Ragan, T.J., Mureddu, L.G., & Vuister, G.W.",
                 "CcpNmr AnalysisAssign: a flexible platform for integrated NMR analysis",
                 "J.Biomol.Nmr (2016), 66, 111-124, http://doi.org/10.1007/s10858-016-0060-y")
#=========================================================================================
# Last code modification
#=========================================================================================
__modifiedBy__ = "$modifiedBy: Ed Brooksbank $"
__dateModified__ = "$dateModified: 2021-05-26 19:50:50 +0100 (Wed, May 26, 2021) $"
__version__ = "$Revision: 3.0.4 $"
#=========================================================================================
# Created
#=========================================================================================
__author__ = "$Author: Ed Brooksbank $"
__date__ = "$Date: 2020-05-26 14:50:42 +0000 (Tue, May 26, 2020) $"
#=========================================================================================
# Start of code
#=========================================================================================

from PyQt5 import QtCore, QtWidgets
from ccpn.ui.gui.widgets.Base import Base
from ccpn.ui.gui.widgets.Icon import Icon
from operator import or_
from functools import reduce
from ccpn.ui.gui.widgets.Font import setWidgetFont


[docs]class DialogButtonBox(QtWidgets.QDialogButtonBox, Base): def __init__(self, parent=None, buttons=None, callbacks=None, texts=None, tipTexts=None, icons=None, enabledStates=None, visibleStates=None, defaultButton=None, enableIcons=False, orientation='horizontal', **kwds): super().__init__(parent) Base._init(self, **kwds) self._parent = parent buttons = buttons or [] if not isinstance(buttons, (tuple, list)): raise TypeError('Error, buttons must be tuple/list') N = len(buttons) callbacks = callbacks or [] texts = texts or [] tipTexts = tipTexts or [] icons = icons or [] enabledStates = enabledStates or [] visibleStates = visibleStates or [] if not isinstance(callbacks, (tuple, list)): raise TypeError('Error, callbacks must be tuple/list') callbacks = (list(callbacks) + N * [None])[:N] if not isinstance(texts, (tuple, list)): raise TypeError('Error, texts must be tuple/list') texts = (list(texts) + N * [None])[:N] if not isinstance(tipTexts, (tuple, list)): raise TypeError('Error, tipTexts must be tuple/list') tipTexts = (list(tipTexts) + N * [None])[:N] if not isinstance(icons, (tuple, list)): raise TypeError('Error, icons must be tuple/list') icons = (list(icons) + N * [None])[:N] if not isinstance(enabledStates, (tuple, list)): raise TypeError('Error, enabledStates must be tuple/list') enabledStates = (list(enabledStates) + N * [None])[:N] if not isinstance(visibleStates, (tuple, list)): raise TypeError('Error, visibleStates must be tuple/list') visibleStates = (list(visibleStates) + N * [None])[:N] if defaultButton is not None and defaultButton not in buttons: raise TypeError("Error, defaultButton not in buttons") if not isinstance(orientation, str): raise TypeError("Error, orientation must be str: 'h' or 'v'") self.setStyleSheet('QPushButton { padding: 0px 8px 0px 8px; }') if 'h' in orientation.lower(): self.setOrientation(QtCore.Qt.Horizontal) else: self.setOrientation(QtCore.Qt.Vertical) self._userButtonDict = {} if buttons: # set the standard buttons - will be in OS specific order buttonTypes = reduce(or_, [btn for btn in buttons if not isinstance(btn, str)]) self.setStandardButtons(buttonTypes) for button in [btn for btn in buttons if isinstance(btn, str)]: # add 'AcceptRole' buttons for user defined buttons - store in user dict newButton = self.addButton(button, QtWidgets.QDialogButtonBox.AcceptRole) self._userButtonDict[button] = newButton if callbacks: for button, callback, text, tipText, icon, enabledState, visibleState in \ zip(buttons, callbacks, texts, tipTexts, icons, enabledStates, visibleStates): thisButton = self.button(button) if thisButton: if callback is not None: thisButton.clicked.connect(callback) if text is not None: thisButton.setText(text) if not text: # reduce the padding to give a better shape thisButton.setStyleSheet('QPushButton { padding: 0px 2px 0px 2px; }') if tipText is not None: thisButton.setToolTip(tipText) if enableIcons and icon is not None: # filename or pixmap thisButton.setIcon(Icon(icon)) # NOTE: sometimes this causes the button to reset its stylesheet thisButton.setIconSize(QtCore.QSize(22, 22)) if enabledState is not None: thisButton.setEnabled(enabledState) if visibleState is not None: thisButton.setVisible(visibleState) thisButton.setMinimumHeight(24) setWidgetFont(thisButton, ) if defaultButton is not None: self._parent.setDefaultButton(self.button(defaultButton))
[docs] def button(self, which: 'QtWidgets.QDialogButtonBox.StandardButton') -> QtWidgets.QPushButton: # subclass 'button' to allow searching for user buttons in _userButtonDict before standardButtons return (self._userButtonDict.get(which) if isinstance(which, str) else None) or super().button(which)