mirror of
https://github.com/wassname/sloth.git
synced 2026-07-16 11:21:45 +08:00
Add fit-to-window mode and shortcut
This commit is contained in:
@@ -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'),
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>656</width>
|
||||
<height>25</height>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuFile">
|
||||
@@ -62,10 +62,16 @@
|
||||
<string>&Shortcuts</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuOptions">
|
||||
<property name="title">
|
||||
<string>&Options</string>
|
||||
</property>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menu_Edit"/>
|
||||
<addaction name="menuShortcuts"/>
|
||||
<addaction name="menu_Views"/>
|
||||
<addaction name="menuOptions"/>
|
||||
<addaction name="menuPlugins"/>
|
||||
<addaction name="menu_Help"/>
|
||||
</widget>
|
||||
|
||||
Reference in New Issue
Block a user