1
1
import os
2
2
import warnings
3
- from datetime import datetime
3
+ from datetime import datetime , timedelta
4
4
from pathlib import Path
5
5
6
6
import napari
16
16
GUI_MAXIMUM_WIDTH = 225
17
17
GUI_MAXIMUM_HEIGHT = 350
18
18
GUI_MINIMUM_HEIGHT = 300
19
+ TIMER_FORMAT = "%H:%M:%S"
19
20
20
21
21
22
"""
@@ -44,20 +45,25 @@ def __init__(self, parent: "napari.viewer.Viewer"):
44
45
"""napari.viewer.Viewer: viewer in which the widget is displayed"""
45
46
46
47
# add some buttons
47
- self .button = ui .Button (
48
- "1" , self .button_func , parent = self , fixed = False
49
- )
48
+ self .button = ui .Button ("1" , self .button_func , parent = self , fixed = True )
50
49
self .time_label = ui .make_label ("" , self )
51
50
self .time_label .setVisible (False )
52
51
53
- io_panel , io_layout = ui .make_container (vertical = False )
52
+ self .pause_box = ui .CheckBox (
53
+ "Pause" , self .pause_timer , parent = self , fixed = True
54
+ )
55
+
56
+ io_panel , io_layout = ui .make_container ()
57
+ io_layout .addWidget (self .button , alignment = ui .ABS_AL )
54
58
io_layout .addWidget (
55
59
ui .combine_blocks (
56
- left_or_above = self .button ,
60
+ left_or_above = self .pause_box ,
57
61
right_or_below = self .time_label ,
58
62
horizontal = True ,
59
- )
60
- ) # , alignment=utils.ABS_AL)
63
+ ),
64
+ alignment = ui .ABS_AL ,
65
+ )
66
+
61
67
io_panel .setLayout (io_layout )
62
68
io_panel .setMaximumWidth (GUI_MAXIMUM_WIDTH )
63
69
layout .addWidget (io_panel , alignment = ui .ABS_AL )
@@ -76,7 +82,40 @@ def __init__(self, parent: "napari.viewer.Viewer"):
76
82
"""Whether to load as folder or single file"""
77
83
78
84
self .start_time = datetime .now ()
79
- self .time = None
85
+ self .time_elapsed = timedelta ()
86
+ self .pause_start = None
87
+ self .is_paused = False
88
+ # self.pause_time = None
89
+
90
+ def pause_timer (self ):
91
+ """Pause the timer for the review time"""
92
+ if self .pause_box .isChecked ():
93
+ self .time_label .setVisible (True )
94
+
95
+ self .pause_start = datetime .now ()
96
+ self .time_elapsed += self .pause_start - self .start_time
97
+ self .pause_box .setText ("Resume timer" )
98
+ self .time_label .setText (
99
+ f"({ utils .time_difference (timedelta (),self .time_elapsed )} )"
100
+ )
101
+ self .is_paused = True
102
+ else :
103
+ self .time_label .setVisible (False )
104
+ self .pause_box .setText ("Pause timer" )
105
+
106
+ # self.pause_time = datetime.now() - self.pause_start
107
+ self .start_time = datetime .now ()
108
+ self .is_paused = False
109
+ self .update_time_csv ()
110
+
111
+ def update_time_csv (self ):
112
+ if not self .is_paused :
113
+ self .time_elapsed += datetime .now () - self .start_time
114
+ self .start_time = datetime .now ()
115
+ str_time = utils .time_difference (timedelta (), self .time_elapsed )
116
+ print (f"Time elapsed : { str_time } " )
117
+ self .df .at [0 , "time" ] = str_time
118
+ self .df .to_csv (self .csv_path )
80
119
81
120
def prepare (self , label_dir , filetype , model_type , checkbox , as_folder ):
82
121
"""Initialize the Datamanager, which loads the csv file and updates it
@@ -127,7 +166,7 @@ def load_csv(self, label_dir, model_type, checkbox):
127
166
print (label_dir )
128
167
csvs = sorted (list (Path (label_dir ).glob (f"{ model_type } *.csv" )))
129
168
if len (csvs ) == 0 :
130
- df , csv_path = self .create (
169
+ df , csv_path = self .create_csv (
131
170
label_dir , model_type
132
171
) # df, train_data_dir, ...
133
172
else :
@@ -146,11 +185,18 @@ def load_csv(self, label_dir, model_type, checkbox):
146
185
df .to_csv (csv_path )
147
186
else :
148
187
pass
149
- self .start_time = datetime .now ()
150
- self .time = self .start_time
188
+
189
+ recorded_time = df .at [0 , "time" ]
190
+ # print("csv load time")
191
+ # print(recorded_time)
192
+ t = datetime .strptime (recorded_time , TIMER_FORMAT )
193
+ self .time_elapsed = timedelta (
194
+ hours = t .hour , minutes = t .minute , seconds = t .second
195
+ )
196
+ # print(self.time_elapsed)
151
197
return df , csv_path
152
198
153
- def create (self , label_dir , model_type , filename = None ):
199
+ def create_csv (self , label_dir , model_type , filename = None ):
154
200
"""
155
201
Create a new dataframe and save the csv
156
202
Args:
@@ -182,6 +228,8 @@ def create(self, label_dir, model_type, filename=None):
182
228
"time" : ["" ] * len (labels ),
183
229
}
184
230
)
231
+ df .at [0 , "time" ] = "00:00:00"
232
+
185
233
csv_path = os .path .join (label_dir , f"{ model_type } _train0.csv" )
186
234
print ("csv path for create" )
187
235
print (csv_path )
@@ -204,6 +252,7 @@ def update(self, slice_num):
204
252
205
253
"""
206
254
self .slice_num = slice_num
255
+ self .update_time_csv ()
207
256
208
257
print (f"New slice review started at { utils .get_time ()} " )
209
258
# print(self.df)
@@ -214,41 +263,20 @@ def update(self, slice_num):
214
263
self .slice_num -= 1
215
264
self .update_button ()
216
265
217
- self .time = datetime .now ()
218
-
219
- if self .button .text () == "Not checked" :
220
- self .time_label .setVisible (False )
221
- else :
222
- self .time_label .setVisible (True )
223
- self .time_label .setText (
224
- f"Previously completed in { self .df .at [self .df .index [self .slice_num ], 'time' ]} "
225
- )
226
-
227
266
def button_func (self ): # updates csv every time you press button...
228
267
if self .viewer .dims .ndisplay != 2 :
229
268
# TODO test if undefined behaviour or if okay
230
269
warnings .warn ("Please switch back to 2D mode !" )
231
270
return
232
- if self .button .text () == "Not checked" :
233
271
234
- start_time = self .time
235
- finish_time = datetime .now ()
236
- self .time = finish_time
237
-
238
- time_diff = utils .time_difference (start_time , finish_time )
239
- print (f"Time taken : { time_diff } " )
272
+ self .update_time_csv ()
240
273
274
+ if self .button .text () == "Not checked" :
241
275
self .button .setText ("Checked" )
242
- self .time_label .setVisible (True )
243
- self .time_label .setText (f"Completed in { time_diff } " )
244
276
self .df .at [self .df .index [self .slice_num ], "train" ] = "Checked"
245
- self .df .at [self .df .index [self .slice_num ], "time" ] = time_diff
246
277
self .df .to_csv (self .csv_path )
247
-
248
278
else :
249
279
self .button .setText ("Not checked" )
250
- self .time_label .setVisible (False )
251
- self .time = datetime .now ()
252
280
self .df .at [self .df .index [self .slice_num ], "train" ] = "Not checked"
253
281
self .df .to_csv (self .csv_path )
254
282
0 commit comments