forked from video-annotator/pythonvideoannotator
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbase_module.py
More file actions
163 lines (113 loc) · 4.91 KB
/
Copy pathbase_module.py
File metadata and controls
163 lines (113 loc) · 4.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#! /usr/bin/python2
# -*- coding: utf-8 -*-
import os, AnyQt
from pyforms import conf
from pyforms import BaseWidget
from pyforms.controls import ControlPlayer
from pyforms.controls import ControlFile
from pyforms.controls import ControlEventTimeline
from pyforms.controls import ControlDockWidget
from pythonvideoannotator_models_gui.models import Project
from pythonvideoannotator_models_gui.dialogs.dialog import Dialog
if conf.PYFORMS_MODE=='GUI':
from AnyQt import QtGui, QtCore
from AnyQt.QtWidgets import QApplication, QFileDialog, QMessageBox
def Exit(): exit()
class BaseModule(BaseWidget):
"""Application form"""
def __init__(self):
global conf;
conf += 'pythonvideoannotator.resources' # Resources can only be loaded after pyqt is running
super(BaseModule, self).__init__('Video annotation editor')
self._project = Project(parent=self)
Dialog.project = self._project
self._player = ControlPlayer("Player")
self._time = ControlEventTimeline('Time')
self._dock = ControlDockWidget("Timeline", side='bottom', order=1, margin=5)
self.formset = ['_player']
self._dock.value = self._time
self._player.process_frame_event = self.process_frame_event
self._player.click_event = self.on_player_click_event
self._time.key_release_event = self.__timeline_key_release_event
self.load_order = []
self.mainmenu.insert(0,
{'File': [
{'Open': self.__open_project_event, 'icon': conf.ANNOTATOR_ICON_OPEN},
'-',
{'Save': self.__save_project_event , 'icon': conf.ANNOTATOR_ICON_SAVE},
{'Save as': self.__save_project_as_event, 'icon': conf.ANNOTATOR_ICON_SAVE},
'-',
{'Exit': QApplication.closeAllWindows, 'icon': conf.ANNOTATOR_ICON_EXIT}
] }
)
self.mainmenu.insert(1, {'Modules': []} )
self.mainmenu.insert(2, {'Windows': []} )
######################################################################################
#### FUNCTIONS #######################################################################
######################################################################################
def init_form(self):
super(BaseModule, self).init_form()
if conf.CHART_FILE_PATH: self._time.import_chart(*conf.CHART_FILE_PATH)
if conf.PROJECT_PATH: self.load_project(conf.PROJECT_PATH)
######################################################################################
#### IO FUNCTIONS ####################################################################
######################################################################################
def save(self, data, project_path=None):
self._project.save(data, project_path)
return data
def load(self, data, project_path=None):
self._project.load(data, project_path)
def save_project(self, project_path=None):
try:
if project_path is None:
project_path = QFileDialog.getExistingDirectory(self, "Select the project directory")
if project_path is not None and str(project_path)!='':
project_path = str(project_path)
self.save({}, project_path)
except Exception as e:
QMessageBox.critical(self, "Error", str(e))
def load_project(self, project_path=None):
if project_path is None:
project_path = QFileDialog.getExistingDirectory(self, "Select the project directory")
if project_path is not None and str(project_path)!='':
self.load({}, str(project_path) )
######################################################################################
#### EVENTS ##########################################################################
######################################################################################
def on_player_click_event(self, event, x, y):
"""
Code to select a blob with the mouse
"""
super(VideoAnnotationEditor, self).on_player_click_event(event, x, y)
self._player.refresh()
def process_frame_event(self, frame):
"""
Function called before render each frame
"""
return frame
def __open_project_event(self): self.load_project()
def __save_project_event(self): self.save_project(self._project.directory)
def __save_project_as_event(self): self.save_project()
def __timeline_key_release_event(self, event):
"""
Control video playback using the space bar to Play/Pause
"""
if event.key() == QtCore.Qt.Key_Space:
self._player.stop() if self._player.is_playing else _player._video.play()
######################################################################################
#### PROPERTIES ######################################################################
######################################################################################
@property
def timeline(self): return self._time
@property
def player(self): return self._player
@property
def video(self): return self._player.value
@video.setter
def video(self, value):
self._player.value = value
self._player.enabled = value is not None
if value:
self._time.max = self._player.max
@property
def project(self): return self._project