Legends can be dragged by user

This commit is contained in:
Luke Campagnola 2013-05-28 18:47:33 -04:00
parent 7a7288b6b3
commit ba31b3d7ba
2 changed files with 54 additions and 3 deletions

View File

@ -48,6 +48,51 @@ class GraphicsWidgetAnchor(object):
self.__offset = offset self.__offset = offset
self.__geometryChanged() self.__geometryChanged()
def autoAnchor(self, pos, relative=True):
"""
Set the position of this item relative to its parent by automatically
choosing appropriate anchor settings.
If relative is True, one corner of the item will be anchored to
the appropriate location on the parent with no offset. The anchored
corner will be whichever is closest to the parent's boundary.
If relative is False, one corner of the item will be anchored to the same
corner of the parent, with an absolute offset to achieve the correct
position.
"""
pos = Point(pos)
br = self.mapRectToParent(self.boundingRect()).translated(pos - self.pos())
pbr = self.parentItem().boundingRect()
anchorPos = [0,0]
parentPos = Point()
itemPos = Point()
if abs(br.left() - pbr.left()) < abs(br.right() - pbr.right()):
anchorPos[0] = 0
parentPos[0] = pbr.left()
itemPos[0] = br.left()
else:
anchorPos[0] = 1
parentPos[0] = pbr.right()
itemPos[0] = br.right()
if abs(br.top() - pbr.top()) < abs(br.bottom() - pbr.bottom()):
anchorPos[1] = 0
parentPos[1] = pbr.top()
itemPos[1] = br.top()
else:
anchorPos[1] = 1
parentPos[1] = pbr.bottom()
itemPos[1] = br.bottom()
if relative:
relPos = [(itemPos[0]-pbr.left()) / pbr.width(), (itemPos[1]-pbr.top()) / pbr.height()]
self.anchor(anchorPos, relPos)
else:
offset = itemPos - parentPos
self.anchor(anchorPos, anchorPos, offset)
def __geometryChanged(self): def __geometryChanged(self):
if self.__parent is None: if self.__parent is None:
return return

View File

@ -101,7 +101,6 @@ class LegendItem(GraphicsWidget, GraphicsWidgetAnchor):
label.close() label.close()
self.updateSize() # redraq box self.updateSize() # redraq box
def updateSize(self): def updateSize(self):
if self.size is not None: if self.size is not None:
return return
@ -124,6 +123,13 @@ class LegendItem(GraphicsWidget, GraphicsWidgetAnchor):
p.setBrush(fn.mkBrush(100,100,100,50)) p.setBrush(fn.mkBrush(100,100,100,50))
p.drawRect(self.boundingRect()) p.drawRect(self.boundingRect())
def hoverEvent(self, ev):
ev.acceptDrags(QtCore.Qt.LeftButton)
def mouseDragEvent(self, ev):
if ev.button() == QtCore.Qt.LeftButton:
dpos = ev.pos() - ev.lastPos()
self.autoAnchor(self.pos() + dpos)
class ItemSample(GraphicsWidget): class ItemSample(GraphicsWidget):
def __init__(self, item): def __init__(self, item):