atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
popup.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
23
24/*
25* This file: 'popup.c'
26*
27* Contains:
28*
29
30 - The functions to create the OpenGL window popup menus:
31 - The main popup menu
32 - The contextual, atom or bond related, popup menus
33
34*
35* List of functions:
36
37 int get_to_be_selected (glwin * view);
38 int get_style (gchar * str);
39 int check_label_numbers (project * this_proj, int types);
40
41 gchar * get_object_from_action (GSimpleAction * action);
42
43 void to_remove_this_object (int type, gpointer data);
44 void to_replace_this_object (int type, GSimpleAction * action, gpointer data);
45 void to_replace_this_object (int type, GtkWidget * widg, gpointer data);
46 void copy_bond_selection ();
47 void remove_object ();
48 void insert_object (int action, gpointer data);
49 void check_hidden_visible (project * this_proj);
50 void create_new_project_using_data (atom_selection * selection);
51 void add_style_sub_menu (GtkWidget * item, GCallback handler, gpointer data);
52 void add_edition_sub_menu (GtkWidget * item, GCallback handler, gpointer data);
53 void create_selection_item (GMenu * menu, glwin * view, gchar * str, gchar * act, int aid, int mid, int gid, int cid, int aoc, GCallback handler, gpointer data);
54 void analyze_popup_attach_color_palettes (glwin * view, GtkWidget * menu, int ato, int spc, int totc, int parc, int frag, int mol);
55 void popup_selection (glwin * view, double ptx, double pty, int spe, int mmod, int ati, int bti, int aoc);
56 void analyze_menu_attach_color_palettes (glwin * view, GtkWidget * menu);
57 void popup_main_menu (glwin * view, double ptx, double pty);
58
59 G_MODULE_EXPORT void set_full_screen (GSimpleAction * action, GVariant * parameter, gpointer data);
60 G_MODULE_EXPORT void set_full_screen (GtkWidget * widg, gpointer data);
61 G_MODULE_EXPORT void remove_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
62 G_MODULE_EXPORT void remove_this_atom (GtkWidget * widg, gpointer data);
63 G_MODULE_EXPORT void add_object (GSimpleAction * action, GVariant * parameter, gpointer data);
64 G_MODULE_EXPORT void add_object (GtkWidget * widg, gpointer data);
65 G_MODULE_EXPORT void to_add_object (GSimpleAction * action, GVariant * parameter, gpointer data);
66 G_MODULE_EXPORT void to_add_object (GtkWidget * widg, gpointer data);
67 G_MODULE_EXPORT void replace_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
68 G_MODULE_EXPORT void replace_this_atom (GtkWidget * widg, gpointer data);
69 G_MODULE_EXPORT void copy_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
70 G_MODULE_EXPORT void copy_this_atom (GtkWidget * widg, gpointer data);
71 G_MODULE_EXPORT void show_hide_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
72 G_MODULE_EXPORT void show_hide_this_atom (GtkWidget * widg, gpointer data);
73 G_MODULE_EXPORT void label_unlabel_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
74 G_MODULE_EXPORT void label_unlabel_this_atom (GtkWidget * widg, gpointer data);
75 G_MODULE_EXPORT void select_unselect_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
76 G_MODULE_EXPORT void select_unselect_this_atom (GtkWidget * widg, gpointer data);
77 G_MODULE_EXPORT void style_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data);
78 G_MODULE_EXPORT void style_this_atom (GtkWidget * widg, gpointer data);
79 G_MODULE_EXPORT void remove_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
80 G_MODULE_EXPORT void remove_the_atoms (GtkWidget * widg, gpointer data);
81 G_MODULE_EXPORT void replace_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
82 G_MODULE_EXPORT void replace_the_atoms (GtkWidget * widg, gpointer data);
83 G_MODULE_EXPORT void copy_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
84 G_MODULE_EXPORT void copy_the_atoms (GtkWidget * widg, gpointer data);
85 G_MODULE_EXPORT void show_hide_others (GSimpleAction * action, GVariant * parameter, gpointer data);
86 G_MODULE_EXPORT void show_hide_others (GtkWidget * widg, gpointer data);
87 G_MODULE_EXPORT void show_hide_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
88 G_MODULE_EXPORT void show_hide_the_atoms (GtkWidget * widg, gpointer data);
89 G_MODULE_EXPORT void label_unlabel_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
90 G_MODULE_EXPORT void label_unlabel_atoms (GtkWidget * widg, gpointer data);
91 G_MODULE_EXPORT void select_unselect_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
92 G_MODULE_EXPORT void select_unselect_atoms (GtkWidget * widg, gpointer data);
93 G_MODULE_EXPORT void style_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
94 G_MODULE_EXPORT void style_the_atoms (GtkWidget * widg, gpointer data);
95 G_MODULE_EXPORT void remove_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
96 G_MODULE_EXPORT void remove_the_coord (GtkWidget * widg, gpointer data);
97 G_MODULE_EXPORT void replace_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
98 G_MODULE_EXPORT void replace_the_coord (GtkWidget * widg, gpointer data);
99 G_MODULE_EXPORT void copy_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
100 G_MODULE_EXPORT void copy_the_coord (GtkWidget * widg, gpointer data);
101 G_MODULE_EXPORT void show_hide_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
102 G_MODULE_EXPORT void show_hide_the_coord (GtkWidget * widg, gpointer data);
103 G_MODULE_EXPORT void label_unlabel_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
104 G_MODULE_EXPORT void label_unlabel_coord (GtkWidget * widg, gpointer data);
105 G_MODULE_EXPORT void select_unselect_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
106 G_MODULE_EXPORT void select_unselect_coord (GtkWidget * widg, gpointer data);
107 G_MODULE_EXPORT void style_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
108 G_MODULE_EXPORT void style_the_coord (GtkWidget * widg, gpointer data);
109 G_MODULE_EXPORT void edit_in_new_project (GSimpleAction * action, GVariant * parameter, gpointer data);
110 G_MODULE_EXPORT void edit_in_new_project (GtkWidget * widg, gpointer data);
111 G_MODULE_EXPORT void edit_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
112 G_MODULE_EXPORT void edit_coord (GtkWidget * widg, gpointer data);
113 G_MODULE_EXPORT void edit_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
114 G_MODULE_EXPORT void edit_atoms (GtkWidget * widg, gpointer data);
115 G_MODULE_EXPORT void select_action_for_all (GSimpleAction * action, GVariant * parameter, gpointer data);
116 G_MODULE_EXPORT void select_action_for_all (GtkWidget * widg, gpointer data);
117 G_MODULE_EXPORT void select_action_for_this_bond (GSimpleAction * action, GVariant * parameter, gpointer data);
118 G_MODULE_EXPORT void select_action_for_this_bond (GtkWidget * widg, gpointer data);
119 G_MODULE_EXPORT void select_action_for_all_bonds (GSimpleAction * action, GVariant * parameter, gpointer data);
120 G_MODULE_EXPORT void select_action_for_all_bonds (GtkWidget * widg, gpointer data);
121 G_MODULE_EXPORT void reset_coords (GSimpleAction * action, GVariant * parameter, gpointer data);
122 G_MODULE_EXPORT void reset_coords (GtkWidget * widg, gpointer data);
123 G_MODULE_EXPORT void turn_rebuild (GSimpleAction * action, GVariant * parameter, gpointer data);
124 G_MODULE_EXPORT void turn_rebuild (GtkWidget * widg, gpointer data);
125 G_MODULE_EXPORT void to_center_this_molecule (GtkWidget * widg, gpointer data);
126
127 GtkWidget * create_selection_item (glwin * view, gchar * str, int mid, int gid, int cid, int aoc, GCallback handler, gpointer data);
128 GtkWidget * selection_menu (glwin * view, int ati, int bti, int aoc, int mid, GCallback handler_a, GCallback handler_b, GCallback handler_c);
129
130 GMenu * add_edition_sub_menu (glwin * view, gchar * act, int aid, GCallback handler, gpointer data);
131 GMenu * add_style_sub_menu (glwin * view, gchar * act, int aid, GCallback handler, gpointer data);
132 GMenu * selection_menu (int aid, glwin * view, int ati, int bti, int aoc, int mid, GCallback handler_a, GCallback handler_b, GCallback handler_c);
133 GMenu * tools_section (glwin * view);
134 GMenu * anim_section (glwin * view);
135
136 atom_search * free_this_search_data (atom_search * this_search);
137
138*/
139
140#include "global.h"
141#include "callbacks.h"
142#include "interface.h"
143#include "workspace.h"
144#include "project.h"
145#include "glview.h"
146#include "glwindow.h"
147#include "submenus.h"
148#include "color_box.h"
149#include "bind.h"
150#include "atom_edit.h"
151
152#define CONTEXTACT 12
153
154extern atom_search * allocate_atom_search (int proj, int action, int searchid, int tsize);
155extern void check_all_trees (project * this_proj);
156extern int action_atoms_from_project (project * this_proj, atom_search * asearch, gboolean visible);
157extern G_MODULE_EXPORT void render_gl_image (GtkWidget * widg, gpointer data);
158extern G_MODULE_EXPORT void coord_properties (GtkWidget * widg, gpointer data);
159extern void apply_project (gboolean showtools);
160extern GtkWidget * field_atom_menu (int p, int s, int a, int f);
161extern void reset_coordinates (project * this_proj, int status);
162extern vec3_t get_bary (project * this_proj, int status);
163extern void prepare_to_instert (gchar * key, project * this_proj, atom_search * asearch, gboolean visible);
164extern insertion_menu mol[];
165extern atom_in_selection * new_atom_in_selection (int id, int sp);
166extern int inserted_from_lib;
167extern void duplicate_material_and_lightning (image * new_img, image * old_img);
168#ifdef GTK4
169extern GSimpleActionGroup * view_pop_actions;
170extern G_MODULE_EXPORT void window_color_coord (GSimpleAction * action, GVariant * parameter, gpointer data);
171extern GtkWidget * color_palette (glwin * view, int ideo, int spec, int geo);
172#endif
173extern G_MODULE_EXPORT void view_shortcuts (GSimpleAction * action, GVariant * parameter, gpointer data);
176
183
185
188
197{
198 if (view -> atom_win && ! column_label)
199 {
200 return (view -> atom_win -> visible || view -> selection_mode == NSELECTION-1) ? 1 : 0;
201 }
202 else
203 {
204 return 0;
205 }
206}
207
208#ifdef GTK4
218G_MODULE_EXPORT void set_full_screen (GSimpleAction * action, GVariant * parameter, gpointer data)
219#else
228G_MODULE_EXPORT void set_full_screen (GtkWidget * widg, gpointer data)
229#endif
230{
231 glwin * view = (glwin *)data;
232 if (! view -> fullscreen)
233 {
234 gtk_window_fullscreen (GTK_WINDOW(view -> win));
235 hide_the_widgets (view -> menu_box);
236 view -> fullscreen = TRUE;
237 }
238 else
239 {
240 gtk_window_unfullscreen (GTK_WINDOW(view -> win));
241 show_the_widgets (view -> menu_box);
242 view -> fullscreen = FALSE;
243 }
244}
245
253int get_style (gchar * str)
254{
255 int i;
256#ifdef GTK4
257 i = strlen (str);
258 return (int) string_to_double ((gpointer)g_strdup_printf ("%c", str[i-1]));
259#else
260 for (i=0; i<OGL_STYLES; i++)
261 {
262 if (g_strcmp0 (_(text_styles[i]), str) == 0) return i;
263 }
264 for (i=0; i<FILLED_STYLES; i++)
265 {
266 if (g_strcmp0 (_(text_filled[i]), str) == 0)
267 {
268 return OGL_STYLES + i;
269 }
270 }
271#endif
272 return NONE;
273}
274
283{
284 project * this_proj = get_project_by_id(this_search -> proj);
285 g_free (this_search);
287 if (this_proj -> modelgl -> atom_win)
288 {
289 if (! this_proj -> modelgl -> atom_win -> visible)
290 {
291 if (! this_proj -> modelgl -> cell_win || ! this_proj -> modelgl -> cell_win -> slab_passivate)
292 {
293 g_free (this_proj -> modelgl -> atom_win);
294 this_proj -> modelgl -> atom_win = NULL;
295 }
296 }
297 }
298 return NULL;
299}
300
309void to_remove_this_object (int type, gpointer data)
310{
311 int i, j;
312 atom_in_selection * selat;
313 tint * sel;
314 prepare_atom_edition (& opengl_project -> modelgl -> colorp[0][0], FALSE);
316 switch (type)
317 {
318 case 0:
319 i = GPOINTER_TO_INT(data);
320 remove_search -> todo[i] = 1;
321 break;
322 case 1:
323 sel = (tint * )data;
324 i = opengl_project -> modelgl -> anim -> last -> img -> step;
325 for (j=0; j<opengl_project -> natomes; j++)
326 {
327 if (sel -> a < 2)
328 {
329 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
330 {
331 remove_search -> todo[j] = 1;
332 }
333 }
334 else
335 {
336 if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
337 {
338 remove_search -> todo[j] = 1;
339 }
340 }
341 }
342 break;
343 case 2:
344 sel = (tint * )data;
345 i = opengl_project -> modelgl -> anim -> last -> img -> step;
346 gboolean doit;
347 for (j=0; j<opengl_project -> natomes; j++)
348 {
349 doit = FALSE;
350 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
351 {
352 if (! sel -> a)
353 {
354 if (opengl_project -> atoms[i][j].pick[0] == is_selected || is_selected == -1) doit = TRUE;
355 }
356 else if (sel -> a == 2)
357 {
358 doit = TRUE;
359 }
360 else if (opengl_project -> atoms[i][j].label[0] == is_labelled)
361 {
362 if (opengl_project -> atoms[i][j].pick[0] == is_selected || is_selected == -1) doit = TRUE;
363 }
364 if (doit)
365 {
366 remove_search -> todo[j] = 1;
367 }
368 }
369 }
370 break;
371 case 3:
372 selat = bond_selection -> first;
373 for (i=0; i<bond_selection -> selected ; i++)
374 {
375 j = selat -> id;
376 remove_search -> todo[j] = 1;
377 selat = selat -> next;
378 }
379 break;
380 }
381}
382
390gchar * get_object_from_action (GSimpleAction * action)
391{
392 int i, j, k;
393 const gchar * act = g_action_get_name(G_ACTION(action));
394 gchar * act_end;
395 gchar * str;
396 k = strlen (act);
397 if (strstr(act, "set-mol-ins"))
398 {
399 act_end = g_strdup_printf ("%c%c", act[k-4], act[k-3]);
400 for (i=0; mol[i].type || mol[i].object; i++)
401 {
402 if (mol[i].object)
403 {
404 str = (i < 10) ? g_strdup_printf (".%d", i) : g_strdup_printf ("%d", i);
405 if (g_strcmp0(str, act_end) == 0)
406 {
407 g_free (str);
408 g_free (act_end);
409 if (i == 9 || i == 13 || i == 16 || i == 17)
410 {
411 return g_strdup_printf ("%s", _(mol[i].object));
412 }
413 else
414 {
415 return g_strdup_printf ("%s", mol[i].object);
416 }
417 break;
418 }
419 g_free (str);
420 }
421 }
422 g_free (act_end);
423 }
424 if (strstr(act, "set-ifp"))
425 {
426 act_end = g_strdup_printf ("%c%c%c%c", act[k-6], act[k-5], act[k-4], act[k-3]);
427 for (i=0; i<nprojects; i++)
428 {
429 if (get_project_by_id(i) -> steps == 1 && get_project_by_id(i) -> natomes)
430 {
431 for (j=0; j<3; j++)
432 {
433 str = g_strdup_printf ("-%d.%d", j, i);
434 if (g_strcmp0(str, act_end) == 0)
435 {
436 g_free (str);
437 g_free (act_end);
438 return g_strdup_printf (_("%s in %s"), _(action_atoms[j]), g_strdup_printf ("%s (%d)", get_project_by_id(i) -> name, i+1));
439 }
440 g_free (str);
441 }
442 }
443 }
444 g_free (act_end);
445 }
446 return NULL;
447}
448
449#ifdef GTK4
459void to_replace_this_object (int type, GSimpleAction * action, gpointer data)
460#else
470void to_replace_this_object (int type, GtkWidget * widg, gpointer data)
471#endif
472{
473 int h, i, j;
474 atom_in_selection * selat;
475 tint * sel;
476 gboolean replace = TRUE;
477 if (opengl_project -> modelgl -> cell_win)
478 {
479 if (opengl_project -> modelgl -> cell_win -> cut_this_slab) replace = FALSE;
480 }
481 if (replace)
482 {
483 prepare_atom_edition (& opengl_project -> modelgl -> colorp[0][0], FALSE);
485 }
486 else
487 {
488 insert_search = opengl_project -> modelgl -> search_widg[8];
489 }
490 gchar * lab;
491#ifdef GTK4
492 if (action != NULL)
493 {
495 }
496#else
497 if (widg != NULL)
498 {
499 lab = g_strdup_printf ("%s", gtk_menu_item_get_label (GTK_MENU_ITEM(widg)));
500 }
501#endif
502 else
503 {
504 lab = g_strdup_printf (_("Copied Data"));
505 }
507 g_free (lab);
508 if (h != 0)
509 {
510 switch (type)
511 {
512 case 0:
513 i = GPOINTER_TO_INT(data);
515 insert_search -> todo[i] = 1;
516 break;
517 case 1:
518 sel = (tint * )data;
519 i = opengl_project -> modelgl -> anim -> last -> img -> step;
520 for (j=0; j<opengl_project -> natomes; j++)
521 {
522 if (sel -> a < 2)
523 {
524 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
525 {
527 insert_search -> todo[j] = 1;
528 }
529 }
530 else if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
531 {
533 insert_search -> todo[j] = 1;
534 }
535 }
536 break;
537 case 2:
538 sel = (tint * )data;
539 gboolean doit;
540 i = opengl_project -> modelgl -> anim -> last -> img -> step;
541 for (j=0; j<opengl_project -> natomes; j++)
542 {
543 doit = FALSE;
544 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
545 {
546 if (! sel -> a)
547 {
548 if (opengl_project -> atoms[i][j].pick[0] == is_selected || is_selected == -1) doit = TRUE;
549 }
550 else if (sel -> a == 2)
551 {
552 doit = TRUE;
553 }
554 else if (opengl_project -> atoms[i][j].label[0] == is_labelled)
555 {
556 if (opengl_project -> atoms[i][j].pick[0] == is_selected || is_selected == -1) doit = TRUE;
557 }
558 if (doit)
559 {
561 insert_search -> todo[j] = 1;
562 }
563 }
564 }
565 break;
566 case 3:
567 selat = bond_selection -> first;
568 for (i=0; i<bond_selection -> selected ; i++)
569 {
570 j = selat -> id;
572 insert_search -> todo[j] = 1;
573 selat = selat -> next;
574 }
575 break;
576 }
577 }
578}
579
586{
587 if (copied_object)
588 {
589 g_free (copied_object);
590 copied_object = NULL;
591 }
592 pasted_todo = allocint (opengl_project -> natomes);
593 atom_in_selection * selat = bond_selection -> first;
594 while (selat)
595 {
596 pasted_todo[selat -> id] = 1;
597 selat = selat -> next;
598 }
600}
601
608{
609 gchar * str;
610 gboolean vis = (opengl_project -> modelgl -> atom_win) ? opengl_project -> modelgl -> atom_win -> visible : FALSE;
613 if (! opengl_project -> modelgl -> cell_win || ! opengl_project -> modelgl -> cell_win -> slab_passivate)
614 {
615 if (! i)
616 {
617 str = g_strdup_printf (_("No atoms to be removed !"));
618 }
619 else
620 {
621 str = g_strdup_printf (_("%d atom(s) removed !"), i);
622 }
623 show_info (str, 0, opengl_project -> modelgl -> win);
624 g_free (str);
625 }
626 else
627 {
628 opengl_project -> modelgl -> search_widg[8] -> int_b = i;
629 }
630}
631
632#ifdef GTK4
642G_MODULE_EXPORT void remove_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
643#else
652G_MODULE_EXPORT void remove_this_atom (GtkWidget * widg, gpointer data)
653#endif
654{
655 to_remove_this_object (0, data);
656 remove_object ();
657}
658
667void insert_object (int action, gpointer data)
668{
669 int i, j;
670 gchar * str;
671 gboolean vis = (opengl_project -> modelgl -> atom_win) ? opengl_project -> modelgl -> atom_win -> visible : FALSE;
672 if (insert_search -> in_selection)
673 {
674 if (action == 1 && remove_search != NULL)
675 {
677 }
679 if (action == 1)
680 {
681 str = g_strdup_printf (_("%d atom(s) removed !\n%d atom(s) inserted !"), i, j);
682 }
683 else
684 {
685 str = g_strdup_printf (_("%d atom(s) inserted !"), (inserted_from_lib) ? inserted_from_lib : j);
687 }
689 if (action == 1) show_info (str, 0, opengl_project -> modelgl -> win);
690 g_free (str);
691 }
693}
694
696
697#ifdef GTK4
707G_MODULE_EXPORT void add_object (GSimpleAction * action, GVariant * parameter, gpointer data)
708#else
717G_MODULE_EXPORT void add_object (GtkWidget * widg, gpointer data)
718#endif
719{
720 int i, j;
721 i = opengl_project -> natomes;
722 prepare_atom_edition (data, FALSE);
725 {
726 gchar * lab = NULL;
727#ifdef GTK4
728 if (action != NULL)
729 {
731 }
732#else
733 if (widg != NULL)
734 {
735 lab = g_strdup_printf ("%s", gtk_menu_item_get_label (GTK_MENU_ITEM(widg)));
736 }
737#endif
738 else
739 {
740 lab = g_strdup_printf (_("Copied Data"));
741 }
743 insert_search -> todo[0] = 1;
745 g_free (lab);
746 }
747 else if (copied_object)
748 {
749 tint ul = ulam_coord (opengl_project -> modelgl);
750 opengl_project -> modelgl -> atom_win -> to_be_inserted[1] = duplicate_atomic_object (copied_object);
751 atomic_object * object = opengl_project -> modelgl -> atom_win -> to_be_inserted[1];
752 for (i=0; i<object -> atoms; i++)
753 {
754 object -> at_list[i].x += opengl_project -> modelgl -> insert_coords.x + object -> dim*ul.a;
755 object -> at_list[i].y += opengl_project -> modelgl -> insert_coords.y + object -> dim*ul.b;
756 object -> at_list[i].z += opengl_project -> modelgl -> insert_coords.z + object -> dim*ul.c;
757 }
759 insert_search -> todo[0] = 1;
760 insert_search -> in_selection ++;
761 }
762 insert_object (3, data);
763 if (! i && opengl_project -> natomes)
764 {
765 if (opengl_project -> modelgl -> anim -> last -> img -> style == SPACEFILL)
766 {
767 j = OGL_STYLES + opengl_project -> modelgl -> anim -> last -> img -> filled_type;
769 }
770 else
771 {
772 j = opengl_project -> modelgl -> anim -> last -> img -> style;
774 }
775 set_this_style (opengl_project -> modelgl, j);
776 }
777}
778
779#ifdef GTK4
789G_MODULE_EXPORT void to_add_object (GSimpleAction * action, GVariant * parameter, gpointer data)
790#else
799G_MODULE_EXPORT void to_add_object (GtkWidget * widg, gpointer data)
800#endif
801{
802 insert_this_object = TRUE;
803#ifdef GTK4
804 add_object (action, parameter, data);
805#else
806 add_object (widg, data);
807#endif
808 insert_this_object = FALSE;
809}
810
811#ifdef GTK4
821G_MODULE_EXPORT void replace_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
822{
824#else
833G_MODULE_EXPORT void replace_this_atom (GtkWidget * widg, gpointer data)
834{
835 to_replace_this_object (0, widg, data);
836#endif
837 to_remove_this_object (0, data);
838 insert_object (1, & opengl_project -> modelgl -> colorp[0][0]);
839}
840
841#ifdef GTK4
851G_MODULE_EXPORT void copy_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
852#else
861G_MODULE_EXPORT void copy_this_atom (GtkWidget * widg, gpointer data)
862#endif
863{
864 int i;
865 if (pasted_todo)
866 {
867 g_free (pasted_todo);
868 pasted_todo = NULL;
869 }
870 if (copied_object)
871 {
872 g_free (copied_object);
873 copied_object = NULL;
874 }
875 pasted_todo = allocint (opengl_project -> natomes);
876 i = GPOINTER_TO_INT(data);
877 pasted_todo[i] = 1;
879}
880
889{
890 int i, j, k, l, m;
891 int ** num;
892 int * numc[4];
893 int * numv[4];
894 int * numg[2];
895
896 k = 2;
897 num = allocdint (2, this_proj -> nspec);
898 for (i=0; i<2; i++) if (this_proj -> modelgl -> adv_bonding[i]) k ++;
899 for (i=0; i<k; i++)
900 {
901 numc[i] = allocint (this_proj -> coord -> totcoord[i]);
902 numv[i] = allocint (this_proj -> coord -> totcoord[i]);
903 if (i < 2)
904 {
905 numg[i] = allocint (this_proj -> nspec);
906 for (j=1; j<this_proj -> nspec; j++)
907 {
908 numg[i][j] = this_proj -> coord -> ntg[i][j-1] + numg[i][j-1];
909 }
910 }
911 }
912 for (i=0; i<this_proj -> steps; i++)
913 {
914 for (j=0; j<this_proj -> natomes; j++)
915 {
916 for (l=0; l<2; l++) if (this_proj -> atoms[i][j].show[l]) num[l][this_proj -> atoms[i][j].sp] ++;
917 for (l=0; l<k; l++)
918 {
919 m = this_proj -> atoms[i][j].coord[l];
920 if (l < 2 && this_proj -> atoms[i][j].sp > 0) m += numg[l][this_proj -> atoms[i][j].sp];
921 numc[l][m] ++;
922 if (this_proj -> atoms[i][j].show[0]) numv[l][m] ++;
923 }
924 }
925 }
926#ifdef GTK4
927 gboolean update_bar = FALSE;
928#endif
929 for (i=0; i<2; i++)
930 {
931 for (j=0; j<this_proj -> nspec; j++)
932 {
933 if (num[i][j] > 0)
934 {
935 if (num[i][j] == this_proj -> chemistry -> nsps[j]*this_proj -> steps)
936 {
937#ifdef GTK4
938 if (! this_proj -> modelgl -> anim -> last -> img -> show_atom[i][j]) update_bar = TRUE;
939#else
940 // GTK3 Menu Action To Check
941 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_spec[i][j], TRUE);
942#endif
943 this_proj -> modelgl -> anim -> last -> img -> show_atom[i][j] = TRUE;
944 }
945 }
946 else if (this_proj -> modelgl -> anim -> last -> img -> show_atom[i][j])
947 {
948#ifdef GTK4
949 update_bar = TRUE;
950#else
951 // GTK3 Menu Action To Check
952 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_spec[i][j], FALSE);
953#endif
954 this_proj -> modelgl -> anim -> last -> img -> show_atom[i][j] = FALSE;
955 }
956 }
957 }
958 l = 0;
959 for (i=0; i<k; i++)
960 {
961 if (is_coord_in_menu(i, this_proj))
962 {
963 for (j=0; j<this_proj -> coord -> totcoord[i]; j++)
964 {
965 if (numv[i][j] > 0)
966 {
967 if (numc[i][j] == numv[i][j])
968 {
969#ifdef GTK4
970 if (! this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j]) update_bar = TRUE;
971#else
972 // GTK3 Menu Action To Check
973 for (l=0; l<2; l++) gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_geom[l][i][j], TRUE);
974#endif
975 }
976 this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j] = TRUE;
977 }
978 else if (this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j])
979 {
980#ifdef GTK4
981 update_bar = TRUE;
982#else
983 // GTK3 Menu Action To Check
984 for (l=0; l<2; l++) gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_geom[l][i][j], FALSE);
985#endif
986 this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j] = FALSE;
987 }
988 }
989 }
990 else
991 {
992 for (j=0; j<this_proj -> coord -> totcoord[i]; j++)
993 {
994 if (numv[i][j] > 0)
995 {
996 this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j] = TRUE;
997 }
998 else if (this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j])
999 {
1000 this_proj -> modelgl -> anim -> last -> img -> show_coord[i][j] = FALSE;
1001 }
1002 }
1003 }
1004 }
1005 for (i=0; i<2; i++) g_free (num[i]);
1006 g_free (num);
1007 for (i=0; i<k; i++)
1008 {
1009 g_free (numc[i]);
1010 g_free (numv[i]);
1011 if (i < 2) g_free (numg[i]);
1012 }
1013#ifdef GTK4
1014 if (update_bar) update_menu_bar (this_proj -> modelgl);
1015#endif
1016}
1017
1018#ifdef GTK4
1028G_MODULE_EXPORT void show_hide_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
1029#else
1038G_MODULE_EXPORT void show_hide_this_atom (GtkWidget * widg, gpointer data)
1039#endif
1040{
1041 int i;
1042 int id = GPOINTER_TO_INT (data);
1043 for (i=0; i<opengl_project -> steps; i++)
1044 {
1045 opengl_project -> atoms[i][id].show[0] = ! opengl_project -> atoms[i][id].show[0];
1046 }
1049}
1050
1059int check_label_numbers (project * this_proj, int types)
1060{
1061 int h, i, j, k, l;
1062 int start, end;
1063 int * naid = allocint (this_proj -> nspec);
1064 int * nlid = allocint (this_proj -> nspec);
1065 start = (types == 0 || types == 2) ? 0 : 1;
1066 end = (types == 1 || types == 2) ? 2 : 1;
1067 l = 0;
1068#ifdef GTK4
1069 gboolean update_bar = FALSE;
1070#endif
1071 for (h=start; h<end; h++)
1072 {
1073 for (i=0; i<this_proj -> nspec; i++) naid[i] = nlid[i] = 0;
1074 for (i=0; i<this_proj -> steps; i++)
1075 {
1076 for (j=0; j<this_proj -> natomes; j++)
1077 {
1078 k = this_proj -> atoms[i][j].sp;
1079 naid[k] ++;
1080 if (this_proj -> atoms[i][j].label[h]) nlid[k] ++;
1081 }
1082 }
1083 if (h==types || (h == 0 && types == 2)) l = 0;
1084 for (i=0; i<this_proj -> nspec; i++)
1085 {
1086 // g_debug ("h= %d, i= %d, nlid[%d]= %d, naid[%d]= %d", h, i+1, i+1, nlid[i], i+1, naid[i]);
1087 if (nlid[i] == naid[i])
1088 {
1089#ifdef GTK4
1090 if (! this_proj -> modelgl -> anim -> last -> img -> show_label[h][i]) update_bar = TRUE;
1091#else
1092 if (! gtk_check_menu_item_get_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_lab[h][i]))
1093 {
1094 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_lab[h][i], 1);
1095 }
1096#endif
1097 this_proj -> modelgl -> anim -> last -> img -> show_label[h][i] = TRUE;
1098
1099 }
1100 else
1101 {
1102 if (nlid[i] == 0)
1103 {
1104#ifdef GTK4
1105 if (this_proj -> modelgl -> anim -> last -> img -> show_label[h][i]) update_bar = TRUE;
1106#else
1107 if (gtk_check_menu_item_get_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_lab[h][i]))
1108 {
1109 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)this_proj -> modelgl -> ogl_lab[h][i], 0);
1110 }
1111#endif
1112 }
1113 this_proj -> modelgl -> anim -> last -> img -> show_label[h][i] = FALSE;
1114 }
1115 if (h==types || (h == 0 && types == 2)) l += nlid[i];
1116 }
1117 }
1118 g_free (naid);
1119 g_free (nlid);
1120 check_all_trees (this_proj);
1121#ifdef GTK4
1122 if (update_bar) update_menu_bar (this_proj -> modelgl);
1123#endif
1124 return l;
1125}
1126
1127#ifdef GTK4
1137G_MODULE_EXPORT void label_unlabel_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
1138#else
1147G_MODULE_EXPORT void label_unlabel_this_atom (GtkWidget * widg, gpointer data)
1148#endif
1149{
1150 int i, j, k, l, m;
1151 int id = GPOINTER_TO_INT (data);
1152 i = opengl_project -> modelgl -> anim -> last -> img -> step;
1153 j = opengl_project -> atoms[i][id].label[0];
1154 for (k=0; k<opengl_project -> steps; k++)
1155 {
1156 opengl_project -> atoms[k][id].label[0] = ! j;
1157 opengl_project -> atoms[k][id].label[1] = ! j;
1158 if (opengl_project -> modelgl -> selection_mode == 1)
1159 {
1160 for (l=0; l<opengl_project -> atoms[k][id].numv; l++)
1161 {
1162 m = opengl_project -> atoms[k][id].vois[l];
1163 opengl_project -> atoms[k][m].label[0] = ! j;
1164 opengl_project -> atoms[k][m].label[1] = ! j;
1165 }
1166 }
1167 }
1168 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
1169 if (check_label)
1170 {
1171 opengl_project -> modelgl -> labelled = check_label_numbers (opengl_project, 2);
1172 update (opengl_project -> modelgl);
1173 }
1174}
1175
1176#ifdef GTK4
1186G_MODULE_EXPORT void select_unselect_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
1187#else
1196G_MODULE_EXPORT void select_unselect_this_atom (GtkWidget * widg, gpointer data)
1197#endif
1198{
1199 int h, i, j, k, l, m;
1200 int id = GPOINTER_TO_INT (data);
1201 h = get_to_be_selected (opengl_project -> modelgl);
1202 j = opengl_project -> modelgl -> anim -> last -> img -> step;
1203 save_all_selections (opengl_project -> modelgl, h);
1204 k = opengl_project -> atoms[j][id].pick[h];
1205 for (i=0; i<opengl_project -> steps; i++)
1206 {
1207 if (i == j)
1208 {
1209 if (! opengl_project -> modelgl -> selection_mode || opengl_project -> atoms[i][id].pick[h] != selected_status)
1210 {
1211 process_selected_atom (opengl_project, opengl_project -> modelgl, id, 0, 0, h);
1212 }
1213 if (opengl_project -> modelgl -> selection_mode == 1)
1214 {
1215 for (l=0; l<opengl_project -> atoms[j][id].numv; l++)
1216 {
1217 m = opengl_project -> atoms[i][id].vois[l];
1218 if (opengl_project -> atoms[i][m].pick[h] != opengl_project -> atoms[i][id].pick[h])
1219 {
1220 process_selected_atom (opengl_project, opengl_project -> modelgl, m, 0, 0, h);
1221 }
1222 }
1223 }
1224 }
1225 else
1226 {
1227 if (! opengl_project -> modelgl -> selection_mode || opengl_project -> atoms[i][id].pick[h] != selected_status)
1228 {
1229 opengl_project -> atoms[i][id].pick[h] = ! k;
1230 }
1231 if (opengl_project -> modelgl -> selection_mode == 1)
1232 {
1233 for (l=0; l<opengl_project -> atoms[j][id].numv; l++)
1234 {
1235 m = opengl_project -> atoms[j][id].vois[l];
1236 opengl_project -> atoms[i][m].pick[h] = opengl_project -> atoms[i][id].pick[h];
1237 }
1238 }
1239 }
1240 }
1241 update_all_selections (opengl_project -> modelgl, h);
1242 int shaders[1] = {SELEC};
1244 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
1245 if (opengl_project -> modelgl -> mode == EDITION)
1246 {
1247 if (opengl_project -> modelgl -> rebuild[0][1]) opengl_project -> modelgl -> rebuild[0][0] = TRUE;
1248 if (opengl_project -> modelgl -> rebuild[1][1]) opengl_project -> modelgl -> rebuild[1][0] = TRUE;
1249 }
1250 update (opengl_project -> modelgl);
1251}
1252
1253gboolean wait_for_style = FALSE;
1254
1255#ifdef GTK4
1265G_MODULE_EXPORT void style_this_atom (GSimpleAction * action, GVariant * parameter, gpointer data)
1266#else
1275G_MODULE_EXPORT void style_this_atom (GtkWidget * widg, gpointer data)
1276#endif
1277{
1278 int i, j;
1279 int id = GPOINTER_TO_INT (data);
1280#ifdef GTK4
1281 j = get_style ((gchar *)g_action_get_name (G_ACTION(action)));
1282#else
1283 j = get_style ((char *)gtk_menu_item_get_label (GTK_MENU_ITEM(widg)));
1284#endif
1285 for (i=0; i<opengl_project -> steps; i++)
1286 {
1287 opengl_project -> atoms[i][id].style = j;
1288 }
1289 if (! wait_for_style)
1290 {
1292 update (opengl_project -> modelgl);
1293 }
1294}
1295
1296#ifdef GTK4
1306G_MODULE_EXPORT void remove_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1307#else
1316G_MODULE_EXPORT void remove_the_atoms (GtkWidget * widg, gpointer data)
1317#endif
1318{
1319 to_remove_this_object (2, data);
1320 remove_object ();
1321}
1322
1323#ifdef GTK4
1333G_MODULE_EXPORT void replace_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1334{
1335 to_replace_this_object (2, action, data);
1336#else
1345G_MODULE_EXPORT void replace_the_atoms (GtkWidget * widg, gpointer data)
1346{
1347 to_replace_this_object (2, widg, data);
1348#endif
1349 to_remove_this_object (2, data);
1350 insert_object (1, & opengl_project -> modelgl -> colorp[0][0]);
1352}
1353
1354#ifdef GTK4
1364G_MODULE_EXPORT void copy_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1365#else
1374G_MODULE_EXPORT void copy_the_atoms (GtkWidget * widg, gpointer data)
1375#endif
1376{
1377 tint * sel = (tint *)data;
1378 int h, i, j;
1379 if (copied_object)
1380 {
1381 g_free (copied_object);
1382 copied_object = NULL;
1383 }
1384 pasted_todo = allocint (opengl_project -> natomes);
1385 h = 0;
1386 i = opengl_project -> modelgl -> anim -> last -> img -> step;
1387 for (j=0; j<opengl_project -> natomes; j++)
1388 {
1389 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
1390 {
1391 if (! sel -> a || opengl_project -> atoms[i][j].label[0] == is_labelled)
1392 {
1393 if (opengl_project -> atoms[i][j].pick[0] == is_selected || is_selected == -1)
1394 {
1395 pasted_todo[j] = 1;
1396 h = 1;
1397 }
1398 }
1399 }
1400 }
1401 if (h)
1402 {
1404 }
1405 else
1406 {
1407 g_free (pasted_todo);
1408 pasted_todo = NULL;
1409 }
1410}
1411
1412#ifdef GTK4
1422G_MODULE_EXPORT void show_hide_others (GSimpleAction * action, GVariant * parameter, gpointer data)
1423#else
1432G_MODULE_EXPORT void show_hide_others (GtkWidget * widg, gpointer data)
1433#endif
1434{
1435 tint * sel = (tint * )data;
1436 int i, j, k;
1437
1438 for (i=0; i<opengl_project -> steps; i++)
1439 {
1440 for (j=0; j<opengl_project -> natomes; j++)
1441 {
1442 for (k=0; k<2; k++)
1443 {
1444 if (opengl_project -> atoms[i][j].show[k] == sel -> c)
1445 {
1446 opengl_project -> atoms[i][j].show[k] = ! sel -> c;
1447 }
1448 }
1449 }
1450 }
1453}
1454
1455#ifdef GTK4
1465G_MODULE_EXPORT void show_hide_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1466#else
1475G_MODULE_EXPORT void show_hide_the_atoms (GtkWidget * widg, gpointer data)
1476#endif
1477{
1478 tint * sel = (tint * )data;
1479 int h, i, j;
1480 h = get_to_be_selected (opengl_project -> modelgl);
1481 for (i=0; i<opengl_project -> steps; i++)
1482 {
1483 for (j=0; j<opengl_project -> natomes; j++)
1484 {
1485 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
1486 {
1487 if (sel -> a == 2 || (opengl_project -> atoms[i][j].pick[h] == is_selected || is_selected == -1))
1488 {
1489 if (sel -> a || opengl_project -> atoms[i][j].label[0] == is_labelled)
1490 {
1491 opengl_project -> atoms[i][j].show[0] = sel -> c;
1492 opengl_project -> atoms[i][j].show[1] = sel -> c;
1493 }
1494 }
1495 }
1496 }
1497 }
1500}
1501
1502#ifdef GTK4
1512G_MODULE_EXPORT void label_unlabel_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1513#else
1522G_MODULE_EXPORT void label_unlabel_atoms (GtkWidget * widg, gpointer data)
1523#endif
1524{
1525 tint * sel = (tint * )data;
1526 int h, i, j;
1527 h = get_to_be_selected (opengl_project -> modelgl);
1528 for (i=0; i<opengl_project -> steps; i++)
1529 {
1530 for (j=0; j<opengl_project -> natomes; j++)
1531 {
1532 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
1533 {
1534 if (opengl_project -> atoms[i][j].pick[h] == is_selected || is_selected == -1)
1535 {
1536 opengl_project -> atoms[i][j].label[0] = sel -> c;
1537 opengl_project -> atoms[i][j].label[1] = sel -> c;
1538 }
1539 }
1540 }
1541 }
1542 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
1543 if (check_label)
1544 {
1545 opengl_project -> modelgl -> labelled = check_label_numbers (opengl_project, 2);
1546 update (opengl_project -> modelgl);
1547 }
1548}
1549
1550#ifdef GTK4
1560G_MODULE_EXPORT void select_unselect_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1561#else
1570G_MODULE_EXPORT void select_unselect_atoms (GtkWidget * widg, gpointer data)
1571#endif
1572{
1573 tint * sel = (tint *)data;
1574 int h, i, j;
1575 h = get_to_be_selected (opengl_project -> modelgl);
1576 save_all_selections (opengl_project -> modelgl, h);
1577 for (i=0; i<opengl_project -> steps; i++)
1578 {
1579 for (j=0; j<opengl_project -> natomes; j++)
1580 {
1581 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
1582 {
1583 if (! sel -> b || opengl_project -> atoms[i][j].label[0] == is_labelled)
1584 {
1585 if (i == opengl_project -> modelgl -> anim -> last -> img -> step)
1586 {
1587 if (opengl_project -> atoms[i][j].pick[h] != sel -> c)
1588 {
1589 process_selected_atom (opengl_project, opengl_project -> modelgl, j, 0, 0, h);
1590 }
1591 }
1592 else
1593 {
1594 if (opengl_project -> atoms[i][j].pick[h] != sel -> c)
1595 {
1596 opengl_project -> atoms[i][j].pick[h] = sel -> c;
1597 }
1598 }
1599 }
1600 }
1601 }
1602 }
1603 update_all_selections (opengl_project -> modelgl, h);
1604 int shaders[1] = {SELEC};
1606 opengl_project -> modelgl -> create_shaders[MEASU] = TRUE;
1607 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
1608 if (opengl_project -> modelgl -> mode == EDITION)
1609 {
1610 if (opengl_project -> modelgl -> rebuild[0][1]) opengl_project -> modelgl -> rebuild[0][0] = TRUE;
1611 if (opengl_project -> modelgl -> rebuild[1][1]) opengl_project -> modelgl -> rebuild[1][0] = TRUE;
1612 }
1613 update (opengl_project -> modelgl);
1614}
1615
1616#ifdef GTK4
1626G_MODULE_EXPORT void style_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
1627#else
1636G_MODULE_EXPORT void style_the_atoms (GtkWidget * widg, gpointer data)
1637#endif
1638{
1639 int h, i, j, k;
1640 tint * sel = (tint *)data;
1641 h = get_to_be_selected (opengl_project -> modelgl);
1642#ifdef GTK4
1643 k = get_style ((gchar *)g_action_get_name(G_ACTION(action)));
1644#else
1645 k = get_style ((char *)gtk_menu_item_get_label (GTK_MENU_ITEM(widg)));
1646#endif
1647 for (i=0; i<opengl_project -> steps; i++)
1648 {
1649 for (j=0; j<opengl_project -> natomes; j++)
1650 {
1651 if (opengl_project -> atoms[i][j].sp == selected_aspec || selected_aspec == -1)
1652 {
1653 if (sel -> a == 2 || (opengl_project -> atoms[i][j].pick[h] == is_selected || is_selected == -1))
1654 {
1655 if (sel -> a || opengl_project -> atoms[i][j].label[0] == is_labelled)
1656 {
1657 opengl_project -> atoms[i][j].style = k;
1658 }
1659 }
1660 }
1661 }
1662 }
1664 update (opengl_project -> modelgl);
1665}
1666
1667#ifdef GTK4
1677G_MODULE_EXPORT void remove_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
1678#else
1687G_MODULE_EXPORT void remove_the_coord (GtkWidget * widg, gpointer data)
1688#endif
1689{
1690 to_remove_this_object (1, data);
1691 remove_object ();
1692}
1693
1694#ifdef GTK4
1704G_MODULE_EXPORT void replace_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
1705{
1706 to_replace_this_object (1, action, data);
1707#else
1716G_MODULE_EXPORT void replace_the_coord (GtkWidget * widg, gpointer data)
1717{
1718 to_replace_this_object (1, widg, data);
1719#endif
1720 to_remove_this_object (1, data);
1721 insert_object (1, data);
1722}
1723
1724#ifdef GTK4
1734G_MODULE_EXPORT void copy_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
1735#else
1744G_MODULE_EXPORT void copy_the_coord (GtkWidget * widg, gpointer data)
1745#endif
1746{
1747 tint * sel = (tint *)data;
1748 int h, i, j;
1749 if (copied_object)
1750 {
1751 g_free (copied_object);
1752 copied_object = NULL;
1753 }
1754 pasted_todo = allocint (opengl_project -> natomes);
1755 h = 0;
1756 i = opengl_project -> modelgl -> anim -> last -> img -> step;
1757 for (j=0; j<opengl_project -> natomes; j++)
1758 {
1759 if (sel -> a < 2)
1760 {
1761 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1762 {
1763 pasted_todo[j] = 1;
1764 h = 1;
1765 }
1766 }
1767 else
1768 {
1769 if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1770 {
1771 pasted_todo[j] = 1;
1772 h = 1;
1773 }
1774 }
1775 }
1776 if (h)
1777 {
1779 }
1780 else
1781 {
1782 g_free (pasted_todo);
1783 pasted_todo = NULL;
1784 }
1785}
1786
1787#ifdef GTK4
1797G_MODULE_EXPORT void show_hide_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
1798#else
1807G_MODULE_EXPORT void show_hide_the_coord (GtkWidget * widg, gpointer data)
1808#endif
1809{
1810 tint * sel = (tint * )data;
1811 int i, j;
1812 for (i=0; i<opengl_project -> steps; i++)
1813 {
1814 for (j=0; j<opengl_project -> natomes; j++)
1815 {
1816 if (sel -> a < 2)
1817 {
1818 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1819 {
1820 opengl_project -> atoms[i][j].show[0] = sel -> c;
1821 opengl_project -> atoms[i][j].show[1] = sel -> c;
1822 }
1823 }
1824 else
1825 {
1826 if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1827 {
1828 opengl_project -> atoms[i][j].show[0] = sel -> c;
1829 opengl_project -> atoms[i][j].show[1] = sel -> c;
1830 }
1831 }
1832 }
1833 }
1836}
1837
1838#ifdef GTK4
1848G_MODULE_EXPORT void label_unlabel_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
1849#else
1858G_MODULE_EXPORT void label_unlabel_coord (GtkWidget * widg, gpointer data)
1859#endif
1860{
1861 tint * sel = (tint * )data;
1862 int i, j, k, l, m;
1863 if (sel -> a > 3) k = opengl_project -> coord -> geolist[sel -> a][0][sel -> b] - 1;
1864 for (i=0; i<opengl_project -> steps; i++)
1865 {
1866 for (j=0; j<opengl_project -> natomes; j++)
1867 {
1868 if (sel -> a < 2)
1869 {
1870 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1871 {
1872 opengl_project -> atoms[i][j].label[0] = sel -> c;
1873 opengl_project -> atoms[i][j].label[1] = sel -> c;
1874 if (opengl_project -> modelgl -> selection_mode == 1)
1875 {
1876 for (l=0; l<opengl_project -> atoms[i][j].numv; l++)
1877 {
1878 m = opengl_project -> atoms[i][j].vois[l];
1879 opengl_project -> atoms[i][m].label[0] = sel -> c;
1880 opengl_project -> atoms[i][m].label[1] = sel -> c;
1881 }
1882 }
1883 }
1884 }
1885 else if (sel -> a < 4)
1886 {
1887 if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1888 {
1889 opengl_project -> atoms[i][j].label[0] = sel -> c;
1890 opengl_project -> atoms[i][j].label[1] = sel -> c;
1891 }
1892 }
1893 else
1894 {
1895 if (opengl_project -> atoms[i][j].rings[sel -> a-4][k])
1896 {
1897 if (opengl_project -> atoms[i][j].rings[sel -> a-4][k][0])
1898 {
1899 opengl_project -> atoms[i][j].label[0] = sel -> c;
1900 opengl_project -> atoms[i][j].label[1] = sel -> c;
1901 }
1902 }
1903 }
1904 }
1905 }
1906 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
1907 if (check_label)
1908 {
1909 opengl_project -> modelgl -> labelled = check_label_numbers (opengl_project, 2);
1910 update (opengl_project -> modelgl);
1911 }
1912}
1913
1914#ifdef GTK4
1924G_MODULE_EXPORT void select_unselect_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
1925#else
1934G_MODULE_EXPORT void select_unselect_coord (GtkWidget * widg, gpointer data)
1935#endif
1936{
1937 tint * sel = (tint * )data;
1938 int h, i, j, k;
1939 h = get_to_be_selected (opengl_project -> modelgl);
1940 save_all_selections (opengl_project -> modelgl, h);
1941 if (sel -> a > 3) k = opengl_project -> coord -> geolist[sel -> a][0][sel -> b] - 1;
1942 for (i=0; i<opengl_project -> steps; i++)
1943 {
1944 for (j=0; j<opengl_project -> natomes; j++)
1945 {
1946 if (sel -> a < 2)
1947 {
1948 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1949 {
1950 if (i == opengl_project -> modelgl -> anim -> last -> img -> step)
1951 {
1952 if (opengl_project -> atoms[i][j].pick[h] != sel -> c) process_selected_atom (opengl_project, opengl_project -> modelgl, j, 0, 0, h);
1953 }
1954 else
1955 {
1956 opengl_project -> atoms[i][j].pick[h] = sel -> c;
1957 }
1958 }
1959 }
1960 else if (sel -> a < 4)
1961 {
1962 if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
1963 {
1964 if (i == opengl_project -> modelgl -> anim -> last -> img -> step)
1965 {
1966 if (opengl_project -> atoms[i][j].pick[h] != sel -> c) process_selected_atom (opengl_project, opengl_project -> modelgl, j, 0, 0, h);
1967 }
1968 else
1969 {
1970 opengl_project -> atoms[i][j].pick[h] = sel -> c;
1971 }
1972 }
1973 }
1974 else
1975 {
1976 if (opengl_project -> atoms[i][j].rings[sel -> a-4][k])
1977 {
1978 if (opengl_project -> atoms[i][j].rings[sel -> a-4][k][0])
1979 {
1980 if (i == opengl_project -> modelgl -> anim -> last -> img -> step)
1981 {
1982 if (opengl_project -> atoms[i][j].pick[h] != sel -> c) process_selected_atom (opengl_project, opengl_project -> modelgl, j, 0, 0, h);
1983 }
1984 else
1985 {
1986 opengl_project -> atoms[i][j].pick[h] = sel -> c;
1987 }
1988 }
1989 }
1990 }
1991 }
1992 }
1993 update_all_selections (opengl_project -> modelgl, h);
1994 int shader[1] = {SELEC};
1996 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
1997 opengl_project -> modelgl -> create_shaders[MEASU] = TRUE;
1998 if (opengl_project -> modelgl -> mode == EDITION)
1999 {
2000 if (opengl_project -> modelgl -> rebuild[0][1]) opengl_project -> modelgl -> rebuild[0][0] = TRUE;
2001 if (opengl_project -> modelgl -> rebuild[1][1]) opengl_project -> modelgl -> rebuild[1][0] = TRUE;
2002 }
2003 update (opengl_project -> modelgl);
2004}
2005
2006#ifdef GTK4
2016G_MODULE_EXPORT void style_the_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
2017#else
2026G_MODULE_EXPORT void style_the_coord (GtkWidget * widg, gpointer data)
2027#endif
2028{
2029 tint * sel = (tint * )data;
2030 int i, j, k, l;
2031 if (sel -> a > 3) k = opengl_project -> coord -> geolist[sel -> a][0][sel -> b] - 1;
2032#ifdef GTK4
2033 l = get_style ((gchar *)g_action_get_name(G_ACTION(action)));
2034#else
2035 l = get_style ((char *)gtk_menu_item_get_label (GTK_MENU_ITEM(widg)));
2036#endif
2037 for (i=0; i<opengl_project -> steps; i++)
2038 {
2039 for (j=0; j<opengl_project -> natomes; j++)
2040 {
2041 if (sel -> a < 2)
2042 {
2043 if (opengl_project -> atoms[i][j].sp == selected_aspec && opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
2044 {
2045 opengl_project -> atoms[i][j].style = l;
2046 }
2047 }
2048 else if (sel -> a < 4)
2049 {
2050 if (opengl_project -> atoms[i][j].coord[sel -> a] == sel -> b)
2051 {
2052 opengl_project -> atoms[i][j].style = l;
2053 }
2054 }
2055 else
2056 {
2057 if (opengl_project -> atoms[i][j].rings[sel -> a-4][k])
2058 {
2059 if (opengl_project -> atoms[i][j].rings[sel -> a-4][k][0])
2060 {
2061 opengl_project -> atoms[i][j].style = l;
2062 }
2063 }
2064 }
2065 }
2066 }
2068 update (opengl_project -> modelgl);
2069}
2070
2079{
2080 int i, j, k, l;
2081 int nspec = 0;
2082 int * pos_sp, * specs;
2083 atom_in_selection * tmp;
2084
2085 pos_sp = allocint (opengl_project -> nspec);
2086 specs = allocint (opengl_project -> nspec);
2087 for (i=0; i<opengl_project -> nspec; i++)
2088 {
2089 specs[i] = 0;
2090 pos_sp[i] = -1;
2091 }
2092
2093 tmp = selection -> first;
2094 j = -1;
2095 for (i=0; i<selection -> selected; i++)
2096 {
2097 specs[tmp -> sp] ++;
2098 if (pos_sp[tmp -> sp] < 0)
2099 {
2100 j ++;
2101 pos_sp[tmp -> sp] = j;
2102 }
2103 if (tmp -> next != NULL) tmp = tmp -> next;
2104 }
2105
2106 for (i=0; i<opengl_project -> nspec; i++) if (specs[i] > 0) nspec ++;
2107
2108 init_project (TRUE);
2109 active_project -> nspec = nspec;
2110 active_project -> natomes = selection -> selected;
2111 active_project -> steps = 1;
2114
2115 if (active_project -> natomes == opengl_project -> natomes)
2116 {
2117 active_cell -> ltype = opengl_project -> cell.ltype;
2118 active_cell -> pbc = opengl_project -> cell.pbc;
2119 active_cell -> has_a_box = opengl_project -> cell.has_a_box;
2120 k = (active_cell -> npt) ? opengl_project -> modelgl -> anim -> last -> img -> step : 0;
2121 for (i=0; i<3; i++)
2122 {
2123 for (j=0; j<3; j++)
2124 {
2125 if (i < 2) active_box -> param[i][j] = opengl_project -> cell.box[k].param[i][j];
2126 active_box -> vect[i][j] = opengl_project -> cell.box[k].vect[i][j];
2127 }
2128 }
2129 }
2130
2131 for (i=0; i<opengl_project -> nspec; i++)
2132 {
2133 if (pos_sp[i] > -1)
2134 {
2135 k = pos_sp[i];
2136 active_chem -> label[k] = g_strdup_printf ("%s", opengl_project -> chemistry -> label[i]);
2137 active_chem -> element[k] = g_strdup_printf ("%s", opengl_project -> chemistry -> element[i]);
2138 active_chem -> nsps[k] = specs[i];
2139 for (j=0; j<CHEM_PARAMS; j++) active_chem -> chem_prop[j][k] = opengl_project -> chemistry -> chem_prop[j][i];
2140 for (j=0; j<opengl_project -> nspec; j++)
2141 {
2142 if (pos_sp[j] > -1)
2143 {
2144 l = pos_sp[j];
2145 active_chem -> cutoffs[k][l] = opengl_project -> chemistry -> cutoffs[i][j];
2146 }
2147 }
2148 }
2149 }
2150 active_chem -> grtotcutoff = opengl_project -> chemistry -> grtotcutoff;
2151
2152 tmp = selection -> first;
2153 for (i=0; i<active_project -> steps; i++)
2154 {
2155 tmp = selection -> first;
2156 for (j=0; j<active_project -> natomes; j++)
2157 {
2158 k = tmp -> id;
2159 active_project -> atoms[i][j].id = j;
2160 active_project -> atoms[i][j].sp = pos_sp[tmp -> sp];
2161 active_project -> atoms[i][j].x = opengl_project -> atoms[i][k].x;
2162 active_project -> atoms[i][j].y = opengl_project -> atoms[i][k].y;
2163 active_project -> atoms[i][j].z = opengl_project -> atoms[i][k].z;
2164 active_project -> atoms[i][j].show[0] = TRUE;
2165 active_project -> atoms[i][j].show[1] = TRUE;
2166 active_project -> atoms[i][j].label[0] = FALSE;
2167 active_project -> atoms[i][j].label[1] = FALSE;
2168 active_project -> atoms[i][j].pick[0] = FALSE;
2169 active_project -> atoms[i][j].cloned = FALSE;
2170 // Next line for style, to initialize style use: NONE
2171 active_project -> atoms[i][j].style = opengl_project -> atoms[i][k].style;
2172 if (tmp -> next != NULL) tmp = tmp -> next;
2173 }
2174 }
2178 i = opengl_project -> modelgl -> anim -> last -> img -> style;
2179 apply_project (FALSE);
2180 active_image -> style = i;
2182 g_free (pos_sp);
2183 g_free (specs);
2184 // Duplicate lightning and material
2185 duplicate_material_and_lightning (active_image, opengl_project -> modelgl -> anim -> last -> img);
2187}
2188
2189#ifdef GTK4
2199G_MODULE_EXPORT void edit_in_new_project (GSimpleAction * action, GVariant * parameter, gpointer data)
2200#else
2209G_MODULE_EXPORT void edit_in_new_project (GtkWidget * widg, gpointer data)
2210#endif
2211{
2212 tint * sel = (tint * )data;
2213 int h, i, j;
2214 atom_selection * selected;
2216 selected = g_malloc0(sizeof*selected);
2217 h = get_to_be_selected (opengl_project -> modelgl);
2218 if (! sel -> b)
2219 {
2220 if (sel -> c)
2221 {
2222 selected = opengl_project -> modelgl -> anim -> last -> img -> selected[h];
2223 }
2224 else
2225 {
2226 selected -> selected = opengl_project -> natomes - opengl_project -> modelgl -> anim -> last -> img -> selected[h] -> selected;
2227 j = opengl_project -> modelgl -> anim -> last -> img -> step;
2228 for (i=0; i<opengl_project -> natomes; i++)
2229 {
2230 if (! opengl_project -> atoms[j][i].pick[h])
2231 {
2232 if (selected -> first)
2233 {
2234 tmp_a -> next = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2235 tmp_a = tmp_a -> next;
2236 }
2237 else
2238 {
2239 selected -> first = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2240 tmp_a = selected -> first;
2241 }
2242 }
2243 }
2244 }
2245 }
2246 else
2247 {
2248 selected -> selected = (is_labelled) ? opengl_project -> modelgl -> labelled : opengl_project -> natomes - opengl_project -> modelgl -> labelled;
2249 j = opengl_project -> modelgl -> anim -> last -> img -> step;
2250 for (i=0; i<opengl_project -> natomes; i++)
2251 {
2252 if (opengl_project -> atoms[j][i].label[0] == is_labelled)
2253 {
2254 if (selected -> first)
2255 {
2256 tmp_a -> next = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2257 tmp_a = tmp_a -> next;
2258 }
2259 else
2260 {
2261 selected -> first = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2262 tmp_a = selected -> first;
2263 }
2264 }
2265 }
2266 }
2267 if (selected -> selected > 0) create_new_project_using_data (selected);
2268 selected = NULL;
2269 g_free (selected);
2270}
2271
2272#ifdef GTK4
2282G_MODULE_EXPORT void edit_coord (GSimpleAction * action, GVariant * parameter, gpointer data)
2283#else
2292G_MODULE_EXPORT void edit_coord (GtkWidget * widg, gpointer data)
2293#endif
2294{
2295 tint * sel = (tint * )data;
2296 int i, j;
2297 atom_selection * selected;
2299 gboolean save_it;
2300
2301 selected = g_malloc0(sizeof*selected);
2302 j = opengl_project -> modelgl -> anim -> last -> img -> step;
2303 for (i=0; i<opengl_project -> natomes; i++)
2304 {
2305 save_it = FALSE;
2306 if (sel -> a < 2)
2307 {
2308 if (opengl_project -> atoms[j][i].sp == selected_aspec && opengl_project -> atoms[j][i].coord[sel -> a] == sel -> b)
2309 {
2310 save_it = TRUE;
2311 }
2312 }
2313 else
2314 {
2315 if (opengl_project -> atoms[j][i].coord[sel -> a] == sel -> b)
2316 {
2317 save_it = TRUE;
2318 }
2319 }
2320 if (save_it)
2321 {
2322 if (selected -> first)
2323 {
2324 tmp_a -> next = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2325 tmp_a = tmp_a -> next;
2326 }
2327 else
2328 {
2329 selected -> first = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2330 tmp_a = selected -> first;
2331 }
2332 selected -> selected ++;
2333 }
2334 }
2335 if (selected -> selected > 0) create_new_project_using_data (selected);
2336 g_free (selected);
2337}
2338
2339#ifdef GTK4
2349G_MODULE_EXPORT void edit_atoms (GSimpleAction * action, GVariant * parameter, gpointer data)
2350#else
2359G_MODULE_EXPORT void edit_atoms (GtkWidget * widg, gpointer data)
2360#endif
2361{
2362 int i, j;
2363 atom_selection * selected;
2365
2366 selected = g_malloc0(sizeof*selected);
2367 j = opengl_project -> modelgl -> anim -> last -> img -> step;
2368 for (i=0; i<opengl_project -> natomes; i++)
2369 {
2370 if (opengl_project -> atoms[j][i].sp == selected_aspec || selected_aspec == -1)
2371 {
2372 if (selected -> first)
2373 {
2374 tmp_a -> next = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2375 tmp_a = tmp_a -> next;
2376 }
2377 else
2378 {
2379 selected -> first = new_atom_in_selection (i, opengl_project -> atoms[j][i].sp);
2380 tmp_a = selected -> first;
2381 }
2382 selected -> selected ++;
2383 }
2384 }
2385 if (selected -> selected > 0) create_new_project_using_data (selected);
2386 g_free (selected);
2387}
2388
2389#ifdef GTK4
2399G_MODULE_EXPORT void select_action_for_all (GSimpleAction * action, GVariant * parameter, gpointer data)
2400#else
2409G_MODULE_EXPORT void select_action_for_all (GtkWidget * widg, gpointer data)
2410#endif
2411{
2412 int i = GPOINTER_TO_INT(data);
2413 selected_aspec = -1;
2414#ifdef DEBUG
2415 g_debug ("Action for All= %d", i);
2416#endif // DEBUG
2417#ifdef GTK4
2418 switch (i)
2419 {
2420 case 0:
2421 select_unselect_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][1]);
2422 break;
2423 case 1:
2424 select_unselect_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][0]);
2425 break;
2426 case 2:
2427 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][1]);
2428 break;
2429 case 3:
2430 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][0]);
2431 break;
2432 case 4:
2433 show_hide_the_atoms (NULL, NULL, & atoid[0][0]);
2434 break;
2435 case 5:
2436 show_hide_the_atoms (NULL, NULL, & atoid[1][1]);
2437 break;
2438 case 6:
2439 style_the_atoms (action, NULL, & atoid[0][1]);
2440 break;
2441 // No case 7 = color
2442 case 8:
2443 edit_in_new_project (NULL, NULL, & opengl_project -> modelgl -> colorp[0][is_selected]);
2444 break;
2445 case 9:
2446 remove_the_atoms (action, NULL, & cut_sel);
2447 break;
2448 case 10:
2449 replace_the_atoms (action, NULL, & cut_sel);
2450 break;
2451 case 11:
2452 copy_the_atoms (action, NULL, & cut_sel);
2453 break;
2454 case CONTEXTACT:
2455 select_unselect_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[1][1]);
2456 break;
2457 case CONTEXTACT+1:
2458 select_unselect_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[1][0]);
2459 break;
2460 case CONTEXTACT+2:
2461 is_selected = -1;
2462 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][1]);
2463 // label_unlabel_atoms (NULL, NULL, & atoid[0][0]);
2464 break;
2465 case CONTEXTACT+3:
2466 is_selected = -1;
2467 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][0]);
2468 // label_unlabel_atoms (NULL, NULL, & atoid[1][0]);
2469 break;
2470 case CONTEXTACT+4:
2471 is_selected = -1;
2472 show_hide_the_atoms (NULL, NULL, & atoid[0][0]);
2473 break;
2474 case CONTEXTACT+5:
2475 is_selected = -1;
2476 show_hide_the_atoms (NULL, NULL, & atoid[1][0]);
2477 break;
2478 case CONTEXTACT+6:
2479 is_selected = -1;
2480 style_the_atoms (action, NULL, & atoid[0][0]);
2481 break;
2482 case CONTEXTACT+8:
2483 is_selected = -1;
2484 edit_in_new_project (NULL, NULL, & opengl_project -> modelgl -> colorp[1][1]);
2485 break;
2486 case CONTEXTACT+9:
2487 is_selected = -1;
2488 remove_the_atoms (action, NULL, & cut_sel);
2489 break;
2490 case CONTEXTACT+10:
2491 is_selected = -1;
2492 replace_the_atoms (action, NULL, & cut_sel);
2493 break;
2494 case CONTEXTACT+11:
2495 is_selected = -1;
2496 copy_the_atoms (action, NULL, & cut_sel);
2497 break;
2498 case 2*CONTEXTACT+4:
2499 is_selected = -1;
2500 show_hide_the_atoms (NULL, NULL, & atoid[0][1]);
2501 break;
2502 case 2*CONTEXTACT+5:
2503 is_selected = -1;
2504 show_hide_the_atoms (NULL, NULL, & atoid[1][1]);
2505 break;
2506 }
2507#else
2508 switch (i)
2509 {
2510 case 0:
2511 select_unselect_atoms (widg, & opengl_project -> modelgl -> colorp[0][1]);
2512 break;
2513 case 1:
2514 select_unselect_atoms (widg, & opengl_project -> modelgl -> colorp[0][0]);
2515 break;
2516 case 2:
2517 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][1]);
2518 // label_unlabel_atoms (NULL, & atoid[0][0]);
2519 break;
2520 case 3:
2521 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][0]);
2522 // label_unlabel_atoms (NULL, & atoid[1][1]);
2523 break;
2524 case 4:
2525 show_hide_the_atoms (NULL, & atoid[0][0]);
2526 break;
2527 case 5:
2528 show_hide_the_atoms (NULL, & atoid[1][1]);
2529 break;
2530 case 6:
2531 style_the_atoms (widg, & atoid[0][1]);
2532 break;
2533 // No case 7 = color
2534 case 8:
2535 edit_in_new_project (NULL, & opengl_project -> modelgl -> colorp[0][is_selected]);
2536 break;
2537 case 9:
2538 remove_the_atoms (widg, & cut_sel);
2539 break;
2540 case 10:
2541 replace_the_atoms (widg, & cut_sel);
2542 break;
2543 case 11:
2544 copy_the_atoms (widg, & cut_sel);
2545 break;
2546 case CONTEXTACT:
2547 select_unselect_atoms (NULL, & opengl_project -> modelgl -> colorp[1][1]);
2548 break;
2549 case CONTEXTACT+1:
2550 select_unselect_atoms (NULL, & opengl_project -> modelgl -> colorp[1][0]);
2551 break;
2552 case CONTEXTACT+2:
2553 is_selected = -1;
2554 // label_unlabel_atoms (NULL, & atoid[0][0]);
2555 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][1]);
2556 break;
2557 case CONTEXTACT+3:
2558 is_selected = -1;
2559 // label_unlabel_atoms (NULL, & atoid[1][0]);
2560 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][0]);
2561 break;
2562 case CONTEXTACT+4:
2563 is_selected = -1;
2564 show_hide_the_atoms (NULL, & atoid[0][0]);
2565 break;
2566 case CONTEXTACT+5:
2567 is_selected = -1;
2568 show_hide_the_atoms (NULL, & atoid[1][0]);
2569 break;
2570 case CONTEXTACT+6:
2571 is_selected = -1;
2572 style_the_atoms (widg, & atoid[0][0]);
2573 break;
2574 case CONTEXTACT+8:
2575 is_selected = -1;
2576 edit_in_new_project (NULL, & opengl_project -> modelgl -> colorp[1][1]);
2577 break;
2578 case CONTEXTACT+9:
2579 is_selected = -1;
2580 remove_the_atoms (widg, & cut_sel);
2581 break;
2582 case CONTEXTACT+10:
2583 is_selected = -1;
2584 replace_the_atoms (widg, & cut_sel);
2585 break;
2586 case CONTEXTACT+11:
2587 is_selected = -1;
2588 copy_the_atoms (widg, & cut_sel);
2589 break;
2590 case 2*CONTEXTACT+4:
2591 is_selected = -1;
2592 show_hide_the_atoms (NULL, & atoid[0][1]);
2593 break;
2594 case 2*CONTEXTACT+5:
2595 is_selected = -1;
2596 show_hide_the_atoms (NULL, & atoid[1][1]);
2597 break;
2598 }
2599#endif
2600}
2601
2602#ifdef GTK4
2612G_MODULE_EXPORT void select_action_for_this_bond (GSimpleAction * action, GVariant * parameter, gpointer data)
2613#else
2622G_MODULE_EXPORT void select_action_for_this_bond (GtkWidget * widg, gpointer data)
2623#endif
2624{
2625 int i, s;
2626 i = GPOINTER_TO_INT(data);
2627#ifdef GTK4
2628 switch (i)
2629 {
2630 case 0:
2631 select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(selected_atom));
2632 select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(selected_btom));
2633 break;
2634 case 1:
2635 select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(selected_atom));
2636 select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(selected_btom));
2637 break;
2638 case 2:
2639 label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(selected_atom));
2640 label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(selected_btom));
2641 break;
2642 case 3:
2643 label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(selected_atom));
2644 label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(selected_btom));
2645 break;
2646 case 4:
2647 show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(selected_atom));
2648 show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(selected_btom));
2649 break;
2650 case 5:
2651 show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(selected_atom));
2652 show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(selected_btom));
2653 break;
2654 case 6:
2655 style_this_atom (action, NULL, GINT_TO_POINTER(selected_atom));
2656 style_this_atom (action, NULL, GINT_TO_POINTER(selected_btom));
2657 break;
2658 default:
2659 // 8 = create project
2660 // 9 = remove
2661 // 10 = replace
2662 // 11 = copy
2663 bond_selection = g_malloc0(sizeof*bond_selection);
2664 s = opengl_project -> modelgl -> anim -> last -> img -> step;
2666 bond_selection -> selected ++;
2668 bond_selection -> selected ++;
2669 switch (i)
2670 {
2671 case 8:
2673 break;
2674 case 9:
2675 to_remove_this_object (3, NULL);
2676 remove_object ();
2677 break;
2678 case 10:
2679 to_replace_this_object (3, action, data);
2680 to_remove_this_object (3, data);
2681 insert_object (1, & opengl_project -> modelgl -> colorp[0][0]);
2683 break;
2684 case 11:
2686 break;
2687 }
2688 break;
2689 g_free (bond_selection);
2690 bond_selection = NULL;
2691 }
2692#else
2693 switch (i)
2694 {
2695 case 0:
2696 select_unselect_this_atom (NULL, GINT_TO_POINTER(selected_atom));
2697 select_unselect_this_atom (NULL, GINT_TO_POINTER(selected_btom));
2698 break;
2699 case 1:
2700 select_unselect_this_atom (NULL, GINT_TO_POINTER(selected_atom));
2701 select_unselect_this_atom (NULL, GINT_TO_POINTER(selected_btom));
2702 break;
2703 case 2:
2704 label_unlabel_this_atom (NULL, GINT_TO_POINTER(selected_atom));
2705 label_unlabel_this_atom (NULL, GINT_TO_POINTER(selected_btom));
2706 break;
2707 case 3:
2708 label_unlabel_this_atom (NULL, GINT_TO_POINTER(selected_atom));
2709 label_unlabel_this_atom (NULL, GINT_TO_POINTER(selected_btom));
2710 break;
2711 case 4:
2712 show_hide_this_atom (NULL, GINT_TO_POINTER(selected_atom));
2713 show_hide_this_atom (NULL, GINT_TO_POINTER(selected_btom));
2714 break;
2715 case 5:
2716 show_hide_this_atom (NULL, GINT_TO_POINTER(selected_atom));
2717 show_hide_this_atom (NULL, GINT_TO_POINTER(selected_btom));
2718 break;
2719 case 6:
2720 style_this_atom (widg, GINT_TO_POINTER(selected_atom));
2721 style_this_atom (widg, GINT_TO_POINTER(selected_btom));
2722 break;
2723 default:
2724 // 8 = create project
2725 // 9 = remove
2726 // 10 = replace
2727 // 11 = copy
2728 bond_selection = g_malloc0(sizeof*bond_selection);
2729 s = opengl_project -> modelgl -> anim -> last -> img -> step;
2731 bond_selection -> selected ++;
2733 bond_selection -> selected ++;
2734 switch (i)
2735 {
2736 case 8:
2738 break;
2739 case 9:
2740 to_remove_this_object (3, NULL);
2741 remove_object ();
2742 break;
2743 case 10:
2744 to_replace_this_object (3, widg, data);
2745 to_remove_this_object (3, data);
2746 insert_object (1, & opengl_project -> modelgl -> colorp[0][0]);
2748 break;
2749 case 11:
2751 break;
2752 }
2753 break;
2754 g_free (bond_selection);
2755 bond_selection = NULL;
2756 }
2757#endif
2758}
2759
2760#ifdef GTK4
2770G_MODULE_EXPORT void select_action_for_all_bonds (GSimpleAction * action, GVariant * parameter, gpointer data)
2771#else
2780G_MODULE_EXPORT void select_action_for_all_bonds (GtkWidget * widg, gpointer data)
2781#endif
2782{
2783 int g, h, i, j, k, l, m, n, o;
2784 int mid = GPOINTER_TO_INT(data);
2785 int s = opengl_project -> modelgl -> anim -> last -> img -> step;
2786 g = get_to_be_selected (opengl_project -> modelgl);
2787 gboolean doit;
2788 gboolean eqtc, eqpc;
2789 bond_selection = NULL;
2791 if (mid == 6 || mid == 6+CONTEXTACT || mid == 6+2*CONTEXTACT) wait_for_style = TRUE;
2792 for (h=0; h<2; h++)
2793 {
2794 for (i=0; i<opengl_project -> modelgl -> bonds[s][h]; i++)
2795 {
2796 doit = FALSE;
2797 k = opengl_project -> modelgl -> bondid[s][h][i][0];
2798 j = opengl_project -> modelgl -> bondid[s][h][i][1];
2799 l = opengl_project -> atoms[s][k].coord[0];
2800 m = opengl_project -> atoms[s][j].coord[0];
2801 n = opengl_project -> atoms[s][k].coord[1];
2802 o = opengl_project -> atoms[s][j].coord[1];
2803 if ((opengl_project -> atoms[s][j].sp == selected_aspec && opengl_project -> atoms[s][k].sp == selected_bspec) ||
2804 (opengl_project -> atoms[s][k].sp == selected_aspec && opengl_project -> atoms[s][j].sp == selected_bspec)) doit = TRUE;
2805 if (doit)
2806 {
2807 if (opengl_project -> atoms[s][j].sp == selected_aspec && opengl_project -> atoms[s][k].sp == selected_bspec)
2808 {
2809 eqtc = ((l == atoid[0][0].b && m == btoid.a) || (l == btoid.a && m == atoid[0][0].b)) ? TRUE : FALSE;
2810 eqpc = ((n == atoid[0][1].b && o == btoid.b) || (n == btoid.b && o == atoid[0][1].b)) ? TRUE : FALSE;
2811 }
2812 else
2813 {
2814 eqtc = ((l == atoid[0][0].b && m == btoid.a) || (l == btoid.a && m == atoid[0][0].b)) ? TRUE : FALSE;
2815 eqpc = ((n == atoid[0][1].b && o == btoid.b) || (n == btoid.b && o == atoid[0][1].b)) ? TRUE : FALSE;
2816 }
2817#ifdef GTK4
2818 if (mid == 0 || (mid == CONTEXTACT && eqtc) || (mid == 2*CONTEXTACT && eqpc))
2819 {
2820 if (! opengl_project -> atoms[s][j].pick[g]) select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(j));
2821 if (! opengl_project -> atoms[s][k].pick[g]) select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(k));
2822 }
2823 else if (mid == 1 || (mid == CONTEXTACT+1 && eqtc) || (mid == 2*CONTEXTACT+1 && eqpc))
2824 {
2825 if (opengl_project -> atoms[s][j].pick[g]) select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(j));
2826 if (opengl_project -> atoms[s][k].pick[g]) select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(k));
2827 }
2828 else if (mid == 2 || (mid == CONTEXTACT+2 && eqtc) || (mid == 2*CONTEXTACT+2 && eqpc))
2829 {
2830 if (! opengl_project -> atoms[s][j].label[0]) label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(j));
2831 if (! opengl_project -> atoms[s][k].label[0]) label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(k));
2832 }
2833 else if (mid == 3 || (mid == CONTEXTACT+3 && eqtc) || (mid == 2*CONTEXTACT+3 && eqpc))
2834 {
2835 if (opengl_project -> atoms[s][j].label[0]) label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(j));
2836 if (opengl_project -> atoms[s][k].label[0]) label_unlabel_this_atom (NULL, NULL, GINT_TO_POINTER(k));
2837 }
2838 else if (mid == 4 || (mid == CONTEXTACT+4 && eqtc) || (mid == 2*CONTEXTACT+4 && eqpc))
2839 {
2840 if (! opengl_project -> atoms[s][j].show[0]) show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(j));
2841 if (! opengl_project -> atoms[s][k].show[0]) show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(k));
2842 }
2843 else if (mid == 5 || (mid == CONTEXTACT+5 && eqtc) || (mid == 2*CONTEXTACT+5 && eqpc))
2844 {
2845 if (opengl_project -> atoms[s][j].show[0]) show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(j));
2846 if (opengl_project -> atoms[s][k].show[0]) show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(k));
2847 }
2848 else if (mid == 6 || (mid == CONTEXTACT+6 && eqtc) || (mid == 2*CONTEXTACT+6 && eqpc))
2849 {
2850 style_this_atom (action, NULL, GINT_TO_POINTER(j));
2851 style_this_atom (action, NULL, GINT_TO_POINTER(k));
2852 }
2853#else
2854 if (mid == 0 || (mid == CONTEXTACT && eqtc) || (mid == 2*CONTEXTACT && eqpc))
2855 {
2856 if (! opengl_project -> atoms[s][j].pick[g]) select_unselect_this_atom (NULL, GINT_TO_POINTER(j));
2857 if (! opengl_project -> atoms[s][k].pick[g]) select_unselect_this_atom (NULL, GINT_TO_POINTER(k));
2858 }
2859 else if (mid == 1 || (mid == CONTEXTACT+1 && eqtc) || (mid == 2*CONTEXTACT+1 && eqpc))
2860 {
2861 if (opengl_project -> atoms[s][j].pick[g]) select_unselect_this_atom (NULL, GINT_TO_POINTER(j));
2862 if (opengl_project -> atoms[s][k].pick[g]) select_unselect_this_atom (NULL, GINT_TO_POINTER(k));
2863 }
2864 else if (mid == 2 || (mid == CONTEXTACT+2 && eqtc) || (mid == 2*CONTEXTACT+2 && eqpc))
2865 {
2866 if (! opengl_project -> atoms[s][j].label[0]) label_unlabel_this_atom (NULL, GINT_TO_POINTER(j));
2867 if (! opengl_project -> atoms[s][k].label[0]) label_unlabel_this_atom (NULL, GINT_TO_POINTER(k));
2868 }
2869 else if (mid == 3 || (mid == CONTEXTACT+3 && eqtc) || (mid == 2*CONTEXTACT+3 && eqpc))
2870 {
2871 if (opengl_project -> atoms[s][j].label[0]) label_unlabel_this_atom (NULL, GINT_TO_POINTER(j));
2872 if (opengl_project -> atoms[s][k].label[0]) label_unlabel_this_atom (NULL, GINT_TO_POINTER(k));
2873 }
2874 else if (mid == 4 || (mid == CONTEXTACT+4 && eqtc) || (mid == 2*CONTEXTACT+4 && eqpc))
2875 {
2876 if (! opengl_project -> atoms[s][j].show[0]) show_hide_this_atom (NULL, GINT_TO_POINTER(j));
2877 if (! opengl_project -> atoms[s][k].show[0]) show_hide_this_atom (NULL, GINT_TO_POINTER(k));
2878 }
2879 else if (mid == 5 || (mid == CONTEXTACT+5 && eqtc) || (mid == 2*CONTEXTACT+5 && eqpc))
2880 {
2881 if (opengl_project -> atoms[s][j].show[0]) show_hide_this_atom (NULL, GINT_TO_POINTER(j));
2882 if (opengl_project -> atoms[s][k].show[0]) show_hide_this_atom (NULL, GINT_TO_POINTER(k));
2883 }
2884 else if (mid == 6 || (mid == CONTEXTACT+6 && eqtc) || (mid == 2*CONTEXTACT+6 && eqpc))
2885 {
2886 style_this_atom (widg, GINT_TO_POINTER(j));
2887 style_this_atom (widg, GINT_TO_POINTER(k));
2888 }
2889#endif
2890 else if ((mid == 8 || (mid == CONTEXTACT+8 && eqtc) || (mid == 2*CONTEXTACT+8 && eqpc))
2891 || (mid == 9 || (mid == CONTEXTACT+9 && eqtc) || (mid == 2*CONTEXTACT+9 && eqpc))
2892 || (mid == 10 || (mid == CONTEXTACT+10 && eqtc) || (mid == 2*CONTEXTACT+10 && eqpc))
2893 || (mid == 11 || (mid == CONTEXTACT+11 && eqtc) || (mid == 2*CONTEXTACT+11 && eqpc)))
2894 {
2895 if (! bond_selection)
2896 {
2897 bond_selection = g_malloc0(sizeof*bond_selection);
2898 bond_selection -> first = new_atom_in_selection (j, opengl_project -> atoms[s][j].sp);
2899 tmp_a = bond_selection -> first;
2900 }
2901 else
2902 {
2903 tmp_a -> next = new_atom_in_selection (j, opengl_project -> atoms[s][j].sp);
2904 tmp_a = tmp_a -> next;
2905 }
2906 bond_selection -> selected ++;
2907 tmp_a -> next = new_atom_in_selection (k, opengl_project -> atoms[s][k].sp);
2908 tmp_a = tmp_a -> next;
2909 bond_selection -> selected ++;
2910 }
2911 }
2912 }
2913 }
2914 if (mid == 6 || mid == CONTEXTACT+6 || mid == 2*CONTEXTACT+6)
2915 {
2917 update (opengl_project -> modelgl);
2918 wait_for_style = FALSE;
2919 }
2920 else if (mid == 8 || mid == CONTEXTACT+8 || mid == 2*CONTEXTACT+8)
2921 {
2923 g_free (bond_selection);
2924 bond_selection = NULL;
2925 }
2926 else if (mid == 9 || mid == CONTEXTACT+9 || mid == 2*CONTEXTACT+9)
2927 {
2928 if (bond_selection)
2929 {
2930 to_remove_this_object (3, data);
2931 remove_object ();
2932 g_free (bond_selection);
2933 bond_selection = NULL;
2934 }
2935 }
2936 else if (mid == 10 || mid == CONTEXTACT+10 || mid == 2*CONTEXTACT+10)
2937 {
2938 if (bond_selection)
2939 {
2940#ifdef GTK4
2941 to_replace_this_object (3, action, data);
2942#else
2943 to_replace_this_object (3, widg, data);
2944#endif
2945 to_remove_this_object (3, data);
2946 insert_object (1, data);
2947 g_free (bond_selection);
2948 bond_selection = NULL;
2949 }
2950 }
2951 else if (mid == 11 || mid == CONTEXTACT+11 || mid == 2*CONTEXTACT+11)
2952 {
2953 if (bond_selection)
2954 {
2956 g_free (bond_selection);
2957 bond_selection = NULL;
2958 }
2959 }
2960}
2961
2962#ifdef GTK4
2974GMenu * add_edition_sub_menu (glwin * view, gchar * act, int aid, GCallback handler, gpointer data)
2975{
2976 GMenu * menu = g_menu_new ();
2977 GMenu * menus;
2978 gchar * word, * name, * str;
2979 gchar * eact = g_strdup_printf ("mol-ins-%s-%d", act, aid);
2980 int i, j;
2981 for (i=0; mol[i].type || mol[i].object; i++)
2982 {
2983 if (mol[i].type)
2984 {
2985 menus = g_menu_new ();
2986 append_submenu (menu, _(mol[i].type), menus);
2987 }
2988 if (mol[i].object)
2989 {
2990 if (i == 9 || i == 13 || i == 16 || i == 17)
2991 {
2992 append_opengl_item (view, menus, _(mol[i].object), eact, 1, i, NULL, IMG_NONE, NULL, FALSE, handler, data, FALSE, FALSE, FALSE, TRUE);
2993 }
2994 else
2995 {
2996 append_opengl_item (view, menus, mol[i].object, eact, 1, i, NULL, IMG_NONE, NULL, FALSE, handler, data, FALSE, FALSE, FALSE, TRUE);
2997 }
2998 }
2999 }
3000 g_free (eact);
3001
3002 gboolean doit = FALSE;
3003 for (i=0; i<nprojects; i++)
3004 {
3005 if (get_project_by_id(i) -> steps == 1 && get_project_by_id(i) -> natomes)
3006 {
3007 doit = TRUE;
3008 break;
3009 }
3010 }
3011
3012 if (doit)
3013 {
3014 GMenu * menup = g_menu_new ();
3015 GMenu * menups;
3016 eact = g_strdup_printf ("ifp-%s-%d", act, aid);
3017 for (i=0; i<nprojects; i++)
3018 {
3019 if (get_project_by_id(i) -> steps == 1 && get_project_by_id(i) -> natomes)
3020 {
3021 name = g_strdup_printf ("%s (%d)", get_project_by_id(i) -> name, i+1);
3022 menups = g_menu_new ();
3023 for (j=0; j<3; j++)
3024 {
3025 word = g_strdup_printf (_("%s in %s"), _(action_atoms[j]), name);
3026 str = g_strdup_printf ("%s-%d", eact, j);
3027 append_opengl_item (view, menups, word, str, 1, i, NULL, IMG_NONE, NULL, FALSE, handler, data, FALSE, FALSE, FALSE, TRUE);
3028 g_free (word);
3029 g_free (str);
3030 }
3031 append_submenu (menup, name, menups);
3032 g_object_unref (menups);
3033 g_free (name);
3034 }
3035 }
3036 g_free (eact);
3037 append_submenu (menu, _("Import From Project"), menup);
3038 g_object_unref (menup);
3039 }
3040 eact = g_strdup_printf ("cp-%s-%d", act, aid);
3041 append_opengl_item (view, menu, _("Copied Data"), eact, 1, 0, "<CTRL>V", IMG_NONE, NULL, FALSE, G_CALLBACK(add_object), data, FALSE, FALSE, FALSE, (copied_object) ? TRUE : FALSE);
3042 g_free (eact);
3043 return menu;
3044}
3045
3057GMenu * add_style_sub_menu (glwin * view, gchar * act, int aid, GCallback handler, gpointer data)
3058{
3059 GMenu * menu = g_menu_new ();
3060 gchar * actc = g_strdup_printf ("%s-%d", act, aid);
3061 int i, j;
3062 for (i=0; i<OGL_STYLES; i++)
3063 {
3064 if (i != SPACEFILL)
3065 {
3066 append_opengl_item (view, menu, _(text_styles[i]), actc, i, i, NULL, IMG_NONE, NULL, FALSE, handler, data, FALSE, FALSE, FALSE, TRUE);
3067 }
3068 else
3069 {
3070 GMenu * menuf = g_menu_new ();
3071 for (j=0; j < FILLED_STYLES; j++)
3072 {
3073 append_opengl_item (view, menuf, _(text_filled[j]), actc, j+OGL_STYLES, j+OGL_STYLES, NULL, IMG_NONE, NULL, FALSE, handler, data, FALSE, FALSE, FALSE, TRUE);
3074 }
3075 append_submenu (menu, _(text_styles[i]), menuf);
3076 }
3077 }
3078 g_free (actc);
3079 return menu;
3080}
3081#else
3091void add_style_sub_menu (GtkWidget * item, GCallback handler, gpointer data)
3092{
3093 GtkWidget * menu = gtk_menu_new ();
3094 gtk_menu_item_set_submenu ((GtkMenuItem *)item, menu);
3095 int i, j;
3096 for (i=0; i<OGL_STYLES; i++)
3097 {
3098 if (i != SPACEFILL)
3099 {
3100 gtk3_menu_item (menu, _(text_styles[i]), IMG_NONE, NULL, handler, data, FALSE, 0, 0, FALSE, FALSE, FALSE);
3101 }
3102 else
3103 {
3104 GtkWidget *widg = create_menu_item (FALSE, _("Spacefilled"));
3105 gtk_menu_shell_append ((GtkMenuShell *)menu, widg);
3106 GtkWidget * menuf = gtk_menu_new ();
3107 gtk_menu_item_set_submenu ((GtkMenuItem *)widg, menuf);
3108 for (j=0; j < FILLED_STYLES; j++)
3109 {
3110 gtk3_menu_item (menuf, _(text_filled[j]), IMG_NONE, NULL, handler, data, FALSE, 0, 0, FALSE, FALSE, FALSE);
3111 }
3112 }
3113 }
3114}
3115
3125void add_edition_sub_menu (GtkWidget * item, GCallback handler, gpointer data)
3126{
3127 GtkWidget * menu = gtk_menu_new ();
3128 GtkWidget * smenu, * pmenu;
3129 GtkWidget * titem, * sitem;
3130 gchar * word, * name;
3131 gtk_menu_item_set_submenu ((GtkMenuItem *)item, menu);
3132 int i, j;
3133
3134 for (i=0; mol[i].type || mol[i].object; i++)
3135 {
3136 if (mol[i].type != NULL)
3137 {
3138 titem = create_menu_item (TRUE, _(mol[i].type));
3139 gtk_menu_shell_append ((GtkMenuShell *)menu, titem);
3140 smenu = gtk_menu_new ();
3141 gtk_menu_item_set_submenu ((GtkMenuItem *)titem, smenu);
3142 }
3143 if (mol[i].object != NULL)
3144 {
3145 if (i == 9 || i == 13 || i == 16 || i == 17)
3146 {
3147 gtk3_menu_item (smenu, _(mol[i].object), IMG_NONE, NULL, handler, data, FALSE, 0, 0, FALSE, FALSE, FALSE);
3148 }
3149 else
3150 {
3151 gtk3_menu_item (smenu, mol[i].object, IMG_NONE, NULL, handler, data, FALSE, 0, 0, FALSE, FALSE, FALSE);
3152 }
3153 }
3154 }
3155
3156 gboolean doit = FALSE;
3157 for (i=0; i<nprojects; i++)
3158 {
3159 if (get_project_by_id(i) -> steps == 1 && get_project_by_id(i) -> natomes)
3160 {
3161 doit = TRUE;
3162 break;
3163 }
3164 }
3165
3166 if (doit)
3167 {
3168 titem = create_menu_item (TRUE, _("Import From Project"));
3169 gtk_menu_shell_append ((GtkMenuShell *)menu, titem);
3170 smenu = gtk_menu_new ();
3171 gtk_menu_item_set_submenu ((GtkMenuItem *)titem, smenu);
3172 for (i=0; i<nprojects; i++)
3173 {
3174 if (get_project_by_id(i) -> steps == 1 && get_project_by_id(i) -> natomes)
3175 {
3176 name = g_strdup_printf ("%s (%d)", get_project_by_id(i) -> name, i+1);
3177 sitem = create_menu_item_from_widget (markup_label(name, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3178 //child = gtk_bin_get_child (GTK_BIN (sitem));
3179 //gtk_label_set_use_markup (GTK_LABEL(child), 1);
3180 //g_signal_connect (G_OBJECT (sitem), "activate", handler, data);
3181 gtk_menu_shell_append ((GtkMenuShell *)smenu, sitem);
3182 pmenu = gtk_menu_new ();
3183 gtk_menu_item_set_submenu ((GtkMenuItem *)sitem, pmenu);
3184 for (j=0; j<3; j++)
3185 {
3186 word = g_strdup_printf (_("%s in %s"), _(action_atoms[j]), name);
3187 gtk3_menu_item (pmenu, word, IMG_NONE, NULL, handler, data, FALSE, 0, 0, FALSE, FALSE, FALSE);
3188 g_free (word);
3189 }
3190 g_free (name);
3191 }
3192 }
3193 }
3194 GtkWidget * pastem = gtk3_menu_item (menu, _("Copied Data"), IMG_NONE, NULL, G_CALLBACK(add_object), data, TRUE, GDK_KEY_v, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
3195 if (! copied_object) widget_set_sensitive (pastem, 0);
3196}
3197#endif
3198
3199#ifdef GTK4
3217void create_selection_item (GMenu * menu, glwin * view, gchar * str, gchar * act, int aid, int mid, int gid, int cid, int aoc, GCallback handler, gpointer data)
3218{
3219 gchar * actc = g_strdup_printf ("%s-%d", act, aid);
3220#else
3235GtkWidget * create_selection_item (glwin * view, gchar * str, int mid, int gid, int cid, int aoc, GCallback handler, gpointer data)
3236{
3237 GtkWidget * sel_item = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3238#endif
3239 int i, j;
3240 if (mid == 6)
3241 {
3242#ifdef GTK4
3243 append_submenu (menu, str, add_style_sub_menu (view, act, aid, handler, data));
3244#else
3245 add_style_sub_menu (sel_item, handler, data);
3246#endif
3247 }
3248 else if (mid == 7)
3249 {
3250 if (cid < 0)
3251 {
3252 i = get_project_by_id (view -> proj) -> nspec;
3253#ifdef GTK4
3254 append_submenu (menu, str, color_item(view, actc, mid, G_CALLBACK(to_run_atom_color_window), & view -> colorp[0][selected_aspec+aoc*i]));
3255#else
3256 gtk_menu_item_set_submenu ((GtkMenuItem *)sel_item, color_box(view, selected_aspec+aoc*i, 0, 0));
3257#endif
3258 }
3259 else
3260 {
3261#ifdef GTK4
3262 i = cid;
3263 if (gid < 2)
3264 {
3265 for (j=0; j<selected_aspec; j++) i += opengl_project -> coord -> ntg[gid][j];
3266 }
3267 append_submenu (menu, str, color_item(view, actc, mid, G_CALLBACK(window_color_coord), & view -> gcid[gid][i][gid]));
3268#else
3269 int k;
3270 j = 2*opengl_project -> nspec;
3271 for (i=0; i < gid; i++)
3272 {
3273 j += opengl_project -> coord -> totcoord[i];
3274 }
3275 if (gid < 2)
3276 {
3277 for (i=0; i<selected_aspec; i++)
3278 {
3279 j += opengl_project -> coord -> ntg[gid][i];
3280 }
3281 k = selected_aspec;
3282 }
3283 else
3284 {
3285 k = gid;
3286 }
3287 gtk_menu_item_set_submenu ((GtkMenuItem *)sel_item, color_box(view, j+cid, k, cid));
3288#endif
3289 }
3290 }
3291 else if (mid == 10)
3292 {
3293#ifdef GTK4
3294 append_submenu (menu, str, add_edition_sub_menu (view, act, aid, handler, data));
3295#else
3296 add_edition_sub_menu (sel_item, handler, data);
3297#endif
3298 }
3299 else
3300 {
3301#ifdef GTK4
3302 append_opengl_item (view, menu, str, actc, 1, 0, NULL, IMG_NONE, NULL, FALSE, handler, data, FALSE, FALSE, FALSE, TRUE);
3303#else
3304 g_signal_connect (G_OBJECT (sel_item), "activate", handler, data);
3305#endif
3306 }
3307#ifdef GTK4
3308 g_free (actc);
3309#else
3310 return sel_item;
3311#endif
3312}
3313
3314gchar * snsab[2][2]={{i18n("All Non-Selected Atom(s)/Bond(s)"), i18n("All Selected Atom(s)/Bond(s)")},
3315 {i18n("All Non-Labelled Atom(s)/Bond(s)"), i18n("All Labelled Atom(s)/Bond(s)")}};
3316
3317#ifdef GTK4
3333GMenu * selection_menu (int aid, glwin * view, int ati, int bti, int aoc, int mid, GCallback handler_a, GCallback handler_b, GCallback handler_c)
3334#else
3349GtkWidget * selection_menu (glwin * view, int ati, int bti, int aoc, int mid, GCallback handler_a, GCallback handler_b, GCallback handler_c)
3350#endif
3351{
3352 int p = view -> proj;
3353 int s = view -> anim -> last -> img -> step;
3354 int spa, spb;
3355 int i, j, k;
3356 gchar * str;
3357
3358#ifdef GTK4
3359 gchar * strb;
3360 GMenu * menu = g_menu_new ();
3361#else
3362 GtkWidget * sel;
3363 GtkWidget * menu = gtk_menu_new ();
3364#endif
3365 project * this_proj = get_project_by_id(p);
3366 spa = this_proj -> atoms[s][ati].sp;
3367 if (bti > -1) spb = this_proj -> atoms[s][bti].sp;
3368 if (bti < 0 && (((mid == 5 || mid == 6) && this_proj -> atoms[s][ati].show[aoc])
3369 || (mid == 0 && ! is_selected) || (mid == 1 && is_selected)
3370 || (mid == 2 && ! is_labelled) || (mid == 3 && is_labelled) || (mid > 8 && mid < 11)))
3371 {
3372 str = g_strdup_printf (_("This Atom: %s<sub>%d</sub>"), exact_name(this_proj -> chemistry -> label[spa]), ati+1);
3373#ifdef GTK4
3374 if (mid == 6)
3375 {
3376 append_submenu (menu, str, add_style_sub_menu (view, "tas", aid, handler_a, GINT_TO_POINTER(ati)));
3377 }
3378 else if (mid == 10)
3379 {
3380 append_submenu (menu, str, add_edition_sub_menu (view, "tae", aid, handler_a, GINT_TO_POINTER(ati)));
3381 }
3382 else
3383 {
3384 strb = g_strdup_printf ("act-%d-%d", aid, mid);
3385 append_opengl_item (view, menu, str, strb, 1, 0, NULL, IMG_NONE, NULL, FALSE, handler_a, GINT_TO_POINTER(ati), FALSE, FALSE, FALSE, TRUE);
3386 g_free (strb);
3387 }
3388#else
3389 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3390 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3391 if (mid == 6)
3392 {
3393 add_style_sub_menu (sel, handler_a, GINT_TO_POINTER(ati));
3394 }
3395 else if (mid == 10)
3396 {
3397 add_edition_sub_menu (sel, handler_a, GINT_TO_POINTER(ati));
3398 }
3399 else
3400 {
3401 g_signal_connect (G_OBJECT (sel), "activate", handler_a, GINT_TO_POINTER(ati));
3402 }
3403#endif
3404 }
3405 else if (bti > -1 && mid != 4 && mid != 7)
3406 {
3407 str = g_strdup_printf (_("This Bond: %s<sub>%d</sub> - %s<sub>%d</sub>"),
3408 exact_name(this_proj -> chemistry -> label[spa]), ati+1,
3409 exact_name(this_proj -> chemistry -> label[spb]), bti+1);
3410#ifdef GTK4
3411 if (mid == 6)
3412 {
3413 append_submenu (menu, str, add_style_sub_menu (view, "tb-s", aid, G_CALLBACK(select_action_for_this_bond), GINT_TO_POINTER(mid)));
3414 }
3415 else if (mid == 10)
3416 {
3417 append_submenu (menu, str, add_edition_sub_menu (view, "tb-e", aid, G_CALLBACK(select_action_for_this_bond), GINT_TO_POINTER(mid)));
3418 }
3419 else
3420 {
3421 strb = g_strdup_printf ("act-%d-%d", aid, mid);
3422 append_opengl_item (view, menu, str, strb, 1, 0, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(select_action_for_this_bond), GINT_TO_POINTER(mid), FALSE, FALSE, FALSE, TRUE);
3423 g_free (strb);
3424 }
3425#else
3426 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3427 if (mid == 6)
3428 {
3429 add_style_sub_menu (sel, G_CALLBACK(select_action_for_this_bond), GINT_TO_POINTER(mid));
3430 }
3431 else if (mid == 10)
3432 {
3433 add_edition_sub_menu (sel, G_CALLBACK(select_action_for_this_bond), GINT_TO_POINTER(mid));
3434 }
3435 else
3436 {
3437 g_signal_connect (G_OBJECT (sel), "activate", G_CALLBACK(select_action_for_this_bond), GINT_TO_POINTER(mid));
3438 }
3439 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3440#endif
3441 g_free (str);
3442 }
3443
3444 if (mid != 7)
3445 {
3446 k = 0;
3447 for (j=0; j<2; j++)
3448 {
3449 if (mid<2 && j==0)
3450 {
3451 i = mid;
3452 }
3453 else if ((mid > 1 && mid < 4) && j==1)
3454 {
3455 i = mid - 2;
3456 }
3457 else
3458 {
3459 i = (j) ? is_labelled : is_selected;
3460 }
3461#ifdef GTK4
3462 if (mid == 6)
3463 {
3464 append_submenu (menu, _(snsab[j][i]), add_style_sub_menu (view, "all-s", aid, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+k)));
3465 }
3466 else if (mid == 10)
3467 {
3468 append_submenu (menu, _(snsab[j][i]), add_edition_sub_menu (view, "all-e", aid, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+k)));
3469 }
3470 else
3471 {
3472 strb = g_strdup_printf ("act-all-%d-%d", aid, mid+k);
3473 append_opengl_item (view, menu, _(snsab[j][i]), strb, 1, 0, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+k), FALSE, FALSE, FALSE, TRUE);
3474 g_free (strb);
3475 }
3476#else
3477 sel = create_menu_item_from_widget (markup_label (_(snsab[j][i]), -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3478 if (mid == 6)
3479 {
3480 add_style_sub_menu (sel, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+k));
3481 }
3482 else if (mid == 10)
3483 {
3484 add_edition_sub_menu (sel, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+k));
3485 }
3486 else
3487 {
3488 g_signal_connect (G_OBJECT (sel), "activate", G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+k));
3489 }
3490 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3491#endif
3492 k = CONTEXTACT;
3493 }
3494 }
3495
3496 for (i=0; i<2; i++)
3497 {
3498 if (this_proj -> modelgl -> adv_bonding[i])
3499 {
3500 j = this_proj -> atoms[s][ati].coord[2+i];
3501 str = (! i) ? g_strdup_printf (_("Fragment N°:\t<b>%d</b>"), j+1) : g_strdup_printf (_("Molecule N°:\t<b>%d</b>"), j+1);
3502#ifdef GTK4
3503 create_selection_item (menu, view, str, (! i) ? "afm" : "amo", aid, mid, 2+i, j, aoc, handler_b, & atoid[mid][2+i]);
3504#else
3505 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item (view, str, mid, 2+i, j, aoc, handler_b, & atoid[mid][2+i]));
3506#endif
3507 g_free (str);
3508 }
3509 }
3510 if (bti < 0)
3511 {
3512 if (this_proj -> atoms[s][ati].coord[0] > -1)
3513 {
3514 i = this_proj -> atoms[s][ati].coord[0];
3515 str = g_strdup_printf (_("All %s Atoms <b>%d</b> Fold"), exact_name(this_proj -> chemistry -> label[spa]), this_proj -> coord -> geolist[0][spa][i]);
3516#ifdef GTK4
3517 create_selection_item (menu, view, str, "atc", aid, mid, 0, i, aoc, handler_b, & atoid[mid][0]);
3518#else
3519 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item(view, str, mid, 0, i, aoc, handler_b, & atoid[mid][0]));
3520#endif
3521 g_free (str);
3522 }
3523 if (this_proj -> atoms[s][ati].coord[1] > -1)
3524 {
3525 i = this_proj -> atoms[s][ati].coord[1];
3526 str = g_strdup_printf (_("All <b>%s</b> Coordinations"), env_name (this_proj, i, spa, 1, NULL));
3527#ifdef GTK4
3528 create_selection_item (menu, view, str, "apc", aid, mid, 1, i, aoc, handler_b, & atoid[mid][1]);
3529#else
3530 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item(view, str, mid, 1, i, aoc, handler_b, & atoid[mid][1]));
3531#endif
3532 g_free (str);
3533 }
3534 if (! aoc)
3535 {
3536 str = g_strdup_printf (_("All <b>%s</b> Atoms"), exact_name(this_proj -> chemistry -> label[spa]));
3537 }
3538 else
3539 {
3540 str = g_strdup_printf (_("All <b>%s*</b> Clones"), exact_name(this_proj -> chemistry -> label[spa]));
3541 }
3542#ifdef GTK4
3543 create_selection_item (menu, view, str, "asp", aid, mid, 0, -1, aoc, handler_c, & atoid[mid][2]);
3544#else
3545 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item(view, str, mid, 0, -1, aoc, handler_c, & atoid[mid][2]));
3546#endif
3547 g_free (str);
3548 }
3549 else
3550 {
3551 if (this_proj -> atoms[s][ati].coord[0] > -1 && this_proj -> atoms[s][bti].coord[0] > -1)
3552 {
3553 i = this_proj -> atoms[s][ati].coord[0];
3554 j = this_proj -> atoms[s][bti].coord[0];
3555 str = g_strdup_printf (_("All %s <b>%d</b> - %s <b>%d</b> Bonds"),
3556 exact_name(this_proj -> chemistry -> label[spa]), this_proj -> coord -> geolist[0][spa][i],
3557 exact_name(this_proj -> chemistry -> label[spb]), this_proj -> coord -> geolist[0][spb][j]);
3558#ifdef GTK4
3559 create_selection_item (menu, view, str, "atcb", aid, mid, -1, -1, aoc, G_CALLBACK(select_action_for_all_bonds), GINT_TO_POINTER(mid+CONTEXTACT));
3560#else
3561 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item(view, str, mid, -1, -1, aoc, G_CALLBACK(select_action_for_all_bonds), GINT_TO_POINTER(mid+CONTEXTACT)));
3562#endif
3563 g_free (str);
3564 }
3565 if (this_proj -> atoms[s][ati].coord[1] > -1 && this_proj -> atoms[s][bti].coord[1] > -1)
3566 {
3567 i = this_proj -> atoms[s][ati].coord[1];
3568 j = this_proj -> atoms[s][bti].coord[1];
3569 str = g_strdup_printf (_("All <b>%s</b> - <b>%s</b> Bonds"), env_name (this_proj, i, spa, 1, NULL), env_name (this_proj, j, spb, 1, NULL));
3570#ifdef GTK4
3571 create_selection_item (menu, view, str, "apcb", aid, mid, -1, -1, aoc, G_CALLBACK(select_action_for_all_bonds), GINT_TO_POINTER(mid+2*CONTEXTACT));
3572#else
3573 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item(view, str, mid, -1, -1, aoc, G_CALLBACK(select_action_for_all_bonds), GINT_TO_POINTER(mid+2*CONTEXTACT)));
3574#endif
3575 g_free (str);
3576 }
3577 str = g_strdup_printf (_("All %s - %s Bonds"), exact_name(this_proj -> chemistry -> label[spa]), exact_name(this_proj -> chemistry -> label[spb]));
3578#ifdef GTK4
3579 create_selection_item (menu, view, str, "acb", aid, mid, -1, -1, aoc, G_CALLBACK(select_action_for_all_bonds), GINT_TO_POINTER(mid));
3580#else
3581 gtk_menu_shell_append ((GtkMenuShell *)menu, create_selection_item(view, str, mid, -1, -1, aoc, G_CALLBACK(select_action_for_all_bonds), GINT_TO_POINTER(mid)));
3582#endif
3583 g_free (str);
3584 }
3585 if (mid > 3 && mid < 6)
3586 {
3587 gchar * mat[2]={i18n("All Hidden Atom(s)/Bond(s)"), i18n("All Visible Atom(s)/Bond(s)")};
3588#ifdef GTK4
3589 strb = g_strdup_printf ("all-hv-%d-%d", aid, mid);
3590 append_opengl_item (view, menu, _(mat[mid%2]), strb, 1, 0, NULL, IMG_NONE, NULL, FALSE, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+2*CONTEXTACT), FALSE, FALSE, FALSE, TRUE);
3591 g_free (strb);
3592#else
3593 gtk3_menu_item (menu, _(mat[mid%2]), IMG_NONE, NULL, G_CALLBACK(select_action_for_all), GINT_TO_POINTER(mid+2*CONTEXTACT), FALSE, 0, 0, FALSE, FALSE, FALSE);
3594#endif
3595 }
3596 return menu;
3597}
3598
3599#ifdef GTK4
3614void analyze_popup_attach_color_palettes (glwin * view, GtkWidget * menu, int ato, int spc, int totc, int parc, int frag, int mol)
3615{
3616 /* Here we need to attached color palettes for:
3617 - The chemical species of the atom in selection
3618 - The total coordination of the atom in selection
3619 - The partial coordination of the atom in selection
3620 - The fragment of the atom in selection
3621 - The molecule of the atom in selection
3622 This is a work in progress since the 'gtk_popover_menu_bar_add_child' to use to insert widget is bugged:
3623 https://gitlab.gnome.org/GNOME/gtk/-/issues/5955
3624 */
3625 int i, j;
3626 project * this_proj = get_project_by_id (view -> proj);
3627 // The chemical species of the atom in selection
3628 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, ato*this_proj -> nspec+spc, -1, -1), "set-asp-7.7"))
3629 {
3630 g_debug ("Color palette error: species in selection - custom= set-asp-7.7");
3631 }
3632 // The total coordination
3633 i = 0;
3634 for (j=0; j<spc; j++)
3635 {
3636 i += this_proj -> coord -> ntg[0][j];
3637 }
3638 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, 2*this_proj -> nspec+i, -1, -1), "set-atc-7.7"))
3639 {
3640 g_debug ("Color palette error: total coordination in selection - custom= set-atc-7.7");
3641 }
3642 // The partial coordination
3643 i = this_proj -> coord -> totcoord[0];
3644 for (j=0; j<spc; j++)
3645 {
3646 i += this_proj -> coord -> ntg[1][j];
3647 }
3648 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, 2*this_proj -> nspec+i, -1, -1), "set-apc-7.7"))
3649 {
3650 g_debug ("Color palette error: partial coordination in selection - custom= set-apc-7.7");
3651 }
3652 if (view -> adv_bonding[0])
3653 {
3654 // The fragment of the atom in selection
3655 i = 2*this_proj -> nspec + this_proj -> coord -> totcoord[0] + this_proj -> coord -> totcoord[1] + frag;
3656 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, i, 2, 0), "set-afm-7.7"))
3657 {
3658 g_debug ("Color palette error: fragment in selection - custom= set-afm-7.7");
3659 }
3660 }
3661 if (view -> adv_bonding[1])
3662 {
3663 // The molecule of the atom in selection
3664 i = 2*this_proj -> nspec + this_proj -> coord -> totcoord[0] + this_proj -> coord -> totcoord[1] + this_proj -> coord -> totcoord[2] + mol;
3665 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, i, 3, 0), "set-amo-7.7"))
3666 {
3667 g_debug ("Color palette error: fragment in selection - custom= set-amo-7.7");
3668 }
3669 }
3670}
3671#endif
3672
3687void popup_selection (glwin * view, double ptx, double pty, int spe, int mmod, int ati, int bti, int aoc)
3688{
3689 int p = view -> proj;
3690 int s = view -> anim -> last -> img -> step;
3691 int i, j;
3692 gchar * str, * strp;
3693 gchar * menu_names[CONTEXTACT] = {i18n("Select"),
3694 i18n("Unselect"),
3695 i18n("Label"),
3696 i18n("Unlabel"),
3697 i18n("Show"),
3698 i18n("Hide"),
3699 i18n("Style"),
3700 i18n("Color"),
3701 i18n("Edit as New Project"),
3702 i18n("Remove"),
3703 i18n("Replace"),
3704 i18n("Copy")};
3705 GCallback handlers[CONTEXTACT][3] = {{G_CALLBACK(select_unselect_this_atom), G_CALLBACK(select_unselect_coord), G_CALLBACK(select_unselect_atoms)},
3706 {G_CALLBACK(select_unselect_this_atom), G_CALLBACK(select_unselect_coord), G_CALLBACK(select_unselect_atoms)},
3707 {G_CALLBACK(label_unlabel_this_atom), G_CALLBACK(label_unlabel_coord), G_CALLBACK(label_unlabel_atoms)},
3708 {G_CALLBACK(label_unlabel_this_atom), G_CALLBACK(label_unlabel_coord), G_CALLBACK(label_unlabel_atoms)},
3709 {G_CALLBACK(show_hide_this_atom), G_CALLBACK(show_hide_the_coord), G_CALLBACK(show_hide_the_atoms)},
3710 {G_CALLBACK(show_hide_this_atom), G_CALLBACK(show_hide_the_coord), G_CALLBACK(show_hide_the_atoms)},
3711 {G_CALLBACK(style_this_atom), G_CALLBACK(style_the_coord), G_CALLBACK(style_the_atoms)},
3712 {NULL, NULL, NULL},
3713 {NULL, G_CALLBACK(edit_coord), G_CALLBACK(edit_atoms)},
3714 {G_CALLBACK(remove_this_atom), G_CALLBACK(remove_the_coord), G_CALLBACK(remove_the_atoms)},
3715 {G_CALLBACK(replace_this_atom), G_CALLBACK(replace_the_coord), G_CALLBACK(replace_the_atoms)},
3716 {G_CALLBACK(copy_this_atom), G_CALLBACK(copy_the_coord), G_CALLBACK(copy_the_atoms)}};
3717#ifdef GTK4
3718 if (view_pop_actions) g_object_unref (view_pop_actions);
3719 view_pop_actions = g_simple_action_group_new ();
3720 GMenu * gmenu = g_menu_new ();
3721#else
3722 GtkWidget * menu = gtk_menu_new ();
3723 GtkWidget * sel;
3724#endif
3725#ifdef DEBUG
3726 g_debug ("POP_SEL:: spe= %d, ati= %d, bti= %d, aoc= %d", spe, ati, bti, aoc);
3727#endif // DEBUG
3728
3730 selected_atom = ati;
3731 selected_btom = bti;
3732 selected_aspec = opengl_project -> atoms[s][ati].sp;
3733 selected_bspec = -1;
3734 selected_status = ! opengl_project -> atoms[s][ati].pick[get_to_be_selected (view)];
3735 is_selected = opengl_project -> atoms[s][ati].pick[mmod];
3736 is_labelled = opengl_project -> atoms[s][ati].label[aoc];
3737#ifdef DEBUG
3738 if (is_selected != spe) g_debug ("Something is wrong in popup");
3739#endif // DEBUG
3740
3741 for (i=0; i<CONTEXTACT; i++)
3742 {
3743 for (j=0; j<4; j++)
3744 {
3745 atoid[i][j].a = j;
3746 atoid[i][j].b = opengl_project -> atoms[s][ati].coord[j];
3747 atoid[i][j].c = ((i-2*(i/2)) == 0 ? 1 : 0);
3748/*#ifdef DEBUG
3749 g_debug ("atoid[%d][%d].a= %d, atoid[%d][%d].b= %d, atoid[%d][%d].c= %d",
3750 i, j, atoid[i][j].a, i, j, atoid[i][j].b, i, j, atoid[i][j].c);
3751#endif*/
3752 }
3753 }
3754 if (bti > -1)
3755 {
3756 btoid.a = opengl_project -> atoms[s][bti].coord[0];
3757 btoid.b = opengl_project -> atoms[s][bti].coord[1];
3758 selected_bspec = opengl_project -> atoms[s][bti].sp;
3759 distance dist = distance_3d (& opengl_project -> cell, (opengl_project -> cell.npt) ? s : 0, & opengl_project -> atoms[s][ati], & opengl_project -> atoms[s][bti]);
3760 if (aoc == 0)
3761 {
3762 str = g_strdup_printf ("%s<sub>%d</sub> - %s<sub>%d</sub>",
3764 }
3765 else
3766 {
3767 str = g_strdup_printf ("%s<sub>%d</sub> - %s<sub>%d</sub>",
3769 }
3770 if (dist.pbc)
3771 {
3772 strp = g_strdup_printf ("<b>%s \t d= %.3f Ã… (%s)</b>", str, dist.length, _("PBC"));
3773 }
3774 else
3775 {
3776 strp = g_strdup_printf ("<b>%s \t d= %.3f Ã…</b>", str, dist.length);
3777 }
3778#ifdef GTK4
3779 append_opengl_item (view, gmenu, strp, "w-dist", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3780#else
3781 sel = create_menu_item_from_widget (markup_label (strp, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3782 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3783#endif
3784 g_free (strp);
3785 for (i=0; i<2; i++)
3786 {
3787 if (view -> adv_bonding[i])
3788 {
3789 j = opengl_project -> atoms[s][ati].coord[2+i] + 1;
3790 str = (! i) ? g_strdup_printf (_("Fragment N°:\t<b>%d</b>"), j) : g_strdup_printf (_("Molecule N°:\t<b>%d</b>"), j);
3791#ifdef GTK4
3792 append_opengl_item (view, gmenu, str, "w-dist-fm", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3793#else
3794 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3795 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3796#endif
3797 g_free (str);
3798 }
3799 }
3800 }
3801 else
3802 {
3803 if (aoc == 0)
3804 {
3805 str = g_strdup_printf ("<b>%s<sub>%d</sub></b>", exact_name(opengl_project -> chemistry -> label[selected_aspec]), ati+1);
3806 }
3807 else
3808 {
3809 str = g_strdup_printf ("<b>%s<sub>%d</sub><sup>*</sup></b>", exact_name(opengl_project -> chemistry -> label[selected_aspec]), ati+1);
3810 }
3811#ifdef GTK4
3812 append_opengl_item (view, gmenu, str, "w-ac", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3813#else
3814 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3815 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3816#endif
3817 g_free (str);
3818 str = g_strdup_printf ("\tx : <b>%f</b>\n\ty : <b>%f</b>\n\tz : <b>%f</b>",
3819 opengl_project -> atoms[s][ati].x, opengl_project -> atoms[s][ati].y, opengl_project -> atoms[s][ati].z);
3820#ifdef GTK4
3821 append_opengl_item (view, gmenu, str, "xyz", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3822#else
3823 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3824 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3825#endif
3826 g_free (str);
3827 if (opengl_project -> atoms[s][ati].coord[0] > -1)
3828 {
3829 i = opengl_project -> atoms[s][ati].coord[0];
3830 str = g_strdup_printf (_("Total Coordination: <b>%d</b>"), opengl_project -> coord -> geolist[0][selected_aspec][i]);
3831#ifdef GTK4
3832 append_opengl_item (view, gmenu, str, "w-tc", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3833#else
3834 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3835 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3836#endif
3837 g_free (str);
3838 i = opengl_project -> atoms[s][ati].coord[1];
3839 str = g_strdup_printf (_("Partial Coordination: <b>%s</b>"), env_name (opengl_project, i, selected_aspec, 1, NULL));
3840#ifdef GTK4
3841 append_opengl_item (view, gmenu, str, "w-pc", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3842#else
3843 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3844 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3845#endif
3846 g_free (str);
3847 }
3848 for (i=0; i<2; i++)
3849 {
3850 if (view -> adv_bonding[i])
3851 {
3852 j = opengl_project -> atoms[s][ati].coord[2+i] + 1;
3853 str = (! i) ? g_strdup_printf (_("Fragment N°:\t<b>%d</b>"), j) : g_strdup_printf (_("Molecule N°:\t<b>%d</b>"), j);
3854#ifdef GTK4
3855 append_opengl_item (view, gmenu, str, "w-fm", 1, 0, NULL, IMG_NONE, NULL, FALSE, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
3856#else
3857 sel = create_menu_item_from_widget (markup_label (str, -1, -1, 0.0, 0.5), FALSE, FALSE, FALSE);
3858 gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3859#endif
3860 g_free (str);
3861 }
3862 }
3863 }
3864
3865 //if (fc)
3866 //{
3867 // gtk_menu_shell_append ((GtkMenuShell *)menu, sel);
3868 // add_menu_separator (menu);
3869 // atoms menu
3870 //gtk_menu_shell_append ((GtkMenuShell *)menu, field_atom_menu(p, s, ati, fc-2));
3871 // bonds menu, if ati involved in bonding, or bti > -1
3872 //gtk_menu_shell_append ((GtkMenuShell *)menu, field_bond_menu(p, s, ati, bti));
3873 // angles menu, if ati involved in bonding with more than 2 neighbors
3874 //gtk_menu_shell_append ((GtkMenuShell *)menu, field_angle_menu(p, s, ati, bti));
3875 //}
3876
3877#ifdef GTK4
3878 GMenu * menua = g_menu_new ();
3879 g_menu_append_section (gmenu, NULL, (GMenuModel *)menua);
3880#else
3881 add_menu_separator (menu);
3882#endif
3883 gboolean go;
3884
3885 /* 0 = Select
3886 1 = Unselect
3887 2 = Label
3888 3 = Unlabel
3889 4 = Show
3890 5 = Hide
3891 6 = Style
3892 7 = Color
3893 8 = Edit as New Project"
3894 9 = Remove
3895 10 = Replace
3896 11 = Copy
3897 */
3898 for (i=0; i<12; i++)
3899 {
3900 go = TRUE;
3901 if (i < 9 && view -> mode == EDITION) go = FALSE;
3902 if ((i > 8 && i < 11) && view -> mode == ANALYZE) go = FALSE;
3903 if (i == 0 && view -> anim -> last -> img -> selected[mmod] -> selected == opengl_project -> natomes) go = FALSE;
3904 if (i == 1 && view -> anim -> last -> img -> selected[mmod] -> selected == 0) go = FALSE;
3905 if (i == 2 && view -> labelled == opengl_project -> natomes*opengl_project -> steps) go = FALSE;
3906 if (i == 3 && view -> labelled == 0) go = FALSE;
3907 if (bti > -1 && i == 7) go = FALSE;
3908 j = (i == 8 && view -> mode == ANALYZE) ? 11 : (i == 11 && view -> mode == ANALYZE) ? 8 : i;
3909 if (go)
3910 {
3911#ifdef GTK4
3912 append_submenu (menua, _(menu_names[j]), selection_menu (i, view, ati, bti, aoc, j, handlers[j][0], handlers[j][1], handlers[j][2]));
3913#else
3914 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu(_(menu_names[j]),
3915 TRUE, selection_menu (view, ati, bti, aoc, j, handlers[j][0], handlers[j][1], handlers[j][2])));
3916#endif
3917 }
3918 }
3919#ifdef GTK4
3920 GtkWidget * menu = gtk_popover_menu_new_from_model_full ((GMenuModel *)gmenu, GTK_POPOVER_MENU_NESTED);
3921 // Color palettes here
3922 if (view -> mode == ANALYZE) analyze_popup_attach_color_palettes (view, menu, aoc, selected_aspec, atoid[0][0].b, atoid[0][1].b, atoid[0][2].b, atoid[0][3].b);
3923
3924 gtk_widget_set_parent (menu, view -> win);
3925 str = g_strdup_printf ("gl-%d", view -> action_id);
3926 gtk_widget_insert_action_group (menu, str, G_ACTION_GROUP(view_pop_actions));
3927 g_free (str);
3928 i = (view -> mode == ANALYZE) ? (is_selected) ? 385 : 355 : 230;
3929 i += (view -> adv_bonding[0] && bti < 0) ? 30 : 0;
3930 i += (view -> adv_bonding[1] && bti < 0) ? 30 : 0;
3931 if (bti > -1) i -= (view -> mode == ANALYZE) ? 70 : 50;
3932 gtk_widget_set_size_request (menu, -1, i);
3933 pop_menu_at_pointer (menu, ptx, pty);
3934#else
3935 pop_menu_at_pointer (menu, NULL);
3936#endif
3937}
3938
3939#ifdef GTK4
3949G_MODULE_EXPORT void reset_coords (GSimpleAction * action, GVariant * parameter, gpointer data)
3950#else
3959G_MODULE_EXPORT void reset_coords (GtkWidget * widg, gpointer data)
3960#endif
3961{
3962 glwin * view = (glwin *)data;
3964 int shaders[5] = {ATOMS, BONDS, POLYS, RINGS, SELEC};
3966 view -> create_shaders[MEASU] = TRUE;
3967 view -> create_shaders[PICKS] = TRUE;
3968 init_coordinates (get_project_by_id(view -> proj), 1, FALSE, TRUE);
3969 update (view);
3970}
3971
3972#ifdef GTK4
3982G_MODULE_EXPORT void turn_rebuild (GSimpleAction * action, GVariant * parameter, gpointer data)
3983#else
3992G_MODULE_EXPORT void turn_rebuild (GtkWidget * widg, gpointer data)
3993#endif
3994{
3995 tint * dat =(tint *)data;
3996 glwin * view = get_project_by_id(dat -> a) -> modelgl;
3997#ifdef GTK4
3998 view -> rebuild[dat -> b][0] = ! view -> rebuild[dat -> b][0];
3999 view -> rebuild[dat -> b][1] = view -> rebuild[dat -> b][0];
4000 update_menu_bar (view);
4001#else
4002 view -> rebuild[dat -> b][0] = gtk_check_menu_item_get_active ((GtkCheckMenuItem *)widg);
4003 view -> rebuild[dat -> b][1] = view -> rebuild[dat -> b][0];
4004 if (widg != view -> rbuild[dat -> b])
4005 {
4006 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> rbuild[dat -> b], view -> rebuild[dat -> b][0]);
4007 }
4008#endif
4009}
4010
4019G_MODULE_EXPORT void to_center_this_molecule (GtkWidget * widg, gpointer data)
4020{
4021 glwin * view = (glwin *)data;
4022 gboolean center = ! get_project_by_id(view -> proj) -> cell.crystal ? TRUE :
4023 ask_yes_no (_("Center crystal atom(s)"), _("Are you sure, this can affect the visual representation of the unit cell ?"), GTK_MESSAGE_QUESTION, view -> win);
4024 if (center) center_this_molecule (view);
4025}
4026
4027#ifdef GTK4
4035GMenu * tools_section (glwin * view)
4036{
4037 GMenu * menu = g_menu_new ();
4038 append_submenu (menu, _("Tools"), menu_tools(view, 1));
4039 return menu;
4040}
4041
4049GMenu * anim_section (glwin * view)
4050{
4051 GMenu * menu = g_menu_new ();
4052 append_submenu (menu, _("Animate"), menu_anim(view, 1));
4053 return menu;
4054}
4055
4064void analyze_menu_attach_color_palettes (glwin * view, GtkWidget * menu)
4065{
4066 /* Here we need to attached color palettes for:
4067 - Box
4068 - Atoms
4069 - Clones
4070 - Total coordination(s)
4071 - Partial coordination(s)
4072 - Fragment(s) and molecule(s)
4073 - Ring(s)
4074 - Background
4075 This is a work in progress since the 'gtk_popover_menu_bar_add_child' to use to insert widget is bugged:
4076 https://gitlab.gnome.org/GNOME/gtk/-/issues/5955
4077 */
4078 int i, j, k, l, m;
4079 gchar * str, * env;
4080 project * this_proj = get_project_by_id (view -> proj);
4081 // Box
4082 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, -1, -1, -1), "set-box-color.0"))
4083 {
4084 g_debug ("Color palette error: box - custom= set-box-color.0");
4085 }
4086 // Atom(s) and clone(s)
4087 for (i=0; i<2; i++)
4088 {
4089 for (j=0; j<this_proj -> nspec; j++)
4090 {
4091 str = g_strdup_printf ("set-%s.%d", (! i) ? "atom-color" : "clone-color", j);
4092 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, i*this_proj -> nspec+j, -1, -1), (const gchar *)str))
4093 {
4094 g_debug ("Color palette error: %s - %d - custom= %s", (! i) ? "atom-color" : "clone-color", j+1, str);
4095 }
4096 g_free (str);
4097 }
4098 }
4099 // Coordinations
4100 for (i=0; i<2; i++)
4101 {
4102 if (this_proj -> coord -> ntg[i])
4103 {
4104 for (j=0; j<this_proj -> nspec; j++)
4105 {
4106 for (k=0; k<this_proj -> coord -> ntg[i][j]; k++)
4107 {
4108 m = 0;
4109 for (l=0; l<j; l++)
4110 {
4111 m += this_proj -> coord -> ntg[i][l];
4112 }
4113 if (i)
4114 {
4115 env = env_name (this_proj, k, j, 1, NULL);
4116 str = g_strdup_printf ("set-%s-c.%d", exact_name (env), m);
4117 g_free (env);
4118 }
4119 else
4120 {
4121 str = g_strdup_printf ("set-%d-c.%d", this_proj -> coord -> geolist[i][j][k], m);
4122 }
4123 m += (i) ? this_proj -> coord -> totcoord[0] : 0;
4124 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, 2*this_proj -> nspec+m, -1, -1), (const gchar *)str))
4125 {
4126 g_debug ("Color palette error: %s - spec= %d - coord= %d, custom= %s", (! i) ? "total-coord" : "partial-coord", j+1, k+1, str);
4127 }
4128 g_free (str);
4129 }
4130 }
4131 }
4132 }
4133 // Fragment(s) and molecule(s)
4134 for (i=2; i<4; i++)
4135 {
4136 for (j=0; j<this_proj -> coord -> totcoord[i]; j++)
4137 {
4138 str = g_strdup_printf ("set-%s-%d", (i == 2) ? "fcol" : "mcol", j);
4139 k = 2*this_proj -> nspec + this_proj -> coord -> totcoord[0] + this_proj -> coord -> totcoord[1] + j;
4140 if (i == 3) k += this_proj -> coord -> totcoord[2];
4141 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, k, i, 0), (const gchar *)str))
4142 {
4143 g_debug ("Color palette error: %s - %d, custom= %s", (i == 2) ? "fragment" : "molecule", j+1, str);
4144 }
4145 g_free (str);
4146 }
4147 }
4148 // Rings
4149 for (i=4; i<9; i++)
4150 {
4151 for (j=0; j<this_proj -> coord -> totcoord[i]; j++)
4152 {
4153 str = g_strdup_printf ("set-rcol-%d-%d", i, j);
4154 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, -3, i-4, 0), (const gchar *)str))
4155 {
4156 g_debug ("Color palette error: rings - %d - %d, custom= %s", i, j+1, str);
4157 }
4158 g_free (str);
4159 }
4160 }
4161 // Background
4162 if (! gtk_popover_menu_add_child ((GtkPopoverMenu *)menu, color_palette (view, -2, -1, -1), "set-back-color.0"))
4163 {
4164 g_debug ("Color palette error: background - custom= set-back-color.0");
4165 }
4166}
4167#endif
4168
4178void popup_main_menu (glwin * view, double ptx, double pty)
4179{
4180 GtkWidget * menu;
4181 opengl_project_changed (view -> proj);
4182#ifdef GTK4
4183 if (view_pop_actions) g_object_unref (view_pop_actions);
4184 view_pop_actions = g_simple_action_group_new ();
4185 GMenu * gmenu = g_menu_new ();
4186 if (view -> mode == ANALYZE)
4187 {
4188 g_menu_append_section (gmenu, NULL, (GMenuModel *)prepare_opengl_menu(view, 1));
4189 if (get_project_by_id(view -> proj) -> natomes)
4190 {
4191 g_menu_append_section (gmenu, NULL, (GMenuModel *)prepare_model_menu(view, 1));
4192 g_menu_append_section (gmenu, NULL, (GMenuModel *)prepare_coord_menu(view, 1));
4193 }
4194 g_menu_append_section (gmenu, NULL, (GMenuModel *)tools_section(view));
4195 g_menu_append_section (gmenu, NULL, (GMenuModel *)menu_view(view, 1));
4196 g_menu_append_section (gmenu, NULL, (GMenuModel *)anim_section(view));
4197 }
4198 else
4199 {
4200 g_menu_append_section (gmenu, NULL, (GMenuModel *)tools_section(view));
4201 append_submenu (gmenu, _("Insert"), add_edition_sub_menu (view, "ins", 0, G_CALLBACK(to_add_object), & view -> colorp[0][0]));
4202 if (opengl_project -> steps == 1) g_menu_append_section (gmenu, NULL, (GMenuModel *)extract_section(view, 1));
4203 append_opengl_item (view, gmenu, _("Reset Motion"), "res-mot", 1, 0, NULL, IMG_STOCK, MEDIA_LOOP, FALSE, G_CALLBACK(reset_coords), view, FALSE, FALSE, FALSE, TRUE);
4204 }
4205 g_menu_append_section (gmenu, NULL, (GMenuModel*)menu_reset(view, 1));
4206 g_menu_append_section (gmenu, NULL, (GMenuModel*)menu_fullscreen(view, 1));
4207 g_menu_append_section (gmenu, NULL, (GMenuModel*)menu_shortcuts(view, 1));
4208
4209 menu = gtk_popover_menu_new_from_model_full ((GMenuModel *)gmenu, GTK_POPOVER_MENU_NESTED);
4210 if (view -> mode == ANALYZE) analyze_menu_attach_color_palettes (view, menu);
4211
4212 gtk_popover_present ((GtkPopover *)menu);
4213 gchar * str = g_strdup_printf ("gl-%d", view -> action_id);
4214 gtk_widget_insert_action_group (menu, str, G_ACTION_GROUP(view_pop_actions));
4215 g_free (str);
4216 gtk_widget_set_parent (menu, view -> win);
4217 gtk_widget_set_size_request (menu, -1, (view -> mode == ANALYZE) ? 742 : 242);
4218 pop_menu_at_pointer (menu, ptx, pty);
4219#else
4220 menu = gtk_menu_new ();
4221 GtkWidget * item;
4222 if (view -> mode == ANALYZE)
4223 {
4224 menu_items_opengl (menu, view, 1);
4225 add_menu_separator (menu);
4226 if (get_project_by_id(view -> proj) -> nspec)
4227 {
4228 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Atom(s)"), TRUE, menu_atoms (view, 1, 0)));
4229 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Bond(s)"), TRUE, menu_bonds (view, 1, 0)));
4230 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Clone(s)"), TRUE, menu_clones (view, 1)));
4231 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_box_axis (view, 1, 0));
4232 add_menu_separator (menu);
4233 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_coord (view, 1));
4234 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Polyhedra"), TRUE, menu_poly (view, 1)));
4235 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Rings"), view -> rings, menu_rings (view, 1)));
4236 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Chain(s)"), view -> chains, add_menu_coord (view, 1, 9)));
4237 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Fragment(s)"), opengl_project -> coord -> totcoord[2], add_menu_coord (view, 1, 2)));
4238 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Molecule(s)"), opengl_project -> coord -> totcoord[3], add_menu_coord (view, 1, 3)));
4239 gtk3_menu_item (menu, _("Advanced"), IMG_NONE, NULL, G_CALLBACK(coord_properties), (gpointer)& view -> colorp[30][0], TRUE, GDK_KEY_e, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
4240 // add_advanced_item (menu, G_CALLBACK(coord_properties), (gpointer)& view -> colorp[30][0], TRUE, GDK_KEY_e, GDK_CONTROL_MASK);
4241 add_menu_separator (menu);
4242 }
4243 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Tools"), TRUE, menu_tools(view, 1)));
4244 add_menu_separator (menu);
4245 menu_items_view (menu, view, 1);
4246 add_menu_separator (menu);
4247 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_anim (view, 1));
4248 }
4249 else
4250 {
4251 item = create_menu_item (TRUE, _("Tools"));
4252 gtk_menu_item_set_submenu ((GtkMenuItem *)item, menu_tools(view, 1));
4253 gtk_menu_shell_append ((GtkMenuShell *)menu, item);
4254 add_menu_separator (menu);
4255
4256 item = create_menu_item (TRUE, _("Insert"));
4257 add_edition_sub_menu (item, G_CALLBACK(to_add_object), & view -> colorp[0][0]);
4258 gtk_menu_shell_append ((GtkMenuShell *)menu, item);
4259 add_menu_separator (menu);
4260
4261 if (opengl_project -> steps == 1)
4262 {
4263 gtk3_menu_item (menu, _("Extract/Rebuild on Motion"), IMG_STOCK, (gpointer)ECUT, G_CALLBACK(turn_rebuild), & view -> colorp[0][0], FALSE, 0, 0, TRUE, FALSE, view -> rebuild[0][0]);
4264 gtk3_menu_item (menu, _("Extract/Rebuild on Copy"), IMG_STOCK, (gpointer)ECUT, G_CALLBACK(turn_rebuild), & view -> colorp[1][0], FALSE, 0, 0, TRUE, FALSE, view -> rebuild[1][0]);
4265 }
4266 gtk3_menu_item (menu, _("Reset Motion"), IMG_STOCK, (gpointer)MEDIA_LOOP, G_CALLBACK(reset_coords), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
4267 }
4268 add_menu_separator (menu);
4269 gtk3_menu_item (menu, _("Reset View"), IMG_STOCK, (gpointer)FITBEST, G_CALLBACK(to_reset_view), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
4270 gtk3_menu_item (menu, _("Center Molecule"), IMG_STOCK, (gpointer)FITBEST, G_CALLBACK(to_center_this_molecule), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
4271 add_menu_separator (menu);
4272 if (! view -> fullscreen)
4273 {
4274 gtk3_menu_item (menu, _("Fullscreen"), IMG_STOCK, (gpointer)FULLSCREEN, G_CALLBACK(set_full_screen), (gpointer)view, TRUE, GDK_KEY_f, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
4275 }
4276 else
4277 {
4278 gtk3_menu_item (menu, _("Exit Fullscreen"), IMG_STOCK, (gpointer)FULLSCREEN, G_CALLBACK(set_full_screen), (gpointer)view, TRUE, GDK_KEY_Escape, 0, FALSE, FALSE, FALSE);
4279 }
4280 add_menu_separator (menu);
4281 gtk3_menu_item (menu, _("Shortcuts"), IMG_NONE, NULL, G_CALLBACK(view_shortcuts), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
4282 pop_menu_at_pointer (menu, NULL);
4283#endif
4284}
void prepare_atom_edition(gpointer data, gboolean visible)
prepare atom edition
Definition atom_edit.c:460
void clean_other_window_after_edit(project *this_proj)
update other windows after model edition if required
Definition atom_edit.c:110
gchar * action_atoms[3]
Definition atom_edit.c:61
Function declarations for the mode edition window.
atomic_object * create_object_from_selection(project *this_proj)
create object from atom selection
atom_search * remove_search
Definition popup.c:174
void init_coordinates(project *this_proj, int status, gboolean win, gboolean init)
preserve atomic coordinates
Definition atom_move.c:197
int is_selected
Definition popup.c:181
int get_selected_object_id(gboolean visible, int p, gchar *str, atom_search *asearch)
get the id of the object selected (in contextual menu, or in combo box)
Definition w_search.c:2378
tint ulam_coord(glwin *view)
shift insertion position for object not to have overlapping objects for multiple/repeated insertions
atomic_object * duplicate_atomic_object(atomic_object *old_obj)
duplicate an insert object
void to_insert_in_project(int stat, int orig, project *this_proj, atom_search *asearch, gboolean visible)
to insert object in project
void allocate_todo(atom_search *asearch, int tsize)
allocate the selection list data buffer
Definition w_search.c:3705
insertion_menu mol[]
Definition w_library.c:193
Binding to the Fortran90 subroutines.
int selected_aspec
Definition popup.c:179
Callback declarations for main window.
atom_search * insert_search
Definition popup.c:175
G_MODULE_EXPORT void cut_this_slab(GtkButton *but, gpointer data)
cut this slab callback
Definition cell_cut.c:488
integer function chains()
Definition chains.F90:54
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 window_color_coord(GtkWidget *widg, gpointer data)
create a window to select a color callback GTK3
Definition w_colors.c:674
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
gchar * param[2]
void process_selected_atom(project *this_proj, glwin *view, int id, int ac, int se, int pi)
process selected atom
Definition selection.c:514
double dist
Definition d_measures.c:73
atom_in_selection * tmp_a
Definition d_measures.c:69
int atoms[NUM_STYLES][2]
int bonds[NUM_STYLES][2]
GtkTreeSelection * sel
Definition datab.c:102
void init_default_shaders(glwin *view)
re-initialize the default OpenGL shaders
distance distance_3d(cell_info *cell, int mdstep, atom *at, atom *bt)
distance between atom a and b in 3D
Definition ogl_utils.c:81
int ** allocdint(int xal, int yal)
allocate an int ** pointer
Definition global.c:317
int activep
Definition global.c:162
int * pasted_todo
Definition global.c:178
int nprojects
Definition global.c:161
gboolean selected_status
Definition global.c:191
gboolean column_label
Definition global.c:188
gboolean check_label
Definition global.c:189
int * allocint(int val)
allocate an int * pointer
Definition global.c:301
#define i18n(String)
Definition global.c:80
double string_to_double(gpointer string)
convert string to double
Definition global.c:611
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:276
@ IMG_STOCK
Definition global.h:280
glwin * active_glwin
Definition project.c:53
GtkWidget * create_menu_item_from_widget(GtkWidget *widg, gboolean check, gboolean radio, gboolean status)
#define FITBEST
Definition global.h:215
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)
cell_info * active_cell
Definition project.c:50
#define MEDIA_LOOP
Definition global.h:205
project * proj
chemical_data * active_chem
Definition project.c:48
void opengl_project_changed(int id)
change the OpenGL project
Definition update_p.c:296
void pop_menu_at_pointer(GtkWidget *widg, GdkEvent *event)
popup a menu at pointer location
Definition gtk-misc.c:2471
G_MODULE_EXPORT void select_unselect_this_atom(GtkWidget *widg, gpointer data)
select / unselect this atom callback GTK3
Definition popup.c:1196
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
#define CHEM_PARAMS
Definition global.h:315
box_info * active_box
Definition project.c:51
G_MODULE_EXPORT void label_unlabel_coord(GtkWidget *widg, gpointer data)
label / unlabel a type of coordination callback GTK3
Definition popup.c:1858
G_MODULE_EXPORT void show_hide_this_atom(GtkWidget *widg, gpointer data)
show / hide this atom callback GTK3
Definition popup.c:1038
G_MODULE_EXPORT void label_unlabel_atoms(GtkWidget *widg, gpointer data)
label / unlabel a type of atom(s) callback GTK3
Definition popup.c:1522
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
project * opengl_project
Definition project.c:54
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
G_MODULE_EXPORT void select_unselect_atoms(GtkWidget *widg, gpointer data)
select / unselect a type of atom(s) callback GTK3
Definition popup.c:1570
#define FULLSCREEN
Definition global.h:214
GtkWidget * create_menu_item(gboolean add_mnemo, gchar *action)
G_MODULE_EXPORT void select_unselect_coord(GtkWidget *widg, gpointer data)
select / unselect a type of coordination callback GTK3
Definition popup.c:1934
tint cut_sel
Definition gui.c:147
G_MODULE_EXPORT void show_hide_the_coord(GtkWidget *widg, gpointer data)
show / hide a type of coordination callback GTK3
Definition popup.c:1807
#define ECUT
Definition global.h:221
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:224
G_MODULE_EXPORT void replace_the_atoms(GtkWidget *widg, gpointer data)
replace selected atom(s) callback GTK3
Definition popup.c:1345
void add_menu_separator(GtkWidget *menu)
GtkWidget * menu_item_new_with_submenu(gchar *name, gboolean active, GtkWidget *sub_menu)
project * active_project
Definition project.c:47
G_MODULE_EXPORT void label_unlabel_this_atom(GtkWidget *widg, gpointer data)
label / unlabel this atom callback GTK3
Definition popup.c:1147
atomic_object * copied_object
Definition glwindow.c:124
image * active_image
Definition project.c:52
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
G_MODULE_EXPORT void remove_the_atoms(GtkWidget *widg, gpointer data)
remove selected atom(s) callback GTK3
Definition popup.c:1316
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
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...
G_MODULE_EXPORT void to_center_this_molecule(GtkWidget *widg, gpointer data)
center this molecule menu item callback GTK4
Definition popup.c:4019
void re_create_md_shaders(int nshaders, int shaders[nshaders], project *this_proj)
re-initialize some MD dependent OpenGL shaders
action
Definition glview.h:198
gboolean is_coord_in_menu(int id, project *this_proj)
is this coordination in a menu ?
Definition m_coord.c:74
gboolean pick
void update_all_menus(glwin *view, int nats)
update all menus of the OpenGL window
Definition glwindow.c:338
@ ANALYZE
Definition glview.h:166
@ EDITION
Definition glview.h:167
int step
Definition ogl_draw.c:76
void update_all_selections(glwin *view, int pi)
update the selection data: bonds, angles and dihedrals
Definition selection.c:387
void save_all_selections(glwin *view, int pi)
save all selection data
Definition selection.c:372
@ REPLACE
Definition glview.h:235
@ REMOVE
Definition glview.h:236
@ INSERT
Definition glview.h:237
@ SPACEFILL
Definition glview.h:184
@ WIREFRAME
Definition glview.h:183
@ NONE
Definition glview.h:181
#define FILLED_STYLES
Definition glwin.h:106
char * text_filled[FILLED_STYLES]
Definition m_style.c:66
#define OGL_STYLES
Definition glwin.h:107
shaders
The different types of shaders in the atomes program.
Definition glwin.h:88
@ BONDS
Definition glwin.h:90
@ PICKS
Definition glwin.h:97
@ LABEL
Definition glwin.h:98
@ POLYS
Definition glwin.h:92
@ SELEC
Definition glwin.h:91
@ MEASU
Definition glwin.h:99
@ ATOMS
Definition glwin.h:89
@ RINGS
Definition glwin.h:96
#define NSELECTION
Definition glwin.h:67
char * text_styles[OGL_STYLES]
Definition m_style.c:59
G_MODULE_EXPORT void coord_properties(GtkWidget *widg, gpointer data)
create the environments configuration window
Definition w_coord.c:1457
int is_labelled
Definition popup.c:182
G_MODULE_EXPORT void set_full_screen(GtkWidget *widg, gpointer data)
set full screen callback GTK3
Definition popup.c:228
G_MODULE_EXPORT void add_object(GtkWidget *widg, gpointer data)
add object call back GTK3
Definition popup.c:717
G_MODULE_EXPORT void copy_the_atoms(GtkWidget *widg, gpointer data)
copy selected atom(s) callback GTK3
Definition popup.c:1374
G_MODULE_EXPORT void view_shortcuts(GtkWidget *widg, gpointer data)
OpenGL window shortcuts callback GTK3.
Definition glwindow.c:468
G_MODULE_EXPORT void to_reset_view(GtkWidget *widg, gpointer data)
reset view callback - GTK3
Definition m_rep.c:275
void set_this_style(glwin *view, int style)
set general style for atom(s) and bond(s)
Definition m_style.c:293
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)
void init_project(gboolean alloc_box)
initialize a new project
Definition init_p.c:273
void show_info(char *information, int val, GtkWidget *win)
add / show information message to widget
Definition interface.c:240
gchar * env_name(project *this_proj, int g, int s, int f, GtkTextBuffer *buffer)
output the name of a coordination sphere
Definition interface.c:1022
gboolean ask_yes_no(gchar *title, gchar *text, int type, GtkWidget *widg)
ask yes or no for something: prepare dialog
Definition interface.c:420
gchar * exact_name(gchar *name)
short cut to print string without spaces
Definition interface.c:434
Messaging function declarations.
GMenu * menu_anim(glwin *view, int popm)
create the 'Animate' submenu elements
Definition m_anim.c:139
GMenu * menu_atoms(glwin *view, int popm, int at)
create the 'Atom(s)' submenu elements
Definition m_atoms.c:800
GMenu * menu_bonds(glwin *view, int popm, int at)
create the 'Bond(s)' submenu GTK4
Definition m_bonds.c:366
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_clones(glwin *view, int popm)
create the 'Clone(s)' submenu GTK4
Definition m_clones.c:180
GMenu * menu_coord(glwin *view, int popm)
create the 'Coordination' submenu GTK4
Definition m_coord.c:689
GMenu * menu_rings(glwin *view, int popm)
create the 'Ring(s)' submenu GTK4
Definition m_coord.c:705
GMenu * add_menu_coord(glwin *view, int popm, int id)
create a coordination type submenu
Definition m_coord.c:652
GMenu * color_item(glwin *view, gchar *act, int popm, int id, GCallback handler, gpointer data)
create a submenu to attach a color palette
Definition m_coord.c:479
G_MODULE_EXPORT void turn_rebuild(GtkWidget *widg, gpointer data)
rebuild menu items callback GTK3
Definition popup.c:3992
GMenu * extract_section(glwin *view, int popm)
create the 'Extract/Rebuild' menu items GTK4
Definition m_edit.c:332
GMenu * menu_poly(glwin *view, int popm)
create the 'Chemistry -> Polyehdra' submenu - GTK4
Definition m_poly.c:490
GMenu * menu_fullscreen(glwin *view, int popm)
create the 'Fullscreen' menu item - GTK4
Definition m_rep.c:794
GMenu * menu_reset(glwin *view, int popm)
create the reset menu items - GTK4
Definition m_rep.c:778
GMenu * menu_view(glwin *view, int popm)
create the 'View' submenu - GTK4
Definition m_rep.c:809
GMenu * menu_tools(glwin *view, int popm)
create the 'Tools' submenu - GTK4
Definition m_tools.c:778
double z
Definition ogl_draw.c:63
double y
Definition ogl_draw.c:63
double x
Definition ogl_draw.c:63
void alloc_proj_data(project *this_proj, int cid)
allocate data
Definition open_p.c:224
GtkWidget * selection_menu(glwin *view, int ati, int bti, int aoc, int mid, GCallback handler_a, GCallback handler_b, GCallback handler_c)
create popup submenu GTK3
Definition popup.c:3349
G_MODULE_EXPORT void remove_the_coord(GtkWidget *widg, gpointer data)
remove a type of coordination callback GTK3
Definition popup.c:1687
int action_atoms_from_project(project *this_proj, atom_search *asearch, gboolean visible)
apply atom edition action to project (motion, remove, replace, insert, random move)
atom_search * free_this_search_data(atom_search *this_search)
free atom search data structure
Definition popup.c:282
G_MODULE_EXPORT void coord_properties(GtkWidget *widg, gpointer data)
create the environments configuration window
Definition w_coord.c:1457
void create_new_project_using_data(atom_selection *selection)
create new project using an atom selection
Definition popup.c:2078
int get_style(gchar *str)
get OpenGL rendering style id
Definition popup.c:253
G_MODULE_EXPORT void turn_rebuild(GtkWidget *widg, gpointer data)
rebuild menu items callback GTK3
Definition popup.c:3992
G_MODULE_EXPORT void to_center_this_molecule(GtkWidget *widg, gpointer data)
center this molecule menu item callback GTK4
Definition popup.c:4019
G_MODULE_EXPORT void select_action_for_all_bonds(GtkWidget *widg, gpointer data)
select action for all bonds based on menu item id callback GTK3
Definition popup.c:2780
gchar * get_object_from_action(GSimpleAction *action)
get object name from action name GTK4
Definition popup.c:390
tint atoid[CONTEXTACT][4]
Definition popup.c:186
G_MODULE_EXPORT void edit_coord(GtkWidget *widg, gpointer data)
create new project using coordination type and id callback GTK3
Definition popup.c:2292
GtkWidget * create_selection_item(glwin *view, gchar *str, int mid, int gid, int cid, int aoc, GCallback handler, gpointer data)
create new menu item for the popup menu GTK3
Definition popup.c:3235
G_MODULE_EXPORT void style_this_atom(GtkWidget *widg, gpointer data)
change OpenGL rendering style for this atom callback GTK3
Definition popup.c:1275
int check_label_numbers(project *this_proj, int types)
check how many atom label(s) are visible
Definition popup.c:1059
void popup_main_menu(glwin *view, double ptx, double pty)
create the OpenGL window popup menu
Definition popup.c:4178
atom_selection * bond_selection
Definition popup.c:184
int selected_bspec
Definition popup.c:180
G_MODULE_EXPORT void select_unselect_this_atom(GtkWidget *widg, gpointer data)
select / unselect this atom callback GTK3
Definition popup.c:1196
void check_hidden_visible(project *this_proj)
check how many atom(s) are visible
Definition popup.c:888
GtkWidget * field_atom_menu(int p, int s, int a, int f)
void apply_project(gboolean showtools)
get project ready for calculation and initialize the OpenGL window
Definition callbacks.c:794
void to_remove_this_object(int type, gpointer data)
remove a type of object
Definition popup.c:309
int inserted_from_lib
Definition w_library.c:296
void reset_coordinates(project *this_proj, int status)
reset transformation and restore saved atomic coordinates
Definition atom_move.c:143
G_MODULE_EXPORT void remove_this_atom(GtkWidget *widg, gpointer data)
remove this atom callback GTK3
Definition popup.c:652
gchar * snsab[2][2]
Definition popup.c:3314
G_MODULE_EXPORT void select_action_for_all(GtkWidget *widg, gpointer data)
select action for all object(s) callback GTK3
Definition popup.c:2409
G_MODULE_EXPORT void replace_the_coord(GtkWidget *widg, gpointer data)
replace a coordination callback GTK3
Definition popup.c:1716
G_MODULE_EXPORT void reset_coords(GtkWidget *widg, gpointer data)
reset coordinates menu item callback GTK3
Definition popup.c:3959
G_MODULE_EXPORT void show_hide_others(GtkWidget *widg, gpointer data)
show all hidden / hide all visible atom(s) callback GTK3
Definition popup.c:1432
void popup_selection(glwin *view, double ptx, double pty, int spe, int mmod, int ati, int bti, int aoc)
create the contextual popup menu, right click on atom or bond
Definition popup.c:3687
void insert_object(int action, gpointer data)
insert object
Definition popup.c:667
void duplicate_material_and_lightning(image *new_img, image *old_img)
copy the material and lightning parameters of an image data structure
Definition ogl_draw.c:223
atom_search * allocate_atom_search(int proj, int action, int searchid, int tsize)
allocate atom search data structure
Definition atom_edit.c:393
G_MODULE_EXPORT void set_full_screen(GtkWidget *widg, gpointer data)
set full screen callback GTK3
Definition popup.c:228
G_MODULE_EXPORT void add_object(GtkWidget *widg, gpointer data)
add object call back GTK3
Definition popup.c:717
G_MODULE_EXPORT void label_unlabel_coord(GtkWidget *widg, gpointer data)
label / unlabel a type of coordination callback GTK3
Definition popup.c:1858
G_MODULE_EXPORT void replace_this_atom(GtkWidget *widg, gpointer data)
replace this atom callback GTK3
Definition popup.c:833
dint btoid
Definition popup.c:187
G_MODULE_EXPORT void copy_the_atoms(GtkWidget *widg, gpointer data)
copy selected atom(s) callback GTK3
Definition popup.c:1374
G_MODULE_EXPORT void copy_the_coord(GtkWidget *widg, gpointer data)
copy a coordination callback GTK3
Definition popup.c:1744
G_MODULE_EXPORT void show_hide_this_atom(GtkWidget *widg, gpointer data)
show / hide this atom callback GTK3
Definition popup.c:1038
void to_replace_this_object(int type, GtkWidget *widg, gpointer data)
replace a type of object GTK3
Definition popup.c:470
G_MODULE_EXPORT void label_unlabel_atoms(GtkWidget *widg, gpointer data)
label / unlabel a type of atom(s) callback GTK3
Definition popup.c:1522
int get_to_be_selected(glwin *view)
find which atom(s) are to be selected
Definition popup.c:196
G_MODULE_EXPORT void style_the_atoms(GtkWidget *widg, gpointer data)
change the OpenGL rendering style of a type of atom(s) callback GTK3
Definition popup.c:1636
G_MODULE_EXPORT void style_the_coord(GtkWidget *widg, gpointer data)
change OpenGL rendering style for a type of coordination callback GTK3
Definition popup.c:2026
int selected_atom
Definition popup.c:177
atom_in_selection * new_atom_in_selection(int id, int sp)
create a selected atom
Definition selection.c:428
G_MODULE_EXPORT void select_unselect_atoms(GtkWidget *widg, gpointer data)
select / unselect a type of atom(s) callback GTK3
Definition popup.c:1570
void add_style_sub_menu(GtkWidget *item, GCallback handler, gpointer data)
add style submenu to menu item GTK3
Definition popup.c:3091
int selected_btom
Definition popup.c:178
void check_all_trees(project *this_proj)
check all search trees
Definition w_search.c:450
void copy_bond_selection()
copy bond selection
Definition popup.c:585
G_MODULE_EXPORT void select_unselect_coord(GtkWidget *widg, gpointer data)
select / unselect a type of coordination callback GTK3
Definition popup.c:1934
vec3_t get_bary(project *this_proj, int status)
get barycenter of atomic coordinates
Definition atom_move.c:170
G_MODULE_EXPORT void to_add_object(GtkWidget *widg, gpointer data)
to add object callback GTK3
Definition popup.c:799
G_MODULE_EXPORT void edit_atoms(GtkWidget *widg, gpointer data)
create new project using atomic species callback GTK3
Definition popup.c:2359
void remove_object()
remove object using 'remove_search'
Definition popup.c:607
#define CONTEXTACT
Definition popup.c:152
G_MODULE_EXPORT void render_gl_image(GtkWidget *widg, gpointer data)
render image from the OpenGL window
Definition glwindow.c:442
G_MODULE_EXPORT void show_hide_the_coord(GtkWidget *widg, gpointer data)
show / hide a type of coordination callback GTK3
Definition popup.c:1807
G_MODULE_EXPORT void select_action_for_this_bond(GtkWidget *widg, gpointer data)
selection action for this bond callback GTK3
Definition popup.c:2622
G_MODULE_EXPORT void replace_the_atoms(GtkWidget *widg, gpointer data)
replace selected atom(s) callback GTK3
Definition popup.c:1345
void add_edition_sub_menu(GtkWidget *item, GCallback handler, gpointer data)
add edition submenu to menu item GTK3
Definition popup.c:3125
G_MODULE_EXPORT void view_shortcuts(GSimpleAction *action, GVariant *parameter, gpointer data)
G_MODULE_EXPORT void edit_in_new_project(GtkWidget *widg, gpointer data)
create new project using selection callback GTK3
Definition popup.c:2209
G_MODULE_EXPORT void show_hide_the_atoms(GtkWidget *widg, gpointer data)
show / hide a type of atom(s) callback GTK3
Definition popup.c:1475
gboolean insert_this_object
Definition popup.c:695
G_MODULE_EXPORT void label_unlabel_this_atom(GtkWidget *widg, gpointer data)
label / unlabel this atom callback GTK3
Definition popup.c:1147
G_MODULE_EXPORT void copy_this_atom(GtkWidget *widg, gpointer data)
copy this atom callback GTK3
Definition popup.c:861
void prepare_to_instert(gchar *key, project *this_proj, atom_search *asearch, gboolean visible)
prepare to insert something
gboolean wait_for_style
Definition popup.c:1253
G_MODULE_EXPORT void remove_the_atoms(GtkWidget *widg, gpointer data)
remove selected atom(s) callback GTK3
Definition popup.c:1316
Function declarations for reading atomes project file Function declarations for saving atomes proje...
void update_analysis_availability(project *this_proj)
update analysis availability for a target projet
Definition update_p.c:121
void active_project_changed(int id)
change the active project
Definition update_p.c:220
Definition global.h:111
Definition glwin.h:967
Definition glwin.h:364
Definition global.h:118
int b
Definition global.h:120
int c
Definition global.h:121
int a
Definition global.h:119
Function declarations for the creation of the OpenGL window menus.
void menu_items_view(GMenu *menu, glwin *view, int popm)
GMenu * prepare_model_menu(glwin *view, int popm)
GMenu * prepare_coord_menu(glwin *view, int popm)
GMenu * prepare_opengl_menu(glwin *view, int popm)
GMenu * menu_shortcuts(glwin *view, int popm)
int status
Definition w_advance.c:173
int element
Definition w_periodic.c:61
void add_project_to_workspace()
add project(s) to the workspace tree
Definition workspace.c:597
GtkWidget * img
Definition workspace.c:70
GtkWidget * lab
Definition workspace.c:73
Function declarations for workspace managment.