atomes 1.3.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-2026 by CNRS and University of Strasbourg */
15
21
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] = {i18n("Orthographic"), i18n("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;
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 update (view);
380 }
381 int i;
382 for (i=1; i<3; i++)
383 {
384 if (the_rep)
385 {
386 if (the_rep -> camera_widg[i] && GTK_IS_WIDGET(the_rep -> camera_widg[i]))
387 {
388 widget_set_sensitive (the_rep -> camera_widg[i], rep);
389 }
390 }
391 }
392}
393
402G_MODULE_EXPORT void set_projection_combo (GtkComboBox * box, gpointer data)
403{
404 int proj = combo_get_active ((GtkWidget *)box);
405 if (preferences)
406 {
407 tmp_rep -> proj = proj;
409 }
410 else
411 {
412 glwin * view = (glwin *)data;
413 set_camera_pos (NULL, & view -> colorp[proj][0]);
414 }
415}
416
425G_MODULE_EXPORT void representation_advanced (GtkWidget * widg, gpointer data)
426{
427 gchar * cam_opts[7]={_("Zoom"), _("<b>P</b>erspective depth"), _("<b>C</b>amera depth"),
428 _("Camera pitch"), _("Camera heading"),
429 _("Camera right/left"), _("Camera up/down")};
430 gchar * str;
431 double smax[7] = {1.0, 100.0, 100.0, 180.0, 180.0, 100.0, 100.0};
432 double smin[7] = {-2.0, 0.0, 0.0, -180.0, -180.0, -100.0, -100.0};
433 double sdel[7] = {0.001, 0.01, 0.01, 0.1, 0.1, 0.01, 0.01};
434 int sdig[7] = {3, 2, 2, 1, 1, 2, 2};
435 int i;
436 double max_depth;
437 double v, v_max;
438 glwin * view;
439 rep_edition * the_rep;
440 GtkWidget * hbox;
441 GtkWidget * phbox, * pvbox;
442 GtkWidget * vbox = create_vbox (BSEP);
443 int rep;
444 gboolean build_win = TRUE;
445 if (preferences)
446 {
447 the_rep = pref_rep_win;
448 the_rep -> win = create_vbox (BSEP);
449 rep = tmp_rep -> rep;
450 max_depth = 100.0;
451 add_box_child_start (GTK_ORIENTATION_VERTICAL, the_rep -> win, vbox, FALSE, FALSE, 10);
452 }
453 else
454 {
455 view = (glwin *)data;
456 max_depth = view -> anim -> last -> img -> m_depth;
457 if (view -> rep_win)
458 {
459 if (view -> rep_win -> win && GTK_IS_WIDGET(view -> rep_win -> win))
460 {
461 build_win = FALSE;
462 show_the_widgets (view -> rep_win -> win);
463 }
464 }
465 if (build_win)
466 {
467 view -> rep_win = g_malloc0(sizeof*view -> rep_win);
468 the_rep = view -> rep_win;
469 str = g_strdup_printf (_("%s - OpenGL scene set-up"), get_project_by_id(view -> proj)->name);
470 the_rep -> win = create_win (str, view -> win, FALSE, FALSE);
471 g_free (str);
472 add_container_child (CONTAINER_WIN, the_rep -> win, vbox);
473 rep = view -> anim -> last -> img -> rep;
474 }
475 }
476 if (build_win)
477 {
478 adv_box (vbox, _("<b>Projection</b>"), 10, 120, 0.0);
479 if (preferences)
480 {
481 phbox = create_hbox (BSEP);
482 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, phbox, FALSE, FALSE, 0);
483 pvbox = create_vbox (BSEP);
484 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, phbox, pvbox, FALSE, FALSE, 30);
485 }
486 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]")};
487 hbox = abox ((preferences) ? pvbox : vbox, _("Select"), 0);
488 GtkWidget * combo = create_combo ();
489 combo = create_combo ();
490 for (i=0; i<6; i++) combo_text_append (combo, projection[i]);
491 combo_set_active (combo, (preferences) ? tmp_rep -> proj : -1);
492 gtk_widget_set_size_request (combo, 150, -1);
493 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
494 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_projection_combo), (preferences) ? NULL : view);
495
496 adv_box (vbox, _("<b>Representation</b>"), 10, 120, 0.0);
497 if (preferences)
498 {
499 phbox = create_hbox (BSEP);
500 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, phbox, FALSE, FALSE, 0);
501 pvbox = create_vbox (BSEP);
502 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, phbox, pvbox, FALSE, FALSE, 30);
503 }
504 hbox = abox ((preferences) ? pvbox : vbox, _("Mode"), 0);
505
506 combo = create_combo ();
507 for (i=0; i<OGL_REPS; i++) combo_text_append (combo, _(text_reps[i]));
508 combo_set_active (combo, rep);
509 gtk_widget_set_size_request (combo, 150, -1);
510 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
511 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_rep_combo), (preferences) ? NULL : view);
512
513 adv_box (vbox, _("<b>OpenGL camera set-up</b>"), 10, 120, 0.0);
514 if (preferences)
515 {
516 phbox = create_hbox (BSEP);
517 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, phbox, FALSE, FALSE, 0);
518 pvbox = create_vbox (BSEP);
519 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, phbox, pvbox, FALSE, FALSE, 30);
520 }
521
522 for (i=0; i<7; i++)
523 {
524 if (! preferences || i != 1)
525 {
526 hbox = abox ((preferences) ? pvbox : vbox, cam_opts[i], 0);
527 switch (i)
528 {
529 case 0:
530 v = 1.0-0.5*((preferences) ? tmp_rep -> zoom : view -> anim -> last -> img -> zoom);
531 break;
532 case 1:
533 v = view -> anim -> last -> img -> p_depth;
534 break;
535 case 2:
536 v = (preferences) ? tmp_rep -> gnear : view -> anim -> last -> img -> gnear;
537 break;
538 default:
539 if (i < 5)
540 {
541 v = (preferences) ? tmp_rep -> c_angle[i-3] : view -> anim -> last -> img -> c_angle[i-3];
542 }
543 else
544 {
545 if (preferences)
546 {
547 v = (tmp_rep -> c_shift[i-5] == 0.0) ? 0.0 : - tmp_rep -> c_shift[i-5];
548 }
549 else
550 {
551 v = (view -> anim -> last -> img -> c_shift[i-5] == 0.0) ? 0.0 : - view -> anim -> last -> img -> c_shift[i-5];
552 }
553 }
554 break;
555 }
556 if (the_rep -> camera_widg[i]) the_rep -> camera_widg[i] = destroy_this_widget (the_rep -> camera_widg[i]);
557 v_max = (i == 1) ? max_depth : (preferences && i == 2) ? 1000.0 : smax[i];
558 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]);
559 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, the_rep -> camera_widg[i], FALSE, FALSE, 10);
560 if (i > 2 || i == 0)
561 {
562 str = g_strdup_printf ("&#x2208; [%.1f, %.1f]", smin[i], smax[i]);
563 }
564 else if (i == 1)
565 {
566 str = g_strdup_printf (_("&#x2208; [<b>C</b>. depth, %.1f]"), max_depth);
567 }
568 else
569 {
570 str = (preferences) ? g_strdup_printf (_("&#x2208; [%.1f, <b>P</b>. depth<sup>*</sup>]"), smin[i]) : g_strdup_printf (_("&#x2208; [%.1f, <b>P</b>. depth]"), smin[i]);
571 }
572 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 25, -1, 0.0, 0.5), FALSE, FALSE, 5);
573 g_free (str);
574 if ((i == 1 || i == 2) && rep == ORTHOGRAPHIC) widget_set_sensitive (the_rep -> camera_widg[i], 0);
575 }
576 }
577 hbox = create_hbox(0);
578 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 20);
579 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);
580 if (! preferences)
581 {
582 add_gtk_close_event (the_rep -> win, G_CALLBACK(on_rep_delete), view);
583 show_the_widgets (the_rep -> win);
584 }
585 else
586 {
587 append_comments (the_rep -> win, "<sup>*</sup>", _("Perspective depth evaluated from the model"));
588 }
589 }
590}
591
600G_MODULE_EXPORT void set_rep (GtkWidget * widg, gpointer data)
601{
602 tint * the_data = (tint *)data;
603 project * this_proj = get_project_by_id(the_data -> a);
604 int i, j;
605 i = this_proj -> modelgl -> anim -> last -> img -> rep;
606 j = the_data -> b;
607#ifdef GTK4
608 if (i != j)
609#else
610 if (i != j && gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg))
611#endif
612 {
613 this_proj -> modelgl -> anim -> last -> img -> rep = NONE;
614#ifdef GTK3
615 // GTK3 Menu Action To Check
616 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_rep[i], FALSE);
617 if (widg != this_proj -> modelgl -> ogl_rep[j])
618 {
619 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_rep[j], TRUE);
620 }
621#endif
622 this_proj -> modelgl -> anim -> last -> img -> rep = j;
623 for (i=1; i<3; i++)
624 {
625 if (this_proj -> modelgl -> rep_win)
626 {
627 if (this_proj -> modelgl -> rep_win -> camera_widg[i] && GTK_IS_WIDGET(this_proj -> modelgl -> rep_win -> camera_widg[i]))
628 {
629 widget_set_sensitive (this_proj -> modelgl -> rep_win -> camera_widg[i], j);
630 }
631 }
632 }
633 this_proj -> modelgl -> create_shaders[MAXIS] = TRUE;
634 update (this_proj -> modelgl);
635 }
636#ifdef GTK3
637 // GTK3 Menu Action To Check
638 else if (i == j && ! gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg))
639 {
640 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_rep[j], TRUE);
641 }
642#endif
643}
644
645#ifdef GTK3
654GtkWidget * menu_rep (glwin * view, int id)
655{
656 int i, j;
657 GtkWidget * menur = gtk_menu_new ();
658 j = view -> anim -> last -> img -> rep;
659 if (id == 0)
660 {
661 for (i=0; i<OGL_REPS; i++)
662 {
663 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);
664 }
665 }
666 else
667 {
668 for (i=0; i<OGL_REPS; i++)
669 {
670 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);
671 }
672 }
673 add_advanced_item (menur, G_CALLBACK(representation_advanced), (gpointer)view, FALSE, 0, 0);
674 return menur;
675}
676#else
686G_MODULE_EXPORT void change_rep_radio (GSimpleAction * action, GVariant * parameter, gpointer data)
687{
688 glwin * view = (glwin *)data;
689 const gchar * rep = g_variant_get_string (parameter, NULL);
690 int lgt = strlen (rep);
691 gchar * name = g_strdup_printf ("%c%c", rep[lgt-2], rep[lgt-1]);
692 if (g_strcmp0(name, ".1") == 0)
693 {
694 g_free (name);
695 name = g_strdup_printf ("%.*s.0", lgt-2, rep);
696 g_action_group_activate_action ((GActionGroup *)view -> action_group, "set-rep", g_variant_new_string((const gchar *)name));
697 g_free (name);
698 }
699 else
700 {
701 const gchar * rep = g_variant_get_string (parameter, NULL);
702 gchar * rep_name = NULL;
703 int i;
704 for (i=0; i<OGL_REPS; i++)
705 {
706 rep_name = g_strdup_printf ("set-rep.%d.0", i);
707 if (g_strcmp0(rep, (const gchar *)rep_name) == 0)
708 {
709 set_rep (NULL, & view -> colorp[i][0]);
710 g_free (rep_name);
711 rep_name = NULL;
712 break;
713 }
714 g_free (rep_name);
715 rep_name = NULL;
716 }
717 g_action_change_state (G_ACTION (action), parameter);
718 }
719}
720
730G_MODULE_EXPORT void to_rep_advanced (GSimpleAction * action, GVariant * parameter, gpointer data)
731{
732 representation_advanced (NULL, data);
733}
734
743GMenu * menu_rep (glwin * view, int popm)
744{
745 GMenu * menu = g_menu_new ();
746 int i, j;
747 i = view -> anim -> last -> img -> rep;
748 for (j=0; j<OGL_REPS; j++)
749 {
750 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);
751 }
752 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);
753 return menu;
754}
755
765G_MODULE_EXPORT void to_center_molecule (GSimpleAction * action, GVariant * parameter, gpointer data)
766{
768}
769
778GMenu * menu_reset (glwin * view, int popm)
779{
780 GMenu * menu = g_menu_new ();
781 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);
782 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);
783 return menu;
784}
785
794GMenu * menu_fullscreen (glwin * view, int popm)
795{
796 GMenu * menu = g_menu_new ();
797 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);
798 return menu;
799}
800
809GMenu * menu_view (glwin * view, int popm)
810{
811 GMenu * menu = g_menu_new ();
812 append_submenu (menu, _("Representation"), menu_rep(view, popm));
813 append_submenu (menu, _("Projection"), menu_proj(view, popm));
814 append_submenu (menu, _("Background"), menu_back(view, popm));
815 if (get_project_by_id(view -> proj) -> nspec) g_menu_append_item (menu, menu_box_axis (view, popm, 1));
816 if (! popm)
817 {
818 g_menu_append_section (menu, NULL, (GMenuModel*)menu_reset(view, popm));
819 g_menu_append_section (menu, NULL, (GMenuModel*)menu_fullscreen(view, popm));
820 }
821 return menu;
822}
823
824#endif
color colorp[64]
double scale(double axe)
find appropriate major tick spacing based on axis length
Definition curve.c:205
float val
Definition dlp_init.c:117
dint rep
Definition dlp_edit.c:2242
#define i18n(String)
Definition global.c:80
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:276
@ IMG_STOCK
Definition global.h:280
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:935
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2048
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:486
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:958
#define BSEP
Definition global.h:261
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:714
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
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:1877
GtkWidget * add_advanced_item(GtkWidget *menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
@ CONTAINER_WIN
Definition global.h:266
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:1999
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
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
#define FULLSCREEN
Definition global.h:214
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
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
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
void init_camera(project *this_proj)
initialize the OpenGL camera settings
Definition glview.c:1180
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1028
void center_this_molecule(glwin *view)
center atomic coordinates around (0,0,0) and refresh shaders
Definition glview.c:1581
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
G_MODULE_EXPORT void set_full_screen(GtkWidget *widg, gpointer data)
set full screen callback GTK3
Definition popup.c:228
G_MODULE_EXPORT void to_reset_view(GtkWidget *widg, gpointer data)
reset view callback - GTK3
Definition m_rep.c:275
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:765
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:565
GMenu * menu_fullscreen(glwin *view, int popm)
create the 'Fullscreen' menu item - GTK4
Definition m_rep.c:794
G_MODULE_EXPORT void set_projection_combo(GtkComboBox *box, gpointer data)
change projection combo callback
Definition m_rep.c:402
GMenu * menu_reset(glwin *view, int popm)
create the reset menu items - GTK4
Definition m_rep.c:778
G_MODULE_EXPORT void change_rep_radio(GSimpleAction *action, GVariant *parameter, gpointer data)
change representation radio items callback - GTK4
Definition m_rep.c:686
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:600
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:743
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:730
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:1103
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:425
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:809
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:146
gboolean preferences
rep_data * tmp_rep
G_MODULE_EXPORT void representation_advanced(GtkWidget *widg, gpointer data)
open advanced representation dialog
Definition m_rep.c:425
Preference variable declarations.
Definition glwin.h:332
Definition glwin.h:350
Definition glwin.h:967
Definition global.h:118
Function declarations for the creation of the OpenGL window menus.
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