atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
w_axis.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2026 by CNRS and University of Strasbourg */
15
21
22/*
23* This file: 'w_axis.c'
24*
25* Contains:
26*
27
28 - The functions to create the axis parameters edition window
29
30*
31* List of functions:
32
33 G_MODULE_EXPORT gboolean scroll_set_axis_position (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
34
35 void activate_pos_box (glwin * view, gboolean val);
36 void init_axis_colors (ColRGBA axcol[3], axis_edition * axis_win);
37 void axis_position_has_changed (gpointer data, double v);
38
39 G_MODULE_EXPORT void update_axis_parameter (GtkEntry * res, gpointer data);
40 G_MODULE_EXPORT void update_axis_length (GtkEntry * res, gpointer data);
41 G_MODULE_EXPORT void set_axis_template (GtkComboBox * box, gpointer data);
42 G_MODULE_EXPORT void set_axis_combo_style (GtkComboBox * box, gpointer data);
43 G_MODULE_EXPORT void set_show_axis_toggle (GtkCheckButton * but, gpointer data);
44 G_MODULE_EXPORT void set_show_axis_toggle (GtkToggleButton * but, gpointer data);
45 G_MODULE_EXPORT void use_axis_default_positions (GtkCheckButton * but, gpointer data);
46 G_MODULE_EXPORT void use_axis_default_positions (GtkToggleButton * but, gpointer data);
47 G_MODULE_EXPORT void use_axis_default_colors (GtkCheckButton * but, gpointer data);
48 G_MODULE_EXPORT void use_axis_default_colors (GtkToggleButton * but, gpointer data);
49 G_MODULE_EXPORT void set_axis_color (GtkColorChooser * colob, gpointer data);
50 G_MODULE_EXPORT void set_axis_position (GtkRange * range, gpointer data);
51 G_MODULE_EXPORT void set_axis_labels (GtkCheckButton * but, gpointer data);
52 G_MODULE_EXPORT void set_axis_labels (GtkToggleButton * but, gpointer data);
53 G_MODULE_EXPORT void set_axis_title (GtkEntry * entry, gpointer data);
54 G_MODULE_EXPORT void axis_advanced (GSimpleAction * action, GVariant * parameter, gpointer data);
55 G_MODULE_EXPORT void axis_advanced (GtkWidget * widg, gpointer data);
56
57 G_MODULE_EXPORT gboolean on_axis_delete (GtkWindow * widg, gpointer data);
58 G_MODULE_EXPORT gboolean on_axis_delete (GtkWidget * widg, GdkEvent * event, gpointer data);
59
60*/
61
62#include "global.h"
63#include "interface.h"
64#include "glview.h"
65#include "glwindow.h"
66#include "preferences.h"
67
68#define AXIS_TEMPLATES 5
69
70double axis_init_color[3][3] = {{0.0, 0.0, 1.0},{0.0, 1.0, 0.0},{1.0, 0.0, 0.0}};
71double axis_range[3][2] = {{0.0,100.0}, {0.0, 100.0}, {0.0, 100.0}};
72
73extern gboolean from_box_or_axis;
74extern G_MODULE_EXPORT void set_labels_render (GtkWidget * widg, gpointer data);
75extern G_MODULE_EXPORT void set_labels_font (GtkFontButton * fontb, gpointer data);
76#ifdef GTK4
77extern G_MODULE_EXPORT void set_labels_scale (GtkCheckButton * but, gpointer data);
78#else
79extern G_MODULE_EXPORT void set_labels_scale (GtkToggleButton * but, gpointer data);
80#endif
81
90G_MODULE_EXPORT void update_axis_parameter (GtkEntry * res, gpointer data)
91{
92 glwin * view;
93 int axis_type;
94 double * axis_line;
95 double * axis_rad;
96#ifdef GTK3
97 gchar * str;
98#endif // GTK3
99 const gchar * n = entry_get_text (res);
100 double v = string_to_double ((gpointer)n);
101 if (preferences)
102 {
103 axis_type = tmp_axis -> axis;
104 axis_line = & tmp_axis -> line;
105 axis_rad = & tmp_axis -> rad;
106 }
107 else
108 {
109 view = (glwin *)data;
110 axis_type = view -> anim -> last -> img -> xyz -> axis;
111 axis_line = & view -> anim -> last -> img -> xyz -> line;
112 axis_rad = & view -> anim -> last -> img -> xyz -> rad;
113 }
114 if (axis_type == CYLINDERS)
115 {
116 if (v > 0.0) * axis_rad = v;
117 v = * axis_rad;
118 if (! preferences)
119 {
120#ifdef GTK3
121 // GTK3 Menu Action To Check
122 str = g_strdup_printf (_("Radius [ %f Å ]"), v);
123 gtk_menu_item_set_label (GTK_MENU_ITEM(view -> ogl_box_axis[1][6]), str);
124 g_free (str);
125#endif
126 }
127 }
128 else
129 {
130 if (v > 0.0) * axis_line = v;
131 v = * axis_line;
132 if (! preferences)
133 {
134#ifdef GTK3
135 // GTK3 Menu Action To Check
136 str = g_strdup_printf (_("Width [ %f pts ]"), v);
137 gtk_menu_item_set_label (GTK_MENU_ITEM(view -> ogl_box_axis[1][4]), str);
138 g_free (str);
139#endif
140 }
141 }
143 if (! preferences)
144 {
145 view -> create_shaders[MAXIS] = TRUE;
146 update (view);
147#ifdef GTK4
148 update_menu_bar (view);
149#endif
150 }
151}
152
161G_MODULE_EXPORT void update_axis_length (GtkEntry * res, gpointer data)
162{
163 glwin * view;
164 double * axis_length;
165#ifdef GTK3
166 gchar * str;
167#endif // GTK3
168 const gchar * n = entry_get_text (res);
169 double v = string_to_double ((gpointer)n);
170 if (preferences)
171 {
172 axis_length = & tmp_axis -> length;
173 }
174 else
175 {
176 view = (glwin *)data;
177 axis_length = & view -> anim -> last -> img -> xyz -> length;
178 }
179 if (v > 0.0) * axis_length = v;
180 v = * axis_length;
182 if (! preferences)
183 {
184#ifdef GTK3
185 // GTK3 Menu Action To Check
186 str = g_strdup_printf (_("_Radius [ %f Å ]"), v);
187 gtk_menu_item_set_label (GTK_MENU_ITEM(view -> ogl_box_axis[1][7]), str);
188 g_free (str);
189#endif
190 view -> create_shaders[MAXIS] = TRUE;
191 update (view);
192#ifdef GTK4
193 update_menu_bar (view);
194#endif
195 }
196}
197
206void activate_pos_box (glwin * view, gboolean val)
207{
208 int i;
209 if (val)
210 {
211 i = (preferences) ? tmp_axis -> t_pos : view -> anim -> last -> img -> xyz -> t_pos;
212 }
213 else
214 {
215 i = NONE;
216 }
217 combo_set_active ((preferences) ? pref_axis_win -> templates : view -> axis_win -> templates, i);
218 widget_set_sensitive ((preferences) ? pref_axis_win -> templates : view -> axis_win -> templates, val);
219}
220
229G_MODULE_EXPORT void set_axis_template (GtkComboBox * box, gpointer data)
230{
231 int i = combo_get_active ((GtkWidget *)box);
232 // The next line is mandatory for GTK4
233 if (i < 0) return;
234 glwin * view;
235 if (preferences)
236 {
237 tmp_axis -> t_pos = i;
238 }
239 else
240 {
241 view = (glwin *)data;
242#ifdef GTK4
243 view -> anim -> last -> img -> xyz -> t_pos = i;
244#endif
245 }
246 if (! preferences)
247 {
248#ifdef GTK4
249 view -> create_shaders[MAXIS] = TRUE;
250 update (view);
251 update_menu_bar (view);
252#else
253 // GTK3 Menu Action To Check
254 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][8+i], TRUE);
255#endif
256 }
257}
258
267G_MODULE_EXPORT void set_axis_combo_style (GtkComboBox * box, gpointer data)
268{
269 glwin * view;
270 axis_edition * the_axis;
271 int * axis;
272 if (preferences)
273 {
274 the_axis = pref_axis_win;
275 axis = & tmp_axis -> axis;
276 }
277 else
278 {
279 view = (glwin *)data;
280 the_axis = view -> axis_win;
281 axis = & view -> anim -> last -> img -> xyz -> axis;
282 }
283 switch (combo_get_active ((GtkWidget *)box))
284 {
285 case 0:
286 * axis = WIREFRAME;
287 hide_the_widgets (the_axis -> radius_box);
288 show_the_widgets (the_axis -> width_box);
289 if (! preferences)
290 {
291#ifdef GTK3
292 // GTK3 Menu Action To Check
293 from_box_or_axis = TRUE;
294 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][1], TRUE);
295 from_box_or_axis = FALSE;
296#endif
297 }
298 break;
299 case 1:
300 * axis = CYLINDERS;
301 hide_the_widgets (the_axis -> width_box);
302 show_the_widgets (the_axis -> radius_box);
303 if (! preferences)
304 {
305#ifdef GTK3
306 // GTK3 Menu Action To Check
307 from_box_or_axis = TRUE;
308 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][2], TRUE);
309 from_box_or_axis = FALSE;
310#endif
311 }
312 break;
313 }
314 if (! preferences)
315 {
316 view -> create_shaders[MAXIS] = TRUE;
317 update (view);
318#ifdef GTK4
319 update_menu_bar (view);
320#endif
321 }
322}
323
324#ifdef GTK4
333G_MODULE_EXPORT void set_show_axis_toggle (GtkCheckButton * but, gpointer data)
334#else
343G_MODULE_EXPORT void set_show_axis_toggle (GtkToggleButton * but, gpointer data)
344#endif
345{
346 gboolean val;
347 glwin * view;
348 axis_edition * the_axis;
349 int * axis_type;
350 if (preferences)
351 {
352 the_axis = pref_axis_win;
353 axis_type = & tmp_axis -> axis;
354 }
355 else
356 {
357 view = (glwin *)data;
358 the_axis = view -> axis_win;
359#ifdef GTK4
360 axis_type = & view -> anim -> last -> img -> xyz -> axis;
361#endif // GTK4
362 }
363 val = button_get_status ((GtkWidget *)but);
364#ifdef GTK3
365 from_box_or_axis = TRUE;
366#endif // GTK3
367 if (val)
368 {
369 if (! preferences)
370 {
371#ifdef GTK4
372 * axis_type = WIREFRAME;
373#else
374 // GTK3 Menu Action To Check
375 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], TRUE);
376#endif
377 }
378 else
379 {
380 * axis_type = WIREFRAME;
381 }
382 if (the_axis -> styles && GTK_IS_WIDGET(the_axis -> styles)) combo_set_active (the_axis -> styles, WIREFRAME-1);
383 }
384 else
385 {
386 if (! preferences)
387 {
388#ifdef GTK4
389 * axis_type = NONE;
390#else
391 // GTK3 Menu Action To Check
392 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], FALSE);
393#endif
394 }
395 else
396 {
397 * axis_type = NONE;
398 }
399 if (the_axis -> styles && GTK_IS_WIDGET(the_axis -> styles)) combo_set_active (the_axis -> styles, NONE);
400 }
401#ifdef GTK3
402 from_box_or_axis = FALSE;
403#endif // GTK3
404 widget_set_sensitive (the_axis -> axis_data, val);
405#ifdef GTK4
406 if (! preferences)
407 {
408 view -> create_shaders[MAXIS] = TRUE;
409 update (view);
410 update_menu_bar (view);
411 }
412#endif
413}
414
415#ifdef GTK4
424G_MODULE_EXPORT void use_axis_default_positions (GtkCheckButton * but, gpointer data)
425#else
434G_MODULE_EXPORT void use_axis_default_positions (GtkToggleButton * but, gpointer data)
435#endif
436{
437 gboolean val;
438 glwin * view = NULL;
439 axis_edition * the_axis;
440 int * pos;
441 if (preferences)
442 {
443 the_axis = pref_axis_win;
444 pos = & tmp_axis -> t_pos;
445 }
446 else
447 {
448 view = (glwin *)data;
449 the_axis = view -> axis_win;
450 pos = & view -> anim -> last -> img -> xyz -> t_pos;
451 }
452 val = button_get_status ((GtkWidget *)but);
453 widget_set_sensitive (the_axis -> axis_position_box, ! val);
454 if (val)
455 {
456#ifdef GTK4
457 * pos = 2;
458#else
459 // GTK3 Menu Action To Check
460 if (! preferences) gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][10], TRUE);
461#endif
462 }
463 else
464 {
465 * pos = CUSTOM;
466#ifdef GTK3
467 int i;
468 if (! preferences)
469 {
470 for (i=8; i<OGL_AXIS; i++)
471 {
472 // GTK3 Menu Action To Check
473 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][i], FALSE);
474 }
475 }
476#endif
477 }
478 activate_pos_box (view, val);
479 if (! preferences)
480 {
481 view -> create_shaders[MAXIS] = TRUE;
482 update (view);
483#ifdef GTK4
484 update_menu_bar (view);
485#endif
486 }
487}
488
497void init_axis_colors (ColRGBA axcol[3], axis_edition * axis_win)
498{
499 int i;
500 for (i = 0; i < 3; i++)
501 {
502 axcol[i].red = axis_init_color[i][0];
503 axcol[i].green = axis_init_color[i][1];
504 axcol[i].blue = axis_init_color[i][2];
505 axcol[i].alpha = 1.0;
506 GdkRGBA col = colrgba_togtkrgba (axcol[i]);
507 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(axis_win -> axis_color_title[i]), & col);
508 }
509}
510
511#ifdef GTK4
520G_MODULE_EXPORT void use_axis_default_colors (GtkCheckButton * but, gpointer data)
521#else
530G_MODULE_EXPORT void use_axis_default_colors (GtkToggleButton * but, gpointer data)
531#endif
532{
533 int i;
534 gboolean val;
535 glwin * view = NULL;
536 axis_edition * the_axis;
537 ColRGBA * col;
538 if (preferences)
539 {
540 the_axis = pref_axis_win;
541 col = tmp_axis -> color;
542 }
543 else
544 {
545 view = (glwin *)data;
546 the_axis = view -> axis_win;
547 col = view -> anim -> last -> img -> xyz -> color;
548 }
549 val = button_get_status ((GtkWidget *)but);
550 if (val)
551 {
552 if (col != NULL)
553 {
554 init_axis_colors ((preferences) ? tmp_axis -> color : view -> anim -> last -> img -> xyz -> color, the_axis);
555 if (! preferences)
556 {
557 g_free (view -> anim -> last -> img -> xyz -> color);
558 view -> anim -> last -> img -> xyz -> color = NULL;
559 }
560 else
561 {
562 g_free (tmp_axis -> color);
563 tmp_axis -> color = NULL;
564 }
565 }
566 }
567 else
568 {
569 if (! preferences)
570 {
571 view -> anim -> last -> img -> xyz -> color = g_malloc0(3*sizeof*view -> anim -> last -> img -> xyz -> color);
572 init_axis_colors (view -> anim -> last -> img -> xyz -> color, the_axis);
573 }
574 else
575 {
576 tmp_axis -> color = g_malloc0(3*sizeof*tmp_axis -> color);
577 init_axis_colors (tmp_axis -> color, the_axis);
578 }
579
580 }
581 for (i=0; i<3; i++) widget_set_sensitive (the_axis -> axis_color_title[i], ! val);
582 if (! preferences)
583 {
584 view -> create_shaders[MAXIS] = TRUE;
585 update (view);
586 }
587}
588
597G_MODULE_EXPORT void set_axis_color (GtkColorChooser * colob, gpointer data)
598{
599 tint * dat = (tint *)data;
600 if (! preferences)
601 {
602 glwin * view = get_project_by_id(dat -> a) -> modelgl;
603 view -> anim -> last -> img -> xyz -> color[dat -> b] = get_button_color (colob);
604 view -> create_shaders[MAXIS] = TRUE;
605 update (view);
606 }
607 else
608 {
609 tmp_axis -> color[dat -> b] = get_button_color (colob);
610 }
611}
612
621void axis_position_has_changed (gpointer data, double v)
622{
623 tint * dat = (tint *)data;
624 if (! preferences)
625 {
626 glwin * view = get_project_by_id(dat -> a) -> modelgl;
627 if (v >= 0.0 && v <= 100.0) view -> anim -> last -> img -> xyz -> c_pos[dat -> b] = v;
628 view -> create_shaders[MAXIS] = TRUE;
629 update (view);
630#ifdef GTK4
631 update_menu_bar (view);
632#endif
633 }
634 else
635 {
636 if (v >= 0.0 && v <= 100.0) tmp_axis -> c_pos[dat -> b] = v;
637 }
638}
639
650G_MODULE_EXPORT gboolean scroll_set_axis_position (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
651{
652 axis_position_has_changed (data, value);
653 return FALSE;
654}
655
664G_MODULE_EXPORT void set_axis_position (GtkRange * range, gpointer data)
665{
666 axis_position_has_changed (data, gtk_range_get_value (range));
667}
668
669#ifdef GTK4
678G_MODULE_EXPORT void set_axis_labels (GtkCheckButton * but, gpointer data)
679#else
688G_MODULE_EXPORT void set_axis_labels (GtkToggleButton * but, gpointer data)
689#endif
690{
691 gboolean val;
692 glwin * view = NULL;
693 axis_edition * the_axis;
694 int * axis_labels;
695 if (preferences)
696 {
697 the_axis = pref_axis_win;
698 axis_labels = & tmp_axis -> labels;
699 }
700 else
701 {
702 view = (glwin *)data;
703 the_axis = view -> axis_win;
704 axis_labels = & view -> anim -> last -> img -> xyz -> labels;
705 }
706 val = button_get_status ((GtkWidget *)but);
707 * axis_labels = val;
708 int i;
709 for (i=0; i<2; i++) widget_set_sensitive (the_axis -> axis_label_box[i], val);
710 if (! preferences)
711 {
712 view -> create_shaders[MAXIS] = TRUE;
713 update (view);
714 }
715}
716
725G_MODULE_EXPORT void set_axis_title (GtkEntry * entry, gpointer data)
726{
727 tint * dat = (tint *)data;
728 glwin * view = NULL;
729 const gchar * m = entry_get_text (entry);
730 if (preferences)
731 {
732 if (tmp_axis -> title[dat -> b]) g_free (tmp_axis -> title[dat -> b]);
733 tmp_axis -> title[dat -> b] = g_strdup_printf ("%s", m);
734 }
735 else
736 {
737 view = get_project_by_id (dat ->a) -> modelgl;
738 if (view -> anim -> last -> img -> xyz -> title[dat -> b]) g_free (view -> anim -> last -> img -> xyz -> title[dat -> b]);
739 view -> anim -> last -> img -> xyz -> title[dat -> b] = g_strdup_printf ("%s", m);
740 view -> create_shaders[MAXIS] = TRUE;
741 update (view);
742 }
743}
744
745#ifdef GTK4
754G_MODULE_EXPORT gboolean on_axis_delete (GtkWindow * widg, gpointer data)
755#else
765G_MODULE_EXPORT gboolean on_axis_delete (GtkWidget * widg, GdkEvent * event, gpointer data)
766#endif
767{
768 glwin * view = (glwin *)data;
769 view -> axis_win -> win = destroy_this_widget (view -> axis_win -> win);
770 g_free (view -> axis_win);
771 view -> axis_win = NULL;
772 return TRUE;
773}
774
783G_MODULE_EXPORT void axis_advanced (GtkWidget * widg, gpointer data)
784{
785 glwin * view;
786 axis_edition * the_axis;
787 int axis_type;
788 double axis_line;
789 double axis_rad;
790 double axis_length;
791 int axis_labels;
792 int axis_tpos;
793 GLfloat * axis_cpos;
794 ColRGBA * axis_color = NULL;
795 screen_label * axis_label;
796 gboolean build_win = TRUE;
797 int i;
798 if (preferences)
799 {
800 the_axis = pref_axis_win;
801 axis_type = tmp_axis -> axis;
802 axis_line = tmp_axis -> line;
803 axis_rad = tmp_axis -> rad;
804 axis_tpos = tmp_axis -> t_pos;
805 axis_length = tmp_axis -> length;
806 axis_labels = tmp_axis -> labels;
807 axis_color = tmp_axis -> color;
808 axis_cpos = tmp_axis -> c_pos;
809 axis_label = tmp_label[2];
810 }
811 else
812 {
813 view = (glwin *)data;
814 if (view -> axis_win)
815 {
816 if (view -> axis_win -> win && GTK_IS_WIDGET(view -> axis_win -> win))
817 {
818 build_win = FALSE;
819 show_the_widgets (view -> axis_win -> win);
820 }
821 }
822 if (build_win)
823 {
824 view -> axis_win = g_malloc0(sizeof*view -> axis_win);
825 the_axis = view -> axis_win;
826 axis_type = view -> anim -> last -> img -> xyz -> axis;
827 axis_line = view -> anim -> last -> img -> xyz -> line;
828 axis_rad = view -> anim -> last -> img -> xyz -> rad;
829 axis_tpos = view -> anim -> last -> img -> xyz -> t_pos;
830 axis_length = view -> anim -> last -> img -> xyz -> length;
831 axis_labels = view -> anim -> last -> img -> xyz -> labels;
832 axis_color = view -> anim -> last -> img -> xyz -> color;
833 axis_cpos = view -> anim -> last -> img -> xyz -> c_pos;
834 axis_label = & view -> anim -> last -> img -> labels[2];
835 }
836 }
837 if (build_win)
838 {
839 GtkWidget * vbox = create_vbox (BSEP);
840 if (preferences)
841 {
842 the_axis -> win = create_vbox (BSEP);
843 adv_box (the_axis -> win, _("<b>Axis settings</b>"), 10, 120, 0.0);
844 GtkWidget * hbox = create_hbox (BSEP);
845 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vbox, FALSE, FALSE, 60);
846 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> win, hbox, FALSE, FALSE, 10);
847 }
848 else
849 {
850 the_axis -> win = create_vbox (BSEP);
851 gchar * str = g_strdup_printf (_("%s - axis settings"), get_project_by_id(view -> proj)->name);
852 the_axis -> win = create_win (str, view -> win, FALSE, FALSE);
853 g_free (str);
854 add_container_child (CONTAINER_WIN, the_axis -> win, vbox);
855 }
856 GtkWidget * box;
857 gboolean ac;
858 if (axis_type != NONE)
859 {
860 ac = TRUE;
861 }
862 else
863 {
864 ac = FALSE;
865 }
866 the_axis -> show_hide = check_button (_("Show/Hide axis"), 100, 20, ac, G_CALLBACK(set_show_axis_toggle), data);
867 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, the_axis -> show_hide, FALSE, FALSE, 5);
868
869 the_axis -> axis_data = create_vbox (BSEP);
870 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, the_axis -> axis_data, TRUE, TRUE, 0);
871 widget_set_sensitive (the_axis -> axis_data, ac);
872
873 GtkWidget * pos_box = create_hbox (0);
874 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_data, pos_box, FALSE, FALSE, 5);
875 if (axis_tpos != CUSTOM)
876 {
877 ac = TRUE;
878 }
879 else
880 {
881 ac = FALSE;
882 }
883 gchar * axis_template[AXIS_TEMPLATES] = {i18n("Top Right Corner <sup>*</sup>"),
884 i18n("Top Left Corner <sup>*</sup>"),
885 i18n("Bottom Right Corner <sup>*</sup>"),
886 i18n("Bottom Left Corner <sup>*</sup>"),
887 i18n("Center <sup>**</sup>")};
888 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, pos_box, check_button (_("Use template positions"), 120, 30, ac, G_CALLBACK(use_axis_default_positions), data), FALSE, FALSE, 0);
889 the_axis -> templates = create_combo ();
890 for (i=0; i < AXIS_TEMPLATES; i++)
891 {
892 combo_text_append (the_axis -> templates, _(axis_template[i]));
893 }
894 combo_set_markup (the_axis -> templates);
895 activate_pos_box (view, ac);
896 gtk_widget_set_size_request (the_axis -> templates, 150, -1);
897 g_signal_connect (G_OBJECT (the_axis -> templates), "changed", G_CALLBACK(set_axis_template), data);
898 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, pos_box, the_axis -> templates, FALSE, FALSE, 10);
899
900 GtkWidget * chbox;
901 GtkWidget * ax_name;
902 the_axis -> axis_position_box = create_vbox (BSEP);
903 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_data, the_axis -> axis_position_box, FALSE, FALSE, 0);
904 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_position_box, markup_label(_("Please choose axis position:"), -1, -1, 0.0, 0.5), FALSE, TRUE, 5);
905
906 // use custom position
907 gchar * al[3] = {i18n("% of the window width"), i18n("% of the window height"), i18n("% of the window depth")};
908 gchar * axis_symbols[3] = {"X", "Y", "Z"};
909 for (i=0; i<2; i++)
910 {
911 chbox = create_hbox (0);
912 ax_name = gtk_label_new (axis_symbols[i]);
913 gtk_widget_set_size_request (ax_name, 20, -1);
914 gtk_label_align (ax_name, 0.5, 0.5);
915 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, ax_name, FALSE, TRUE, 0);
916 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, create_hscale (axis_range[i][0], axis_range[i][1], 1.0,
917 axis_cpos[i],
918 GTK_POS_LEFT, 0, 170, G_CALLBACK(set_axis_position),
919 G_CALLBACK(scroll_set_axis_position), (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]),
920 FALSE, TRUE, 0);
921 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_position_box, chbox, FALSE, TRUE, 5);
922 ax_name = gtk_label_new (_(al[i]));
923 gtk_label_align (ax_name, -1, 0.5);
924 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, ax_name, FALSE, TRUE, 0);
925 }
926 widget_set_sensitive (the_axis -> axis_position_box, ! ac);
927
928 box = abox (the_axis -> axis_data, _("Length [&#xC5;] "), 0);
929 the_axis -> length = create_entry (G_CALLBACK(update_axis_length), 150, 10, FALSE, data);
930 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, the_axis -> length, FALSE, FALSE, 0);
931 update_entry_double (GTK_ENTRY(the_axis -> length), axis_length);
932
933 box = abox (the_axis -> axis_data, _("Style "), 0);
934 the_axis -> styles = create_combo ();
935 combo_text_append (the_axis -> styles, _("Wireframes"));
936 combo_text_append (the_axis -> styles, _("Cylinders"));
937 if (axis_type == NONE) i = NONE;
938 if (axis_type == WIREFRAME) i = 0;
939 if (axis_type == CYLINDERS) i = 1;
940 combo_set_active (the_axis -> styles, i);
941 gtk_widget_set_size_request (the_axis -> styles, 150, -1);
942 g_signal_connect (G_OBJECT (the_axis -> styles), "changed", G_CALLBACK(set_axis_combo_style), data);
943 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, the_axis -> styles, FALSE, FALSE, 0);
944
945 the_axis -> width_box = abox (the_axis -> axis_data, _("Line width [pts] "), 0);
946 the_axis -> width = create_entry (G_CALLBACK(update_axis_parameter), 150, 10, FALSE, data);
947 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, the_axis -> width_box, the_axis -> width, FALSE, FALSE, 0);
948 update_entry_double (GTK_ENTRY(the_axis -> width), axis_line);
949 the_axis -> radius_box = abox (the_axis -> axis_data, _("Cylinder radius [&#xC5;] "), 0);
950 the_axis -> radius = create_entry (G_CALLBACK(update_axis_parameter), 150, 10, FALSE, data);
951 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, the_axis -> radius_box, the_axis -> radius, FALSE, FALSE, 0);
952 update_entry_double (GTK_ENTRY(the_axis -> radius), axis_rad);
953
954 // Labels
955 GtkWidget * lab_box = create_vbox (BSEP);
956 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_data, lab_box, FALSE, FALSE, 0);
957 add_box_child_start (GTK_ORIENTATION_VERTICAL, lab_box, check_button (_("Label axis"), 100, 40, axis_labels, G_CALLBACK(set_axis_labels), data), FALSE, FALSE, 0);
958
959 the_axis -> axis_label_box[0] = create_vbox (BSEP);
960 add_box_child_start (GTK_ORIENTATION_VERTICAL, lab_box, the_axis -> axis_label_box[0], FALSE, FALSE, 0);
961 box = abox (the_axis -> axis_label_box[0], _("Rendering "), 0);
962 GtkWidget * config = create_combo ();
963 combo_text_append (config, _("Basic Text"));
964 combo_text_append (config, _("Highlighted"));
965 combo_set_active (config, axis_label -> render);
966 gtk_widget_set_size_request (config, 150, -1);
967 g_signal_connect (G_OBJECT (config), "changed", G_CALLBACK(set_labels_render), (preferences) ? & pref_pointer[2] : & view -> colorp[2][0]);
968 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, config, FALSE, FALSE, 0);
969 box = abox (the_axis -> axis_label_box[0], _("Font"), 0);
970 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box,
971 font_button(axis_label -> font, 150, 30, G_CALLBACK(set_labels_font), (preferences) ? & pref_pointer[2] : & view -> colorp[2][0]),
972 FALSE, FALSE, 0);
973 // Size / scale
974 box = abox (the_axis -> axis_label_box[0], _("Size"), 0);
975 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box,
976 check_button (_("Scale with zoom in/out"), 150, -1, axis_label -> scale, G_CALLBACK(set_labels_scale), (preferences) ? & pref_pointer[2] : & view -> colorp[2][0]),
977 FALSE, FALSE, 10);
978
979 GtkWidget * lab_h_box = create_hbox (BSEP);
980 add_box_child_start (GTK_ORIENTATION_VERTICAL, lab_box, lab_h_box, FALSE, FALSE, 0);
981 the_axis -> axis_label_box[1] = create_vbox (BSEP);
982 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lab_h_box, the_axis -> axis_label_box[1], FALSE, FALSE, 0);
983 box = abox (the_axis -> axis_label_box[1], _("Legends"), 0);
984 GtkWidget * ax_title[3];
985 for (i=0; i<3; i++)
986 {
987 chbox = create_hbox (0);
988 ax_title[i] = create_entry (G_CALLBACK(set_axis_title), 80, 10, FALSE, (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]);
989 update_entry_text (GTK_ENTRY(ax_title[i]), (preferences) ? tmp_axis -> title[i] : view -> anim -> last -> img -> xyz -> title[i]);
990 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, ax_title[i], FALSE, FALSE, 20);
991 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_label_box[1], chbox, FALSE, FALSE, 2);
992 }
993
994 // Colors
995 GtkWidget * col_v_box = create_vbox (BSEP);
996 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lab_h_box, col_v_box, FALSE, FALSE, 0);
997 box = create_hbox (0);
998 add_box_child_start (GTK_ORIENTATION_VERTICAL, col_v_box, box, FALSE, FALSE, 0);
999 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
1000 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, markup_label(_("Colors"), 50, 30, 0.0, 0.5), FALSE, FALSE, 0);
1001 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, check_button (_("Use base colors"), -1, -1, ac, G_CALLBACK(use_axis_default_colors), data), FALSE, FALSE, 10);
1002
1003 if (axis_color == NULL)
1004 {
1005 ac = TRUE;
1006 }
1007 else
1008 {
1009 ac = FALSE;
1010 }
1011 for (i=0; i<3; i++)
1012 {
1013 chbox = create_hbox (0);
1014 if (axis_color != NULL)
1015 {
1016 the_axis -> axis_color_title[i] = color_button (axis_color[i], TRUE, 100, -1, G_CALLBACK(set_axis_color), (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]);
1017 }
1018 else
1019 {
1020 ColRGBA col;
1021 col.red = axis_init_color[i][0];
1022 col.green = axis_init_color[i][1];
1023 col.blue = axis_init_color[i][2];
1024 col.alpha = 1.0;
1025 the_axis -> axis_color_title[i] = color_button (col, TRUE, 100, -1, G_CALLBACK(set_axis_color), (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]);
1026 }
1027 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, the_axis -> axis_color_title[i], FALSE, FALSE, 40);
1028 widget_set_sensitive (the_axis -> axis_color_title[i], ! ac);
1029 add_box_child_start (GTK_ORIENTATION_VERTICAL, col_v_box, chbox, FALSE, FALSE, 0);
1030 }
1031
1032 append_comments (the_axis -> axis_data, "<sup>*</sup>", _("In front of the atomic model"));
1033 append_comments (the_axis -> axis_data, "<sup>**</sup>", _("Inside the atomic model"));
1034 if (! preferences)
1035 {
1036 add_global_option (vbox, & view -> colorp[2][0]);
1037 add_gtk_close_event (the_axis -> win, G_CALLBACK(on_axis_delete), view);
1038 show_the_widgets (the_axis -> win);
1039 if (axis_type == CYLINDERS)
1040 {
1041 hide_the_widgets (the_axis -> width_box);
1042 }
1043 else
1044 {
1045 hide_the_widgets (the_axis -> radius_box);
1046 }
1047 }
1048 }
1049}
G_MODULE_EXPORT void set_show_axis_toggle(GtkToggleButton *but, gpointer data)
show / hide axis callback GTK3
Definition w_axis.c:343
color colorp[64]
double scale(double axe)
find appropriate major tick spacing based on axis length
Definition curve.c:205
ColRGBA col
Definition d_measures.c:77
float val
Definition dlp_init.c:117
#define i18n(String)
Definition global.c:80
double string_to_double(gpointer string)
convert string to double
Definition global.c:611
Global variable declarations Global convenience function declarations Global data structure defin...
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:935
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1401
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:688
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2048
GtkWidget * font_button(gchar *font, int dimx, int dimy, GCallback handler, gpointer data)
create a font selection button
Definition gtk-misc.c:1855
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:486
void combo_set_markup(GtkWidget *combo)
use pango markup in combo widget
Definition gtk-misc.c:970
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:958
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:652
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1721
#define BSEP
Definition global.h:261
void add_gtk_close_event(GtkWidget *widg, GCallback handler, gpointer data)
add a close event signal and callback to a GtkWidget
Definition gtk-misc.c:2557
void add_global_option(GtkWidget *vbox, tint *oid)
add a button to update global user preferences
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1937
@ CONTAINER_WIN
Definition global.h:266
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:1010
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2406
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
void gtk_label_align(GtkWidget *lab, float ax, float ay)
set text alignment in a GtkLabel
Definition gtk-misc.c:756
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:987
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1833
GtkWidget * create_hscale(float min, float max, float delta, float val, int pos, int round, int size, GCallback handler, GCallback scroll_handler, gpointer data)
create an horizontal scale GtkWidget
Definition gtk-misc.c:780
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:726
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:224
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1899
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2067
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
@ CUSTOM
Definition glview.h:219
render
Definition glview.h:191
labels
Definition glview.h:223
styles
Definition glview.h:180
@ CYLINDERS
Definition glview.h:186
@ WIREFRAME
Definition glview.h:183
@ NONE
Definition glview.h:181
@ MAXIS
Definition glwin.h:94
#define OGL_AXIS
Definition glwin.h:59
Function declarations for the creation of the OpenGL window.
Messaging function declarations.
gboolean from_box_or_axis
Definition w_box.c:48
axis_edition * pref_axis_win
axis * tmp_axis
tint * pref_pointer
screen_label * tmp_label[5]
GtkWidget * adv_box(GtkWidget *box, char *lab, int vspace, int size, float xalign)
create a box with markup label
Definition w_advance.c:146
gboolean preferences
Preference variable declarations.
float blue
Definition global.h:138
float alpha
Definition global.h:139
float red
Definition global.h:136
float green
Definition global.h:137
Definition glwin.h:332
Definition glwin.h:350
Definition glwin.h:967
Definition global.h:118
G_MODULE_EXPORT void set_labels_font(GtkFontButton *fontb, gpointer data)
change label(s) font
Definition w_labels.c:250
double axis_range[3][2]
Definition w_axis.c:71
G_MODULE_EXPORT gboolean on_axis_delete(GtkWidget *widg, GdkEvent *event, gpointer data)
axis window delete event - GTK3
Definition w_axis.c:765
G_MODULE_EXPORT void set_axis_title(GtkEntry *entry, gpointer data)
set axis title callback
Definition w_axis.c:725
#define AXIS_TEMPLATES
Definition w_axis.c:68
G_MODULE_EXPORT gboolean scroll_set_axis_position(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
change axis position - scroll callback
Definition w_axis.c:650
G_MODULE_EXPORT void use_axis_default_positions(GtkToggleButton *but, gpointer data)
use axis default colors callback GTK3
Definition w_axis.c:434
G_MODULE_EXPORT void set_labels_render(GtkWidget *widg, gpointer data)
void axis_position_has_changed(gpointer data, double v)
change axis position
Definition w_axis.c:621
G_MODULE_EXPORT void update_axis_length(GtkEntry *res, gpointer data)
update axis length callback
Definition w_axis.c:161
void init_axis_colors(ColRGBA axcol[3], axis_edition *axis_win)
initialize axis colors
Definition w_axis.c:497
G_MODULE_EXPORT void set_axis_combo_style(GtkComboBox *box, gpointer data)
set axis style callback
Definition w_axis.c:267
G_MODULE_EXPORT void set_show_axis_toggle(GtkToggleButton *but, gpointer data)
show / hide axis callback GTK3
Definition w_axis.c:343
G_MODULE_EXPORT void axis_advanced(GtkWidget *widg, gpointer data)
create the axis advanced parameters window
Definition w_axis.c:783
G_MODULE_EXPORT void set_axis_color(GtkColorChooser *colob, gpointer data)
change axis color
Definition w_axis.c:597
G_MODULE_EXPORT void set_axis_template(GtkComboBox *box, gpointer data)
set axis position callback
Definition w_axis.c:229
G_MODULE_EXPORT void set_labels_scale(GtkToggleButton *but, gpointer data)
change label(s) scale - toggle callback GTK3
Definition w_labels.c:403
G_MODULE_EXPORT void use_axis_default_colors(GtkToggleButton *but, gpointer data)
use axis default color callback GTK3
Definition w_axis.c:530
G_MODULE_EXPORT void update_axis_parameter(GtkEntry *res, gpointer data)
update axis parameter callback
Definition w_axis.c:90
void activate_pos_box(glwin *view, gboolean val)
update axis position data
Definition w_axis.c:206
G_MODULE_EXPORT void set_axis_labels(GtkToggleButton *but, gpointer data)
set axis labels callback GTK3
Definition w_axis.c:688
G_MODULE_EXPORT void set_axis_position(GtkRange *range, gpointer data)
change axis position - range callback
Definition w_axis.c:664
double axis_init_color[3][3]
Definition w_axis.c:70
GtkWidget * res[2]
Definition w_encode.c:342
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72