1 /*
2  * This file is part of Siril, an astronomy image processor.
3  * Copyright (C) 2005-2011 Francois Meyer (dulle at free.fr)
4  * Copyright (C) 2012-2021 team free-astro (see more in AUTHORS file)
5  * Reference site is https://free-astro.org/index.php/Siril
6  *
7  * Siril is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * Siril is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Siril. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include "core/siril.h"
22 #include "core/proto.h"
23 #include "core/command.h"
24 #include "core/undo.h"
25 #include "core/siril_update.h"
26 #include "core/siril_cmd_help.h"
27 #include "algos/annotate.h"
28 #include "algos/colors.h"
29 #include "algos/noise.h"
30 #include "algos/geometry.h"
31 #include "algos/siril_wcs.h"
32 #include "algos/plateSolver.h"
33 #include "compositing/compositing.h"
34 #include "gui/about_dialog.h"
35 #include "gui/utils.h"
36 #include "gui/callbacks.h"
37 #include "gui/histogram.h"
38 #include "gui/open_dialog.h"
39 #include "gui/message_dialog.h"
40 #include "gui/PSF_list.h"
41 #include "gui/save_dialog.h"
42 #include "gui/sequence_list.h"
43 #include "gui/progress_and_log.h"
44 #include "gui/dialogs.h"
45 #include "gui/script_menu.h"
46 #include "gui/image_interactions.h"
47 #include "gui/image_display.h"
48 #include "gui/photometric_cc.h"
49 
50 #include "siril_actions.h"
51 
open_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)52 void open_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
53 	header_open_button_clicked();
54 }
55 
cwd_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)56 void cwd_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
57 	cwd_btton_clicked();
58 }
59 
save_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)60 void save_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
61 	on_header_save_button_clicked();
62 }
63 
save_as_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)64 void save_as_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
65 	on_header_save_as_button_clicked();
66 }
67 
snapshot_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)68 void snapshot_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
69 	on_header_snapshot_button_clicked();
70 }
71 
undo_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)72 void undo_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
73 	set_cursor_waiting(TRUE);
74 	undo_display_data(UNDO);
75 	set_cursor_waiting(FALSE);
76 }
77 
redo_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)78 void redo_action_activate(GSimpleAction *action, GVariant *parameter,gpointer user_data) {
79 	set_cursor_waiting(TRUE);
80 	undo_display_data(REDO);
81 	set_cursor_waiting(FALSE);
82 }
83 
quit_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)84 void quit_action_activate(GSimpleAction *action, GVariant *parameter,gpointer user_data) {
85 	siril_quit();
86 }
87 
about_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)88 void about_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
89 	siril_show_about_dialog();
90 }
91 
preferences_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)92 void preferences_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
93 	siril_open_dialog("settings_window");
94 }
95 
close_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)96 void close_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
97 	process_close(0);
98 }
99 
scripts_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)100 void scripts_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
101 	siril_get_on_script_pages();
102 }
103 
updates_action_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)104 void updates_action_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
105 	siril_check_updates(TRUE);
106 }
107 
108 static gboolean is_extended = FALSE;
109 
full_screen_activated(GSimpleAction * action,GVariant * parameter,gpointer user_data)110 void full_screen_activated(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
111 	GtkWindow *window;
112 	GtkWidget *toolbarbox = lookup_widget("toolbarbox");
113 	GtkWidget *control_center_box = lookup_widget("control_center_box");
114 	GtkButton *button = GTK_BUTTON(lookup_widget("button_paned"));
115 	gboolean is_control_box_visible;
116 	gboolean is_fullscreen;
117 
118 	window = GTK_WINDOW(GTK_APPLICATION_WINDOW(user_data));
119 
120 	GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
121 	is_fullscreen = gdk_window_get_state(gdk_window) & GDK_WINDOW_STATE_FULLSCREEN;
122 	is_control_box_visible = gtk_widget_get_visible(control_center_box);
123 
124 	if (is_fullscreen) {
125 		gtk_window_unfullscreen(window);
126 		if (is_extended)
127 			gtk_button_clicked(button);
128 	} else {
129 		gtk_window_fullscreen(window);
130 		if (is_control_box_visible) {
131 			gtk_button_clicked(button);
132 		}
133 		is_extended = is_control_box_visible;
134 	}
135 	gtk_widget_set_visible(toolbarbox, is_fullscreen);
136 }
137 
keyboard_shortcuts_activated(GSimpleAction * action,GVariant * parameter,gpointer user_data)138 void keyboard_shortcuts_activated(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
139 	GtkWindow *window;
140 
141 	window = GTK_WINDOW(GTK_APPLICATION_WINDOW(user_data));
142 
143 	siril_cmd_help_keyboard_shortcuts(window);
144 }
145 
tab_conversion_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)146 void tab_conversion_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
147 	control_window_switch_to_tab(FILE_CONVERSION);
148 }
149 
tab_sequence_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)150 void tab_sequence_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
151 	control_window_switch_to_tab(IMAGE_SEQ);
152 }
153 
tab_prepro_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)154 void tab_prepro_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
155 	control_window_switch_to_tab(PRE_PROC);
156 }
157 
tab_registration_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)158 void tab_registration_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
159 	control_window_switch_to_tab(REGISTRATION);
160 }
161 
tab_plot_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)162 void tab_plot_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
163 	control_window_switch_to_tab(PLOT);
164 }
165 
tab_stacking_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)166 void tab_stacking_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
167 	control_window_switch_to_tab(STACKING);
168 }
169 
tab_logs_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)170 void tab_logs_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
171 	control_window_switch_to_tab(OUTPUT_LOGS);
172 }
173 
toolbar_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)174 void toolbar_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
175 	GtkWidget *w = lookup_widget("toolbarbox");
176 	gtk_widget_set_visible(w, !gtk_widget_get_visible(w));
177 }
178 
change_zoom_fit_state(GSimpleAction * action,GVariant * state,gpointer user_data)179 void change_zoom_fit_state(GSimpleAction *action, GVariant *state, gpointer user_data) {
180 	if (g_variant_get_boolean(state)) {
181 		com.zoom_value = ZOOM_FIT;
182 		reset_display_offset();
183 		redraw(com.cvport, REMAP_NONE);
184 	} else {
185 		com.zoom_value = get_zoom_val();
186 	}
187 	g_simple_action_set_state(action, state);
188 }
189 
zoom_fit_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)190 void zoom_fit_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
191 	GVariant *state;
192 
193 	state = g_action_get_state(G_ACTION(action));
194 	g_action_change_state(G_ACTION(action), g_variant_new_boolean(!g_variant_get_boolean(state)));
195 	g_variant_unref(state);
196 }
197 
zoom_in_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)198 void zoom_in_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
199 	point center = get_center_of_vport();
200 	update_zoom(center.x, center.y, ZOOM_IN);
201 }
202 
zoom_out_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)203 void zoom_out_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
204 	point center = get_center_of_vport();
205 	update_zoom(center.x, center.y, ZOOM_OUT);
206 }
207 
zoom_one_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)208 void zoom_one_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
209 	update_zoom_fit_button();
210 	com.zoom_value = ZOOM_NONE;
211 	reset_display_offset();
212 	redraw(com.cvport, REMAP_NONE);
213 }
214 
negative_view_state(GSimpleAction * action,GVariant * state,gpointer user_data)215 void negative_view_state(GSimpleAction *action, GVariant *state, gpointer user_data) {
216 	set_cursor_waiting(TRUE);
217 	redraw(com.cvport, REMAP_ALL);
218 	redraw_previews();
219 	set_cursor_waiting(FALSE);
220 	g_simple_action_set_state(action, state);
221 }
222 
negative_view_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)223 void negative_view_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
224 	GVariant *state;
225 
226 	state = g_action_get_state(G_ACTION(action));
227 	g_action_change_state(G_ACTION(action), g_variant_new_boolean(!g_variant_get_boolean(state)));
228 	g_variant_unref(state);
229 }
230 
color_map_state(GSimpleAction * action,GVariant * state,gpointer user_data)231 void color_map_state(GSimpleAction *action, GVariant *state, gpointer user_data) {
232 	set_cursor_waiting(TRUE);
233 	redraw(com.cvport, REMAP_ALL);
234 	redraw_previews();
235 	set_cursor_waiting(FALSE);
236 	g_simple_action_set_state(action, state);
237 }
238 
color_map_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)239 void color_map_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
240 	GVariant *state;
241 
242 	state = g_action_get_state(G_ACTION(action));
243 	g_action_change_state(G_ACTION(action), g_variant_new_boolean(!g_variant_get_boolean(state)));
244 	g_variant_unref(state);
245 }
246 
astrometry_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)247 void astrometry_activate(GSimpleAction *action, GVariant *parameter,gpointer user_data) {
248 	open_astrometry_dialog();
249 }
250 
dyn_psf_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)251 void dyn_psf_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
252 	siril_open_dialog("stars_list_window");
253 }
254 
pick_star_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)255 void pick_star_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
256 	pick_a_star();
257 }
258 
search_object_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)259 void search_object_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
260 	if (has_wcs(&gfit))
261 		siril_open_dialog("search_objects");
262 }
263 
annotate_object_state(GSimpleAction * action,GVariant * state,gpointer user_data)264 void annotate_object_state(GSimpleAction *action, GVariant *state, gpointer user_data) {
265 	if (g_variant_get_boolean(state)) {
266 		if (has_wcs(&gfit)) {
267 			com.found_object = find_objects(&gfit);
268 		}
269 	} else {
270 		g_slist_free_full(com.found_object, (GDestroyNotify) free_object);
271 		com.found_object = NULL;
272 	}
273 	g_simple_action_set_state(action, state);
274 	redraw(com.cvport, REMAP_NONE);
275 }
276 
annotate_object_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)277 void annotate_object_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
278 	GVariant *state;
279 
280 	state = g_action_get_state(G_ACTION(action));
281 	g_action_change_state(G_ACTION(action), g_variant_new_boolean(!g_variant_get_boolean(state)));
282 	g_variant_unref(state);
283 }
284 
seq_list_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)285 void seq_list_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
286 	if (gtk_widget_get_visible(lookup_widget("seqlist_dialog"))) {
287 		siril_close_dialog("seqlist_dialog");
288 	} else {
289 		gboolean confirm = TRUE;
290 		if (com.seq.current == RESULT_IMAGE) {
291 			confirm = siril_confirm_dialog(_("Save your changes before loading a frame of the sequence."),
292 					_("The image currently displayed is the result of the previous stack. "
293 							"If you load an image from the sequence, you might lose the entire process you performed on the image, "
294 							"but not the image itself. You need to save your data before doing this."),
295 					_("Load another image"));
296 		}
297 		if (confirm) {
298 			update_seqlist();
299 			siril_open_dialog("seqlist_dialog");
300 		}
301 	}
302 }
303 
statistics_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)304 void statistics_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
305 	set_cursor_waiting(TRUE);
306 	computeStat();
307 	siril_open_dialog("StatWindow");
308 	set_cursor_waiting(FALSE);
309 }
310 
noise_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)311 void noise_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
312 	evaluate_noise_in_image();
313 }
314 
image_information_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)315 void image_information_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
316 	siril_open_dialog("file_information");
317 }
318 
image_fits_header_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)319 void image_fits_header_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
320 	show_FITS_header(&gfit);
321 }
322 
323 /******* processing menu **************/
324 
remove_green_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)325 void remove_green_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
326 	siril_open_dialog("SCNR_dialog");
327 }
328 
saturation_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)329 void saturation_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
330 	siril_open_dialog("satu_dialog");
331 }
332 
color_calib_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)333 void color_calib_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
334 	initialize_calibration_interface();
335 	siril_open_dialog("color_calibration");
336 }
337 
pcc_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)338 void pcc_activate(GSimpleAction *action, GVariant *parameter,gpointer user_data) {
339 	initialize_photometric_cc_dialog();
340 	siril_open_dialog("ImagePlateSolver_Dial");
341 }
342 
split_channel_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)343 void split_channel_activate(GSimpleAction *action, GVariant *parameter,gpointer user_data) {
344 	siril_open_dialog("extract_channel_dialog");
345 }
346 
negative_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)347 void negative_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
348 	negative_processing();
349 }
350 
histo_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)351 void histo_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
352 	toggle_histogram_window_visibility();
353 }
354 
fix_banding_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)355 void fix_banding_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
356 	siril_open_dialog("canon_fixbanding_dialog");
357 }
358 
cosmetic_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)359 void cosmetic_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
360 	siril_open_dialog("cosmetic_dialog");
361 }
362 
background_extr_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)363 void background_extr_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
364 	siril_open_dialog("background_extraction_dialog");
365 }
366 
asinh_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)367 void asinh_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
368 	siril_open_dialog("asinh_dialog");
369 }
370 
deconvolution_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)371 void deconvolution_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
372 	siril_open_dialog("deconvolution_dialog");
373 }
374 
resample_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)375 void resample_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
376 	siril_open_dialog("resample_dialog");
377 }
378 
rotation_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)379 void rotation_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
380 	siril_open_dialog("rotation_dialog");
381 }
382 
rotation90_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)383 void rotation90_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
384 	siril_rotate90();
385 }
386 
rotation270_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)387 void rotation270_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
388 	siril_rotate270();
389 }
390 
mirrorx_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)391 void mirrorx_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
392 	mirrorx_gui(&gfit);
393 }
394 
mirrory_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)395 void mirrory_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
396 	mirrory_gui(&gfit);
397 }
398 
wavelets_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)399 void wavelets_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
400 	siril_open_dialog("wavelets_dialog");
401 }
402 
split_wavelets_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)403 void split_wavelets_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
404 	siril_open_dialog("extract_wavelets_layers_dialog");
405 }
406 
medianfilter_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)407 void medianfilter_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
408 	siril_open_dialog("Median_dialog");
409 }
410 
rgradient_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)411 void rgradient_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
412 	siril_open_dialog("rgradient_dialog");
413 }
414 
clahe_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)415 void clahe_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
416 	siril_open_dialog("CLAHE_dialog");
417 }
418 
linearmatch_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)419 void linearmatch_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
420 	siril_open_dialog("linearmatch_dialog");
421 }
422 
fft_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)423 void fft_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
424 	GtkFileChooserButton *magbutton, *phasebutton;
425 
426 	magbutton = GTK_FILE_CHOOSER_BUTTON(lookup_widget("filechooser_mag"));
427 	phasebutton = GTK_FILE_CHOOSER_BUTTON(lookup_widget("filechooser_phase"));
428 	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(magbutton), com.wd);
429 	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(phasebutton), com.wd);
430 	siril_open_dialog("dialog_FFT");
431 }
432 
rgb_compositing_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)433 void rgb_compositing_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
434 	open_compositing_window();
435 }
436 
split_cfa_activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)437 void split_cfa_activate(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
438 	siril_open_dialog("split_cfa_dialog");
439 }
440