@@ -87,6 +87,8 @@ def capture(self, _, __):
87
87
frame_file = self .ProMan .frames_folder / f"{ len (list (self .ProMan .frames_folder .glob ('*.png' ))):06d} .png"
88
88
cv2 .imwrite (str (frame_file ), frame ) # Fix: Convert Path to string
89
89
90
+ self .refetch_frames_list ()
91
+
90
92
def render_capture (self ):
91
93
if not (self .isInitCap and self .isopenProject ):
92
94
return
@@ -102,6 +104,28 @@ def render_capture(self):
102
104
texture_data = np .true_divide (data , 255.0 ) # Normalize to [0, 1]
103
105
dpg .set_value ("texture_preview" , texture_data )
104
106
107
+ def refetch_frames_list (self ):
108
+ if not self .isopenProject :
109
+ return
110
+
111
+ frames = self .ProMan .list_frames ()
112
+
113
+ for frame in frames :
114
+ frame_name = frame .name
115
+ frame_path = frame
116
+
117
+ with dpg .texture_registry ():
118
+ width , height , channels , data = dpg .load_image (str (frame_path ))
119
+
120
+ try :
121
+ dpg .add_raw_texture (width , height , data , format = dpg .mvFormat_Float_rgb , tag = f"frame_texture_{ frame_name } " )
122
+ except Exception as e :
123
+ continue
124
+
125
+ with dpg .group (horizontal = True , parent = "frames_window_group" ):
126
+ dpg .add_image (f"frame_texture_{ frame_name } " )
127
+ dpg .add_button (label = "Delete" , callback = lambda _ , __ : frame_path .unlink (), tag = f"frame_delete_{ frame_name } " )
128
+
105
129
def create_project (self , _ , __ ):
106
130
project_name = dpg .get_value ("new_project_name" )
107
131
project_fps = dpg .get_value ("new_project_fps" )
@@ -121,16 +145,19 @@ def create_project(self, _, __):
121
145
try :
122
146
self .ProMan .create_project ()
123
147
self .isopenProject = True
148
+ self .refetch_frames_list ()
124
149
Thread (target = self .start_camera ).start ()
125
150
except Exception as e :
126
151
dpg .show_item ("dialog_window" )
127
152
dpg .set_value ("dialog_window_title" , "can't create project" )
128
153
dpg .set_value ("dialog_window_text" , str (traceback .format_exc ()))
129
154
155
+
130
156
def open_project (self , _ , data ):
131
157
try :
132
158
self .ProMan = ProjectManager .load_project (data ["file_path_name" ])
133
159
self .isopenProject = True
160
+ self .refetch_frames_list ()
134
161
Thread (target = self .start_camera ).start ()
135
162
except Exception as e :
136
163
dpg .show_item ("dialog_window" )
@@ -195,7 +222,7 @@ def init(self):
195
222
196
223
raw_data = array .array ("f" , texture_data )
197
224
198
- with dpg .texture_registry ():
225
+ with dpg .texture_registry (show = True ):
199
226
dpg .add_raw_texture (self .preview_size [0 ], self .preview_size [1 ], raw_data , format = dpg .mvFormat_Float_rgb , tag = "texture_preview" )
200
227
dpg .add_raw_texture (self .preview_size [0 ], self .preview_size [1 ], raw_data , format = dpg .mvFormat_Float_rgb , tag = "texture_playback" )
201
228
@@ -244,6 +271,10 @@ def render(self):
244
271
245
272
dpg .configure_item ("effect_window" , width = window_width , height = effect_height , pos = (0 , effect_y ))
246
273
274
+ # Frames window height at the full right side of the viewport
275
+ frames_width = viewport_width - window_width
276
+ dpg .configure_item ("frames_window" , width = frames_width , height = viewport_height - 18 , pos = (window_width , 18 ))
277
+
247
278
def exit (self ):
248
279
self .close_project (None , None )
249
280
dpg .destroy_context ()
0 commit comments