Skip to content

Commit f88a38a

Browse files
authored
Merge pull request #27 from AdaptiveMotorControlLab/cy/timer_review
Timer improvement
2 parents e462c4e + 6039936 commit f88a38a

File tree

2 files changed

+65
-37
lines changed

2 files changed

+65
-37
lines changed

napari_cellseg3d/plugin_dock.py

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22
import warnings
3-
from datetime import datetime
3+
from datetime import datetime, timedelta
44
from pathlib import Path
55

66
import napari
@@ -16,6 +16,7 @@
1616
GUI_MAXIMUM_WIDTH = 225
1717
GUI_MAXIMUM_HEIGHT = 350
1818
GUI_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

napari_cellseg3d/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def time_difference(time_start, time_finish, as_string=True):
155155
"""
156156
Args:
157157
time_start (datetime): time to subtract to time_finish
158-
time_finish (datetime): time to add to (-time_start)
158+
time_finish (datetime): time to add to subtract time_start to
159159
as_string (bool): if True, returns a string with the full time diff. Otherwise, returns as a list [hours,minutes,seconds]
160160
"""
161161

0 commit comments

Comments
 (0)