"""
Module Documentation here
"""
#=========================================================================================
# Licence, Reference and Credits
#=========================================================================================
__copyright__ = "Copyright (C) CCPN project (https://www.ccpn.ac.uk) 2014 - 2022"
__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 https://ccpn.ac.uk/software/licensing/")
__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: 2022-03-17 13:59:51 +0000 (Thu, March 17, 2022) $"
__version__ = "$Revision: 3.1.0 $"
#=========================================================================================
# Created
#=========================================================================================
__author__ = "$Author: CCPN $"
__date__ = "$Date: 2018-12-20 15:44:35 +0000 (Thu, December 20, 2018) $"
#=========================================================================================
# Start of code
#=========================================================================================
import pandas as pd
from ccpn.ui.gui.widgets.Label import Label
from ccpn.ui.gui.widgets.Frame import Frame
from ccpn.ui.gui.widgets.Spacer import Spacer
from ccpn.ui.gui.popups.Dialog import CcpnDialogMainWidget
from ccpn.ui.gui.widgets.CheckBox import CheckBox
from ccpn.core.lib.DataFrameObject import DataFrameObject
[docs]class ColumnViewSettingsPopup(CcpnDialogMainWidget):
FIXEDHEIGHT = False
FIXEDWIDTH = True
USESCROLLWIDGET = True
def __init__(self, table, dataFrameObject=None, parent=None, hiddenColumns=None, title='Column Settings', **kwds):
super().__init__(parent, setLayout=True, windowTitle=title, minimumSize=(250, 250), **kwds)
self.table = table
# self.dataFrameObject = dataFrameObject
self.widgetColumnViewSettings = ColumnViewSettings(self.mainWidget, table=table,
dfObject=dataFrameObject,
hiddenColumns=hiddenColumns, grid=(0, 0))
self.setCloseButton(callback=self._close, tipText='Close')
self.setDefaultButton(self.CLOSEBUTTON)
self.__postInit__()
[docs] def getHiddenColumns(self):
return self.widgetColumnViewSettings._getHiddenColumns()
[docs] def setHiddenColumns(self, texts):
self.widgetColumnViewSettings._hiddenColumns = texts
def _close(self):
"""Save the hidden columns to the table class. So it remembers when you open again the popup
"""
hiddenColumns = self.getHiddenColumns()
# self.dataFrameObject.hiddenColumns = hiddenColumns
self.table.setHiddenColumns(hiddenColumns, False)
self.reject()
return hiddenColumns
SEARCH_MODES = ['Literal', 'Case Sensitive Literal', 'Regular Expression']
CheckboxTipText = 'Select column to be visible on the table.'
[docs]class ColumnViewSettings(Frame):
""" hide show check boxes corresponding to the table columns """
def __init__(self, parent=None, table=None, dfObject=None, direction='v', hiddenColumns=None, **kwds):
super().__init__(parent, setLayout=True, **kwds)
self.direction = direction
# only need the pd.DataFrame
if isinstance(dfObject, DataFrameObject):
self._df = dfObject.dataFrame
elif isinstance(dfObject, pd.DataFrame):
self._df = dfObject
else:
raise ValueError('dfObject is the wrong type')
self.table = table
self.checkBoxes = []
self._hideColumnWidths = {}
self.filterLabel = Label(self, text='Display Columns', grid=(0, 0))
self.widgetFrame = Frame(self, setLayout=True, margins=(5, 5, 5, 5), grid=(1, 0))
Spacer(self, 5, 5, 'fixed', 'expanding', grid=(2, 0))
self._hiddenColumns = hiddenColumns or []
self.initCheckBoxes()
[docs] def initCheckBoxes(self):
# columns = self._dfObject.headings # self.table._columns
columns = list(self._df.columns)
hiddenColumns = self._hiddenColumns or []
if columns:
for i, colum in enumerate(columns):
# always ignore the _internal columns
if colum not in self.table._internalColumns:
if self.direction == 'v':
i += 1
cb = CheckBox(self.widgetFrame, text=colum, grid=(i, 1), callback=self.checkBoxCallBack,
checked=True if colum not in hiddenColumns else False,
hAlign='l', tipText=CheckboxTipText, )
else:
cb = CheckBox(self.widgetFrame, text=colum, grid=(1, i), callback=self.checkBoxCallBack,
checked=True if colum not in hiddenColumns else False,
hAlign='l', tipText=CheckboxTipText, )
self.checkBoxes.append(cb)
def _getHiddenColumns(self):
return self._hiddenColumns
[docs] def checkBoxCallBack(self):
currentCheckBox = self.sender()
name = currentCheckBox.text()
# i = self._dfObject.headings.index(name)
i = list(self._df.columns).index(name)
checkedBoxes = []
for checkBox in self.checkBoxes:
checkBox.setEnabled(True)
if checkBox.isChecked():
checkedBoxes.append(checkBox)
if len(checkedBoxes) > 0:
if currentCheckBox.isChecked():
self._showColumn(i, name)
else:
self._hideColumn(i, name)
else:
# always display at least one columns, disables the last checkbox
currentCheckBox.setEnabled(False)
currentCheckBox.setChecked(True)
def _hideColumn(self, i, name):
self.table.hideColumn(i)
if not name in self._hiddenColumns:
self._hiddenColumns.append(name)
def _showColumn(self, i, name):
self.table.showColumn(i)
self.table.resizeColumnToContents(i)
if name in self._hiddenColumns:
self._hiddenColumns.remove(name)
[docs] def showColumns(self):
# show/hide the columns in the list
columns = self.table.columnTexts
for i, colName in enumerate(columns):
if colName in self._hiddenColumns:
self._hideColumn(i, colName)
else:
self._showColumn(i, colName)