mirror of
https://github.com/wassname/sloth.git
synced 2026-07-12 15:17:13 +08:00
Implement new Inserter interface (closes #26)
This commit is contained in:
@@ -110,23 +110,24 @@ class AnnotationScene(QGraphicsScene):
|
||||
if item is not None:
|
||||
self.addItem(item)
|
||||
|
||||
def mode(self):
|
||||
return self.mode_
|
||||
def onInserterFinished(self):
|
||||
self.sender().inserterFinished.disconnect(self.onInserterFinished)
|
||||
self.inserter_ = None
|
||||
|
||||
def setMode(self, mode):
|
||||
print "setMode :", mode
|
||||
self.mode_ = mode
|
||||
|
||||
if self.mode_ == None:
|
||||
self.inserter_ = None
|
||||
return
|
||||
# Abort current inserter
|
||||
if self.inserter_ is not None:
|
||||
self.inserter_.abort()
|
||||
|
||||
inserter = self.inserterfactory_.create(self.mode_['type'], self)
|
||||
if inserter is None:
|
||||
raise InvalidArgumentException("Invalid mode")
|
||||
|
||||
self.inserter_ = inserter
|
||||
self.inserter_.setMode(self.mode_)
|
||||
# Add new inserter
|
||||
if mode is not None:
|
||||
inserter = self.inserterfactory_.create(mode['type'], self.labeltool_, self, mode)
|
||||
if inserter is None:
|
||||
raise InvalidArgumentException("Invalid mode")
|
||||
inserter.inserterFinished.connect(self.onInserterFinished)
|
||||
self.inserter_ = inserter
|
||||
|
||||
#
|
||||
# common methods
|
||||
|
||||
+32
-30
@@ -2,20 +2,15 @@ from PyQt4.QtGui import *
|
||||
from PyQt4.Qt import *
|
||||
import math
|
||||
|
||||
class ItemInserter:
|
||||
def __init__(self, scene, mode=None):
|
||||
self.scene_ = scene
|
||||
self.mode_ = mode
|
||||
class ItemInserter(QObject):
|
||||
# Signals
|
||||
inserterFinished = pyqtSignal()
|
||||
|
||||
def setScene(self, scene):
|
||||
self.scene_ = scene
|
||||
def scene(self):
|
||||
return self.scene_
|
||||
|
||||
def setMode(self, mode):
|
||||
self.mode_ = mode
|
||||
def mode(self):
|
||||
return self.mode_
|
||||
def __init__(self, labeltool, scene, default_properties=None):
|
||||
QObject.__init__(self)
|
||||
self.labeltool_ = labeltool
|
||||
self.scene_ = scene
|
||||
self.default_properties_ = default_properties
|
||||
|
||||
def mousePressEvent(self, event, image_item):
|
||||
event.accept()
|
||||
@@ -32,19 +27,23 @@ class ItemInserter:
|
||||
def allowOutOfSceneEvents(self):
|
||||
return False
|
||||
|
||||
def abort(self):
|
||||
self.inserterFinished.emit()
|
||||
|
||||
class PointItemInserter(ItemInserter):
|
||||
def mousePressEvent(self, event, image_item):
|
||||
pos = event.scenePos()
|
||||
ann = {'type': 'point',
|
||||
'x': pos.x(), 'y': pos.y()}
|
||||
ann.update(self.default_properties_)
|
||||
image_item.addAnnotation(ann)
|
||||
event.accept()
|
||||
|
||||
class RectItemInserter(ItemInserter):
|
||||
def __init__(self, scene, mode=None):
|
||||
ItemInserter.__init__(self, scene, mode)
|
||||
def __init__(self, labeltool, scene, default_properties=None):
|
||||
ItemInserter.__init__(self, labeltool, scene, default_properties)
|
||||
self.current_item_ = None
|
||||
self.init_pos_ = None
|
||||
self.init_pos_ = None
|
||||
|
||||
def mousePressEvent(self, event, image_item):
|
||||
pos = event.scenePos()
|
||||
@@ -52,7 +51,7 @@ class RectItemInserter(ItemInserter):
|
||||
item.setPen(Qt.red)
|
||||
self.current_item_ = item
|
||||
self.init_pos_ = pos
|
||||
self.scene().addItem(item)
|
||||
self.scene_.addItem(item)
|
||||
event.accept()
|
||||
|
||||
def mouseMoveEvent(self, event, image_item):
|
||||
@@ -71,9 +70,9 @@ class RectItemInserter(ItemInserter):
|
||||
ann = {'type': 'rect',
|
||||
'x': rect.x(), 'y': rect.y(),
|
||||
'width': rect.width(), 'height': rect.height()}
|
||||
ann.update(self.mode())
|
||||
ann.update(self.default_properties_)
|
||||
image_item.addAnnotation(ann)
|
||||
self.scene().removeItem(self.current_item_)
|
||||
self.scene_.removeItem(self.current_item_)
|
||||
self.current_item_ = None
|
||||
self.init_pos_ = None
|
||||
|
||||
@@ -82,17 +81,19 @@ class RectItemInserter(ItemInserter):
|
||||
def allowOutOfSceneEvents(self):
|
||||
return True
|
||||
|
||||
class FixedRatioRectItemInserter(RectItemInserter):
|
||||
def __init__(self, scene, mode=None):
|
||||
RectItemInserter.__init__(self, scene, mode)
|
||||
self.ratio_ = 1
|
||||
if mode is not None:
|
||||
self.ratio_ = float(mode.get('_ratio', 1))
|
||||
def abort(self):
|
||||
if self.current_item_ is not None:
|
||||
self.scene_.removeItem(self.current_item_)
|
||||
self.current_item_ = None
|
||||
self.init_pos_ = None
|
||||
ItemInserter.abort(self)
|
||||
|
||||
def setMode(self, mode):
|
||||
if mode is not None:
|
||||
self.ratio_ = float(mode.get('_ratio', 1))
|
||||
RectItemInserter.setMode(self, mode)
|
||||
class FixedRatioRectItemInserter(RectItemInserter):
|
||||
def __init__(self, labeltool, scene, default_properties=None):
|
||||
RectItemInserter.__init__(self, labeltool, scene, default_properties)
|
||||
self.ratio_ = 1
|
||||
if default_properties is not None:
|
||||
self.ratio_ = float(default_properties.get('_ratio', 1))
|
||||
|
||||
def mouseMoveEvent(self, event, image_item):
|
||||
if self.current_item_ is not None:
|
||||
@@ -110,6 +111,7 @@ class FixedRatioRectItemInserter(RectItemInserter):
|
||||
|
||||
event.accept()
|
||||
|
||||
# TODO
|
||||
class PolygonItemInserter(ItemInserter):
|
||||
def __init__(self, scene, mode=None):
|
||||
ItemInserter.__init__(self, scene, mode)
|
||||
@@ -120,7 +122,7 @@ class PolygonItemInserter(ItemInserter):
|
||||
if self.current_item_ is None:
|
||||
item = QGraphicsPolygonItem(QPolygonF([pos]))
|
||||
self.current_item_ = item
|
||||
self.scene().addItem(item)
|
||||
self.scene_.addItem(item)
|
||||
else:
|
||||
polygon = self.current_item_.polygon()
|
||||
polygon.append(pos)
|
||||
|
||||
Reference in New Issue
Block a user