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