#=========================================================================================
# 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()