11import os
22import warnings
3- from datetime import datetime
3+ from datetime import datetime , timedelta
44from pathlib import Path
55
66import napari
1616GUI_MAXIMUM_WIDTH = 225
1717GUI_MAXIMUM_HEIGHT = 350
1818GUI_MINIMUM_HEIGHT = 300
19+ TIMER_FORMAT = "%H:%M:%S"
1920
2021
2122"""
@@ -44,20 +45,25 @@ def __init__(self, parent: "napari.viewer.Viewer"):
4445 """napari.viewer.Viewer: viewer in which the widget is displayed"""
4546
4647 # 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 )
5049 self .time_label = ui .make_label ("" , self )
5150 self .time_label .setVisible (False )
5251
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 )
5458 io_layout .addWidget (
5559 ui .combine_blocks (
56- left_or_above = self .button ,
60+ left_or_above = self .pause_box ,
5761 right_or_below = self .time_label ,
5862 horizontal = True ,
59- )
60- ) # , alignment=utils.ABS_AL)
63+ ),
64+ alignment = ui .ABS_AL ,
65+ )
66+
6167 io_panel .setLayout (io_layout )
6268 io_panel .setMaximumWidth (GUI_MAXIMUM_WIDTH )
6369 layout .addWidget (io_panel , alignment = ui .ABS_AL )
@@ -76,7 +82,40 @@ def __init__(self, parent: "napari.viewer.Viewer"):
7682 """Whether to load as folder or single file"""
7783
7884 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 )
80119
81120 def prepare (self , label_dir , filetype , model_type , checkbox , as_folder ):
82121 """Initialize the Datamanager, which loads the csv file and updates it
@@ -127,7 +166,7 @@ def load_csv(self, label_dir, model_type, checkbox):
127166 print (label_dir )
128167 csvs = sorted (list (Path (label_dir ).glob (f"{ model_type } *.csv" )))
129168 if len (csvs ) == 0 :
130- df , csv_path = self .create (
169+ df , csv_path = self .create_csv (
131170 label_dir , model_type
132171 ) # df, train_data_dir, ...
133172 else :
@@ -146,11 +185,18 @@ def load_csv(self, label_dir, model_type, checkbox):
146185 df .to_csv (csv_path )
147186 else :
148187 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)
151197 return df , csv_path
152198
153- def create (self , label_dir , model_type , filename = None ):
199+ def create_csv (self , label_dir , model_type , filename = None ):
154200 """
155201 Create a new dataframe and save the csv
156202 Args:
@@ -182,6 +228,8 @@ def create(self, label_dir, model_type, filename=None):
182228 "time" : ["" ] * len (labels ),
183229 }
184230 )
231+ df .at [0 , "time" ] = "00:00:00"
232+
185233 csv_path = os .path .join (label_dir , f"{ model_type } _train0.csv" )
186234 print ("csv path for create" )
187235 print (csv_path )
@@ -204,6 +252,7 @@ def update(self, slice_num):
204252
205253 """
206254 self .slice_num = slice_num
255+ self .update_time_csv ()
207256
208257 print (f"New slice review started at { utils .get_time ()} " )
209258 # print(self.df)
@@ -214,41 +263,20 @@ def update(self, slice_num):
214263 self .slice_num -= 1
215264 self .update_button ()
216265
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-
227266 def button_func (self ): # updates csv every time you press button...
228267 if self .viewer .dims .ndisplay != 2 :
229268 # TODO test if undefined behaviour or if okay
230269 warnings .warn ("Please switch back to 2D mode !" )
231270 return
232- if self .button .text () == "Not checked" :
233271
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 ()
240273
274+ if self .button .text () == "Not checked" :
241275 self .button .setText ("Checked" )
242- self .time_label .setVisible (True )
243- self .time_label .setText (f"Completed in { time_diff } " )
244276 self .df .at [self .df .index [self .slice_num ], "train" ] = "Checked"
245- self .df .at [self .df .index [self .slice_num ], "time" ] = time_diff
246277 self .df .to_csv (self .csv_path )
247-
248278 else :
249279 self .button .setText ("Not checked" )
250- self .time_label .setVisible (False )
251- self .time = datetime .now ()
252280 self .df .at [self .df .index [self .slice_num ], "train" ] = "Not checked"
253281 self .df .to_csv (self .csv_path )
254282
0 commit comments