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 @@ -62,10 +62,16 @@ &Shortcuts + + + &Options + + +