atomes 1.3.2
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
w_measures.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2026 by CNRS and University of Strasbourg */
15
21
22/*
23* This file: 'w_measures.c'
24*
25* Contains:
26*
27
28 - The functions to create the measurement(s) window
29
30*
31* List of functions:
32
33 int get_selection_type (glwin * view);
34
35 G_MODULE_EXPORT gboolean measure_tree_selection_event (GtkWidget * widget, GdkEventButton * event, gpointer data);
36 G_MODULE_EXPORT gboolean close_measure_event (GtkWindow * widg, gpointer data);
37 G_MODULE_EXPORT gboolean close_measure_event (GtkWidget * widg, GdkEvent * event, gpointer data);
38
39 gchar * create_measure_label (glwin * view, int sid);
40
41 void measure_set_visible (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
42 void measure_set_color (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, int pid, int mid);
43 void dihedral_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
44 void measure_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
45 void fill_bond_model_row (int p, int a, int b, GtkTreeStore * store);
46 void fill_angle_model_row (int p, int a, int b, int c, GtkTreeStore * store);
47 void fill_dihedral_model_row (int p, int a, int b, int c, int d, GtkTreeStore * store);
48 void update_label_selection (glwin * view, int sid);
49 void measure_tree_button_event (GtkWidget * widget, double event_x, double event_y, guint event_button, gpointer data);
50 void update_selection_tree (glwin * view, int sid, int mid);
51
52 G_MODULE_EXPORT void measure_tree_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
53 G_MODULE_EXPORT void close_ml (GtkButton * but, gpointer data);
54 G_MODULE_EXPORT void measure_labels (GtkButton * but, gpointer data);
55 G_MODULE_EXPORT void window_measures (GtkWidget * widg, gpointer data);
56
57 GtkWidget * create_selection_tree (glwin * view, int sid, int mid);
58 GtkWidget * measurment_tab (glwin * view, int sid, int mid);
59
60*/
61
62#include "global.h"
63#include "glview.h"
64
65extern void bonds_loop (glwin * view, int id, int pi, GtkTreeStore * store);
66extern void angles_loop (glwin * view, int id, int pi, GtkTreeStore * store);
67extern void dihedrals_loop (glwin * view, int id, int pi, GtkTreeStore * store);
68extern int num_bonds (int i);
69extern int num_angles (int i);
70extern int num_dihedrals (int i);
71
75
84{
85 if (view -> mode == EDITION && view -> selection_mode == NSELECTION-1)
86 {
87 return 1;
88 }
89 else if (view -> atom_win)
90 {
91 return 1;
92 }
93 else
94 {
95 return 0;
96 }
97}
98
109void fill_bond_model_row (int p, int a, int b, GtkTreeStore * store)
110{
111 GtkTreeIter bond_level;
112 gchar * str_a, * str_b, * str_c;
113 project * this_proj = get_project_by_id(p);
114 atom * at, * bt;
115 gboolean pbc = this_proj -> cell.pbc;
117 int s = this_proj -> modelgl -> anim -> last -> img -> step;
118 at = & this_proj -> atoms[s][a];
119 bt = & this_proj -> atoms[s][b];
120 bond_id ++;
121 dist = distance_3d (& this_proj -> cell, (this_proj -> cell.npt) ? s : 0, at, bt);
122 str_a = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[at -> sp], a+1);
123 str_b = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[bt -> sp], b+1);
124 str_c = g_strdup_printf("%.3lf", dist.length);
125 if (pbc)
126 {
127 gtk_tree_store_append (store, & bond_level, NULL);
128 gtk_tree_store_set (store, & bond_level, 0, bond_id,
129 1, str_a,
130 2, str_b,
131 3, str_c,
132 4, dist.pbc, -1);
133 }
134 else
135 {
136 gtk_tree_store_append (store, & bond_level, NULL);
137 gtk_tree_store_set (store, & bond_level, 0, bond_id,
138 1, str_a,
139 2, str_b,
140 3, str_c, -1);
141 }
142 g_free (str_a);
143 g_free (str_b);
144 g_free (str_c);
145}
146
158void fill_angle_model_row (int p, int a, int b, int c, GtkTreeStore * store)
159{
160 GtkTreeIter angle_level;
161 gchar * str_a, * str_b, * str_c, * str_d;
162 project * this_proj = get_project_by_id(p);
163 atom * at, * bt, * ct;
164 gboolean pbc = this_proj -> cell.pbc;
165 angle theta;
166 int s = this_proj -> modelgl -> anim -> last -> img -> step;
167 at = & this_proj -> atoms[s][a];
168 bt = & this_proj -> atoms[s][b];
169 ct = & this_proj -> atoms[s][c];
170 angle_id ++;
171 theta = angle_3d (& this_proj -> cell, (this_proj -> cell.npt) ? s : 0, at, bt, ct);
172 str_a = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[at -> sp], a+1);
173 str_b = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[bt -> sp], b+1);
174 str_c = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[ct -> sp], c+1);
175 str_d = g_strdup_printf("%.2lf", theta.angle);
176 if (pbc)
177 {
178 gtk_tree_store_append (store, & angle_level, NULL);
179 gtk_tree_store_set (store, & angle_level, 0, angle_id,
180 1, str_a,
181 2, str_b,
182 3, str_c,
183 4, str_d,
184 5, theta.pbc, -1);
185 }
186 else
187 {
188 gtk_tree_store_append (store, & angle_level, NULL);
189 gtk_tree_store_set (store, & angle_level, 0, angle_id,
190 1, str_a,
191 2, str_b,
192 3, str_c,
193 4, str_d, -1);
194 }
195 g_free (str_a);
196 g_free (str_b);
197 g_free (str_c);
198 g_free (str_d);
199}
200
213void fill_dihedral_model_row (int p, int a, int b, int c, int d, GtkTreeStore * store)
214{
215 GtkTreeIter dihedral_level;
216 gchar * str_a, * str_b, * str_c, * str_d, * str_e;
217 project * this_proj = get_project_by_id(p);
218 atom * at, * bt, * ct, * dt;
219 gboolean pbc = this_proj -> cell.pbc;
220 angle phi;
221 int s = this_proj -> modelgl -> anim -> last -> img -> step;
222 at = & this_proj -> atoms[s][a];
223 bt = & this_proj -> atoms[s][b];
224 ct = & this_proj -> atoms[s][c];
225 dt = & this_proj -> atoms[s][d];
226 dihedral_id ++;
227 phi = dihedral_3d (& this_proj -> cell, (this_proj -> cell.npt) ? s : 0, at, bt, ct, dt);
228 str_a = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[at -> sp], a+1);
229 str_b = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[bt -> sp], b+1);
230 str_c = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[ct -> sp], c+1);
231 str_d = g_strdup_printf("%s<sub>%d</sub>", this_proj -> chemistry -> label[dt -> sp], d+1);
232 str_e = g_strdup_printf("%.2lf", phi.angle);
233 if (pbc)
234 {
235 gtk_tree_store_append (store, & dihedral_level, NULL);
236 gtk_tree_store_set (store, & dihedral_level, 0, dihedral_id,
237 1, str_a,
238 2, str_b,
239 3, str_c,
240 4, str_d,
241 5, str_e,
242 6, phi.pbc, -1);
243 }
244 else
245 {
246 gtk_tree_store_append (store, & dihedral_level, NULL);
247 gtk_tree_store_set (store, & dihedral_level, 0, dihedral_id,
248 1, str_a,
249 2, str_b,
250 3, str_c,
251 4, str_d,
252 5, str_e, -1);
253 }
254 g_free (str_a);
255 g_free (str_b);
256 g_free (str_c);
257 g_free (str_d);
258 g_free (str_e);
259}
260
261extern ColRGBA init_color (int id, int numid);
262
274void measure_set_visible (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
275{
276 int i;
277 tint * dat = (tint *)data;
278 gtk_tree_model_get (mod, iter, dat -> b, & i, -1);
279 gtk_cell_renderer_set_visible (renderer, i);
280}
281
294void measure_set_color (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, int pid, int mid)
295{
296 int i, j;
297 j = 0;
298 gboolean docolor = FALSE;
299 gtk_tree_model_get (mod, iter, 0, & i, -1);
300 project * this_proj = get_project_by_id(pid);
301 image * img = this_proj -> modelgl -> anim -> last -> img;
302 int pi = get_selection_type (this_proj -> modelgl);
303 if (img -> selected[pi] -> selected)
304 {
305 if ((mid == 2 && img -> selected[pi] -> selected < MAX_IN_SELECTION-10) || (mid < 2 && img -> selected[pi] -> selected < MAX_IN_SELECTION))
306 {
307 switch (mid)
308 {
309 case 0:
310 j = num_bonds (img -> selected[pi] -> selected);
311 if (img -> selected[pi] -> selected_bonds[i]) docolor = TRUE;
312 break;
313 case 1:
314 j = num_angles (img -> selected[pi] -> selected);
315 if (img -> selected[pi] -> selected_angles[i]) docolor = TRUE;
316 break;
317 case 2:
318 j = num_dihedrals (img -> selected[pi] -> selected);
319 if (img -> selected[pi] -> selected_dihedrals[i]) docolor = TRUE;
320 break;
321 }
322 }
323 }
324 set_renderer_color (docolor, renderer, init_color (i, j));
325}
326
338void dihedral_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
339{
340 tint * dat = (tint *)data;
341 measure_set_color (col, renderer, mod, iter, dat -> a, 2);
342 set_renderer_markup (mod, iter, renderer, dat -> b);
343}
344
356void measure_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
357{
358 tint * dat = (tint *)data;
359 measure_set_color (col, renderer, mod, iter, dat -> a, dat -> c);
360 set_renderer_markup (mod, iter, renderer, dat -> b);
361}
362
374void measure_tree_button_event (GtkWidget * widget, double event_x, double event_y, guint event_button, gpointer data)
375{
376 if (event_button == 1)
377 {
378 tint * dat = (tint *)data;
379 glwin * view = get_project_by_id(dat -> a) -> modelgl;
380 int pi = get_selection_type (view);
381 GtkTreeModel * measure_model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
382 GtkTreePath * path;
383 GtkTreeViewColumn * column;
384 int i, j;
385#ifdef GTK4
386 int e_x, e_y;
387 gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW(widget), event_x, event_y, & e_x, & e_y);
388 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), e_x, e_y, & path, & column, & i, & j))
389#else
390 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), event_x, event_y, & path, & column, & i, & j))
391#endif
392 {
393 GtkTreeIter row;
394 if (gtk_tree_model_get_iter (measure_model, & row, path))
395 {
396 gtk_tree_model_get (measure_model, & row, 0, & j, -1);
397 // select bonds, angles or dihedrals:
398 switch (dat -> c)
399 {
400 case 0:
401 view -> anim -> last -> img -> selected[pi] -> selected_bonds[j] = ! view -> anim -> last -> img -> selected[pi] -> selected_bonds[j];
402 break;
403 case 1:
404 view -> anim -> last -> img -> selected[pi] -> selected_angles[j] = ! view -> anim -> last -> img -> selected[pi] -> selected_angles[j];
405 break;
406 case 2:
407 view -> anim -> last -> img -> selected[pi] -> selected_dihedrals[j] = ! view -> anim -> last -> img -> selected[pi] -> selected_dihedrals[j];
408 break;
409 }
410 }
411 }
412 view -> create_shaders[MEASU] = TRUE;
413 update (view);
414 }
415}
416
417#ifdef GTK3
427G_MODULE_EXPORT gboolean measure_tree_selection_event (GtkWidget * widget, GdkEventButton * event, gpointer data)
428{
429 if (event -> type == GDK_BUTTON_PRESS)
430 {
431 GdkEventButton * bevent = (GdkEventButton*)event;
432 measure_tree_button_event (widget, bevent -> x, bevent -> y, bevent -> button, data);
433 }
434 return FALSE;
435}
436#else
448G_MODULE_EXPORT void measure_tree_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
449{
450 measure_tree_button_event (gtk_event_controller_get_widget ((GtkEventController*)gesture), x, y, gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), data);
451}
452#endif
453
463GtkWidget * create_selection_tree (glwin * view, int sid, int mid)
464{
465 int i, j;
466 GtkTreeViewColumn * sel_col[7];
467 GtkCellRenderer * sel_cell[7];
468 GtkTreeStore * sel_model;
469 gchar * ctitle[3][7]={{i18n("Id."), i18n("Atom 1"), i18n("Atom 2"), i18n("Distance [Ã…]"), i18n("Using PBC"), "NULL", "NULL"},
470 {i18n("Id."), i18n("Atom 1"), i18n("Atom 2"), i18n("Atom 3"), "θ [°]", i18n("Using PBC"), "NULL"},
471 {i18n("Id."), i18n("Atom 1"), i18n("Atom 2"), i18n("Atom 3"), i18n("Atom 4"), "ϕ [°]", i18n("Using PBC")}};
472 gchar * ctype[3][7]={{"text", "text", "text", "text", "active", "text", "text"},
473 {"text", "text", "text", "text", "text", "active", "text"},
474 {"text", "text", "text", "text", "text", "text", "active"}};
475 int tree_dim[3]={4, 5, 6};
476 GType col_type[3][7]= {{G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING},
477 {G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING},
478 {G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN}};
479
480 if (get_project_by_id(view -> proj) -> cell.pbc)
481 {
482 sel_model = gtk_tree_store_newv (tree_dim[mid]+1, col_type[mid]);
483 j = 1;
484 }
485 else
486 {
487 sel_model = gtk_tree_store_newv (tree_dim[mid], col_type[mid]);
488 j = 0;
489 }
490
491 GtkWidget * selection_tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(sel_model));
492 for (i=0; i<4+j+mid; i++)
493 {
494 if ((mid == 0 && i < 4) || (mid == 1 && i < 5) || (mid == 2 && i < 6))
495 {
496 sel_cell[i] = gtk_cell_renderer_text_new();
497 sel_col[i] = gtk_tree_view_column_new_with_attributes (_(ctitle[mid][i]), sel_cell[i], ctype[mid][i], i, NULL);
498 if (i == 0) gtk_tree_view_column_set_visible (sel_col[i], FALSE);
499 }
500 else if ((mid == 0 && i == 4) || (mid == 1 && i == 5) || (mid == 2 && i == 6))
501 {
502 sel_cell[i] = gtk_cell_renderer_toggle_new ();
503 sel_col[i] = gtk_tree_view_column_new_with_attributes (_(ctitle[mid][i]), sel_cell[i], ctype[mid][i], i, NULL);
504 }
505 gtk_tree_view_column_set_alignment (sel_col[i], 0.5);
506 gtk_tree_view_append_column (GTK_TREE_VIEW(selection_tree), sel_col[i]);
507 if (i > 0 && i < 4+mid)
508 {
509 if (mid < 2)
510 {
511 gtk_tree_view_column_set_cell_data_func (sel_col[i], sel_cell[i], measure_set_color_and_markup, & view -> colorp[i][mid], NULL);
512 }
513 else
514 {
515 gtk_tree_view_column_set_cell_data_func (sel_col[i], sel_cell[i], dihedral_set_color_and_markup, & view -> colorp[i][0], NULL);
516 }
517 }
518 else if (i > 0)
519 {
520 gtk_tree_view_column_set_cell_data_func (sel_col[i], sel_cell[i], measure_set_visible, & view -> colorp[i][0], NULL);
521 }
522 }
523 image * img = view -> anim -> last -> img;
524 if (img -> selected[sid] -> selected < MAX_IN_SELECTION)
525 {
526 if ( (mid == 0 && img -> selected[sid] -> selected > 1)
527 || (mid == 1 && img -> selected[sid] -> selected > 2)
528 || (mid == 2 && img -> selected[sid] -> selected > 3 && img -> selected[sid] -> selected < MAX_IN_SELECTION-10))
529 {
530 if (mid == 0)
531 {
532 bond_id = -1;
533 bonds_loop (view, 2, sid, GTK_TREE_STORE(sel_model));
534#ifdef GTK4
535 add_widget_gesture_and_key_action (selection_tree, "bond-tree-pressed", G_CALLBACK(measure_tree_button_pressed), & view -> colorp[0][mid],
536 NULL, NULL, NULL, NULL, NULL, NULL,
537 NULL, NULL, NULL, NULL, NULL, NULL);
538#else
539 g_signal_connect (G_OBJECT(selection_tree), "button_press_event", G_CALLBACK(measure_tree_selection_event), & view -> colorp[0][mid]);
540#endif
541 }
542 else if (mid == 1)
543 {
544 angle_id = -1;
545 angles_loop (view, 2, sid, GTK_TREE_STORE(sel_model));
546#ifdef GTK4
547 add_widget_gesture_and_key_action (selection_tree, "angle-tree-pressed", G_CALLBACK(measure_tree_button_pressed), & view -> colorp[0][mid],
548 NULL, NULL, NULL, NULL, NULL, NULL,
549 NULL, NULL, NULL, NULL, NULL, NULL);
550#else
551 g_signal_connect (G_OBJECT(selection_tree), "button_press_event", G_CALLBACK(measure_tree_selection_event), & view -> colorp[0][mid]);
552#endif
553 }
554 else if (mid == 2)
555 {
556 dihedral_id = -1;
557 dihedrals_loop (view, 2, sid, GTK_TREE_STORE(sel_model));
558/*#ifdef GTK4
559 add_widget_gesture_and_key_action (selection_tree, "dihedral-tree-pressed", G_CALLBACK(measure_tree_button_pressed), & view -> colorp[0][mid],
560 NULL, NULL, NULL, NULL, NULL, NULL,
561 NULL, NULL, NULL, NULL, NULL, NULL);
562#else
563 g_signal_connect (G_OBJECT(selection_tree), "button_press_event", G_CALLBACK(measure_tree_selection_event), & view -> colorp[0][mid]);
564#endif*/
565 }
566 }
567 }
568 GtkTreeSelection * selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(selection_tree));
569 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
570 gtk_tree_view_expand_all (GTK_TREE_VIEW(selection_tree));
571 return selection_tree;
572}
573
583void update_selection_tree (glwin * view, int sid, int mid)
584{
585 GtkWidget * cont = gtk_widget_get_parent (view -> measure_win -> selection_tree[mid]);
586 view -> measure_win -> selection_tree[mid] = destroy_this_widget (view -> measure_win -> selection_tree[mid]);
587 view -> measure_win -> selection_tree[mid] = create_selection_tree (view, sid, mid);
588 add_container_child (CONTAINER_SCR, cont, view -> measure_win -> selection_tree[mid]);
589 show_the_widgets (cont);
590}
591
601GtkWidget * measurment_tab (glwin * view, int sid, int mid)
602{
603 GtkWidget * scrollsets = create_scroll (NULL, 350+50*mid, 350, GTK_SHADOW_NONE);
604 view -> measure_win -> selection_tree[mid] = create_selection_tree (view, sid, mid);
605 add_container_child (CONTAINER_SCR, scrollsets, view -> measure_win -> selection_tree[mid]);
606 return scrollsets;
607}
608
617gchar * create_measure_label (glwin * view, int sid)
618{
619 gchar * str;
620 image * img = view -> anim -> last -> img;
621 if (img -> selected[sid] -> selected < MAX_IN_SELECTION)
622 {
623 str = g_strdup_printf (_("\tAtom(s) in selection<sup>*</sup> :\t<b>%d</b>"), img -> selected[sid] -> selected);
624 }
625 else
626 {
627 str = g_strdup_printf (_("\tSorry too many [%d] atoms in selection<sup>*</sup>"), img -> selected[sid] -> selected);
628 }
629 return str;
630}
631
640void update_label_selection (glwin * view, int sid)
641{
642 gtk_label_set_text (GTK_LABEL(view -> measure_win -> label), create_measure_label(view, sid));
643 gtk_label_set_use_markup (GTK_LABEL(view -> measure_win -> label), TRUE);
644}
645
646extern GtkWidget * labels_tab (glwin * view, int id);
647
656G_MODULE_EXPORT void close_ml (GtkButton * but, gpointer data)
657{
658 destroy_this_widget (GTK_WIDGET(data));
659}
660
669G_MODULE_EXPORT void measure_labels (GtkButton * but, gpointer data)
670{
671 glwin * view = (glwin *) data;
672 gchar * str = g_strdup_printf (_("%s - measures - style"), get_project_by_id(view -> proj) -> name);
673 GtkWidget * win = create_win (str, view -> measure_win -> win, TRUE, FALSE);
674 //gtk_widget_set_size_request (win, -1, -1480);
675 g_free (str);
676 GtkWidget * vbox = create_vbox (BSEP);
678 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, labels_tab (view, (is_atom_win_active(view) || (view -> mode == EDITION && view -> selection_mode == NSELECTION-1)) ? 4 : 3), FALSE, FALSE, 0);
679 GtkWidget * hbox = create_hbox (0);
680 GtkWidget * close_but = create_button (_("Close"), IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(close_ml), win);
681 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, close_but, FALSE, TRUE, 150);
682 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 20);
683 add_gtk_close_event (win, G_CALLBACK(hide_this_window), NULL);
684 show_the_widgets (win);
685 gtk_window_set_resizable (GTK_WINDOW(win), FALSE);
686}
687
688#ifdef GTK4
697G_MODULE_EXPORT gboolean close_measure_event (GtkWindow * widg, gpointer data)
698#else
708G_MODULE_EXPORT gboolean close_measure_event (GtkWidget * widg, GdkEvent * event, gpointer data)
709#endif
710{
711 glwin * view = (glwin *) data;
712 view -> measure_win -> win = destroy_this_widget (view -> measure_win -> win);
713 int i;
714 for (i=0; i<3; i++)
715 {
716 view -> measure_win -> selection_tree[i] = NULL;
717 }
718 g_free (view -> measure_win);
719 view -> measure_win = NULL;
720 return FALSE;
721}
722
731G_MODULE_EXPORT void window_measures (GtkWidget * widg, gpointer data)
732{
733 glwin * view = (glwin *) data;
734 if (view -> measure_win == NULL)
735 {
736 view -> measure_win = g_malloc0(sizeof*view -> measure_win);
737 gchar * str = g_strdup_printf (_("%s - measures"), get_project_by_id(view -> proj) -> name);
738 int pi = get_selection_type (view);
739 view -> measure_win -> win = create_win (str, view -> win, FALSE, FALSE);
740 gtk_widget_set_size_request (view -> measure_win -> win, 450, 500);
741 g_free (str);
742 GtkWidget * vbox = create_vbox (BSEP);
743 add_container_child (CONTAINER_WIN, view -> measure_win -> win, vbox);
744 GtkWidget * notebook = gtk_notebook_new ();
745 view -> measure_win -> label = markup_label(create_measure_label(view, pi), -1, 50, 0.0, 0.5);
746 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, view -> measure_win -> label, FALSE, FALSE, 0);
747 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, notebook, FALSE, FALSE, 0);
748 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), measurment_tab (view, pi, 0), gtk_label_new (_("Distances")));
749 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), measurment_tab (view, pi, 1), gtk_label_new (_("Angles")));
750 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), measurment_tab (view, pi, 2), gtk_label_new (_("Dihedrals")));
751
752 str = g_strdup_printf (_("You can select up to %d atoms for both inter-atomic distance(s) and angle(s),"), MAX_IN_SELECTION-1);
753 append_comments (vbox, "<sup>*</sup>", str);
754 g_free (str);
755 str = g_strdup_printf (_("and up to %d atoms for dihedral angle(s) measurement(s)"), MAX_IN_SELECTION-11);
756 append_comments (vbox, " ", str);
757 g_free (str);
758 GtkWidget * hbox = create_hbox (0);
759 GtkWidget * but = create_button (_("Font and style"), IMG_NONE, NULL, 150, -1, GTK_RELIEF_NORMAL, G_CALLBACK(measure_labels), view);
760 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, but, FALSE, TRUE, 150);
761 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
762 add_gtk_close_event (view -> measure_win -> win, G_CALLBACK(close_measure_event), view);
763 show_the_widgets (view -> measure_win -> win);
764 }
765 else
766 {
767 show_the_widgets (view -> measure_win -> win);
768 }
769}
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
color colorp[64]
ColRGBA init_color(int id, int numid)
initialize color based id number over total number of elements
Definition initcoord.c:81
ColRGBA col
Definition d_measures.c:77
double dist
Definition d_measures.c:73
int atoms[NUM_STYLES][2]
GtkTreePath * path
Definition datab.c:103
GtkTreeIter row
Definition datab.c:104
gchar * ctitle[MAXDATA][12]
Definition dlp_field.c:924
GType col_type[MAXDATA][12]
Definition dlp_field.c:946
angle dihedral_3d(cell_info *cell, int mdstep, atom *at, atom *bt, atom *ct, atom *dt)
dihedral between atom a, b, c and d in 3D
Definition ogl_utils.c:204
angle angle_3d(cell_info *cell, int mdstep, atom *at, atom *bt, atom *ct)
angle between atom a, b and c in 3D
Definition ogl_utils.c:179
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
double pi
Definition global.c:203
#define i18n(String)
Definition global.c:80
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:277
void set_renderer_color(int tocol, GtkCellRenderer *renderer, ColRGBA col)
set the color of a GtkCellRenderer
Definition gtk-misc.c:1740
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2048
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2139
gboolean is_atom_win_active(glwin *view)
is the model edition window visible ?
Definition atom_edit.c:71
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:486
project * proj
#define BSEP
Definition global.h:262
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2541
void add_gtk_close_event(GtkWidget *widg, GCallback handler, gpointer data)
add a close event signal and callback to a GtkWidget
Definition gtk-misc.c:2557
void set_renderer_markup(GtkTreeModel *mod, GtkTreeIter *iter, GtkCellRenderer *renderer, int col)
set Pango text markup for a GtkCellRenderer
Definition gtk-misc.c:1764
@ CONTAINER_WIN
Definition global.h:267
@ CONTAINER_SCR
Definition global.h:268
GtkWidget * create_button(gchar *text, int image_format, gchar *image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
create a simple button
Definition gtk-misc.c:1999
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
#define MAX_IN_SELECTION
Maximum number of atoms in selection to display measure information.
Definition glview.h:144
@ EDITION
Definition glview.h:167
int step
Definition ogl_draw.c:76
@ MEASU
Definition glwin.h:99
#define NSELECTION
Definition glwin.h:67
double y
Definition ogl_draw.c:63
double x
Definition ogl_draw.c:63
GtkWidget * labels_tab(glwin *view, int lid)
create atomic label(s) tab for the atom(s) / clone(s) window
Definition w_labels.c:624
Definition glwin.h:115
double angle
Definition glwin.h:116
gboolean pbc
Definition glwin.h:117
Definition global.h:968
Definition glwin.h:967
Definition glwin.h:364
Definition global.h:119
int angle_id
Definition w_measures.c:73
GtkWidget * labels_tab(glwin *view, int id)
create atomic label(s) tab for the atom(s) / clone(s) window
Definition w_labels.c:624
int num_bonds(int i)
number of distinct pair(s) of atoms in selection
Definition selection.c:183
void measure_set_visible(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
show / hide cell renderer in the measures tree store
Definition w_measures.c:274
GtkWidget * measurment_tab(glwin *view, int sid, int mid)
Definition w_measures.c:601
int get_selection_type(glwin *view)
get selection type
Definition w_measures.c:83
void update_label_selection(glwin *view, int sid)
update the text information for the number of atoms/measures in selection
Definition w_measures.c:640
void fill_angle_model_row(int p, int a, int b, int c, GtkTreeStore *store)
fill angle tree store row
Definition w_measures.c:158
void measure_set_color_and_markup(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
Measure window set color and Pango markup in tree view.
Definition w_measures.c:356
void measure_tree_button_event(GtkWidget *widget, double event_x, double event_y, guint event_button, gpointer data)
measure tree button event
Definition w_measures.c:374
void dihedral_set_color_and_markup(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
Definition w_measures.c:338
int num_dihedrals(int i)
number of distinct quadruplet(s) of atoms in selection
Definition selection.c:207
int dihedral_id
Definition w_measures.c:74
G_MODULE_EXPORT gboolean close_measure_event(GtkWidget *widg, GdkEvent *event, gpointer data)
measurements window close event callback GTK3
Definition w_measures.c:708
void dihedrals_loop(glwin *view, int id, int pi, GtkTreeStore *store)
do things for the measured dihedrals selection
Definition d_measures.c:319
void update_selection_tree(glwin *view, int sid, int mid)
update measurements tree view
Definition w_measures.c:583
ColRGBA init_color(int id, int numid)
initialize color based id number over total number of elements
Definition initcoord.c:81
G_MODULE_EXPORT void measure_labels(GtkButton *but, gpointer data)
measurements style edition window
Definition w_measures.c:669
void fill_dihedral_model_row(int p, int a, int b, int c, int d, GtkTreeStore *store)
fill dihedral tree store row
Definition w_measures.c:213
G_MODULE_EXPORT void measure_tree_button_pressed(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
measures tree view button press callback GTK4
Definition w_measures.c:448
int num_angles(int i)
number of distinct triplet(s) of atoms in selection
Definition selection.c:195
void angles_loop(glwin *view, int id, int pi, GtkTreeStore *store)
do things for the measured angles selection
Definition d_measures.c:204
void bonds_loop(glwin *view, int id, int pi, GtkTreeStore *store)
do things for the measured distances selection
Definition d_measures.c:530
gchar * create_measure_label(glwin *view, int sid)
create the text information for the number of atom(s) in selection
Definition w_measures.c:617
G_MODULE_EXPORT void window_measures(GtkWidget *widg, gpointer data)
create the measurements window
Definition w_measures.c:731
void measure_set_color(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, int pid, int mid)
set renderer color in the measures tree store
Definition w_measures.c:294
GtkWidget * create_selection_tree(glwin *view, int sid, int mid)
create the measurements selection tree
Definition w_measures.c:463
G_MODULE_EXPORT void close_ml(GtkButton *but, gpointer data)
measurements style edition window close button
Definition w_measures.c:656
void fill_bond_model_row(int p, int a, int b, GtkTreeStore *store)
fill bond tree store row
Definition w_measures.c:109
int bond_id
Definition w_measures.c:72
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72