atomes 1.2.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-2025 by CNRS and University of Strasbourg */
15
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_STYLES 2
69#define AXIS_TEMPLATES 5
70
71gchar * axis_symbols[3] = {"X", "Y", "Z"};
72gchar * axis_style[AXIS_STYLES] = {"Wireframe", "Cylinders"};
73gchar * al[3] = {"% of the window width", "% of the window height", "% of the window depth"};
74
75double axis_init_color[3][3] = {{0.0, 0.0, 1.0},{0.0, 1.0, 0.0},{1.0, 0.0, 0.0}};
76double axis_range[3][2] = {{0.0,100.0}, {0.0, 100.0}, {0.0, 100.0}};
77
78extern gboolean from_box_or_axis;
79extern G_MODULE_EXPORT void set_labels_render (GtkWidget * widg, gpointer data);
80extern G_MODULE_EXPORT void set_labels_font (GtkFontButton * fontb, gpointer data);
81#ifdef GTK4
82extern G_MODULE_EXPORT void set_labels_scale (GtkCheckButton * but, gpointer data);
83#else
84extern G_MODULE_EXPORT void set_labels_scale (GtkToggleButton * but, gpointer data);
85#endif
86
95G_MODULE_EXPORT void update_axis_parameter (GtkEntry * res, gpointer data)
96{
97 glwin * view;
98 int axis_type;
99 double * axis_line;
100 double * axis_rad;
101#ifdef GTK3
102 gchar * str;
103#endif // GTK3
104 const gchar * n = entry_get_text (res);
105 double v = string_to_double ((gpointer)n);
106 if (preferences)
107 {
108 axis_type = tmp_axis -> axis;
109 axis_line = & tmp_axis -> line;
110 axis_rad = & tmp_axis -> rad;
111 }
112 else
113 {
114 view = (glwin *)data;
115 axis_type = view -> anim -> last -> img -> xyz -> axis;
116 axis_line = & view -> anim -> last -> img -> xyz -> line;
117 axis_rad = & view -> anim -> last -> img -> xyz -> rad;
118 }
119 if (axis_type == CYLINDERS)
120 {
121 if (v > 0.0) * axis_rad = v;
122 v = * axis_rad;
123 if (! preferences)
124 {
125#ifdef GTK3
126 // GTK3 Menu Action To Check
127 str = g_strdup_printf ("_Radius [ %f Å ]", v);
128 gtk_menu_item_set_label (GTK_MENU_ITEM(view -> ogl_box_axis[1][6]), str);
129 g_free (str);
130#endif
131 }
132 }
133 else
134 {
135 if (v > 0.0) * axis_line = v;
136 v = * axis_line;
137 if (! preferences)
138 {
139#ifdef GTK3
140 // GTK3 Menu Action To Check
141 str = g_strdup_printf ("_Width [ %f pts ]", v);
142 gtk_menu_item_set_label (GTK_MENU_ITEM(view -> ogl_box_axis[1][4]), str);
143 g_free (str);
144#endif
145 }
146 }
148 if (! preferences)
149 {
150 view -> create_shaders[MAXIS] = TRUE;
151 update (view);
152#ifdef GTK4
153 update_menu_bar (view);
154#endif
155 }
156}
157
166G_MODULE_EXPORT void update_axis_length (GtkEntry * res, gpointer data)
167{
168 glwin * view;
169 double * axis_length;
170#ifdef GTK3
171 gchar * str;
172#endif // GTK3
173 const gchar * n = entry_get_text (res);
174 double v = string_to_double ((gpointer)n);
175 if (preferences)
176 {
177 axis_length = & tmp_axis -> length;
178 }
179 else
180 {
181 view = (glwin *)data;
182 axis_length = & view -> anim -> last -> img -> xyz -> length;
183 }
184 if (v > 0.0) * axis_length = v;
185 v = * axis_length;
187 if (! preferences)
188 {
189#ifdef GTK3
190 // GTK3 Menu Action To Check
191 str = g_strdup_printf ("_Radius [ %f Å ]", v);
192 gtk_menu_item_set_label (GTK_MENU_ITEM(view -> ogl_box_axis[1][7]), str);
193 g_free (str);
194#endif
195 view -> create_shaders[MAXIS] = TRUE;
196 update (view);
197#ifdef GTK4
198 update_menu_bar (view);
199#endif
200 }
201}
202
211void activate_pos_box (glwin * view, gboolean val)
212{
213 int i;
214 if (val)
215 {
216 i = (preferences) ? tmp_axis -> t_pos : view -> anim -> last -> img -> xyz -> t_pos;
217 }
218 else
219 {
220 i = NONE;
221 }
222 combo_set_active ((preferences) ? pref_axis_win -> templates : view -> axis_win -> templates, i);
223 widget_set_sensitive ((preferences) ? pref_axis_win -> templates : view -> axis_win -> templates, val);
224}
225
234G_MODULE_EXPORT void set_axis_template (GtkComboBox * box, gpointer data)
235{
236 int i = combo_get_active ((GtkWidget *)box);
237 glwin * view;
238 if (preferences)
239 {
240 tmp_axis -> t_pos = i;
241 }
242 else
243 {
244 view = (glwin *)data;
245#ifdef GTK4
246 view -> anim -> last -> img -> xyz -> t_pos = i;
247#endif
248 }
249 if (! preferences)
250 {
251#ifdef GTK4
252 view -> create_shaders[MAXIS] = TRUE;
253 update (view);
254 update_menu_bar (view);
255#else
256 // GTK3 Menu Action To Check
257 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][8+i], TRUE);
258#endif
259 }
260}
261
270G_MODULE_EXPORT void set_axis_combo_style (GtkComboBox * box, gpointer data)
271{
272 glwin * view;
273 axis_edition * the_axis;
274 int * axis;
275 if (preferences)
276 {
277 the_axis = pref_axis_win;
278 axis = & tmp_axis -> axis;
279 }
280 else
281 {
282 view = (glwin *)data;
283 the_axis = view -> axis_win;
284 axis = & view -> anim -> last -> img -> xyz -> axis;
285 }
286 switch (combo_get_active ((GtkWidget *)box))
287 {
288 case 0:
289 * axis = WIREFRAME;
290 if (is_the_widget_visible(the_axis -> radius_box)) hide_the_widgets (the_axis -> radius_box);
291 if (! is_the_widget_visible(the_axis -> width_box)) show_the_widgets (the_axis -> width_box);
292 if (! preferences)
293 {
294#ifdef GTK3
295 // GTK3 Menu Action To Check
296 from_box_or_axis = TRUE;
297 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][1], TRUE);
298 from_box_or_axis = FALSE;
299#endif
300 }
301 break;
302 case 1:
303 * axis = CYLINDERS;
304 if (is_the_widget_visible(the_axis -> width_box)) hide_the_widgets (the_axis -> width_box);
305 if (! is_the_widget_visible(the_axis -> radius_box)) show_the_widgets (the_axis -> radius_box);
306 if (! preferences)
307 {
308#ifdef GTK3
309 // GTK3 Menu Action To Check
310 from_box_or_axis = TRUE;
311 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][2], TRUE);
312 from_box_or_axis = FALSE;
313#endif
314 }
315 break;
316 }
317 if (! preferences)
318 {
319 view -> create_shaders[MAXIS] = TRUE;
320 update (view);
321#ifdef GTK4
322 update_menu_bar (view);
323#endif
324 }
325}
326
327#ifdef GTK4
336G_MODULE_EXPORT void set_show_axis_toggle (GtkCheckButton * but, gpointer data)
337#else
346G_MODULE_EXPORT void set_show_axis_toggle (GtkToggleButton * but, gpointer data)
347#endif
348{
349 gboolean val;
350 glwin * view;
351 axis_edition * the_axis;
352 int * axis_type;
353 if (preferences)
354 {
355 the_axis = pref_axis_win;
356 axis_type = & tmp_axis -> axis;
357 }
358 else
359 {
360 view = (glwin *)data;
361 the_axis = view -> axis_win;
362#ifdef GTK4
363 axis_type = & view -> anim -> last -> img -> xyz -> axis;
364#endif // GTK4
365 }
366 val = button_get_status ((GtkWidget *)but);
367#ifdef GTK3
368 from_box_or_axis = TRUE;
369#endif // GTK3
370 if (val)
371 {
372 if (! preferences)
373 {
374#ifdef GTK4
375 * axis_type = WIREFRAME;
376#else
377 // GTK3 Menu Action To Check
378 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], TRUE);
379#endif
380 }
381 else
382 {
383 * axis_type = WIREFRAME;
384 }
385 if (the_axis -> styles && GTK_IS_WIDGET(the_axis -> styles)) combo_set_active (the_axis -> styles, WIREFRAME-1);
386 }
387 else
388 {
389 if (! preferences)
390 {
391#ifdef GTK4
392 * axis_type = NONE;
393#else
394 // GTK3 Menu Action To Check
395 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], FALSE);
396#endif
397 }
398 else
399 {
400 * axis_type = NONE;
401 }
402 if (the_axis -> styles && GTK_IS_WIDGET(the_axis -> styles)) combo_set_active (the_axis -> styles, NONE);
403 }
404#ifdef GTK3
405 from_box_or_axis = FALSE;
406#endif // GTK3
407 widget_set_sensitive (the_axis -> axis_data, val);
408#ifdef GTK4
409 if (! preferences)
410 {
411 view -> create_shaders[MAXIS] = TRUE;
412 update (view);
413 update_menu_bar (view);
414 }
415#endif
416}
417
418#ifdef GTK4
427G_MODULE_EXPORT void use_axis_default_positions (GtkCheckButton * but, gpointer data)
428#else
437G_MODULE_EXPORT void use_axis_default_positions (GtkToggleButton * but, gpointer data)
438#endif
439{
440 gboolean val;
441 glwin * view = NULL;
442 axis_edition * the_axis;
443 int * pos;
444 if (preferences)
445 {
446 the_axis = pref_axis_win;
447 pos = & tmp_axis -> t_pos;
448 }
449 else
450 {
451 view = (glwin *)data;
452 the_axis = view -> axis_win;
453 pos = & view -> anim -> last -> img -> xyz -> t_pos;
454 }
455 val = button_get_status ((GtkWidget *)but);
456 widget_set_sensitive (the_axis -> axis_position_box, ! val);
457 if (val)
458 {
459#ifdef GTK4
460 * pos = 2;
461#else
462 // GTK3 Menu Action To Check
463 if (! preferences) gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][10], TRUE);
464#endif
465 }
466 else
467 {
468 * pos = CUSTOM;
469#ifdef GTK3
470 int i;
471 if (! preferences)
472 {
473 for (i=8; i<OGL_AXIS; i++)
474 {
475 // GTK3 Menu Action To Check
476 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][i], FALSE);
477 }
478 }
479#endif
480 }
481 activate_pos_box (view, val);
482 if (! preferences)
483 {
484 view -> create_shaders[MAXIS] = TRUE;
485 update (view);
486#ifdef GTK4
487 update_menu_bar (view);
488#endif
489 }
490}
491
500void init_axis_colors (ColRGBA axcol[3], axis_edition * axis_win)
501{
502 int i;
503 for (i = 0; i < 3; i++)
504 {
505 axcol[i].red = axis_init_color[i][0];
506 axcol[i].green = axis_init_color[i][1];
507 axcol[i].blue = axis_init_color[i][2];
508 axcol[i].alpha = 1.0;
509 GdkRGBA col = colrgba_togtkrgba (axcol[i]);
510 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(axis_win -> axis_color_title[i]), & col);
511 }
512}
513
514#ifdef GTK4
523G_MODULE_EXPORT void use_axis_default_colors (GtkCheckButton * but, gpointer data)
524#else
533G_MODULE_EXPORT void use_axis_default_colors (GtkToggleButton * but, gpointer data)
534#endif
535{
536 int i;
537 gboolean val;
538 glwin * view = NULL;
539 axis_edition * the_axis;
540 ColRGBA * col;
541 if (preferences)
542 {
543 the_axis = pref_axis_win;
544 col = tmp_axis -> color;
545 }
546 else
547 {
548 view = (glwin *)data;
549 the_axis = view -> axis_win;
550 col = view -> anim -> last -> img -> xyz -> color;
551 }
552 val = button_get_status ((GtkWidget *)but);
553 if (val)
554 {
555 if (col != NULL)
556 {
557 init_axis_colors ((preferences) ? tmp_axis -> color : view -> anim -> last -> img -> xyz -> color, the_axis);
558 if (! preferences)
559 {
560 g_free (view -> anim -> last -> img -> xyz -> color);
561 view -> anim -> last -> img -> xyz -> color = NULL;
562 }
563 else
564 {
565 g_free (tmp_axis -> color);
566 tmp_axis -> color = NULL;
567 }
568 }
569 }
570 else
571 {
572 if (! preferences)
573 {
574 view -> anim -> last -> img -> xyz -> color = g_malloc (3*sizeof*view -> anim -> last -> img -> xyz -> color);
575 init_axis_colors (view -> anim -> last -> img -> xyz -> color, the_axis);
576 }
577 else
578 {
579 tmp_axis -> color = g_malloc (3*sizeof*tmp_axis -> color);
580 init_axis_colors (tmp_axis -> color, the_axis);
581 }
582
583 }
584 for (i=0; i<3; i++) widget_set_sensitive (the_axis -> axis_color_title[i], ! val);
585 if (! preferences)
586 {
587 view -> create_shaders[MAXIS] = TRUE;
588 update (view);
589 }
590}
591
600G_MODULE_EXPORT void set_axis_color (GtkColorChooser * colob, gpointer data)
601{
602 tint * dat = (tint *)data;
603 if (! preferences)
604 {
605 glwin * view = get_project_by_id(dat -> a) -> modelgl;
606 view -> anim -> last -> img -> xyz -> color[dat -> b] = get_button_color (colob);
607 view -> create_shaders[MAXIS] = TRUE;
608 update (view);
609 }
610 else
611 {
612 tmp_axis -> color[dat -> b] = get_button_color (colob);
613 }
614}
615
624void axis_position_has_changed (gpointer data, double v)
625{
626 tint * dat = (tint *)data;
627 if (! preferences)
628 {
629 glwin * view = get_project_by_id(dat -> a) -> modelgl;
630 if (v >= 0.0 && v <= 100.0) view -> anim -> last -> img -> xyz -> c_pos[dat -> b] = v;
631 view -> create_shaders[MAXIS] = TRUE;
632 update (view);
633#ifdef GTK4
634 update_menu_bar (view);
635#endif
636 }
637 else
638 {
639 if (v >= 0.0 && v <= 100.0) tmp_axis -> c_pos[dat -> b] = v;
640 }
641}
642
653G_MODULE_EXPORT gboolean scroll_set_axis_position (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
654{
655 axis_position_has_changed (data, value);
656 return FALSE;
657}
658
667G_MODULE_EXPORT void set_axis_position (GtkRange * range, gpointer data)
668{
669 axis_position_has_changed (data, gtk_range_get_value (range));
670}
671
672#ifdef GTK4
681G_MODULE_EXPORT void set_axis_labels (GtkCheckButton * but, gpointer data)
682#else
691G_MODULE_EXPORT void set_axis_labels (GtkToggleButton * but, gpointer data)
692#endif
693{
694 gboolean val;
695 glwin * view = NULL;
696 axis_edition * the_axis;
697 int * axis_labels;
698 if (preferences)
699 {
700 the_axis = pref_axis_win;
701 axis_labels = & tmp_axis -> labels;
702 }
703 else
704 {
705 view = (glwin *)data;
706 the_axis = view -> axis_win;
707 axis_labels = & view -> anim -> last -> img -> xyz -> labels;
708 }
709 val = button_get_status ((GtkWidget *)but);
710 * axis_labels = val;
711 int i;
712 for (i=0; i<2; i++) widget_set_sensitive (the_axis -> axis_label_box[i], val);
713 if (! preferences)
714 {
715 view -> create_shaders[MAXIS] = TRUE;
716 update (view);
717 }
718}
719
728G_MODULE_EXPORT void set_axis_title (GtkEntry * entry, gpointer data)
729{
730 tint * dat = (tint *)data;
731 glwin * view = NULL;
732 const gchar * m = entry_get_text (entry);
733 if (preferences)
734 {
735 if (tmp_axis -> title[dat -> b]) g_free (tmp_axis -> title[dat -> b]);
736 tmp_axis -> title[dat -> b] = g_strdup_printf ("%s", m);
737 }
738 else
739 {
740 view = get_project_by_id (dat ->a) -> modelgl;
741 if (view -> anim -> last -> img -> xyz -> title[dat -> b]) g_free (view -> anim -> last -> img -> xyz -> title[dat -> b]);
742 view -> anim -> last -> img -> xyz -> title[dat -> b] = g_strdup_printf ("%s", m);
743 view -> create_shaders[MAXIS] = TRUE;
744 update (view);
745 }
746}
747
748#ifdef GTK4
757G_MODULE_EXPORT gboolean on_axis_delete (GtkWindow * widg, gpointer data)
758#else
768G_MODULE_EXPORT gboolean on_axis_delete (GtkWidget * widg, GdkEvent * event, gpointer data)
769#endif
770{
771 glwin * view = (glwin *)data;
772 view -> axis_win -> win = destroy_this_widget (view -> axis_win -> win);
773 g_free (view -> axis_win);
774 view -> axis_win = NULL;
775 return TRUE;
776}
777
786G_MODULE_EXPORT void axis_advanced (GtkWidget * widg, gpointer data)
787{
788 glwin * view;
789 axis_edition * the_axis;
790 int axis_type;
791 double axis_line;
792 double axis_rad;
793 double axis_length;
794 int axis_labels;
795 int axis_tpos;
796 GLfloat * axis_cpos;
797 ColRGBA * axis_color = NULL;
798 screen_label * axis_label;
799 gboolean build_win = TRUE;
800 int i;
801 if (preferences)
802 {
803 the_axis = pref_axis_win;
804 axis_type = tmp_axis -> axis;
805 axis_line = tmp_axis -> line;
806 axis_rad = tmp_axis -> rad;
807 axis_tpos = tmp_axis -> t_pos;
808 axis_length = tmp_axis -> length;
809 axis_labels = tmp_axis -> labels;
810 axis_color = tmp_axis -> color;
811 axis_cpos = tmp_axis -> c_pos;
812 axis_label = tmp_label[2];
813 }
814 else
815 {
816 view = (glwin *)data;
817 if (view -> axis_win)
818 {
819 if (view -> axis_win -> win && GTK_IS_WIDGET(view -> axis_win -> win))
820 {
821 build_win = FALSE;
822 show_the_widgets (view -> axis_win -> win);
823 }
824 }
825 if (build_win)
826 {
827 view -> axis_win = g_malloc0(sizeof*view -> axis_win);
828 the_axis = view -> axis_win;
829 axis_type = view -> anim -> last -> img -> xyz -> axis;
830 axis_line = view -> anim -> last -> img -> xyz -> line;
831 axis_rad = view -> anim -> last -> img -> xyz -> rad;
832 axis_tpos = view -> anim -> last -> img -> xyz -> t_pos;
833 axis_length = view -> anim -> last -> img -> xyz -> length;
834 axis_labels = view -> anim -> last -> img -> xyz -> labels;
835 axis_color = view -> anim -> last -> img -> xyz -> color;
836 axis_cpos = view -> anim -> last -> img -> xyz -> c_pos;
837 axis_label = & view -> anim -> last -> img -> labels[2];
838 }
839 }
840 if (build_win)
841 {
842 GtkWidget * vbox = create_vbox (BSEP);
843 if (preferences)
844 {
845 the_axis -> win = create_vbox (BSEP);
846 adv_box (the_axis -> win, "<b>Axis settings</b>", 10, 120, 0.0);
847 GtkWidget * hbox = create_hbox (BSEP);
848 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vbox, FALSE, FALSE, 60);
849 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> win, hbox, FALSE, FALSE, 10);
850 }
851 else
852 {
853 the_axis -> win = create_vbox (BSEP);
854 gchar * str = g_strdup_printf ("%s - axis settings", get_project_by_id(view -> proj)->name);
855 the_axis -> win = create_win (str, view -> win, FALSE, FALSE);
856 g_free (str);
857 add_container_child (CONTAINER_WIN, the_axis -> win, vbox);
858 }
859 GtkWidget * box;
860 gboolean ac;
861 if (axis_type != NONE)
862 {
863 ac = TRUE;
864 }
865 else
866 {
867 ac = FALSE;
868 }
869 the_axis -> show_hide = check_button ("Show / hide axis", 100, 20, ac, G_CALLBACK(set_show_axis_toggle), data);
870 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, the_axis -> show_hide, FALSE, FALSE, 5);
871
872 the_axis -> axis_data = create_vbox (BSEP);
873 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, the_axis -> axis_data, TRUE, TRUE, 0);
874 widget_set_sensitive (the_axis -> axis_data, ac);
875
876 GtkWidget * pos_box = create_hbox (0);
877 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_data, pos_box, FALSE, FALSE, 5);
878 if (axis_tpos != CUSTOM)
879 {
880 ac = TRUE;
881 }
882 else
883 {
884 ac = FALSE;
885 }
886 gchar * axis_template[AXIS_TEMPLATES] = {"Top Right Corner <sup>*</sup>", "Top Left Corner <sup>*</sup>", "Bottom Right Corner <sup>*</sup>", "Bottom Left Corner <sup>*</sup>", "Center <sup>**</sup>"};
887 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);
888 the_axis -> templates = create_combo ();
889 for (i=0; i < AXIS_TEMPLATES; i++)
890 {
891 combo_text_append (the_axis -> templates, axis_template[i]);
892 }
893 combo_set_markup (the_axis -> templates);
894 activate_pos_box (view, ac);
895 gtk_widget_set_size_request (the_axis -> templates, 150, -1);
896 g_signal_connect (G_OBJECT (the_axis -> templates), "changed", G_CALLBACK(set_axis_template), data);
897 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, pos_box, the_axis -> templates, FALSE, FALSE, 10);
898
899 GtkWidget * chbox;
900 GtkWidget * ax_name;
901 the_axis -> axis_position_box = create_vbox (BSEP);
902 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_data, the_axis -> axis_position_box, FALSE, FALSE, 0);
903 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);
904
905 // use custom position
906 for (i=0; i<2; i++)
907 {
908 chbox = create_hbox (0);
909 ax_name = gtk_label_new (axis_symbols[i]);
910 gtk_widget_set_size_request (ax_name, 20, -1);
911 gtk_label_align (ax_name, 0.5, 0.5);
912 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, ax_name, FALSE, TRUE, 0);
913 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, create_hscale (axis_range[i][0], axis_range[i][1], 1.0,
914 axis_cpos[i],
915 GTK_POS_LEFT, 0, 170, G_CALLBACK(set_axis_position),
916 G_CALLBACK(scroll_set_axis_position), (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]),
917 FALSE, TRUE, 0);
918 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_position_box, chbox, FALSE, TRUE, 5);
919 ax_name = gtk_label_new (al[i]);
920 gtk_label_align (ax_name, -1, 0.5);
921 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, ax_name, FALSE, TRUE, 0);
922 }
923 widget_set_sensitive (the_axis -> axis_position_box, ! ac);
924
925 box = abox (the_axis -> axis_data, "Length [&#xC5;] ", 0);
926 the_axis -> length = create_entry (G_CALLBACK(update_axis_length), 150, 10, FALSE, data);
927 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, the_axis -> length, FALSE, FALSE, 0);
928 update_entry_double (GTK_ENTRY(the_axis -> length), axis_length);
929
930 box = abox (the_axis -> axis_data, "Style ", 0);
931 the_axis -> styles = create_combo ();
932 for (i=0; i<AXIS_STYLES; i++)
933 {
934 combo_text_append (the_axis -> styles, axis_style[i]);
935 }
936 if (axis_type == NONE) i = NONE;
937 if (axis_type == WIREFRAME) i = 0;
938 if (axis_type == CYLINDERS) i = 1;
939 combo_set_active (the_axis -> styles, i);
940 gtk_widget_set_size_request (the_axis -> styles, 150, -1);
941 g_signal_connect (G_OBJECT (the_axis -> styles), "changed", G_CALLBACK(set_axis_combo_style), data);
942 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, the_axis -> styles, FALSE, FALSE, 0);
943
944 the_axis -> width_box = abox (the_axis -> axis_data, "Line width [pts] ", 0);
945 the_axis -> width = create_entry (G_CALLBACK(update_axis_parameter), 150, 10, FALSE, data);
946 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, the_axis -> width_box, the_axis -> width, FALSE, FALSE, 0);
947 update_entry_double (GTK_ENTRY(the_axis -> width), axis_line);
948 the_axis -> radius_box = abox (the_axis -> axis_data, "Cylinder radius [&#xC5;] ", 0);
949 the_axis -> radius = create_entry (G_CALLBACK(update_axis_parameter), 150, 10, FALSE, data);
950 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, the_axis -> radius_box, the_axis -> radius, FALSE, FALSE, 0);
951 update_entry_double (GTK_ENTRY(the_axis -> radius), axis_rad);
952
953 // Labels
954 GtkWidget * lab_box = create_vbox (BSEP);
955 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_data, lab_box, FALSE, FALSE, 0);
956 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);
957
958 the_axis -> axis_label_box[0] = create_vbox (BSEP);
959 add_box_child_start (GTK_ORIENTATION_VERTICAL, lab_box, the_axis -> axis_label_box[0], FALSE, FALSE, 0);
960 box = abox (the_axis -> axis_label_box[0], "Rendering ", 0);
961 GtkWidget * config = create_combo ();
962 combo_text_append (config, "Basic text");
963 combo_text_append (config, "Highlighted");
964 combo_set_active (config, axis_label -> render);
965 gtk_widget_set_size_request (config, 150, -1);
966 g_signal_connect (G_OBJECT (config), "changed", G_CALLBACK(set_labels_render), (preferences) ? & pref_pointer[2] : & view -> colorp[2][0]);
967 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, config, FALSE, FALSE, 0);
968 box = abox (the_axis -> axis_label_box[0], "Font", 0);
969 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box,
970 font_button(axis_label -> font, 150, 30, G_CALLBACK(set_labels_font), (preferences) ? & pref_pointer[2] : & view -> colorp[2][0]),
971 FALSE, FALSE, 0);
972 // Size / scale
973 box = abox (the_axis -> axis_label_box[0], "Size", 0);
974 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box,
975 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]),
976 FALSE, FALSE, 10);
977
978 GtkWidget * lab_h_box = create_hbox (BSEP);
979 add_box_child_start (GTK_ORIENTATION_VERTICAL, lab_box, lab_h_box, FALSE, FALSE, 0);
980 the_axis -> axis_label_box[1] = create_vbox (BSEP);
981 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lab_h_box, the_axis -> axis_label_box[1], FALSE, FALSE, 0);
982 box = abox (the_axis -> axis_label_box[1], "Legends", 0);
983 GtkWidget * ax_title[3];
984 for (i=0; i<3; i++)
985 {
986 chbox = create_hbox (0);
987 ax_title[i] = create_entry (G_CALLBACK(set_axis_title), 80, 10, FALSE, (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]);
988 update_entry_text (GTK_ENTRY(ax_title[i]), (preferences) ? tmp_axis -> title[i] : view -> anim -> last -> img -> xyz -> title[i]);
989 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, ax_title[i], FALSE, FALSE, 20);
990 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_axis -> axis_label_box[1], chbox, FALSE, FALSE, 2);
991 }
992
993 // Colors
994 GtkWidget * col_v_box = create_vbox (BSEP);
995 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lab_h_box, col_v_box, FALSE, FALSE, 0);
996 box = create_hbox (0);
997 add_box_child_start (GTK_ORIENTATION_VERTICAL, col_v_box, box, FALSE, FALSE, 0);
998 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
999 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, markup_label("Colors", 50, 30, 0.0, 0.5), FALSE, FALSE, 0);
1000 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);
1001
1002 if (axis_color == NULL)
1003 {
1004 ac = TRUE;
1005 }
1006 else
1007 {
1008 ac = FALSE;
1009 }
1010 for (i=0; i<3; i++)
1011 {
1012 chbox = create_hbox (0);
1013 if (axis_color != NULL)
1014 {
1015 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]);
1016 }
1017 else
1018 {
1019 ColRGBA col;
1020 col.red = axis_init_color[i][0];
1021 col.green = axis_init_color[i][1];
1022 col.blue = axis_init_color[i][2];
1023 col.alpha = 1.0;
1024 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]);
1025 }
1026 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, chbox, the_axis -> axis_color_title[i], FALSE, FALSE, 40);
1027 widget_set_sensitive (the_axis -> axis_color_title[i], ! ac);
1028 add_box_child_start (GTK_ORIENTATION_VERTICAL, col_v_box, chbox, FALSE, FALSE, 0);
1029 }
1030
1031 append_comments (the_axis -> axis_data, "<sup>*</sup>", "In front of the atomic model");
1032 append_comments (the_axis -> axis_data, "<sup>**</sup>", "Inside the atomic model");
1033 if (! preferences)
1034 {
1035 add_global_option (vbox, & view -> colorp[2][0]);
1036 add_gtk_close_event (the_axis -> win, G_CALLBACK(on_axis_delete), view);
1037 show_the_widgets (the_axis -> win);
1038 if (axis_type == CYLINDERS)
1039 {
1040 hide_the_widgets (the_axis -> width_box);
1041 }
1042 else
1043 {
1044 hide_the_widgets (the_axis -> radius_box);
1045 }
1046 }
1047 }
1048}
color colorp[64]
double scale(double axe)
find appropriate major tick spacing based on axis length
Definition curve.c:204
ColRGBA col
Definition d_measures.c:77
float val
Definition dlp_init.c:117
double string_to_double(gpointer string)
convert string to double
Definition global.c:624
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:909
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1375
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:643
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2004
GtkWidget * font_button(gchar *font, int dimx, int dimy, GCallback handler, gpointer data)
create a font selection button
Definition gtk-misc.c:1811
gboolean is_the_widget_visible(GtkWidget *widg)
test if a GtkWidget exist, then return if it is visible or not
Definition gtk-misc.c:724
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:454
void combo_set_markup(GtkWidget *combo)
use pango markup in combo widget
Definition gtk-misc.c:944
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:932
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:607
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1695
#define BSEP
Definition global.h:247
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:2522
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:1893
@ CONTAINER_WIN
Definition global.h:252
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:984
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1646
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:308
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2371
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:215
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:823
void gtk_label_align(GtkWidget *lab, float ax, float ay)
set text alignment in a GtkLabel
Definition gtk-misc.c:711
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:961
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2169
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1789
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:754
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:681
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:235
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:198
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1855
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2023
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:182
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:450
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
struct box box
box layout data structure
Definition glwin.h:349
struct axis axis
axis layout data structure
Definition glwin.h:331
@ MAXIS
Definition glwin.h:94
#define OGL_AXIS
Definition glwin.h:59
Function declarations for the creation of the OpenGL window.
Messaging function declarations.
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:151
gboolean preferences
Preference variable declarations.
float blue
Definition global.h:126
float alpha
Definition global.h:127
float red
Definition global.h:124
float green
Definition global.h:125
Definition glwin.h:333
Definition glwin.h:351
Definition glwin.h:965
Definition global.h:106
int b
Definition tab-1.c:95
int a
Definition tab-1.c:95
gboolean from_box_or_axis
Definition w_box.c:52
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:76
G_MODULE_EXPORT gboolean on_axis_delete(GtkWidget *widg, GdkEvent *event, gpointer data)
axis window delete event - GTK3
Definition w_axis.c:768
G_MODULE_EXPORT void set_axis_title(GtkEntry *entry, gpointer data)
set axis title callback
Definition w_axis.c:728
#define AXIS_TEMPLATES
Definition w_axis.c:69
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:653
gchar * axis_style[AXIS_STYLES]
Definition w_axis.c:72
G_MODULE_EXPORT void use_axis_default_positions(GtkToggleButton *but, gpointer data)
use axis default colors callback GTK3
Definition w_axis.c:437
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:624
G_MODULE_EXPORT void update_axis_length(GtkEntry *res, gpointer data)
update axis length callback
Definition w_axis.c:166
void init_axis_colors(ColRGBA axcol[3], axis_edition *axis_win)
initialize axis colors
Definition w_axis.c:500
gchar * al[3]
Definition w_axis.c:73
G_MODULE_EXPORT void set_axis_combo_style(GtkComboBox *box, gpointer data)
set axis style callback
Definition w_axis.c:270
G_MODULE_EXPORT void set_show_axis_toggle(GtkToggleButton *but, gpointer data)
show / hide axis callback GTK3
Definition w_axis.c:346
gchar * axis_symbols[3]
Definition w_axis.c:71
G_MODULE_EXPORT void axis_advanced(GtkWidget *widg, gpointer data)
create the axis advanced parameters window
Definition w_axis.c:786
#define AXIS_STYLES
Definition w_axis.c:68
G_MODULE_EXPORT void set_axis_color(GtkColorChooser *colob, gpointer data)
change axis color
Definition w_axis.c:600
G_MODULE_EXPORT void set_axis_template(GtkComboBox *box, gpointer data)
set axis position callback
Definition w_axis.c:234
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:533
G_MODULE_EXPORT void update_axis_parameter(GtkEntry *res, gpointer data)
update axis parameter callback
Definition w_axis.c:95
void activate_pos_box(glwin *view, gboolean val)
update axis position data
Definition w_axis.c:211
G_MODULE_EXPORT void set_axis_labels(GtkToggleButton *but, gpointer data)
set axis labels callback GTK3
Definition w_axis.c:691
G_MODULE_EXPORT void set_axis_position(GtkRange *range, gpointer data)
change axis position - range callback
Definition w_axis.c:667
double axis_init_color[3][3]
Definition w_axis.c:75
GtkWidget * res[2]
Definition w_encode.c:212
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72