From b4d5445fbfeed62b88ec0bb1014166104dd4d8f2 Mon Sep 17 00:00:00 2001 From: Martin Baeuml Date: Wed, 14 Sep 2011 17:20:39 +0200 Subject: [PATCH] add cycleValuesOnKeypress parameter to BaseItem --- sloth/items/items.py | 55 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/sloth/items/items.py b/sloth/items/items.py index 6145057..a580cee 100644 --- a/sloth/items/items.py +++ b/sloth/items/items.py @@ -4,11 +4,19 @@ from PyQt4.Qt import * import logging LOG = logging.getLogger(__name__) +class IgnorePrefix: + def __init__(self, value): + self.value = value + def __str__(self): + return self.value + class BaseItem(QAbstractGraphicsShapeItem): """ Base class for visualization items. """ + cycleValuesOnKeypress = {} + def __init__(self, model_item=None, prefix="", parent=None): """ Creates a visualization item. @@ -154,6 +162,33 @@ class BaseItem(QAbstractGraphicsShapeItem): self.updateModel() return QAbstractGraphicsShapeItem.itemChange(self, change, value) + def keyPressEvent(self, event): + """ + This handles the value cycling as defined in cycleValuesOnKeypress. + """ + if str(event.text()) in self.cycleValuesOnKeypress: + itemkey, valuelist = self.cycleValuesOnKeypress[str(event.text())] + if isinstance(itemkey, IgnorePrefix): + itemkey = itemkey.value + else: + itemkey = self.prefix() + itemkey + if len(valuelist) > 0: + oldvalue = self._model_item.get(itemkey, None) + if oldvalue is None: + nextindex = 0 + else: + try: + nextindex = (valuelist.index(oldvalue)+1) % len(valuelist) + except ValueError: + nextindex = 0 + newvalue = valuelist[nextindex] + if newvalue is None and oldvalue is not None: + self._model_item.delete(itemkey) + else: + self._model_item[itemkey] = valuelist[nextindex] + self.dataChanged() + event.accept() + class PointItem(BaseItem): """ @@ -217,6 +252,7 @@ class PointItem(BaseItem): painter.drawEllipse(self.boundingRect()) def keyPressEvent(self, event): + BaseItem.keyPressEvent(self, event) step = 1 if event.modifiers() & Qt.ShiftModifier: step = 5 @@ -317,6 +353,7 @@ class RectItem(BaseItem): BaseItem.mouseReleaseEvent(self, event) def keyPressEvent(self, event): + BaseItem.keyPressEvent(self, event) step = 1 if event.modifiers() & Qt.ShiftModifier: step = 5 @@ -358,6 +395,10 @@ class GroupItem(BaseItem): return self.childrenBoundingRect() class OccludablePointItem(PointItem): + cycleValuesOnKeypress = { + 'o': ('occluded', [True, False]) + } + def __init__(self, *args, **kwargs): PointItem.__init__(self, *args, **kwargs) self.updateColor() @@ -372,17 +413,15 @@ class OccludablePointItem(PointItem): occluded = self._model_item[key] self.setColor(Qt.red if occluded else Qt.yellow) - def keyPressEvent(self, event): - PointItem.keyPressEvent(self, event) - if event.key() == Qt.Key_O: - occluded = not self._model_item.get(self.prefix() + 'occluded', False) - self._model_item[self.prefix() + 'occluded'] = occluded - self.updateColor() - event.accept() +class IDRectItem(RectItem): + cycleValuesOnKeypress = dict( + [('i', (IgnorePrefix('id'), range(10)))] + + [(str(i), (IgnorePrefix('id'), [i])) for i in range(10)] + ) class BBoxFaceItem(GroupItem): items = [ - (RectItem, "bbox"), + (IDRectItem, "bbox"), (OccludablePointItem, "lec"), (OccludablePointItem, "rec"), (OccludablePointItem, "mc"),