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

#=========================================================================================
# Licence, Reference and Credits
#=========================================================================================
__copyright__ = "Copyright (C) CCPN project (http://www.ccpn.ac.uk) 2014 - 2019"
__credits__ = ("Ed Brooksbank, Luca Mureddu, Timothy J Ragan & 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: CCPN $"
__dateModified__ = "$dateModified: 2017-07-07 16:32:55 +0100 (Fri, July 07, 2017) $"
__version__ = "$Revision: 3.0.0 $"
#=========================================================================================
# Created
#=========================================================================================
__author__ = "$Author: Luca Mureddu $"
__date__ = "$Date: 2017-04-07 10:28:41 +0000 (Fri, April 07, 2017) $"
#=========================================================================================
# Start of code
#=========================================================================================

from PyQt5 import QtGui, QtWidgets, QtCore
from ccpn.ui.gui.widgets.Base import Base
from ccpn.ui.gui.widgets.CheckBox import CheckBox
from ccpn.ui.gui.widgets.Widget import Widget


CHECKED = QtCore.Qt.Checked
UNCHECKED = QtCore.Qt.Unchecked


[docs]class CheckBoxes(Widget): def __init__(self, parent, texts=None, selectedInd=None, exclusive=False, selectAll=None, deselectAll=None, callback=None, direction='h', tipTexts=None, **kwds): super().__init__(parent, setLayout=True, **kwds) if texts is None: texts = [] self.texts = texts direction = direction.lower() checkBoxGroup = self.checkBoxGroup = QtWidgets.QButtonGroup(self) self.isExclusive = exclusive checkBoxGroup.setExclusive(self.isExclusive) if not tipTexts: tipTexts = [None] * len(texts) self.checkBoxes = [] self.setCheckBoxes(texts, selectedInd, direction, tipTexts) checkBoxGroup.buttonClicked.connect(self._callback) self.setCallback(callback) if selectAll: self.selectAll() if deselectAll: self.deselectAll()
[docs] def setCheckBoxes(self, texts=None, selectedInd=None, direction='h', tipTexts=None): """Change the checkBoxes in the checkBox group """ # clear the original checkBoxs selected = self.getSelectedText() for btn in self.checkBoxes: self.checkBoxGroup.removeButton(btn) btn.deleteLater() self.checkBoxes = [] # exit if there are none to define if not texts: return # rebuild the checkBox list for i, text in enumerate(texts): if 'h' in direction: grid = (0, i) else: grid = (i, 0) checkBox = CheckBox(self, text=text, tipText=tipTexts[i], grid=grid, hAlign='r') self.checkBoxes.append(checkBox) self.checkBoxGroup.addButton(checkBox) self.checkBoxGroup.setId(checkBox, i) self.texts = texts if selectedInd is not None: if selectedInd < len(self.checkBoxes): self.checkBoxes[selectedInd].setChecked(True) elif selected and selected in self.texts: self.set(selected) elif self.checkBoxes: self.checkBoxes[0].setChecked(True)
[docs] def getCheckBox(self, text): for rb in self.checkBoxes: if rb.text() == text: return rb
[docs] def get(self): return self.texts[self.getIndex()]
[docs] def getIndex(self): return self.checkBoxes.index(self.checkBoxGroup.checkedCheckBox())
@property def isChecked(self): return self.checkBoxGroup.checkedCheckBox() is not None
[docs] def set(self, text): i = self.texts.index(text) self.setIndex(i)
[docs] def getSelectedIndexes(self): return [ii for ii, checkBox in enumerate(self.checkBoxes) if checkBox.isChecked()]
[docs] def getSelectedText(self): return [checkBox.text() for checkBox in self.checkBoxes if checkBox.isChecked()]
# for checkBox in self.checkBoxes: # if checkBox.isChecked(): # name = checkBox.text() # if name: # return name
[docs] def setIndex(self, i): if len(self.checkBoxes) > i: self.checkBoxes[i].setChecked(True)
[docs] def clearIndex(self, i): if len(self.checkBoxes) > i: self.checkBoxes[i].setChecked(False)
[docs] def deselectAll(self): self.checkBoxGroup.setExclusive(False) for i in self.checkBoxes: i.setChecked(False) self.checkBoxGroup.setExclusive(self.isExclusive)
[docs] def selectAll(self): self.checkBoxGroup.setExclusive(False) for i in self.checkBoxes: i.setChecked(True) self.checkBoxGroup.setExclusive(self.isExclusive)
[docs] def setChecked(self, value): self.checkBoxGroup.setExclusive(False) for i in self.checkBoxes: i.setChecked(value) self.checkBoxGroup.setExclusive(self.isExclusive)
[docs] def setCallback(self, callback): self.callback = callback
def _callback(self, checkBox): if self.callback and checkBox: # checkBox = self.checkBoxGroup.checkBoxs[ind] self.callback()
[docs] def setSelectedByText(self, texts, checkFlag, presetAll=True): if presetAll: self.setChecked(not checkFlag) self.checkBoxGroup.setExclusive(False) for checkBox in self.checkBoxes: if checkBox.text() in texts: checkBox.setChecked(checkFlag) self.checkBoxGroup.setExclusive(self.isExclusive)
if __name__ == '__main__': from ccpn.ui.gui.widgets.Application import TestApplication from ccpn.ui.gui.widgets.BasePopup import BasePopup from ccpn.ui.gui.popups.Dialog import CcpnDialog def testCallback(): print('TEST') app = TestApplication() popup = CcpnDialog(windowTitle='Test checkBoxes', setLayout=True) checkBoxGroup = QtWidgets.QButtonGroup(popup) # checkBoxes = CheckBoxes(parent=popup, # callback=testCallback, grid=(0, 0)) for i in range(10): checkBox = CheckBox(popup, text='TEST', grid=(i, 0), callback=None) # partial(self.assignSelect checkBoxGroup.addCheckBox(checkBox) popup.raise_() popup.exec() app.start()