NEW options for LegendItem (#395)

* NEW options for LegendItem

* * changed 'drawFrame' into 'frame'
* added **kwargs to plotItem.addLegend
* added (frame=False, colCount=2) in legend example
* more elegant solution for legend.getLabel

* repaired getLabel
ItemSample.item == plotitem

Co-authored-by: Ogi Moore <ognyan.moore@gmail.com>
This commit is contained in:
Karl Georg Bedrich 2020-06-13 07:40:20 +02:00 committed by GitHub
parent e1f6c08365
commit 3a758cac96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 12 deletions

View File

@ -13,7 +13,7 @@ win = pg.plot()
win.setWindowTitle('pyqtgraph example: BarGraphItem') win.setWindowTitle('pyqtgraph example: BarGraphItem')
# # option1: only for .plot(), following c1,c2 for example----------------------- # # option1: only for .plot(), following c1,c2 for example-----------------------
# win.addLegend() # win.addLegend(frame=False, rowCount=1, colCount=2)
# bar graph # bar graph
x = np.arange(10) x = np.arange(10)

View File

@ -26,7 +26,7 @@ class LegendItem(GraphicsWidget, GraphicsWidgetAnchor):
""" """
def __init__(self, size=None, offset=None, horSpacing=25, verSpacing=0, pen=None, def __init__(self, size=None, offset=None, horSpacing=25, verSpacing=0, pen=None,
brush=None, labelTextColor=None, **kwargs): brush=None, labelTextColor=None, frame=True, rowCount=1, colCount=1, **kwargs):
""" """
============== =============================================================== ============== ===============================================================
**Arguments:** **Arguments:**
@ -60,6 +60,11 @@ class LegendItem(GraphicsWidget, GraphicsWidgetAnchor):
self.setLayout(self.layout) self.setLayout(self.layout)
self.items = [] self.items = []
self.size = size self.size = size
self.offset = offset
self.frame = frame
self.columnCount = colCount
self.rowCount = rowCount
self.curRow = 0
if size is not None: if size is not None:
self.setGeometry(QtCore.QRectF(0, 0, self.size[0], self.size[1])) self.setGeometry(QtCore.QRectF(0, 0, self.size[0], self.size[1]))
@ -160,13 +165,51 @@ class LegendItem(GraphicsWidget, GraphicsWidgetAnchor):
sample = item sample = item
else: else:
sample = ItemSample(item) sample = ItemSample(item)
row = self.layout.rowCount()
self.items.append((sample, label)) self.items.append((sample, label))
self.layout.addItem(sample, row, 0) self._addItemToLayout(sample, label)
self.layout.addItem(label, row, 1)
self.updateSize() self.updateSize()
def _addItemToLayout(self, sample, label):
col = self.layout.columnCount()
row = self.layout.rowCount()
if row:
row -= 1
nCol = self.columnCount*2
#FIRST ROW FULL
if col == nCol:
for col in range(0,nCol,2):
#FIND RIGHT COLUMN
if not self.layout.itemAt(row, col):
break
if col+2 == nCol:
#MAKE NEW ROW
col = 0
row += 1
self.layout.addItem(sample, row, col)
self.layout.addItem(label, row, col+1)
def setColumnCount(self, columnCount):
'''
change the orientation of all items of the legend
'''
if columnCount != self.columnCount:
self.columnCount = columnCount
self.rowCount = int(len(self.items)/columnCount)
for i in range(self.layout.count()-1,-1,-1):
self.layout.removeAt(i) #clear layout
for sample, label in self.items:
self._addItemToLayout(sample, label)
self.updateSize()
def getLabel(self, plotItem):
"""
return the labelItem inside the legend for a given plotItem
the label-text can be changed via labenItem.setText
"""
out = [(it, lab) for it, lab in self.items if it.item==plotItem]
try: return out[0][1]
except IndexError: return None
def removeItem(self, item): def removeItem(self, item):
""" """
Removes one item from the legend. Removes one item from the legend.
@ -198,16 +241,29 @@ class LegendItem(GraphicsWidget, GraphicsWidgetAnchor):
def updateSize(self): def updateSize(self):
if self.size is not None: if self.size is not None:
return return
height = 0
self.setGeometry(0, 0, 0, 0) width = 0
for row in range(self.layout.rowCount()):
row_height = 0
col_witdh = 0
for col in range(self.layout.columnCount()):
item = self.layout.itemAt(row, col)
if item:
col_witdh += item.width() + 3
row_height = max(row_height, item.height())
width = max(width, col_witdh)
height += row_height
self.setGeometry(0, 0, width, height)
return
def boundingRect(self): def boundingRect(self):
return QtCore.QRectF(0, 0, self.width(), self.height()) return QtCore.QRectF(0, 0, self.width(), self.height())
def paint(self, p, *args): def paint(self, p, *args):
p.setPen(self.opts['pen']) if self.frame:
p.setBrush(self.opts['brush']) p.setPen(self.opts['pen'])
p.drawRect(self.boundingRect()) p.setBrush(self.opts['brush'])
p.drawRect(self.boundingRect())
def hoverEvent(self, ev): def hoverEvent(self, ev):
ev.acceptDrags(QtCore.Qt.LeftButton) ev.acceptDrags(QtCore.Qt.LeftButton)

View File

@ -660,6 +660,7 @@ class PlotItem(GraphicsWidget):
Accepts the same arguments as :meth:`~pyqtgraph.LegendItem`. Accepts the same arguments as :meth:`~pyqtgraph.LegendItem`.
""" """
if self.legend is None: if self.legend is None:
self.legend = LegendItem(offset=offset, **kwargs) self.legend = LegendItem(offset=offset, **kwargs)
self.legend.setParentItem(self.vb) self.legend.setParentItem(self.vb)