atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
m_rep.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: 'm_rep.c'
24*
25* Contains:
26*
27
28 - The functions to create the 'View -> Representation' submenu
29
30*
31* List of functions:
32
33 G_MODULE_EXPORT gboolean scroll_set_camera (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
34 G_MODULE_EXPORT gboolean on_rep_delete (GtkWindow * widg, gpointer data);
35 G_MODULE_EXPORT gboolean on_rep_delete (GtkWidget * widg, GdkEvent * event, gpointer data);
36
37 void update_labels (glwin * view);
38 void camera_has_changed (gdouble value, gpointer data);
39
40 G_MODULE_EXPORT void reset_view (GtkButton * but, gpointer data);
41 G_MODULE_EXPORT void to_reset_view (GSimpleAction * action, GVariant * parameter, gpointer data);
42 G_MODULE_EXPORT void to_reset_view (GtkWidget * widg, gpointer data);
43 G_MODULE_EXPORT void set_camera (GtkRange * range, gpointer data);
44 G_MODULE_EXPORT void set_camera_spin (GtkSpinButton * res, gpointer data);
45 G_MODULE_EXPORT void representation_advanced (GtkWidget * widg, gpointer data);
46 G_MODULE_EXPORT void set_rep (GtkWidget * widg, gpointer data);
47 G_MODULE_EXPORT void change_rep_radio (GSimpleAction * action, GVariant * parameter, gpointer data);
48 G_MODULE_EXPORT void to_rep_advanced (GSimpleAction * action, GVariant * parameter, gpointer data);
49 G_MODULE_EXPORT void to_center_molecule (GSimpleAction * action, GVariant * parameter, gpointer data);
50
51 GtkWidget * menu_rep (glwin * view, int id);
52
53 GMenu * menu_rep (glwin * view, int popm);
54 GMenu * menu_reset (glwin * view, int popm);
55 GMenu * menu_fullscreen (glwin * view, int popm);
56 GMenu * menu_view (glwin * view, int popm);
57
58*/
59
60#include "global.h"
61#include "interface.h"
62#include "glview.h"
63#include "glwindow.h"
64#include "submenus.h"
65#include "preferences.h"
66
67extern void save_rotation_quaternion (glwin * view);
68extern void rotate_x_y (glwin * view, double angle_x, double angle_y);
69extern G_MODULE_EXPORT void set_camera_pos (GtkWidget * widg, gpointer data);
70#ifdef GTK4
71extern G_MODULE_EXPORT void set_full_screen (GSimpleAction * action, GVariant * parameter, gpointer data);
72#else
73extern G_MODULE_EXPORT void set_full_screen (GtkWidget * widg, gpointer data);
74#endif
75
76gchar * text_reps[OGL_REPS] = {"Orthographic", "Perspective"};
77
85void update_labels (glwin * view)
86{
87 int i;
88 for (i=0; i<2; i++) if (view -> anim -> last -> img -> labels[i].scale) view -> create_shaders[LABEL] = TRUE;
89 if (view -> anim -> last -> img -> labels[2].scale) view -> create_shaders[MAXIS] = TRUE;
90 if (view -> anim -> last -> img -> labels[3].scale) view -> create_shaders[MEASU] = TRUE;
91}
92
101void camera_has_changed (gdouble value, gpointer data)
102{
103 tint * cid = (tint *)data;
104 glwin * view;
105 rep_edition * the_rep;
106 GLdouble * p_depth;
107 GLdouble * c_angle;
108 GLdouble * c_shift;
109 GLdouble * gnear;
110 GLdouble * zoom;
111 if (preferences)
112 {
113 the_rep = pref_rep_win;
114 GLdouble val = 10000.0;
115 p_depth = & val;
116 c_angle = tmp_rep -> c_angle;
117 c_shift = tmp_rep -> c_shift;
118 gnear = & tmp_rep -> gnear;
119 zoom = & tmp_rep -> zoom;
120 }
121 else
122 {
123 view = get_project_by_id(cid -> a) -> modelgl;
124 the_rep = view -> rep_win;
125 p_depth = & view -> anim -> last -> img -> p_depth;
126 c_angle = view -> anim -> last -> img -> c_angle;
127 c_shift = view -> anim -> last -> img -> c_shift;
128 gnear = & view -> anim -> last -> img -> gnear;
129 zoom = & view -> anim -> last -> img -> zoom;
130 }
131 double v;
132 switch (cid -> b)
133 {
134 case 0:
135 * zoom = 2.0*(1.0-value);
136 // gtk_spin_button_set_increments ((GtkSpinButton *)view -> rep_win -> camera_widg[0], view -> zoom_factor, view -> zoom_factor);
137 break;
138 case 1:
139 // > camera depth
140 if (value > * gnear)
141 {
142 * p_depth = value;
143 }
144 else
145 {
146 * p_depth = * gnear + 0.01;
147 gtk_spin_button_set_value ((GtkSpinButton *)the_rep -> camera_widg[1], * p_depth);
148 }
149 break;
150 case 2:
151 // < perspective depth
152 if (value < * p_depth)
153 {
154 * gnear = value;
155 }
156 else
157 {
158 * gnear = * p_depth - 0.01;
159 gtk_spin_button_set_value ((GtkSpinButton *)the_rep -> camera_widg[2], * gnear);
160 }
161 break;
162 default:
163 if (cid -> b < 5)
164 {
165 if (value != c_angle[cid -> b - 3])
166 {
167 if (preferences)
168 {
169 c_angle[cid -> b - 3] = value;
170 }
171 else
172 {
173 v = c_angle[cid -> b - 3] - value;
175 if (cid -> b == 3)
176 {
177 rotate_x_y (view, v, 0.0);
178 }
179 else
180 {
181 rotate_x_y (view, 0.0, v);
182 }
183 }
184 gtk_spin_button_set_value ((GtkSpinButton *)the_rep -> camera_widg[cid -> b], value);
185 }
186 }
187 else
188 {
189 c_shift[cid -> b - 5] = (value == 0.0) ? value : - value;
190 }
191 break;
192 }
193 if (! preferences)
194 {
195 update_labels (view);
196 if (view -> anim -> last -> img -> xyz -> axis != NONE) view -> create_shaders[MAXIS] = TRUE;
197 update (view);
198 }
199}
200
209G_MODULE_EXPORT void reset_view (GtkButton * but, gpointer data)
210{
211 int i;
212 if (preferences)
213 {
214 tmp_rep -> proj = -1;
215 tmp_rep -> zoom = ZOOM;
216 tmp_rep -> c_angle[0] = - CAMERA_ANGLE_X;
217 tmp_rep -> c_angle[1] = - CAMERA_ANGLE_Y;
218 for (i=0; i<2; i++) tmp_rep -> c_shift[i] = 0.0;
219 tmp_rep -> gnear = 6.0;
220 if (pref_rep_win)
221 {
222 if (pref_rep_win -> camera_widg[2] && GTK_IS_WIDGET(pref_rep_win -> camera_widg[2]))
223 {
224 gtk_spin_button_set_value ((GtkSpinButton *)pref_rep_win -> camera_widg[2], tmp_rep -> gnear);
225 }
226 for (i=0; i<2; i++)
227 {
228 if (pref_rep_win -> camera_widg[i+3] && GTK_IS_WIDGET(pref_rep_win -> camera_widg[i+3]))
229 {
230 gtk_spin_button_set_value ((GtkSpinButton *)pref_rep_win -> camera_widg[i+3], tmp_rep -> c_angle[i]);
231 }
232 if (pref_rep_win -> camera_widg[i+5] && GTK_IS_WIDGET(pref_rep_win -> camera_widg[i+5]))
233 {
234 gtk_spin_button_set_value ((GtkSpinButton *)pref_rep_win -> camera_widg[i+5], tmp_rep -> c_shift[i]);
235 }
236 }
237 if (pref_rep_win -> camera_widg[0] && GTK_IS_WIDGET(pref_rep_win -> camera_widg[0]))
238 {
239 gtk_spin_button_set_value ((GtkSpinButton *)pref_rep_win -> camera_widg[0], 1.0 - 0.5*tmp_rep -> zoom);
240 }
241 }
242 }
243 else
244 {
245 glwin * view = (glwin *)data;
246 i = view -> mode;
247 view -> mode = ANALYZE;
248 init_camera (get_project_by_id(view -> proj), FALSE);
249 view -> mode = i;
250 update_labels (view);
251 update (view);
252 }
253}
254
255#ifdef GTK4
265G_MODULE_EXPORT void to_reset_view (GSimpleAction * action, GVariant * parameter, gpointer data)
266#else
275G_MODULE_EXPORT void to_reset_view (GtkWidget * widg, gpointer data)
276#endif
277{
278 reset_view (NULL, data);
279}
280
291G_MODULE_EXPORT gboolean scroll_set_camera (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
292{
293 camera_has_changed (value, data);
294 return FALSE;
295}
296
305G_MODULE_EXPORT void set_camera (GtkRange * range, gpointer data)
306{
307 camera_has_changed (gtk_range_get_value (range), data);
308}
309
318G_MODULE_EXPORT void set_camera_spin (GtkSpinButton * res, gpointer data)
319{
320 camera_has_changed (gtk_spin_button_get_value(res), data);
321}
322
323#ifdef GTK4
332G_MODULE_EXPORT gboolean on_rep_delete (GtkWindow * widg, gpointer data)
333#else
343G_MODULE_EXPORT gboolean on_rep_delete (GtkWidget * widg, GdkEvent * event, gpointer data)
344#endif
345{
346 glwin * view = (glwin *)data;
347 int i;
348 for (i=0; i<7; i++)
349 {
350 if (view -> rep_win -> camera_widg[i]) view -> rep_win -> camera_widg[i] = destroy_this_widget(view -> rep_win -> camera_widg[i]);
351 }
352 destroy_this_widget ((GtkWidget *)widg);
353 return TRUE;
354}
355
364G_MODULE_EXPORT void set_rep_combo (GtkComboBox * box, gpointer data)
365{
366 int rep = combo_get_active ((GtkWidget *)box);
367 rep_edition * the_rep;
368 glwin * view;
369 if (preferences)
370 {
371 tmp_rep -> rep = rep;
372 the_rep = pref_rep_win;
373 }
374 else
375 {
376 view = (glwin *)data;
377 the_rep = view -> rep_win;
378 view -> anim -> last -> img -> rep = rep;
379 }
380 int i;
381 for (i=1; i<3; i++)
382 {
383 if (the_rep)
384 {
385 if (the_rep -> camera_widg[i] && GTK_IS_WIDGET(the_rep -> camera_widg[i]))
386 {
387 widget_set_sensitive (the_rep -> camera_widg[i], rep);
388 }
389 }
390 }
391}
392
401G_MODULE_EXPORT void set_projection_combo (GtkComboBox * box, gpointer data)
402{
403 int proj = combo_get_active ((GtkWidget *)box);
404 if (preferences)
405 {
406 tmp_rep -> proj = proj;
408 }
409 else
410 {
411 glwin * view = (glwin *)data;
412 set_camera_pos (NULL, & view -> colorp[proj][0]);
413 }
414}
415
424G_MODULE_EXPORT void representation_advanced (GtkWidget * widg, gpointer data)
425{
426 gchar * cam_opts[7]={"Zoom", "<b>P</b>erspective depth", "<b>C</b>amera depth",
427 "Camera pitch", "Camera heading",
428 "Camera right/left", "Camera up/down"};
429 gchar * str;
430 double smax[7] = {1.0, 100.0, 100.0, 180.0, 180.0, 100.0, 100.0};
431 double smin[7] = {-2.0, 0.0, 0.0, -180.0, -180.0, -100.0, -100.0};
432 double sdel[7] = {0.001, 0.01, 0.01, 0.1, 0.1, 0.01, 0.01};
433 int sdig[7] = {3, 2, 2, 1, 1, 2, 2};
434 int i;
435 double max_depth;
436 double v, v_max;
437 glwin * view;
438 rep_edition * the_rep;
439 GtkWidget * hbox;
440 GtkWidget * phbox, * pvbox;
441 GtkWidget * vbox = create_vbox (BSEP);
442 int rep;
443 gboolean build_win = TRUE;
444 if (preferences)
445 {
446 the_rep = pref_rep_win;
447 the_rep -> win = create_vbox (BSEP);
448 rep = tmp_rep -> rep;
449 max_depth = 100.0;
450 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_rep -> win, vbox, FALSE, FALSE, 10);
451 }
452 else
453 {
454 view = (glwin *)data;
455 max_depth = view -> anim -> last -> img -> m_depth;
456 if (view -> rep_win)
457 {
458 if (view -> rep_win -> win && GTK_IS_WIDGET(view -> rep_win -> win))
459 {
460 build_win = FALSE;
461 show_the_widgets (view -> rep_win -> win);
462 }
463 }
464 if (build_win)
465 {
466 view -> rep_win = g_malloc0(sizeof*view -> rep_win);
467 the_rep = view -> rep_win;
468 str = g_strdup_printf ("%s - OpenGL camera set-up", get_project_by_id(view -> proj)->name);
469 the_rep -> win = create_win (str, view -> win, FALSE, FALSE);
470 g_free (str);
471 add_container_child (CONTAINER_WIN, the_rep -> win, vbox);
472 rep = view -> anim -> last -> img -> rep;
473 }
474 }
475 if (build_win)
476 {
477 adv_box (vbox, "<b>Projection</b>", 10, 120, 0.0);
478 if (preferences)
479 {
480 phbox = create_hbox (BSEP);
481 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, phbox, FALSE, FALSE, 0);
482 pvbox = create_vbox (BSEP);
483 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, phbox, pvbox, FALSE, FALSE, 30);
484 }
485 gchar * projection[6]={"Right [1, 0, 0]", "Left [-1, 0, 0]", "Top [0, 1, 0]", "Bottom [0, -1, 0]", "Front [0, 0, 1]", "Back [0, 0, -1]"};
486 hbox = abox ((preferences) ? pvbox : vbox, "Select", 0);
487 GtkWidget * combo = create_combo ();
488 combo = create_combo ();
489 for (i=0; i<6; i++) combo_text_append (combo, projection[i]);
490 combo_set_active (combo, (preferences) ? tmp_rep -> proj : -1);
491 gtk_widget_set_size_request (combo, 150, -1);
492 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
493 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_projection_combo), (preferences) ? NULL : view);
494
495 adv_box (vbox, "<b>Representation</b>", 10, 120, 0.0);
496 if (preferences)
497 {
498 phbox = create_hbox (BSEP);
499 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, phbox, FALSE, FALSE, 0);
500 pvbox = create_vbox (BSEP);
501 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, phbox, pvbox, FALSE, FALSE, 30);
502 }
503 hbox = abox ((preferences) ? pvbox : vbox, "Mode", 0);
504
505 combo = create_combo ();
506 for (i=0; i<OGL_REPS; i++) combo_text_append (combo, text_reps[i]);
507 combo_set_active (combo, rep);
508 gtk_widget_set_size_request (combo, 150, -1);
509 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
510 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_rep_combo), (preferences) ? NULL : view);
511
512 adv_box (vbox, "<b>OpenGL camera set-up</b>", 10, 120, 0.0);
513 if (preferences)
514 {
515 phbox = create_hbox (BSEP);
516 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, phbox, FALSE, FALSE, 0);
517 pvbox = create_vbox (BSEP);
518 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, phbox, pvbox, FALSE, FALSE, 30);
519 }
520
521 for (i=0; i<7; i++)
522 {
523 if (! preferences || i != 1)
524 {
525 hbox = abox ((preferences) ? pvbox : vbox, cam_opts[i], 0);
526 switch (i)
527 {
528 case 0:
529 v = 1.0-0.5*((preferences) ? tmp_rep -> zoom : view -> anim -> last -> img -> zoom);
530 break;
531 case 1:
532 v = view -> anim -> last -> img -> p_depth;
533 break;
534 case 2:
535 v = (preferences) ? tmp_rep -> gnear : view -> anim -> last -> img -> gnear;
536 break;
537 default:
538 if (i < 5)
539 {
540 v = (preferences) ? tmp_rep -> c_angle[i-3] : view -> anim -> last -> img -> c_angle[i-3];
541 }
542 else
543 {
544 if (preferences)
545 {
546 v = (tmp_rep -> c_shift[i-5] == 0.0) ? 0.0 : - tmp_rep -> c_shift[i-5];
547 }
548 else
549 {
550 v = (view -> anim -> last -> img -> c_shift[i-5] == 0.0) ? 0.0 : - view -> anim -> last -> img -> c_shift[i-5];
551 }
552 }
553 break;
554 }
555 if (the_rep -> camera_widg[i]) the_rep -> camera_widg[i] = destroy_this_widget (the_rep -> camera_widg[i]);
556 v_max = (i == 1) ? max_depth : (preferences && i == 2) ? 10000.0 : smax[i];
557 the_rep -> camera_widg[i] = spin_button (G_CALLBACK(set_camera_spin), v, smin[i], v_max, sdel[i], sdig[i], 150, (preferences) ? & pref_pointer[i] : & view -> colorp[i][0]);
558 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, the_rep -> camera_widg[i], FALSE, FALSE, 10);
559 if (i > 2 || i == 0)
560 {
561 str = g_strdup_printf ("in [%.1f, %.1f]", smin[i], smax[i]);
562 }
563 else if (i == 1)
564 {
565 str = g_strdup_printf ("in [<b>C</b>. depth, %.1f]", max_depth);
566 }
567 else
568 {
569 str = (preferences) ? g_strdup_printf ("in [%.1f, <b>P</b>. depth<sup>*</sup>]", smin[i]) : g_strdup_printf ("in [%.1f, <b>P</b>. depth]", smin[i]);
570 }
571 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 25, -1, 0.0, 0.5), FALSE, FALSE, 5);
572 g_free (str);
573 if ((i == 1 || i == 2) && rep == ORTHOGRAPHIC) widget_set_sensitive (the_rep -> camera_widg[i], 0);
574 }
575 }
576 hbox = create_hbox(0);
577 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 20);
578 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, create_button((preferences) ? "Reset" : "Reset view", IMG_NONE, NULL, 100, 25, GTK_RELIEF_NORMAL, G_CALLBACK(reset_view), view), FALSE, FALSE, 200);
579 if (! preferences)
580 {
581 add_gtk_close_event (the_rep -> win, G_CALLBACK(on_rep_delete), view);
582 show_the_widgets (the_rep -> win);
583 }
584 else
585 {
586 append_comments (the_rep -> win, "<sup>*</sup>", "Perspective depth evaluated from the model");
587 }
588 }
589}
590
599G_MODULE_EXPORT void set_rep (GtkWidget * widg, gpointer data)
600{
601 tint * the_data = (tint *)data;
602 project * this_proj = get_project_by_id(the_data -> a);
603 int i, j;
604 i = this_proj -> modelgl -> anim -> last -> img -> rep;
605 j = the_data -> b;
606#ifdef GTK4
607 if (i != j)
608#else
609 if (i != j && gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg))
610#endif
611 {
612 this_proj -> modelgl -> anim -> last -> img -> rep = NONE;
613#ifdef GTK3
614 // GTK3 Menu Action To Check
615 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_rep[i], FALSE);
616 if (widg != this_proj -> modelgl -> ogl_rep[j])
617 {
618 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_rep[j], TRUE);
619 }
620#endif
621 this_proj -> modelgl -> anim -> last -> img -> rep = j;
622 for (i=1; i<3; i++)
623 {
624 if (this_proj -> modelgl -> rep_win)
625 {
626 if (this_proj -> modelgl -> rep_win -> camera_widg[i] && GTK_IS_WIDGET(this_proj -> modelgl -> rep_win -> camera_widg[i]))
627 {
628 widget_set_sensitive (this_proj -> modelgl -> rep_win -> camera_widg[i], j);
629 }
630 }
631 }
632 this_proj -> modelgl -> create_shaders[MAXIS] = TRUE;
633 update (this_proj -> modelgl);
634 }
635#ifdef GTK3
636 // GTK3 Menu Action To Check
637 else if (i == j && ! gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg))
638 {
639 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_rep[j], TRUE);
640 }
641#endif
642}
643
644#ifdef GTK3
653GtkWidget * menu_rep (glwin * view, int id)
654{
655 int i, j;
656 GtkWidget * menur = gtk_menu_new ();
657 j = view -> anim -> last -> img -> rep;
658 if (id == 0)
659 {
660 for (i=0; i<OGL_REPS; i++)
661 {
662 view -> ogl_rep[i] = gtk3_menu_item (menur, text_reps[i], IMG_NONE, NULL, G_CALLBACK(set_rep), & view -> colorp[i][0], FALSE, 0, 0, TRUE, TRUE, (i == j) ? TRUE : FALSE);
663 }
664 }
665 else
666 {
667 for (i=0; i<OGL_REPS; i++)
668 {
669 gtk3_menu_item (menur, text_reps[i], IMG_NONE, NULL, G_CALLBACK(set_rep), & view -> colorp[i][0], FALSE, 0, 0, TRUE, TRUE, (i == j) ? TRUE : FALSE);
670 }
671 }
672 add_advanced_item (menur, G_CALLBACK(representation_advanced), (gpointer)view, FALSE, 0, 0);
673 return menur;
674}
675#else
685G_MODULE_EXPORT void change_rep_radio (GSimpleAction * action, GVariant * parameter, gpointer data)
686{
687 glwin * view = (glwin *)data;
688 const gchar * rep = g_variant_get_string (parameter, NULL);
689 int lgt = strlen (rep);
690 gchar * name = g_strdup_printf ("%c%c", rep[lgt-2], rep[lgt-1]);
691 if (g_strcmp0(name, ".1") == 0)
692 {
693 g_free (name);
694 name = g_strdup_printf ("%.*s.0", lgt-2, rep);
695 g_action_group_activate_action ((GActionGroup *)view -> action_group, "set-rep", g_variant_new_string((const gchar *)name));
696 g_free (name);
697 }
698 else
699 {
700 const gchar * rep = g_variant_get_string (parameter, NULL);
701 gchar * rep_name = NULL;
702 int i;
703 for (i=0; i<OGL_REPS; i++)
704 {
705 rep_name = g_strdup_printf ("set-rep.%d.0", i);
706 if (g_strcmp0(rep, (const gchar *)rep_name) == 0)
707 {
708 set_rep (NULL, & view -> colorp[i][0]);
709 g_free (rep_name);
710 rep_name = NULL;
711 break;
712 }
713 g_free (rep_name);
714 rep_name = NULL;
715 }
716 g_action_change_state (G_ACTION (action), parameter);
717 }
718}
719
729G_MODULE_EXPORT void to_rep_advanced (GSimpleAction * action, GVariant * parameter, gpointer data)
730{
731 representation_advanced (NULL, data);
732}
733
742GMenu * menu_rep (glwin * view, int popm)
743{
744 GMenu * menu = g_menu_new ();
745 int i, j;
746 i = view -> anim -> last -> img -> rep;
747 for (j=0; j<OGL_REPS; j++)
748 {
749 append_opengl_item (view, menu, text_reps[j], "rep", popm, j, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(change_rep_radio), (gpointer)view, FALSE, (i == j) ? TRUE : FALSE, TRUE, TRUE);
750 }
751 append_opengl_item (view, menu, "Advanced", "rep-adv", popm, j, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(to_rep_advanced), (gpointer)view, FALSE, FALSE, FALSE, TRUE);
752 return menu;
753}
754
764G_MODULE_EXPORT void to_center_molecule (GSimpleAction * action, GVariant * parameter, gpointer data)
765{
767}
768
777GMenu * menu_reset (glwin * view, int popm)
778{
779 GMenu * menu = g_menu_new ();
780 append_opengl_item (view, menu, "Reset view", "reset-view", popm, popm, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(to_reset_view), (gpointer)view, FALSE, FALSE, FALSE, TRUE);
781 append_opengl_item (view, menu, "Center molecule", "center-mol", popm, popm, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(to_center_molecule), (gpointer)view, FALSE, FALSE, FALSE, TRUE);
782 return menu;
783}
784
793GMenu * menu_fullscreen (glwin * view, int popm)
794{
795 GMenu * menu = g_menu_new ();
796 append_opengl_item (view, menu, "Fullscreen", "full", popm, popm, "<CTRL>F", IMG_STOCK, (gpointer)FULLSCREEN, FALSE, G_CALLBACK(set_full_screen), (gpointer)view, FALSE, FALSE, FALSE, TRUE);
797 return menu;
798}
799
808GMenu * menu_view (glwin * view, int popm)
809{
810 GMenu * menu = g_menu_new ();
811 append_submenu (menu, "Representation", menu_rep(view, popm));
812 append_submenu (menu, "Projection", menu_proj(view, popm));
813 append_submenu (menu, "Background", menu_back(view, popm));
814 if (get_project_by_id(view -> proj) -> nspec) g_menu_append_item (menu, menu_box_axis (view, popm, 1));
815 if (! popm)
816 {
817 g_menu_append_section (menu, NULL, (GMenuModel*)menu_reset(view, popm));
818 g_menu_append_section (menu, NULL, (GMenuModel*)menu_fullscreen(view, popm));
819 }
820 return menu;
821}
822
823#endif
color colorp[64]
double scale(double axe)
find appropriate major tick spacing based on axis length
Definition curve.c:204
float val
Definition dlp_init.c:117
dint rep
Definition dlp_edit.c:2227
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:262
@ IMG_STOCK
Definition global.h:266
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:909
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2004
GtkWidget * gtk3_menu_item(GtkWidget *menu, gchar *name, int icon_format, gpointer item_icon, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod, gboolean check, gboolean radio, gboolean status)
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:454
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:932
#define BSEP
Definition global.h:247
void append_submenu(GMenu *menu, const gchar *label, GMenu *submenu)
append a GMenuItem with a subenu to a GMenu, and use markup for the GMenuItem
Definition gui.c:732
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
GtkWidget * spin_button(GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
create a spin button
Definition gtk-misc.c:1833
GtkWidget * add_advanced_item(GtkWidget *menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
@ CONTAINER_WIN
Definition global.h:252
GtkWidget * create_button(gchar *text, int image_format, gchar *image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
create a simple button
Definition gtk-misc.c:1955
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
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
#define FULLSCREEN
Definition global.h:200
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
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:235
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
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
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1017
void init_camera(project *this_proj, int get_depth)
initialize the OpenGL camera settings
Definition glview.c:1170
void center_this_molecule(glwin *view)
center atomic coordinates around (0,0,0) and refresh shaders
Definition glview.c:1571
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
action
Definition glview.h:198
#define CAMERA_ANGLE_X
Default value for the OpenGL camera pitch in °
Definition glview.h:109
@ ANALYZE
Definition glview.h:166
@ ORTHOGRAPHIC
Definition glview.h:160
labels
Definition glview.h:223
#define ZOOM
Default value for the OpenGL zoom.
Definition glview.h:124
#define CAMERA_ANGLE_Y
Default value for the OpenGL camera heading in °
Definition glview.h:114
@ NONE
Definition glview.h:181
@ LABEL
Definition glwin.h:98
@ MAXIS
Definition glwin.h:94
@ MEASU
Definition glwin.h:99
#define OGL_REPS
Definition glwin.h:60
Function declarations for the creation of the OpenGL window.
void append_opengl_item(glwin *view, GMenu *menu, const gchar *name, gchar *key, int mpop, int item_id, gchar *accel, int image_format, gpointer icon, gboolean custom, GCallback handler, gpointer data, gboolean check, gboolean status, gboolean radio, gboolean sensitive)
Messaging function declarations.
GMenu * menu_back(glwin *view, int popm)
create the background color menu item GTK4
Definition m_back.c:89
GMenuItem * menu_box_axis(glwin *view, int popm, int ab)
create the 'Model -> Box' and 'View -> Axis' submenus GTK4
Definition m_box.c:598
GMenu * menu_proj(glwin *view, int popm)
create the 'View -> Projection' submenu - GTK4
Definition m_proj.c:189
G_MODULE_EXPORT void to_center_molecule(GSimpleAction *action, GVariant *parameter, gpointer data)
center molecule callback - GTK4
Definition m_rep.c:764
void update_labels(glwin *view)
update labels (on representation data update)
Definition m_rep.c:85
void save_rotation_quaternion(glwin *view)
save the rotation quaternion of the last image
Definition glview.c:554
GMenu * menu_fullscreen(glwin *view, int popm)
create the 'Fullscreen' menu item - GTK4
Definition m_rep.c:793
G_MODULE_EXPORT void set_projection_combo(GtkComboBox *box, gpointer data)
change projection combo callback
Definition m_rep.c:401
GMenu * menu_reset(glwin *view, int popm)
create the reset menu items - GTK4
Definition m_rep.c:777
G_MODULE_EXPORT void change_rep_radio(GSimpleAction *action, GVariant *parameter, gpointer data)
change representation radio items callback - GTK4
Definition m_rep.c:685
void camera_has_changed(gdouble value, gpointer data)
update camera data
Definition m_rep.c:101
G_MODULE_EXPORT void reset_view(GtkButton *but, gpointer data)
reset view callback
Definition m_rep.c:209
G_MODULE_EXPORT void set_full_screen(GtkWidget *widg, gpointer data)
set full screen callback GTK3
Definition popup.c:228
G_MODULE_EXPORT void set_rep(GtkWidget *widg, gpointer data)
change representation callback
Definition m_rep.c:599
G_MODULE_EXPORT gboolean on_rep_delete(GtkWidget *widg, GdkEvent *event, gpointer data)
representation window delete event - GTK3
Definition m_rep.c:343
G_MODULE_EXPORT void set_camera(GtkRange *range, gpointer data)
update camera data callback - range callback
Definition m_rep.c:305
GMenu * menu_rep(glwin *view, int popm)
create 'View -> Representation' submenu items - GTK4
Definition m_rep.c:742
G_MODULE_EXPORT void set_camera_pos(GtkWidget *widg, gpointer data)
set camera position callback
Definition m_proj.c:67
G_MODULE_EXPORT void to_reset_view(GtkWidget *widg, gpointer data)
reset view callback - GTK3
Definition m_rep.c:275
G_MODULE_EXPORT void to_rep_advanced(GSimpleAction *action, GVariant *parameter, gpointer data)
change representation callback - GTK4
Definition m_rep.c:729
G_MODULE_EXPORT gboolean scroll_set_camera(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update camera data callback - scroll callback
Definition m_rep.c:291
void rotate_x_y(glwin *view, double angle_x, double angle_y)
rotate the OpenGL camera
Definition glview.c:1092
G_MODULE_EXPORT void set_camera_spin(GtkSpinButton *res, gpointer data)
update camera data callback - spin button
Definition m_rep.c:318
G_MODULE_EXPORT void representation_advanced(GtkWidget *widg, gpointer data)
open advanced representation dialog
Definition m_rep.c:424
G_MODULE_EXPORT void set_rep_combo(GtkComboBox *box, gpointer data)
change representation combo callback
Definition m_rep.c:364
GMenu * menu_view(glwin *view, int popm)
create the 'View' submenu - GTK4
Definition m_rep.c:808
gchar * text_reps[OGL_REPS]
Definition m_rep.c:76
tint * pref_pointer
rep_edition * pref_rep_win
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
rep_data * tmp_rep
Preference variable declarations.
Definition glwin.h:333
Definition glwin.h:351
Definition glwin.h:965
Definition global.h:106
Function declarations for the creation of the OpenGL window menus.
int b
Definition tab-1.c:95
int a
Definition tab-1.c:95
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