diff --git a/sloth/conf/default_config.py b/sloth/conf/default_config.py
index 7b3552f..bc5dbb8 100644
--- a/sloth/conf/default_config.py
+++ b/sloth/conf/default_config.py
@@ -74,6 +74,7 @@ HOTKEYS = (
('PgUp', lambda lt: lt.gotoPrevious(), 'Previous image/frame'),
('Tab', lambda lt: lt.selectNextAnnotation(), 'Select next annotation'),
('Shift+Tab', lambda lt: lt.selectPreviousAnnotation(), 'Select previous annotation'),
+ ('Ctrl+f', lambda lt: lt.view().fitInView(), 'Fit current image/frame into window'),
('Del', lambda lt: lt.deleteSelectedAnnotations(), 'Delete selected annotations'),
('ESC', lambda lt: lt.exitInsertMode(), 'Exit insert mode'),
('Shift+l', lambda lt: lt.currentImage().setUnlabeled(False), 'Mark current image as labeled'),
diff --git a/sloth/core/labeltool.py b/sloth/core/labeltool.py
index ab783e3..b9f51b8 100755
--- a/sloth/core/labeltool.py
+++ b/sloth/core/labeltool.py
@@ -378,6 +378,12 @@ class LabelTool(QObject):
else:
return self._mainwindow.scene
+ def view(self):
+ if self._mainwindow is None:
+ return None
+ else:
+ return self._mainwindow.view
+
def selectNextAnnotation(self):
if self._mainwindow is not None:
return self._mainwindow.scene.selectNextItem()
diff --git a/sloth/gui/annotationscene.py b/sloth/gui/annotationscene.py
index c7ae31b..b332691 100644
--- a/sloth/gui/annotationscene.py
+++ b/sloth/gui/annotationscene.py
@@ -16,6 +16,7 @@ class AnnotationScene(QGraphicsScene):
self.model_ = None
self.image_item_ = None
self.inserter_ = None
+ self.scene_item_ = None
self.message_ = ""
self.labeltool_ = labeltool
@@ -56,6 +57,9 @@ class AnnotationScene(QGraphicsScene):
# reset caches, invalidate root
self.reset()
+ def sceneItem(self):
+ return self.scene_item_
+
def setCurrentImage(self, current_image):
"""
Set the index of the model which denotes the current image to be
@@ -75,10 +79,10 @@ class AnnotationScene(QGraphicsScene):
assert self.image_item_.model() == self.model_
self.image_ = self.labeltool_.getImage(self.image_item_)
self.pixmap_ = QPixmap(toQImage(self.image_))
- item = QGraphicsPixmapItem(self.pixmap_)
- item.setZValue(-1)
+ self.scene_item_ = QGraphicsPixmapItem(self.pixmap_)
+ self.scene_item_.setZValue(-1)
self.setSceneRect(0, 0, self.pixmap_.width(), self.pixmap_.height())
- self.addItem(item)
+ self.addItem(self.scene_item_)
self.insertItems(0, len(self.image_item_.children())-1)
self.update()
@@ -133,6 +137,10 @@ class AnnotationScene(QGraphicsScene):
self.setCurrentImage(None)
self.clearMessage()
+ def clear(self):
+ QGraphicsScene.clear(self)
+ self.scene_item_ = None
+
def addItem(self, item):
QGraphicsScene.addItem(self, item)
# TODO emit signal itemAdded
diff --git a/sloth/gui/frameviewer.py b/sloth/gui/frameviewer.py
index c8676f5..c1e63f5 100644
--- a/sloth/gui/frameviewer.py
+++ b/sloth/gui/frameviewer.py
@@ -28,6 +28,20 @@ class GraphicsView(QGraphicsView):
self._panStartX = -1
self._panStartY = -1
+ def fitInView(self):
+ if self.scene() is None:
+ return
+ si = self.scene().sceneItem()
+ if si is None:
+ return
+
+ old_scale = self.getScale()
+ QGraphicsView.fitInView(self, si, Qt.KeepAspectRatio)
+ new_scale = self.getScale()
+
+ if new_scale != old_scale:
+ self.scaleChanged.emit(new_scale)
+
def setScene(self, scene):
QGraphicsView.setScene(self, scene)
#self.setScaleAbsolute(1)
diff --git a/sloth/gui/labeltool.py b/sloth/gui/labeltool.py
index 9b350ec..231be74 100755
--- a/sloth/gui/labeltool.py
+++ b/sloth/gui/labeltool.py
@@ -62,6 +62,8 @@ class MainWindow(QMainWindow):
def onCurrentImageChanged(self):
new_image = self.labeltool.currentImage()
self.scene.setCurrentImage(new_image)
+ if self.options["Fit-to-window mode"].isChecked():
+ self.view.fitInView()
self.treeview.scrollTo(new_image.index())
img = self.labeltool.getImage(new_image)
@@ -101,6 +103,14 @@ class MainWindow(QMainWindow):
self.ui.menuShortcuts.addAction(hk)
self.shortcuts.append(hk)
+ def initOptions(self):
+ self.options = {}
+ for o in ["Fit-to-window mode"]:
+ action = QAction(o, self)
+ action.setCheckable(True)
+ self.ui.menuOptions.addAction(action)
+ self.options[o] = action
+
###
### GUI/Application setup
###___________________________________________________________________________________________
@@ -142,6 +152,7 @@ class MainWindow(QMainWindow):
self.setCentralWidget(self.central_widget)
self.initShortcuts(config.HOTKEYS)
+ self.initOptions()
self.treeview = AnnotationTreeView()
self.treeview.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
diff --git a/sloth/gui/labeltool.ui b/sloth/gui/labeltool.ui
index 356a59b..3b66436 100644
--- a/sloth/gui/labeltool.ui
+++ b/sloth/gui/labeltool.ui
@@ -20,7 +20,7 @@
0
0
656
- 25
+ 21
+
+