atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
m_atoms.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_atoms.c'
24*
25* Contains:
26*
27
28 - The functions to create the 'Model -> Atom(s)' submenu
29
30*
31* List of functions:
32
33 gchar * label_atpts (project * this_proj, glwin * view, int id);
34
35 G_MODULE_EXPORT void show_hide_atoms (GtkWidget * widg, gpointer data);
36 G_MODULE_EXPORT void show_hide_labels (GtkWidget * widg, gpointer data);
37 G_MODULE_EXPORT void show_hide_all_atom_labels (GtkWidget * widg, gpointer data);
38 G_MODULE_EXPORT void show_hide_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
39 G_MODULE_EXPORT void show_hide_labels (GSimpleAction * action, GVariant * parameter, gpointer data);
40 G_MODULE_EXPORT void show_hide_all_atom_labels (GSimpleAction * action, GVariant * parameter, gpointer data);
41
42 GtkWidget * create_spec_menu (char * name, gboolean va, gboolean vb, GtkWidget * menu, GCallback handler, tint * data);
43 GtkWidget * create_atom_layout_widget (gchar * str, GtkWidget * widg, tint * data);
44 GtkWidget * show_atoms_submenu (glwin * view, int id, int at);
45 GtkWidget * color_atoms_submenu (glwin * view, int id, int at);
46 GtkWidget * label_atoms_submenu (glwin * view, int id, int at);
47 GtkWidget * menu_atoms (glwin * view, int id, int at);
48
49 GMenu * label_atoms_submenu (glwin * view, int popm, int at, gboolean sensitive);
50 GMenu * color_atoms_submenu (glwin * view, int popm, int at, gboolean sensitive);
51 GMenu * show_atoms_submenu (glwin * view, int popm, int at, gboolean sensitive);
52 GMenu * menu_atoms (glwin * view, int popm, int at);
53
54*/
55
56#include "global.h"
57#include "glview.h"
58#include "glwindow.h"
59#include "color_box.h"
60
61extern void check_hidden_visible (project * this_proj);
62extern G_MODULE_EXPORT void set_atom_parameter (GtkWidget * widg, gpointer data);
63
73gchar * label_atpts (project * this_proj, glwin * view, int id)
74{
75 int i;
76 gchar * mot;
77 gchar * tmp;
78 gchar * str;
79
80 for (i=0; i < this_proj -> nspec; i++)
81 {
82 switch (id)
83 {
84 case 0:
85 str = g_strdup_printf ("%s [ %f Å ]", this_proj -> chemistry -> label[i], view -> anim -> last -> img -> sphererad[i]);
86 break;
87 case 1:
88 str = g_strdup_printf ("%s [ %f pts ]", this_proj -> chemistry -> label[i], view -> anim -> last -> img -> pointrad[i]);
89 break;
90 case 2:
91 str = g_strdup_printf ("%s [ %f pts ]", this_proj -> chemistry -> label[i], view -> anim -> last -> img -> sphererad[i+this_proj -> nspec]);
92 break;
93 case 3:
94 str = g_strdup_printf ("%s [ %f pts ]", this_proj -> chemistry -> label[i], view -> anim -> last -> img -> pointrad[i+this_proj -> nspec]);
95 break;
96 default:
97 str = g_strdup_printf ("%s [ %f Å ]", this_proj -> chemistry -> label[i], view -> anim -> last -> img -> atomicrad[i]);
98 break;
99 }
100 if (i == 0)
101 {
102 mot = g_strdup_printf ("%s", str);
103 }
104 else
105 {
106 tmp = g_strdup_printf ("%s", mot);
107 g_free (mot);
108 mot = g_strdup_printf ("%s\n%s", tmp, str);
109 g_free (tmp);
110 }
111 g_free (str);
112 }
113 return mot;
114}
115
116#ifdef GTK3
117extern G_MODULE_EXPORT void set_show_hide_all_atom_labels (GtkWidget * widg, gpointer data);
118extern G_MODULE_EXPORT void atom_properties (GtkWidget * widg, gpointer data);
119
128G_MODULE_EXPORT void show_hide_atoms (GtkWidget * widg, gpointer data)
129{
130 tint * the_data = (tint *) data;
131 int j = the_data -> b;
132 int k = the_data -> c;
133 int l, m;
134 project * this_proj = get_project_by_id(the_data -> a);
135 gboolean v = gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg);
136 if (widg != this_proj -> modelgl -> ogl_spec[j][k])
137 {
138 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_spec[j][k], v);
139 }
140 for (l=0; l<this_proj -> steps; l++)
141 {
142 for (m=0; m<this_proj -> natomes; m++)
143 {
144 if (this_proj -> atoms[l][m].sp == k) this_proj -> atoms[l][m].show[j] = v;
145 }
146 }
147 this_proj -> modelgl -> anim -> last -> img -> show_atom[j][k] = v;
148 check_hidden_visible (this_proj);
149 init_default_shaders (this_proj -> modelgl);
150}
151
160G_MODULE_EXPORT void show_hide_labels (GtkWidget * widg, gpointer data)
161{
162 int l, m;
163 tint * id = (tint *) data;
164 int j = id -> b;
165 int k = id -> c;
166 project * this_proj = get_project_by_id(id -> a);
167 gboolean v = gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg);
168 if (widg != this_proj -> modelgl -> ogl_lab[j][k])
169 {
170 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_lab[j][k], v);
171 }
172 for (l=0; l<this_proj -> steps; l++)
173 {
174 for (m=0; m<this_proj -> natomes; m++)
175 {
176 if (this_proj -> atoms[l][m].sp == k)
177 {
178 if (this_proj -> atoms[l][m].label[j] != v)
179 {
180 this_proj -> atoms[l][m].label[j] = v;
181 }
182 }
183 }
184 }
185 this_proj -> modelgl -> labelled = check_label_numbers (this_proj, j);
186 this_proj -> modelgl -> create_shaders[LABEL] = TRUE;
187 update (this_proj -> modelgl);
188}
189
198G_MODULE_EXPORT void show_hide_all_atom_labels (GtkWidget * widg, gpointer data)
199{
200 tint * id = (tint *) data;
201 int j = id -> b;
202 int k;
203 gboolean show = TRUE;
204 project * this_proj = get_project_by_id(id -> a);
205 for (k=0; k<this_proj -> nspec; k++)
206 {
207 if (plot -> show_label[j][k]) show = FALSE;
208 }
209 for (k=0; k<this_proj -> nspec; k++)
210 {
211 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_lab[j][k], show);
212 }
213}
214
227GtkWidget * create_spec_menu (char * name, gboolean va, gboolean vb, GtkWidget * menu, GCallback handler, tint * data)
228{
229 GtkWidget * spec_widget = gtk3_menu_item (menu, name, IMG_NONE, NULL, handler, data, FALSE, 0, 0, TRUE, FALSE, va);
230 widget_set_sensitive (spec_widget, vb);
231 return spec_widget;
232}
233
243GtkWidget * create_atom_layout_widget (gchar * str, GtkWidget * widg, tint * data)
244{
245 GtkWidget * menu = gtk_menu_new ();
246 gtk_menu_item_set_submenu ((GtkMenuItem *)widg, menu);
247 GtkWidget * layout = create_menu_item (TRUE, str);
248 gtk_menu_shell_append ((GtkMenuShell *)menu, layout);
249 g_signal_connect (G_OBJECT (layout), "activate", G_CALLBACK(set_atom_parameter), data);
250 return layout;
251}
252
262GtkWidget * show_atoms_submenu (glwin * view, int id, int at)
263{
264 GtkWidget * mshow = gtk_menu_new ();
265 gchar * str;
266 gboolean sensitive = (! at) ? TRUE : view -> anim -> last -> img -> draw_clones;
267 project * this_proj = get_project_by_id (view -> proj);
268 if (id == 0)
269 {
270 view -> ogl_spec[at] = g_malloc0(this_proj -> nspec*sizeof*view -> ogl_spec[at]);
271 }
272 int i;
273 for (i=0; i< this_proj -> nspec; i++)
274 {
275 if (at == 0)
276 {
277 str = g_strdup_printf ("%s", this_proj -> chemistry -> label[i]);
278 }
279 else
280 {
281 str = g_strdup_printf ("%s*", this_proj -> chemistry -> label[i]);
282 }
283 if (id == 0)
284 {
285 view -> ogl_spec[at][i] = create_spec_menu (str,
286 view -> anim -> last -> img -> show_atom[at][i],
287 sensitive,
288 mshow,
289 G_CALLBACK(show_hide_atoms),
290 & view -> colorp[at][i]);
291
292 }
293 else
294 {
295 create_spec_menu (str, view -> anim -> last -> img -> show_atom[at][i],
296 sensitive,
297 mshow,
298 G_CALLBACK(show_hide_atoms),
299 & view -> colorp[at][i]);
300 }
301 g_free (str);
302 }
303 return mshow;
304}
305
315GtkWidget * color_atoms_submenu (glwin * view, int id, int at)
316{
317 GtkWidget * menuc = gtk_menu_new ();
318 project * this_proj = get_project_by_id (view -> proj);
319 gchar * str;
320 GtkWidget * sp;
321 int i, j;
322 if (at == 0)
323 {
324 j = 0;
325 }
326 else
327 {
328 j = this_proj -> nspec;
329 }
330 for (i=0; i< this_proj -> nspec; i++)
331 {
332 if (at == 0)
333 {
334 str = g_strdup_printf ("%s", this_proj -> chemistry -> label[i]);
335 }
336 else
337 {
338 str = g_strdup_printf ("%s*", this_proj -> chemistry -> label[i]);
339 }
340 sp = create_menu_item (FALSE, str);
341 g_free (str);
342 gtk_menu_shell_append ((GtkMenuShell *)menuc, sp);
343 gtk_menu_item_set_submenu ((GtkMenuItem *)sp, color_box(view, i+j, 0, 0));
344 }
345 if (at == 1) widget_set_sensitive (menuc, view -> anim -> last -> img -> draw_clones);
346 return menuc;
347}
348
358GtkWidget * label_atoms_submenu (glwin * view, int id, int at)
359{
360 GtkWidget * menul = gtk_menu_new ();
361 GtkWidget * all = create_menu_item (FALSE, _("Show/Hide All"));
362 g_signal_connect (G_OBJECT (all), "activate", G_CALLBACK(show_hide_all_atom_labels), & view -> colorp[at][0]);
363 gtk_menu_shell_append ((GtkMenuShell *)menul, all);
364 GtkWidget * l_show = create_menu_item (FALSE, _("Show"));
365 gtk_menu_shell_append ((GtkMenuShell *)menul, l_show);
366 GtkWidget * mshow = gtk_menu_new ();
367 gtk_menu_item_set_submenu ((GtkMenuItem *)l_show, mshow);
368 project * this_proj = get_project_by_id (view -> proj);
369 gchar * str;
370 gboolean sensitive = (! at) ? TRUE : view -> anim -> last -> img -> draw_clones;
371 if (id == 0)
372 {
373 view -> ogl_lab[at] = g_malloc0(this_proj -> nspec*sizeof*view -> ogl_lab[at]);
374 }
375 int i;
376 for (i=0; i< this_proj -> nspec; i++)
377 {
378 if (at == 0)
379 {
380 str = g_strdup_printf ("%s", this_proj -> chemistry -> label[i]);
381 }
382 else
383 {
384 str = g_strdup_printf ("%s*", this_proj -> chemistry -> label[i]);
385 }
386 if (id == 0)
387 {
388 view -> ogl_lab[at][i] = create_spec_menu (str,
389 view -> anim -> last -> img -> show_label[at][i],
390 sensitive,
391 mshow,
392 G_CALLBACK(show_hide_labels),
393 & view -> colorp[at][i]);
394 }
395 else
396 {
397 create_spec_menu (str,
398 view -> anim -> last -> img -> show_label[at][i],
399 sensitive,
400 mshow,
401 G_CALLBACK(show_hide_labels),
402 & view -> colorp[at][i]);
403 }
404 g_free (str);
405 }
406 if (at == 0 || id == 1)
407 {
408 GtkWidget * l_sel = create_menu_item (FALSE, _("Select atom(s)"));
409 gtk_menu_shell_append ((GtkMenuShell *)menul, l_sel);
410 g_signal_connect (G_OBJECT (l_sel), "activate",G_CALLBACK(atom_properties), & view -> colorp[at][2]);
411 if (id == 1) widget_set_sensitive (l_sel, sensitive);
412 GtkWidget * l_adv = add_advanced_item (menul, G_CALLBACK(atom_properties), (gpointer)& view -> colorp[at][1], FALSE, 0, 0);
413 if (id == 1) widget_set_sensitive (l_adv, sensitive);
414 }
415 else
416 {
417 view -> ogl_clones[2] = create_menu_item (FALSE, _("Select atom(s)"));
418 gtk_menu_shell_append ((GtkMenuShell *)menul, view -> ogl_clones[2]);
419 g_signal_connect (G_OBJECT (view -> ogl_clones[2]), "activate",G_CALLBACK(atom_properties), & view -> colorp[at][2]);
420 widget_set_sensitive (view -> ogl_clones[2], sensitive);
421 view -> ogl_clones[3] = add_advanced_item (menul, G_CALLBACK(atom_properties), (gpointer)& view -> colorp[at][1], FALSE, 0, 0);
422 widget_set_sensitive (view -> ogl_clones[3], sensitive);
423 }
424 return menul;
425}
426
436GtkWidget * menu_atoms (glwin * view, int id, int at)
437{
438 int i;
439 GtkWidget * widg;
440 gchar * str;
441 project * this_proj = get_project_by_id(view -> proj);
442 GtkWidget * menua = gtk_menu_new ();
443 gtk_menu_shell_append ((GtkMenuShell *)menua, menu_item_new_with_submenu (_("Show"), TRUE, show_atoms_submenu (view, id, at)));
444 if (at == 1 && id == 0)
445 {
446 view -> ogl_clones[1] = color_atoms_submenu (view, id, at);
447 gtk_menu_shell_append ((GtkMenuShell *)menua, menu_item_new_with_submenu (_("Color(s)"), ! (view -> anim -> last -> img -> color_map[0] != 0), view -> ogl_clones[1]));
448 }
449 else
450 {
451 gtk_menu_shell_append ((GtkMenuShell *)menua, menu_item_new_with_submenu (_("Color(s)"), ! (view -> anim -> last -> img -> color_map[0] != 0), color_atoms_submenu (view, id, at)));
452 }
453 gtk_menu_shell_append ((GtkMenuShell *)menua, menu_item_new_with_submenu (_("Label(s)"), TRUE, label_atoms_submenu (view, id, at)));
454
455 i = view -> anim -> last -> img -> style;
456 str = label_atpts (this_proj, view, 2*at);
457 if (id == 0)
458 {
459 view -> ogl_atoms[4*at] = create_menu_item(FALSE, _("Radius(ii)"));
460 gtk_menu_shell_append ((GtkMenuShell *)menua, view -> ogl_atoms[4*at]);
461 view -> ogl_atoms[4*at+1] = create_atom_layout_widget (str, view -> ogl_atoms[4*at], & view -> colorp[at][0]);
462 if (at == 1 && ! view -> anim -> last -> img -> draw_clones)
463 {
464 widget_set_sensitive (view -> ogl_atoms[4*at+1], 0);
465 }
466 }
467 else if (i == SPHERES || i == BALL_AND_STICK)
468 {
469 widg = create_menu_item (FALSE, _("Radius(ii)"));
470 gtk_menu_shell_append ((GtkMenuShell *)menua, widg);
471 widg = create_atom_layout_widget (str, widg, & view -> colorp[at][0]);
472 if (at == 1 && ! view -> anim -> last -> img -> draw_clones)
473 {
474 widget_set_sensitive (widg, 0);
475 }
476 }
477 g_free (str);
478
479 str = label_atpts (this_proj, view, 1+2*at);
480 if (id == 0)
481 {
482 view -> ogl_atoms[4*at+2] = create_menu_item(FALSE, _("Dot Size(s)"));
483 gtk_menu_shell_append ((GtkMenuShell *)menua, view -> ogl_atoms[4*at+2]);
484 view -> ogl_atoms[4*at+3] = create_atom_layout_widget (str, view -> ogl_atoms[4*at+2], & view -> colorp[at][1]);
485 if (at == 1 && ! view -> anim -> last -> img -> draw_clones)
486 {
487 widget_set_sensitive (view -> ogl_atoms[4*at+3], 0);
488 }
489 }
490 else if (i == WIREFRAME || i == PUNT)
491 {
492 widg = create_menu_item (FALSE, _("Dot Size(s)"));
493 gtk_menu_shell_append ((GtkMenuShell *)menua, widg);
494 widg = create_atom_layout_widget (str, widg, & view -> colorp[at][1]);
495 if (at == 1 && ! view -> anim -> last -> img -> draw_clones)
496 {
497 widget_set_sensitive (widg, 0);
498 }
499 }
500 g_free (str);
501 if (id == 0 && at == 1)
502 {
503 view -> ogl_clones[4] = add_advanced_item (menua, G_CALLBACK(atom_properties), (gpointer)& view -> colorp[at][0], FALSE, 0, 0);
504 if (at == 1)
505 {
506 widget_set_sensitive (view -> ogl_clones[4], view -> anim -> last -> img -> draw_clones);
507 }
508 }
509 else
510 {
511 GtkWidget * advanced = add_advanced_item (menua, G_CALLBACK(atom_properties), (gpointer)& view -> colorp[at][0], FALSE, 0, 0);
512 if (at == 1)
513 {
514 widget_set_sensitive (advanced, view -> anim -> last -> img -> draw_clones);
515 }
516 }
517 return menua;
518}
519#else
520
521extern G_MODULE_EXPORT void atom_properties (GSimpleAction * action, GVariant * state, gpointer data);
522
532G_MODULE_EXPORT void show_hide_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
533{
534 tint * the_data = (tint *) data;
535 int j = the_data -> b;
536 int k = the_data -> c;
537 int l, m;
538 gboolean doit = TRUE;
539 gboolean show;
540 project * this_proj = get_project_by_id (the_data -> a);
541 GVariant * state;
542 if (action)
543 {
544 state = g_action_get_state (G_ACTION (action));
545 show = ! g_variant_get_boolean (state);
546 const gchar * atom = g_action_get_name ((GAction *)action);
547 int lgt = strlen (atom);
548 gchar * name = g_strdup_printf ("%c%c", atom[lgt-2], atom[lgt-1]);
549 if (g_strcmp0(name, ".1") == 0)
550 {
551 g_free (name);
552 name = g_strdup_printf ("%.*s.0", lgt-2, atom);
553 g_action_group_activate_action ((GActionGroup *)this_proj -> modelgl -> action_group, (const gchar *)name, NULL);
554 g_free (name);
555 doit = FALSE;
556 }
557 }
558 else
559 {
560 show = this_proj -> modelgl -> anim -> last -> img -> show_atom[j][k];
561 }
562 if (doit)
563 {
564 for (l=0; l<this_proj -> steps; l++)
565 {
566 for (m=0; m<this_proj -> natomes; m++)
567 {
568 if (this_proj -> atoms[l][m].sp == k) this_proj -> atoms[l][m].show[j] = show;
569 }
570 }
571 this_proj -> modelgl -> anim -> last -> img -> show_atom[j][k] = show;
572 init_default_shaders (this_proj -> modelgl);
573 if (action)
574 {
575 g_action_change_state (G_ACTION (action), g_variant_new_boolean (show));
576 g_variant_unref (state);
577 }
578 }
579}
580
590G_MODULE_EXPORT void show_hide_labels (GSimpleAction * action, GVariant * parameter, gpointer data)
591{
592 tint * the_data = (tint *) data;
593 int j = the_data -> b;
594 int k = the_data -> c;
595 gboolean doit = TRUE;
596 gboolean show;
597 project * this_proj = get_project_by_id (the_data -> a);
598 GVariant * state;
599 if (action)
600 {
601 state = g_action_get_state (G_ACTION (action));
602 show = ! g_variant_get_boolean (state);
603 const gchar * label = g_action_get_name ((GAction *)action);
604 int lgt = strlen (label);
605 gchar * name = g_strdup_printf ("%c%c", label[lgt-2], label[lgt-1]);
606 if (g_strcmp0(name, ".1") == 0)
607 {
608 g_free (name);
609 name = g_strdup_printf ("%.*s.0", lgt-2, label);
610 g_action_group_activate_action ((GActionGroup *)this_proj -> modelgl -> action_group, (const gchar *)name, NULL);
611 g_free (name);
612 doit = FALSE;
613 }
614 }
615 else
616 {
617 show = ! this_proj -> modelgl -> anim -> last -> img -> show_label[j][k];
618 }
619 if (doit)
620 {
621 int l, m;
622 for (l=0; l<this_proj -> steps; l++)
623 {
624 for (m=0; m<this_proj -> natomes; m++)
625 {
626 if (this_proj -> atoms[l][m].sp == k)
627 {
628 if (this_proj -> atoms[l][m].label[j] != show)
629 {
630 this_proj -> atoms[l][m].label[j] = show;
631 }
632 }
633 }
634 }
635 this_proj -> modelgl -> labelled = check_label_numbers (this_proj, j);
636 this_proj -> modelgl -> create_shaders[LABEL] = TRUE;
637 update (this_proj -> modelgl);
638 if (action)
639 {
640 g_action_change_state (G_ACTION (action), g_variant_new_boolean (show));
641 g_variant_unref (state);
642 }
643 }
644}
645
655G_MODULE_EXPORT void show_hide_all_atom_labels (GSimpleAction * action, GVariant * parameter, gpointer data)
656{
657 // Neither check, nor radio
658 tint * id = (tint *) data;
659 int i, j, k;
660 project * this_proj = get_project_by_id(id -> a);
661 i = id -> b;
662 gboolean show = ! this_proj -> atoms[0][0].label[i];
663 for (j=0; j<this_proj -> steps; j++)
664 {
665 for (k=0; k<this_proj -> natomes; k++)
666 {
667 this_proj -> atoms[j][k].label[i] = show;
668 }
669 }
670 this_proj -> modelgl -> labelled = check_label_numbers (this_proj, i);
671 this_proj -> modelgl -> create_shaders[LABEL] = TRUE;
672 update (this_proj -> modelgl);
673 update_menu_bar (this_proj -> modelgl);
674}
675
686GMenu * label_atoms_submenu (glwin * view, int popm, int at, gboolean sensitive)
687{
688 GMenu * menu = g_menu_new ();
689 append_opengl_item (view, menu, _("Show/Hide All"), (at) ? "clones-labels-all" : "atoms-labels-all", popm, popm, NULL, IMG_NONE, NULL,
690 FALSE, G_CALLBACK(show_hide_all_atom_labels), & view -> colorp[at][0], FALSE, FALSE, FALSE, sensitive);
691 GMenu * smenu = g_menu_new ();
692 project * this_proj = get_project_by_id (view -> proj);
693 gchar * str;
694 int i;
695 for (i=0; i< this_proj -> nspec; i++)
696 {
697 if (at == 0)
698 {
699 str = g_strdup_printf ("%s", this_proj -> chemistry -> label[i]);
700 }
701 else
702 {
703 str = g_strdup_printf ("%s*", this_proj -> chemistry -> label[i]);
704 }
705 append_opengl_item (view, smenu, str, (! at) ? "atom-label" : "clone-label", popm, i, NULL, IMG_NONE, NULL,
706 FALSE, G_CALLBACK(show_hide_labels), & view -> colorp[at][i],
707 TRUE, view -> anim -> last -> img -> show_label[at][i], FALSE, sensitive);
708 }
709 append_submenu (menu, _("Show"), smenu);
710 append_opengl_item (view, menu, _("Select atom(s)"), (! at) ? "atom-select" : "clone-select", popm, i, NULL, IMG_NONE, NULL,
711 FALSE, G_CALLBACK(atom_properties), & view -> colorp[at][2], FALSE, FALSE, FALSE, sensitive);
712 append_opengl_item (view, menu, _("Advanced"), (! at) ? "atom-lab-adv" : "clone-lab-adv", popm, i, NULL, IMG_STOCK, DPROPERTIES,
713 FALSE, G_CALLBACK(atom_properties), & view -> colorp[at][1], FALSE, FALSE, FALSE, sensitive);
714 return menu;
715}
716
727GMenu * color_atoms_submenu (glwin * view, int popm, int at, gboolean sensitive)
728{
729 GMenu * menu = g_menu_new ();
730 GMenu * menuc;
731 project * this_proj = get_project_by_id (view -> proj);
732 gchar * stra, * strb;
733 int i;
734 for (i=0; i< this_proj -> nspec; i++)
735 {
736 if (at == 0)
737 {
738 stra = g_strdup_printf ("%s", this_proj -> chemistry -> label[i]);
739 }
740 else
741 {
742 stra = g_strdup_printf ("%s*", this_proj -> chemistry -> label[i]);
743 }
744 strb = g_strdup_printf ("%s", (! at) ? "atom-color" : "clone-color");
745 menuc = g_menu_new ();
746 append_opengl_item (view, menuc, strb, strb, popm, i, NULL, IMG_NONE, NULL, TRUE, NULL, NULL, FALSE, FALSE, FALSE, FALSE);
747 append_opengl_item (view, menuc, _("More Colors ..."), strb, popm, i, NULL, IMG_NONE, NULL,
748 FALSE, G_CALLBACK(to_run_atom_color_window), & view -> colorp[0][i+at*this_proj -> nspec], FALSE, FALSE, FALSE, sensitive);
749 append_submenu (menu, stra, menuc);
750 g_free (stra);
751 g_free (strb);
752 g_object_unref (menuc);
753 }
754 return menu;
755}
756
767GMenu * show_atoms_submenu (glwin * view, int popm, int at, gboolean sensitive)
768{
769 GMenu * menu = g_menu_new ();
770 gchar * str;
771 project * this_proj = get_project_by_id (view -> proj);
772 int i;
773 for (i=0; i<this_proj -> nspec; i++)
774 {
775 if (at == 0)
776 {
777 str = g_strdup_printf ("%s", this_proj -> chemistry -> label[i]);
778 }
779 else
780 {
781 str = g_strdup_printf ("%s*", this_proj -> chemistry -> label[i]);
782 }
783 append_opengl_item (view, menu, str, (! at) ? "show-atom" : "show-clone", popm, i, NULL, IMG_NONE, NULL,
784 FALSE, G_CALLBACK(show_hide_atoms), & view -> colorp[at][i],
785 TRUE, view -> anim -> last -> img -> show_atom[at][i], FALSE, sensitive);
786 g_free (str);
787 }
788 return menu;
789}
790
800GMenu * menu_atoms (glwin * view, int popm, int at)
801{
802 int i = view -> anim -> last -> img -> style;
803 gboolean sensitive = (at) ? view -> anim -> last -> img -> draw_clones : TRUE;
804
805 GMenu * menu = g_menu_new ();
806 append_submenu (menu, _("Show"), show_atoms_submenu(view, popm, at, sensitive));
807 append_submenu (menu, _("Color(s)"), color_atoms_submenu (view, popm, at, sensitive));
808 append_submenu (menu, _("Label(s)"), label_atoms_submenu (view, popm, at, sensitive));
809 GMenuItem * item;
810 if (i == SPHERES || i == BALL_AND_STICK)
811 {
812 item = g_menu_item_new (_("Radius(ii)"), (sensitive) ? NULL : "None");
813 g_menu_item_set_attribute (item, "custom", "s", (at) ? "clone-radii" : "atom-radii", NULL);
814 g_menu_append_item (menu, item);
815 }
816 if (i == WIREFRAME || i == PUNT)
817 {
818 item = g_menu_item_new (_("Dot Size(s)"), (sensitive) ? NULL : "None");
819 g_menu_item_set_attribute (item, "custom", "s", (at) ? "clone-pts" : "atom-pts", NULL);
820 g_menu_append_item (menu, item);
821 }
822 append_opengl_item (view, menu, _("Advanced"), (! at) ? "atom-advanced" : "clone-advanced", popm, popm, NULL, IMG_STOCK, DPROPERTIES,
823 FALSE, G_CALLBACK(atom_properties), & view -> colorp[at][0],
824 FALSE, FALSE, FALSE, sensitive);
825 return menu;
826}
827#endif
gchar * mot[2][2]
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
GtkWidget * color_box(glwin *view, int ideo, int spec, int geo)
create the color palette pointers and menus GTK3 version
Definition color_box.c:259
Structure definitions for color management Function declarations for color management.
color colorp[64]
G_MODULE_EXPORT void to_run_atom_color_window(GtkWidget *widg, gpointer data)
to run atom color selection window callback GTK3
Definition w_colors.c:612
PangoLayout * layout
Definition curve.c:80
int atoms[NUM_STYLES][2]
void init_default_shaders(glwin *view)
re-initialize the default OpenGL shaders
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:276
@ IMG_STOCK
Definition global.h:280
G_MODULE_EXPORT void show_hide_labels(GtkWidget *widg, gpointer data)
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)
project * proj
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
GtkWidget * add_advanced_item(GtkWidget *menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
#define DPROPERTIES
Definition global.h:222
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_menu_item(gboolean add_mnemo, gchar *action)
G_MODULE_EXPORT void show_hide_atoms(GtkWidget *widg, gpointer data)
GtkWidget * menu_item_new_with_submenu(gchar *name, gboolean active, GtkWidget *sub_menu)
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:72
action
Definition glview.h:198
int check_label_numbers(project *this_proj, int types)
check how many atom label(s) are visible
Definition popup.c:1059
@ SPHERES
Definition glview.h:185
@ BALL_AND_STICK
Definition glview.h:182
@ WIREFRAME
Definition glview.h:183
@ PUNT
Definition glview.h:187
@ LABEL
Definition glwin.h:98
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)
GMenu * color_atoms_submenu(glwin *view, int popm, int at, gboolean sensitive)
create the 'Atom(s) -> Color(s)' submenu elements
Definition m_atoms.c:727
G_MODULE_EXPORT void atom_properties(GSimpleAction *action, GVariant *state, gpointer data)
atom(s) property callback GTK4
Definition w_atoms.c:573
gchar * label_atpts(project *this_proj, glwin *view, int id)
prepare the text of a menu item in the 'Model -> Atom(s)' submenu
Definition m_atoms.c:73
void check_hidden_visible(project *this_proj)
check how many atom(s) are visible
Definition popup.c:888
G_MODULE_EXPORT void show_hide_labels(GSimpleAction *action, GVariant *parameter, gpointer data)
handle the show/hide label signal GTK4
Definition m_atoms.c:590
G_MODULE_EXPORT void show_hide_atoms(GSimpleAction *action, GVariant *parameter, gpointer data)
handle the show/hide signal GTK4
Definition m_atoms.c:532
GMenu * show_atoms_submenu(glwin *view, int popm, int at, gboolean sensitive)
create the 'Atom(s) -> Show' submenu elements
Definition m_atoms.c:767
GMenu * label_atoms_submenu(glwin *view, int popm, int at, gboolean sensitive)
create the 'Atom(s) -> Label(s)' submenu elements
Definition m_atoms.c:686
GMenu * menu_atoms(glwin *view, int popm, int at)
create the 'Atom(s)' submenu elements
Definition m_atoms.c:800
G_MODULE_EXPORT void show_hide_all_atom_labels(GSimpleAction *action, GVariant *parameter, gpointer data)
handle the show/hide all labels GTK4
Definition m_atoms.c:655
G_MODULE_EXPORT void set_atom_parameter(GtkWidget *widg, gpointer data)
set atom parameter - creating the dialog
Definition w_atoms.c:193
double precision, dimension(98), parameter c
Definition global.h:964
Definition glwin.h:967
Definition global.h:118
GtkWidget * img
Definition workspace.c:70