Skip to content

Commit 2bbf9de

Browse files
committed
move event listener to sub-controllers
1 parent 70fbbc5 commit 2bbf9de

File tree

9 files changed

+86
-83
lines changed

9 files changed

+86
-83
lines changed

src/navigate/controller/controller.py

Lines changed: 8 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,14 @@ def update_experiment_setting(self):
474474
"multiposition_count"
475475
] = len(positions)
476476

477+
if self.configuration["experiment"]["MicroscopeState"]["is_multiposition"] \
478+
and len(positions) == 0:
479+
# Update the view and override the settings.
480+
self.configuration["experiment"]["MicroscopeState"][
481+
"is_multiposition"
482+
] = False
483+
self.channels_tab_controller.is_multiposition_val.set(False)
484+
477485
# TODO: validate experiment dict
478486

479487
channel_warning = self.channels_tab_controller.verify_experiment_values()
@@ -1226,54 +1234,13 @@ def update_event(self):
12261234
# Display a warning that arises from the model as a top-level GUI popup
12271235
messagebox.showwarning(title="Navigate", message=value)
12281236

1229-
elif event == "waveform":
1230-
# Update the waveform plot.
1231-
self.waveform_tab_controller.update_waveforms(
1232-
waveform_dict=value,
1233-
sample_rate=self.configuration_controller.daq_sample_rate,
1234-
)
1235-
12361237
elif event == "multiposition":
12371238
# Update the multi-position tab without appending to the list
12381239
update_table(
12391240
table=self.multiposition_tab_controller.table,
12401241
pos=value,
12411242
)
12421243
self.channels_tab_controller.is_multiposition_val.set(True)
1243-
self.channels_tab_controller.toggle_multiposition()
1244-
1245-
elif event == "disable_multiposition":
1246-
self.channels_tab_controller.is_multiposition_val.set(False)
1247-
self.channels_tab_controller.toggle_multiposition()
1248-
1249-
elif event == "ilastik_mask":
1250-
# Display the ilastik mask
1251-
self.camera_view_controller.display_mask(mask=value)
1252-
1253-
elif event == "autofocus":
1254-
# Display the autofocus plot
1255-
if hasattr(self, "af_popup_controller"):
1256-
self.af_popup_controller.display_plot(
1257-
data=value[0], line_plot=value[1], clear_data=value[2]
1258-
)
1259-
1260-
elif event == "tonywilson":
1261-
if hasattr(self, "ao_popup_controller"):
1262-
# self.ao_popup_controller.set_widgets_from_coef(value['coefs'])
1263-
self.ao_popup_controller.plot_tonywilson(value)
1264-
# self.ao_popup_controller.plot_mirror(value)
1265-
if value["done"]:
1266-
print("Tony Wilson done! Updating expt...")
1267-
self.ao_popup_controller.update_experiment_values()
1268-
1269-
elif event == "mirror_update":
1270-
if hasattr(self, "ao_popup_controller"):
1271-
self.ao_popup_controller.set_widgets_from_coef(value["coefs"])
1272-
self.ao_popup_controller.plot_mirror(value)
1273-
1274-
elif event == "ao_save_report":
1275-
if hasattr(self, "ao_popup_controller"):
1276-
self.ao_popup_controller.save_report_to_file(value)
12771244

12781245
elif event == "stop":
12791246
# Stop the software
@@ -1288,14 +1255,6 @@ def update_event(self):
12881255
time.sleep(0.001)
12891256
pass
12901257

1291-
elif event == "remove_positions":
1292-
self.multiposition_tab_controller.remove_positions(value)
1293-
1294-
elif event == "exposure_time":
1295-
self.channels_tab_controller.set_exposure_time(value[0], value[1])
1296-
elif event == "display_camera_parameters":
1297-
self.camera_setting_controller.update_camera_parameters_silent(*value)
1298-
12991258
elif event in self.event_listeners.keys():
13001259
try:
13011260
self.event_listeners[event](value)

src/navigate/controller/sub_controllers/adaptive_optics.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ def plot_mirror(self, data):
370370

371371
try:
372372
coefs = data["coefs"]
373+
self.set_widgets_from_coef(coefs)
373374
self.coefs_bar.clear()
374375
self.coefs_bar.bar(range(len(coefs)), coefs)
375376
self.coefs_bar.set_title("Current Coefs")
@@ -410,6 +411,10 @@ def plot_tonywilson(self, data):
410411

411412
self.plot_tw_trace()
412413

414+
if data["done"]:
415+
print("Tony Wilson done! Updating expt...")
416+
self.update_experiment_values()
417+
413418
def plot_tw_trace(self):
414419
"""Plot the tony wilson trace data."""
415420
mode = self.parent_controller.configuration["experiment"][
@@ -435,3 +440,11 @@ def plot_tw_trace(self):
435440
# To redraw the plot
436441
self.fig_tw.tight_layout()
437442
self.fig_tw.canvas.draw_idle()
443+
444+
@property
445+
def custom_events(self):
446+
return {
447+
"ao_save_report": self.save_report_to_file,
448+
"mirror_update": self.plot_mirror,
449+
"tonywilson": self.plot_tonywilson,
450+
}

src/navigate/controller/sub_controllers/autofocus.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -204,19 +204,20 @@ def func(*args):
204204

205205
return func
206206

207-
def display_plot(self, data, line_plot=False, clear_data=True):
207+
def display_plot(self, data_and_flags):
208208
"""Displays the autofocus plot
209209
210-
data : numpy.ndarray
211-
The data to be plotted.
212-
line_plot : bool
213-
If True, the plot will be a line plot.
214-
If False, the plot will be a scatter plot.
215-
clear_data : bool
216-
If True, the plot will be cleared before plotting.
217-
If False, the plot will be added to the existing plot.
210+
data : tuple (numpy.ndarray, bool, bool)
211+
(data, line_plot, clear_data)
212+
data: The data to be plotted.
213+
line_plot:
214+
If True, the plot will be a line plot.
215+
If False, the plot will be a scatter plot.
216+
clear_data:
217+
If True, the plot will be cleared before plotting.
218+
If False, the plot will be added to the existing plot.
218219
"""
219-
220+
data, line_plot, clear_data = data_and_flags
220221
data = np.asarray(data)
221222
coarse_range = self.setting_dict.get("coarse_range", 500)
222223
coarse_step = self.setting_dict.get("coarse_step_size", 50)
@@ -270,3 +271,9 @@ def display_plot(self, data, line_plot=False, clear_data=True):
270271
self.autofocus_coarse.xaxis.set_minor_locator(tck.AutoMinorLocator())
271272
self.autofocus_fig.tight_layout()
272273
self.autofocus_fig.canvas.draw_idle()
274+
275+
@property
276+
def custom_events(self):
277+
return {
278+
"autofocus": self.display_plot
279+
}

src/navigate/controller/sub_controllers/camera_settings.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,10 +580,24 @@ def update_camera_device_related_setting(self):
580580
self.roi_widgets["Center_X"].set(self.default_width / 2)
581581
self.roi_widgets["Center_Y"].set(self.default_height / 2)
582582

583-
def update_camera_parameters_silent(self, sensor_mode=None, readout_direction=None, number_of_pixels=None):
583+
def update_camera_parameters_silent(self, value):
584+
"""Update GUI camera parameters
585+
586+
Parameters
587+
----------
588+
value : tuple
589+
(sensor_mode, readout_direction, number_of_pixels)
590+
"""
591+
sensor_mode, readout_direction, number_of_pixels = value
584592
if sensor_mode:
585593
self.update_sensor_mode(sensor_mode)
586594
if readout_direction:
587595
self.mode_widgets["Readout"].set(readout_direction)
588596
if number_of_pixels:
589597
self.mode_widgets["Pixels"].set(number_of_pixels)
598+
599+
@property
600+
def custom_events(self):
601+
return {
602+
"display_camera_parameters": self.update_camera_parameters_silent
603+
}

src/navigate/controller/sub_controllers/camera_view.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,3 +1238,9 @@ def try_to_display_image(self, image_id):
12381238

12391239
display_thread = threading.Thread(target=self.display_image, args=(image_id,))
12401240
display_thread.start()
1241+
1242+
@property
1243+
def custom_events(self):
1244+
return {
1245+
"ilastik_mask": self.display_mask
1246+
}

src/navigate/controller/sub_controllers/channels_tab.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,8 @@ def __init__(self, view, parent_controller=None):
158158

159159
#: bool: Whether or not the user has selected to use multiposition.
160160
self.is_multiposition_val = self.view.multipoint_frame.on_off
161-
self.view.multipoint_frame.save_check.configure(
162-
command=self.toggle_multiposition
163-
)
161+
self.is_multiposition_val.trace_add("write", self.toggle_multiposition)
162+
164163
self.view.multipoint_frame.buttons["tiling"].configure(
165164
command=self.launch_tiling_wizard
166165
)
@@ -350,12 +349,10 @@ def set_mode(self, mode):
350349
# multi-position flag
351350
if mode == "stop":
352351
self.is_multiposition_val.set(self.is_multiposition_cache)
353-
self.toggle_multiposition()
354352
else:
355353
self.is_multiposition_cache = self.is_multiposition
356354
if mode == "customized":
357355
self.is_multiposition_val.set(False)
358-
self.toggle_multiposition()
359356

360357
if image_mode == "customized" or mode != "stop":
361358
self.disable_multiposition_btn()
@@ -712,7 +709,7 @@ def update_timepoint_setting(self, call_parent=False):
712709
"timepoint settings on channels tab have been changed and recalculated"
713710
)
714711

715-
def toggle_multiposition(self):
712+
def toggle_multiposition(self, *args):
716713
"""Toggle Multi-position Acquisition.
717714
718715
Recalculates the experiment duration.
@@ -835,17 +832,24 @@ def verify_experiment_values(self):
835832
return "Timepoints should be at least 1!"
836833
return None
837834

838-
def set_exposure_time(self, channel, exposure_time):
835+
def set_exposure_time(self, channel_exposure_time):
839836
"""Set exposure time for a specified channel
840837
841838
Parameters
842839
----------
843-
channel : str
840+
channel_exposure_time : tuple(str, float)
841+
(channel_name, exposure_time)
844842
Channel name, such as "channel_1", "channel_2",...
845-
exposure_time : float
846843
Exposure time in milliseconds.
847844
"""
845+
channel, exposure_time = channel_exposure_time
848846
idx = int(channel[channel.index("_") + 1 :]) - 1
849847
self.channel_setting_controller.in_initialization = True
850848
self.channel_setting_controller.view.exptime_variables[idx].set(exposure_time)
851849
self.channel_setting_controller.in_initialization = False
850+
851+
@property
852+
def custom_events(self):
853+
return {
854+
"exposure_time": self.set_exposure_time
855+
}

src/navigate/controller/sub_controllers/multiposition.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,9 @@ def remove_positions(self, position_flag_list):
285285
p for i, p in enumerate(positions) if (i >= l or position_flag_list[i])
286286
]
287287
self.set_positions(new_positions)
288+
289+
@property
290+
def custom_events(self):
291+
return {
292+
"remove_positions": self.remove_positions
293+
}

src/navigate/controller/sub_controllers/waveform_tab.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ def __init__(self, view, parent_controller=None):
7777
microscope_name
7878
]["daq"]["sample_rate"]
7979
)
80+
self.update_sample_rate()
8081
self.view.waveform_settings.inputs["sample_rate"].get_variable().trace_add(
8182
"write", self.update_sample_rate
8283
)
@@ -127,20 +128,16 @@ def update_waveform_template(self, *args):
127128
event = type("MyEvent", (object,), {})
128129
self.plot_waveforms(event)
129130

130-
def update_waveforms(self, waveform_dict, sample_rate):
131+
def update_waveforms(self, waveform_dict):
131132
"""Update the waveforms in the waveform tab
132133
133134
Parameters
134135
----------
135136
waveform_dict : dict
136137
Dictionary of waveforms
137-
sample_rate : int
138-
Sample rate of the waveforms
139138
"""
140139
#: dict: Dictionary of waveforms
141140
self.waveform_dict = waveform_dict
142-
self.sample_rate = sample_rate
143-
144141
event = type("MyEvent", (object,), {})
145142
self.plot_waveforms(event)
146143

@@ -337,3 +334,9 @@ def set_waveform_template(self, template_name):
337334
self.parent_controller.configuration["experiment"]["MicroscopeState"][
338335
"waveform_template"
339336
] = template_name
337+
338+
@property
339+
def custom_events(self):
340+
return {
341+
"waveform": self.update_waveforms
342+
}

src/navigate/model/model.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -512,15 +512,6 @@ def run_command(self, command, *args, **kwargs):
512512
"is_save"
513513
]
514514

515-
# If multiposition is selected, verify that it is not empty.
516-
if self.configuration["experiment"]["MicroscopeState"]["is_multiposition"]:
517-
if len(self.configuration["experiment"]["MultiPositions"]) == 0:
518-
# Update the view and override the settings.
519-
self.event_queue.put(("disable_multiposition", None))
520-
self.configuration["experiment"]["MicroscopeState"][
521-
"is_multiposition"
522-
] = False
523-
524515
# Calculate waveforms, turn on lasers, etc.
525516
self.prepare_acquisition()
526517

0 commit comments

Comments
 (0)