atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
w_rings.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_rings.c'
24*
25* Contains:
26*
27
28 - The functions to create the ring(s) tab for the advanced environments window
29
30*
31* List of functions:
32
33 gchar * ring_atoms (project * this_proj, int ring, int step, int size, int rid, gboolean to_file);
34
35 int get_rmin (project * this_proj, int rid, int step);
36 int get_rmax (project * this_proj, int rid, int step);
37
38 void rings_set_visible (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
39 void fill_rings_model (GtkTreeStore * store, project * this_proj, int rid);
40 void rings_set_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
41 void add_this_ring_to_search_tree (project * this_proj, int rid);
42
43 G_MODULE_EXPORT void on_select_rings (GtkCellRendererToggle * cell_renderer, gchar * string_path, gpointer data);
44 G_MODULE_EXPORT void update_rings_search (GtkEntry * res, gpointer data);
45 G_MODULE_EXPORT void run_save_rings_to_file (GtkNativeDialog * info, gint response_id, gpointer data);
46 G_MODULE_EXPORT void run_save_rings_to_file (GtkDialog * info, gint response_id, gpointer data);
47 G_MODULE_EXPORT void save_rings_to_file (GtkButton * but, gpointer data);
48
49 GtkWidget * create_rings_tree (project * this_proj, int rid, gboolean fill_this);
50 GtkWidget * create_rings_search (project * this_proj, int rid);
51 GtkWidget * rings_tab (glwin * view, int rid);
52
53*/
54
55#include "global.h"
56#include "interface.h"
57#include "glview.h"
58#include "glwindow.h"
59
60extern const gchar * dfi[2];
61gchar * rtype[5] = {i18n("all"), i18n("King"), i18n("Guttman"), i18n("primtive"), i18n("strong")};
62
72G_MODULE_EXPORT void on_select_rings (GtkCellRendererToggle * cell_renderer, gchar * string_path, gpointer data)
73{
74 tint * dat = (tint * )data;
75 gboolean saved_label[2];
76 int i, j, g, c, s, v, u, a, b;
77 opengl_project_changed(dat -> a);
78 coord_edition * coord = opengl_project -> modelgl -> coord_win;
79 b = (opengl_project -> steps > 1) ? 1: 0;
80 for (i=0; i<5; i++)
81 {
82 if (i*10 > dat -> b) break;
83 }
84 g = i - 1;
85 for (i=2+b; i<5+b; i++)
86 {
87 if (10*g+i == dat -> b) break;
88 }
89 c = i;
90 if (gtk_cell_renderer_toggle_get_active(cell_renderer))
91 {
92 v = 0;
93 }
94 else
95 {
96 v = 1;
97 }
98 GtkTreeIter iter;
99 GtkTreePath * path = gtk_tree_path_new_from_string (string_path);
100 gtk_tree_model_get_iter (GTK_TREE_MODEL(coord -> rings_model[g]), & iter, path);
101 gtk_tree_store_set (coord -> rings_model[g], & iter, c, v, -1);
102 if (b)
103 {
104 gtk_tree_model_get (GTK_TREE_MODEL(coord -> rings_model[g]), & iter, 0, & s, -1);
105 s = - s - 1;
106 }
107 else
108 {
109 s = 0;
110 }
111 gtk_tree_model_get (GTK_TREE_MODEL(coord -> rings_model[g]), & iter, b, & i, -1);
112 i = -i;
113 gtk_tree_model_get (GTK_TREE_MODEL(coord -> rings_model[g]), & iter, b+1, & j, -1);
114 switch (c-b)
115 {
116 case 2:
117 // Viz
118 for (u=0; u<i; u++)
119 {
120 a = opengl_project -> modelgl -> all_rings[g][s][i-1][j-1][u];
121#ifdef GTK4
122 if (opengl_project -> atoms[s][a].show[0] != v) show_hide_this_atom (NULL, NULL, GINT_TO_POINTER(a));
123#else
124 if (opengl_project -> atoms[s][a].show[0] != v) show_hide_this_atom (NULL, GINT_TO_POINTER(a));
125#endif // GTK4
126 }
127 break;
128 case 3:
129 // Show poly
130 opengl_project -> modelgl -> show_rpoly[g][s][i-1][j-1] = v;
131 int shaders[1] = {RINGS};
133 break;
134 case 4:
135 // Label
136 for (u=0; u<i; u++)
137 {
138 a = opengl_project -> modelgl -> all_rings[g][s][i-1][j-1][u];
139 opengl_project -> atoms[s][a].label[0] = opengl_project -> atoms[s][a].label[1] = v;
140 }
141 opengl_project -> modelgl -> create_shaders[LABEL] = TRUE;
142 break;
143 case 5:
144 // Pick
145 for (u=0; u<i; u++)
146 {
147 a = opengl_project -> modelgl -> all_rings[g][s][i-1][j-1][u];
148 saved_label[0] = opengl_project -> atoms[s][a].label[0];
149 saved_label[1] = opengl_project -> atoms[s][a].label[1];
150#ifdef GTK4
151 if (opengl_project -> atoms[s][a].pick[0] != v) select_unselect_this_atom (NULL, NULL, GINT_TO_POINTER(a));
152#else
153 if (opengl_project -> atoms[s][a].pick[0] != v) select_unselect_this_atom (NULL, GINT_TO_POINTER(a));
154#endif // GTK4
155 opengl_project -> atoms[s][a].label[0] = saved_label[0];
156 opengl_project -> atoms[s][a].label[1] = saved_label[1];
157 }
158 break;
159 }
160 update (opengl_project -> modelgl);
161}
162
174void rings_set_visible (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
175{
176 tint * id = (tint *)data;
177 int i, j, k;
178 project * this_proj = get_project_by_id(id -> a);
179 i = id -> b;
180 j = (this_proj -> steps > 1) ? 1: 0;
181 gtk_tree_model_get (mod, iter, j, & k, -1);
182 if (j)
183 {
184 gtk_tree_model_get (mod, iter, 0, & k, -1);
185 if (i == 0)
186 {
187 if (k > 0)
188 {
189 gtk_cell_renderer_set_visible (renderer, 1);
190 }
191 else
192 {
193 gtk_cell_renderer_set_visible (renderer, 0);
194 }
195 }
196 else if (k > 0)
197 {
198 gtk_cell_renderer_set_visible (renderer, 0);
199 }
200 else
201 {
202 gtk_tree_model_get (mod, iter, j, & k, -1);
203 if (i == 1)
204 {
205 if (k > 0)
206 {
207 gtk_cell_renderer_set_visible (renderer, 1);
208 }
209 else
210 {
211 gtk_cell_renderer_set_visible (renderer, 0);
212 }
213 }
214 else
215 {
216 if (k > 0)
217 {
218 gtk_cell_renderer_set_visible (renderer, 0);
219 }
220 else
221 {
222 gtk_cell_renderer_set_visible (renderer, 1);
223 }
224 }
225 }
226 }
227 else
228 {
229 if (i == 0)
230 {
231 if (k > 0)
232 {
233 gtk_cell_renderer_set_visible (renderer, 1);
234 }
235 else
236 {
237 gtk_cell_renderer_set_visible (renderer, 0);
238 }
239 }
240 else
241 {
242 if (k > 0)
243 {
244 gtk_cell_renderer_set_visible (renderer, 0);
245 }
246 else
247 {
248 gtk_cell_renderer_set_visible (renderer, 1);
249 }
250 }
251 }
252}
253
266gchar * ring_atoms (project * this_proj, int ring, int step, int size, int rid, gboolean to_file)
267{
268 gchar * str;
269 int aid, sid;
270 aid = this_proj -> modelgl -> all_rings[ring][step][size][rid][0];
271 sid = this_proj -> atoms[step][aid].sp;
272 int i;
273 if (to_file)
274 {
275 str = g_strdup_printf ("%s%d", exact_name(this_proj -> chemistry -> label[sid]), aid+1);
276 for (i=1; i<size+1; i++)
277 {
278 aid = this_proj -> modelgl -> all_rings[ring][step][size][rid][i];
279 sid = this_proj -> atoms[step][aid].sp;
280 str = g_strdup_printf ("%s - %s%d", str, exact_name(this_proj -> chemistry -> label[sid]), aid+1);
281 }
282 }
283 else
284 {
285 str = g_strdup_printf ("%s<sub>%d</sub>", exact_name(this_proj -> chemistry -> label[sid]), aid+1);
286 for (i=1; i<size+1; i++)
287 {
288 aid = this_proj -> modelgl -> all_rings[ring][step][size][rid][i];
289 sid = this_proj -> atoms[step][aid].sp;
290 str = g_strdup_printf ("%s-%s<sub>%d</sub>", str, exact_name(this_proj -> chemistry -> label[sid]), aid+1);
291 }
292 }
293 return str;
294}
295
305void fill_rings_model (GtkTreeStore * store, project * this_proj, int rid)
306{
307 GtkTreeIter step_level, size_level, ring_level;
308 gchar * str;
309 int h, i, j, k, l;
310 if (this_proj -> coord -> totcoord[rid+4])
311 {
312 for (h=0; h < this_proj -> steps; h++)
313 {
314 if (this_proj -> steps > 1)
315 {
316 gtk_tree_store_append (store, & step_level, NULL);
317 gtk_tree_store_set (store, & step_level, 0, h+1,
318 1, 0,
319 2, 0,
320 3, 0,
321 4, 0,
322 5, 0,
323 6, 0, -1);
324 }
325 for (i=0; i < this_proj -> coord -> totcoord[rid+4]; i++)
326 {
327 j = this_proj -> coord -> geolist[rid+4][0][i];
328 k = this_proj -> modelgl -> num_rings[rid][h][j-1];
329 if (this_proj -> steps > 1 && k > 0)
330 {
331 gtk_tree_store_append (store, & size_level, & step_level);
332 gtk_tree_store_set (store, & size_level, 0, 0,
333 1, j,
334 2, 0,
335 3, 0,
336 4, 0,
337 5, 0,
338 6, 0, -1);
339 }
340 else if (this_proj -> steps == 1)
341 {
342 gtk_tree_store_append (store, & size_level, NULL);
343 gtk_tree_store_set (store, & size_level, 0, j,
344 1, 0,
345 2, 0,
346 3, 0,
347 4, 0,
348 5, 0, -1);
349 }
350 for (l=0; l<k; l++)
351 {
352 gtk_tree_store_append (store, & ring_level, & size_level);
353 str = ring_atoms (this_proj, rid, h, j-1, l, FALSE);
354 if (this_proj -> steps > 1)
355 {
356 gtk_tree_store_set (store, & ring_level, 0, -(h+1),
357 1, -j,
358 2, l+1,
359 3, FALSE,
360 4, this_proj -> modelgl -> show_rpoly[rid][h][j-1][l],
361 5, FALSE,
362 6, FALSE,
363 7, str, -1);
364 }
365 else
366 {
367 gtk_tree_store_set (store, & ring_level, 0, -j,
368 1, l+1,
369 2, FALSE,
370 3, this_proj -> modelgl -> show_rpoly[rid][h][j-1][l],
371 4, FALSE,
372 5, FALSE,
373 6, str, -1);
374 }
375 g_free (str);
376 }
377 }
378 }
379 }
380}
381
393void rings_set_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
394{
395 int steps = GPOINTER_TO_INT(data);
396 set_renderer_markup (mod, iter, renderer, (steps) ? 7 : 6);
397}
398
408GtkWidget * create_rings_tree (project * this_proj, int rid, gboolean fill_this)
409{
410 int i, j, k;
411 GtkTreeViewColumn * rings_col[7];
412 GtkCellRenderer * rings_cell[7];
413 gchar * ctitle[8]={i18n("MD step"), i18n("Ring(s) size"), i18n("Id."), i18n("Show"), i18n("Poly."), i18n("Label"), i18n("Pick"), i18n("Atoms")};
414 gchar * ctype[8]={"text", "text", "text", "active", "active", "active", "active", "text"};
415 GType col_type_ms[8]={G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING};
416 GType col_type_ss[7]={G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING};
417
418 coord_edition * coord = this_proj -> modelgl -> coord_win;
419
420 j = (this_proj -> steps > 1) ? 1: 0;
421 k = (this_proj -> steps > 1) ? 0: 1;
422 coord -> rings_model[rid] = gtk_tree_store_newv (7+j, (j) ? col_type_ms : col_type_ss);
423 if (fill_this) fill_rings_model (coord -> rings_model[rid], this_proj, rid);
424 GtkWidget * rings_tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(coord -> rings_model[rid]));
425 for (i=0; i<7+j; i++)
426 {
427 if (i < 2+j || i > 5+j)
428 {
429 rings_cell[i] = gtk_cell_renderer_text_new ();
430 }
431 else
432 {
433 rings_cell[i] = gtk_cell_renderer_toggle_new ();
434 g_signal_connect (G_OBJECT(rings_cell[i]), "toggled", G_CALLBACK(on_select_rings), & this_proj -> modelgl -> colorp[rid*10+i][0]);
435 }
436 gtk_cell_renderer_set_fixed_size (rings_cell[i], -1, 25);
437 rings_col[i] = gtk_tree_view_column_new_with_attributes (_(ctitle[i+k]), rings_cell[i], ctype[i+k], i, NULL);
438 gtk_tree_view_append_column(GTK_TREE_VIEW(rings_tree), rings_col[i]);
439 gtk_tree_view_column_set_alignment (rings_col[i], 0.5);
440 gtk_tree_view_column_set_cell_data_func (rings_col[i], rings_cell[i], rings_set_visible, & this_proj -> modelgl -> colorp[i][0], NULL);
441 if (i > 5+j) gtk_tree_view_column_set_cell_data_func (rings_col[i], rings_cell[i], rings_set_markup, GINT_TO_POINTER(j), NULL);
442 }
443
444 return rings_tree;
445}
446
455void add_this_ring_to_search_tree (project * this_proj, int rid)
456{
457 GtkTreeIter step_level, size_level, ring_level;
458 GtkTreeIter new_level;
459 coord_edition * coord = this_proj -> modelgl -> coord_win;
460 GtkTreeStore * store = (GtkTreeStore *) coord -> rings_model[rid];
461 GtkTreeModel * mod = GTK_TREE_MODEL(coord -> rings_model[rid]);
462 gboolean valid;
463 gboolean insert = TRUE;
464 gchar * str;
465 int f, h, i, j, k, l, m;
466 int prepend = 0;
467 if (this_proj -> steps > 1)
468 {
469 valid = gtk_tree_model_get_iter_first(mod, & step_level);
470 while (valid)
471 {
472 gtk_tree_model_get (mod, & step_level, 0, & f, -1);
473 if (f > coord -> rst[rid])
474 {
475 prepend = 1;
476 valid = FALSE;
477 }
478 else if (f == coord -> rst[rid])
479 {
480 if (gtk_tree_model_iter_has_child (mod, &step_level))
481 {
482 h = gtk_tree_model_iter_n_children (mod, &step_level);
483 for (i=0; i<h; i++)
484 {
485 if (gtk_tree_model_iter_nth_child (mod, &size_level, &step_level, i))
486 {
487 gtk_tree_model_get (mod, &size_level, 1, & j, -1);
488 if (j > coord -> rsz[rid])
489 {
490 prepend = 3;
491 valid = FALSE;
492 break;
493 }
494 else if (j == coord -> rsz[rid])
495 {
496 if (gtk_tree_model_iter_has_child (mod, &size_level))
497 {
498 k = gtk_tree_model_iter_n_children (mod, &size_level);
499 for (l=0; l<k; l++)
500 {
501 if (gtk_tree_model_iter_nth_child (mod, &ring_level, &size_level, l))
502 {
503 gtk_tree_model_get (mod, &ring_level, 2, & m, -1);
504 if (m > coord -> ri[rid])
505 {
506 prepend = 5;
507 valid = FALSE;
508 break;
509 }
510 else if (m == coord -> ri[rid])
511 {
512 insert = valid = FALSE;
513 break;
514 }
515 }
516 }
517 if (valid)
518 {
519 prepend = 4;
520 valid = FALSE;
521 break;
522 }
523 }
524 }
525 }
526 }
527 if (valid)
528 {
529 prepend = 2;
530 valid = FALSE;
531 }
532 }
533 }
534 else
535 {
536 valid = gtk_tree_model_iter_next(mod, & step_level);
537 }
538 }
539 if (insert)
540 {
541 str = ring_atoms (this_proj, rid, coord -> rst[rid]-1, coord -> rsz[rid]-1, coord -> ri[rid]-1, FALSE);
542 switch (prepend)
543 {
544 case 0:
545 gtk_tree_store_append (store, & step_level, NULL);
546 gtk_tree_store_set (store, & step_level, 0, coord -> rst[rid],
547 1, 0,
548 2, 0,
549 3, 0,
550 4, 0,
551 5, 0,
552 6, 0, -1);
553 gtk_tree_store_append (store, & size_level, & step_level);
554 gtk_tree_store_set (store, & size_level, 0, 0,
555 1, coord -> rsz[rid],
556 2, 0,
557 3, 0,
558 4, 0,
559 5, 0,
560 6, 0, -1);
561 gtk_tree_store_append (store, & ring_level, & size_level);
562 gtk_tree_store_set (store, & ring_level, 0, -coord -> rst[rid],
563 1, -coord -> rsz[rid],
564 2, coord -> ri[rid],
565 3, FALSE,
566 4, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
567 5, FALSE,
568 6, FALSE,
569 7, str, -1);
570 break;
571 case 1:
572 gtk_tree_store_insert_before (store, & new_level, NULL, & step_level);
573 gtk_tree_store_set (store, & new_level, 0, coord -> rst[rid],
574 1, 0,
575 2, 0,
576 3, 0,
577 4, 0,
578 5, 0,
579 6, 0, -1);
580 gtk_tree_store_append (store, & size_level, & new_level);
581 gtk_tree_store_set (store, & size_level, 0, 0,
582 1, coord -> rsz[rid],
583 2, 0,
584 3, 0,
585 4, 0,
586 5, 0,
587 6, 0, -1);
588 gtk_tree_store_append (store, & ring_level, & size_level);
589 gtk_tree_store_set (store, & ring_level, 0, -coord -> rst[rid],
590 1, -coord -> rsz[rid],
591 2, coord -> ri[rid],
592 3, FALSE,
593 4, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
594 5, FALSE,
595 6, FALSE,
596 7, str, -1);
597 break;
598 case 2:
599 gtk_tree_store_insert_after (store, & new_level, & step_level, & size_level);
600 gtk_tree_store_set (store, & new_level, 0, 0,
601 1, coord -> rsz[rid],
602 2, 0,
603 3, 0,
604 4, 0,
605 5, 0,
606 6, 0, -1);
607 gtk_tree_store_append (store, & ring_level, & new_level);
608 gtk_tree_store_set (store, & ring_level, 0, -coord -> rst[rid],
609 1, -coord -> rsz[rid],
610 2, coord -> ri[rid],
611 3, FALSE,
612 4, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
613 5, FALSE,
614 6, FALSE,
615 7, str, -1);
616 break;
617 case 3:
618 gtk_tree_store_insert_before (store, & new_level, & step_level, & size_level);
619 gtk_tree_store_set (store, & new_level, 0, 0,
620 1, coord -> rsz[rid],
621 2, 0,
622 3, 0,
623 4, 0,
624 5, 0,
625 6, 0, -1);
626 gtk_tree_store_append (store, & ring_level, & new_level);
627 gtk_tree_store_set (store, & ring_level, 0, -coord -> rst[rid],
628 1, -coord -> rsz[rid],
629 2, coord -> ri[rid],
630 3, FALSE,
631 4, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
632 5, FALSE,
633 6, FALSE,
634 7, str, -1);
635 break;
636 case 4:
637 gtk_tree_store_insert_after (store, & new_level, & size_level, & ring_level);
638 gtk_tree_store_set (store, & new_level, 0, -coord -> rst[rid],
639 1, -coord -> rsz[rid],
640 2, coord -> ri[rid],
641 3, FALSE,
642 4, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
643 5, FALSE,
644 6, FALSE,
645 7, str, -1);
646 break;
647 case 5:
648 gtk_tree_store_insert_before (store, & new_level, & size_level, & ring_level);
649 gtk_tree_store_set (store, & new_level, 0, -coord -> rst[rid],
650 1, -coord -> rsz[rid],
651 2, coord -> ri[rid],
652 3, FALSE,
653 4, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
654 5, FALSE,
655 6, FALSE,
656 7, str, -1);
657 break;
658 }
659 g_free (str);
660 }
661 }
662 else
663 {
664 valid = gtk_tree_model_get_iter_first(mod, & size_level);
665 while (valid)
666 {
667 gtk_tree_model_get (mod, & size_level, 0, & i, -1);
668 if (i > coord -> rsz[rid])
669 {
670 prepend = 1;
671 valid = FALSE;
672 }
673 else if (i == coord -> rsz[rid])
674 {
675 if (gtk_tree_model_iter_has_child (mod, &size_level))
676 {
677 j = gtk_tree_model_iter_n_children (mod, &size_level);
678 for (k=0; k<j; k++)
679 {
680 if (gtk_tree_model_iter_nth_child (mod, &ring_level, &size_level, k))
681 {
682 gtk_tree_model_get (mod, &ring_level, 1, & l, -1);
683 if (l > coord -> ri[rid])
684 {
685 prepend = 2;
686 valid = FALSE;
687 break;
688 }
689 else if (l == coord -> ri[rid])
690 {
691 insert = valid = FALSE;
692 break;
693 }
694 }
695 }
696 if (valid)
697 {
698 prepend = 3;
699 valid = FALSE;
700 }
701 }
702 }
703 else
704 {
705 valid = gtk_tree_model_iter_next(mod, & step_level);
706 }
707 }
708 if (insert)
709 {
710 str = ring_atoms (this_proj, rid, coord -> rst[rid]-1, coord -> rsz[rid]-1, coord -> ri[rid]-1, FALSE);
711 switch (prepend)
712 {
713 case 0:
714 gtk_tree_store_append (store, & size_level, NULL);
715 gtk_tree_store_set (store, & size_level, 0, coord -> rsz[rid],
716 1, 0,
717 2, 0,
718 3, 0,
719 4, 0,
720 5, 0, -1);
721 gtk_tree_store_append (store, & ring_level, & size_level);
722 gtk_tree_store_set (store, & ring_level, 0, -coord -> rsz[rid],
723 1, coord -> ri[rid],
724 2, FALSE,
725 3, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
726 4, FALSE,
727 5, FALSE,
728 6, str, -1);
729 break;
730 case 1:
731 gtk_tree_store_insert_before (store, & new_level, NULL, & size_level);
732 gtk_tree_store_set (store, & new_level, 0, coord -> rsz[rid],
733 1, 0,
734 2, 0,
735 3, 0,
736 4, 0,
737 5, 0, -1);
738 gtk_tree_store_append (store, & ring_level, & new_level);
739 gtk_tree_store_set (store, & ring_level, 0, -coord -> rsz[rid],
740 1, coord -> ri[rid],
741 2, FALSE,
742 3, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
743 4, FALSE,
744 5, FALSE,
745 6, str, -1);
746 break;
747 case 2:
748 gtk_tree_store_insert_before (store, & new_level, & size_level, & ring_level);
749 gtk_tree_store_set (store, & new_level, 0, -coord -> rsz[rid],
750 1, coord -> ri[rid],
751 2, FALSE,
752 3, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
753 4, FALSE,
754 5, FALSE,
755 6, str, -1);
756 break;
757 case 3:
758 gtk_tree_store_insert_after (store, & new_level, & size_level, & ring_level);
759 gtk_tree_store_set (store, & new_level, 0, -coord -> rsz[rid],
760 1, coord -> ri[rid],
761 2, FALSE,
762 3, this_proj -> modelgl -> show_rpoly[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1][coord -> ri[rid]-1],
763 4, FALSE,
764 5, FALSE,
765 6, str, -1);
766 break;
767 }
768 g_free (str);
769 }
770 }
771}
772
782int get_rmin (project * this_proj, int rid, int step)
783{
784 int i, j;
785 for (i=0; i<this_proj -> coord -> totcoord[rid+4]; i++)
786 {
787 j = this_proj -> coord -> geolist[rid+4][0][i];
788 if (this_proj -> modelgl -> num_rings[rid][step-1][j-1]) break;
789 }
790 return j;
791}
792
802int get_rmax (project * this_proj, int rid, int step)
803{
804 int i, j;
805 for (i=this_proj -> coord -> totcoord[rid+4]-1; i>-1; i--)
806 {
807 j = this_proj -> coord -> geolist[rid+4][0][i];
808 if (this_proj -> modelgl -> num_rings[rid][step-1][j-1]) break;
809 }
810 return j;
811}
812
821G_MODULE_EXPORT void update_rings_search (GtkEntry * res, gpointer data)
822{
823 tint * dat = (tint * )data;
824 gchar * str;
825 int i, j, k, v;
826 int rid;
827 const gchar * m = entry_get_text (res);
828 v = (int)string_to_double ((gpointer)m);
829 project * this_proj = get_project_by_id(dat -> a);
830 coord_edition * coord = this_proj -> modelgl -> coord_win;
831 for (i=0; i<5; i++)
832 {
833 if (i*10 > dat -> b) break;
834 }
835 rid = i - 1;
836 for (i=0; i<3; i++)
837 {
838 if (10*rid+i == dat -> b) break;
839 }
840 switch (i)
841 {
842 case 0:
843 if (v > 0 && v < this_proj -> steps+1)
844 {
845 if (v != coord -> rst[rid])
846 {
847 coord -> rst[rid] = v;
848 coord -> rsz[rid] = coord -> ri[rid] = -1;
849 for (j=1; j<3; j++) gtk_label_set_text (GTK_LABEL(coord -> rilab[rid][j]), "");
850 }
851 }
852 else
853 {
854 coord -> rst[rid] = coord -> rsz[rid] = coord -> ri[rid] = -1;
855 }
856 if (coord -> rst[rid] > 0)
857 {
858 update_entry_int(res, coord -> rst[rid]);
859 str = g_strdup_printf ("&#x2208; [%d - %d]", get_rmin(this_proj, rid, coord -> rst[rid]), get_rmax(this_proj, rid, coord -> rst[rid]));
860 gtk_label_set_text (GTK_LABEL(coord -> rilab[rid][1]), str);
861 g_free (str);
862 }
863 else
864 {
866 }
867 break;
868 case 1:
869 if (coord -> rst[rid] > -1)
870 {
871 j = get_rmin(this_proj, rid, coord -> rst[rid]);
872 k = get_rmax(this_proj, rid, coord -> rst[rid]);
873 if (v >= j && v <= k)
874 {
875 if (v != coord -> rsz[rid])
876 {
877 if (this_proj -> modelgl -> num_rings[rid][coord -> rst[rid]-1][v-1])
878 {
879 coord -> rsz[rid] = v;
880 coord -> ri[rid] = -1;
881 }
882 else
883 {
884 coord -> rsz[rid] = -1;
885 }
886 }
887 }
888 }
889 else
890 {
891 coord -> rsz[rid] = coord -> ri[rid] = -1;
892 }
893 if (coord -> rsz[rid] > 0)
894 {
895 update_entry_int(res, coord -> rsz[rid]);
896 str = g_strdup_printf ("&#x2208; [1 - %d]", this_proj -> modelgl -> num_rings[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1]);
897 gtk_label_set_text (GTK_LABEL(coord -> rilab[rid][2]), str);
898 g_free (str);
899 }
900 else
901 {
903 gtk_label_set_text (GTK_LABEL(coord -> rilab[rid][2]), "");
904 }
905 break;
906 case 2:
907 if (coord -> rst[rid] > -1 && coord -> rsz[rid] > -1)
908 {
909 if (v > 0 && v < this_proj -> modelgl -> num_rings[rid][coord -> rst[rid]-1][coord -> rsz[rid]-1]+1)
910 {
911 coord -> ri[rid] = v;
912 }
913 else
914 {
915 coord -> ri[rid] = -1;
916 }
917 }
918 else
919 {
920 coord -> ri[rid] = -1;
921 }
922 if (coord -> ri[rid] > 0)
923 {
924 update_entry_int(res, coord -> ri[rid]);
925 }
926 else
927 {
929 }
930 break;
931 }
932 if (coord -> rst[rid] > 0 && coord -> rsz[rid] > 0 && coord -> ri[rid] > 0)
933 {
934 add_this_ring_to_search_tree (this_proj, rid);
935 }
936}
937
946GtkWidget * create_rings_search (project * this_proj, int rid)
947{
948 GtkWidget * rings_search = create_vbox (BSEP);
949 gchar * str = g_strdup_printf (_("Too many <b>%s</b> rings in your model !\n"
950 " It is impossible to display the entire list ...\n"
951 "... instead you can look for ring(s) individually:\n"), _(rings_type[rid]));
952 add_box_child_start (GTK_ORIENTATION_VERTICAL, rings_search, markup_label(str, 200, -1, 0.5, 0.5), FALSE, FALSE, 10);
953 g_free (str);
954 gchar * search_item[3]={i18n("MD step:"), i18n("Ring size:"), i18n("Ring Id.:")};
955 int i, j;
956 GtkWidget * hbox;
957 GtkWidget * entry;
958 j = (this_proj -> steps) > 1 ? 0 : 1;
959 coord_edition * coord = this_proj -> modelgl -> coord_win;
960 coord -> rst[rid] = 1;
961 for (i=j; i<3; i++)
962 {
963 hbox = create_hbox (0);
964 add_box_child_start (GTK_ORIENTATION_VERTICAL, rings_search, hbox, FALSE, FALSE, 0);
965 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(search_item[i]), 100, -1, 0.0, 0.5), FALSE, FALSE, 20);
966 entry = create_entry (G_CALLBACK(update_rings_search), 100, 15, FALSE, & this_proj -> modelgl -> colorp[rid*10+i][0]);
967 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox,entry, FALSE, FALSE, 0);
968 if (i==0)
969 {
970 str = g_strdup_printf ("&#x2208; [1 - %d]", this_proj -> steps);
971 coord -> rilab[rid][i] = markup_label(str, 50, -1, 0.0, 0.5);
972 g_free (str);
973 }
974 else if (i == 1)
975 {
976 str = g_strdup_printf ("&#x2208; [%d - %d]", get_rmin(this_proj, rid, coord -> rst[rid]), get_rmax(this_proj, rid, coord -> rst[rid]));
977 coord -> rilab[rid][i] = markup_label(str, 50, -1, 0.0, 0.5);
978 g_free (str);
979 }
980 else
981 {
982 coord -> rilab[rid][i] = markup_label("", 50, -1, 0.0, 0.5);
983 }
984 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, coord -> rilab[rid][i], FALSE, FALSE, 5);
985 }
986 add_box_child_start (GTK_ORIENTATION_VERTICAL, rings_search, markup_label(_("<b>Search result(s)</b>"), 200, -1, 0.5, 0.5), FALSE, FALSE, 10);
987 add_box_child_start (GTK_ORIENTATION_VERTICAL, rings_search, create_rings_tree (this_proj, rid, FALSE), FALSE, FALSE, 0);
988 return rings_search;
989}
990
991#ifdef GTK4
1001G_MODULE_EXPORT void run_save_rings_to_file (GtkNativeDialog * info, gint response_id, gpointer data)
1002{
1003 GtkFileChooser * chooser = GTK_FILE_CHOOSER((GtkFileChooserNative *)info);
1004#else
1014G_MODULE_EXPORT void run_save_rings_to_file (GtkDialog * info, gint response_id, gpointer data)
1015{
1016 GtkFileChooser * chooser = GTK_FILE_CHOOSER((GtkWidget *)info);
1017#endif
1018 if (response_id == GTK_RESPONSE_ACCEPT)
1019 {
1020 gchar * rings_file = file_chooser_get_file_name (chooser);
1021 // Save data to file here !
1022 if (rings_file)
1023 {
1024 tint * dat = (tint *)data;
1025 project * this_proj = get_project_by_id (dat -> a);
1026 int rid = dat -> b;
1027 if (this_proj -> coord -> totcoord[rid+4])
1028 {
1029 FILE * fp = fopen (rings_file, dfi[1]);
1030 gchar * str;
1031 if (fp)
1032 {
1033 if (! rid)
1034 {
1035 fprintf (fp, _("# This file contains the list of all rings in the %s model\n\n"), prepare_for_title(this_proj -> name));
1036 }
1037 else
1038 {
1039 fprintf (fp, _("# This file contains the list of all %s rings in the %s model\n\n"), _(rtype[rid]), prepare_for_title(this_proj -> name));
1040 }
1041 int h, i, j, k, l;
1042 for (h=0; h < this_proj -> steps; h++)
1043 {
1044 i = h+1;
1045 if (this_proj -> steps > 1) fprintf (fp, _("Step N°%d\n"), i);
1046 for (i=0; i < this_proj -> coord -> totcoord[rid+4]; i++)
1047 {
1048 j = this_proj -> coord -> geolist[rid+4][0][i];
1049 fprintf (fp, (this_proj -> steps > 1) ? _("\n\tRing(s) of size %d atoms\n") : _("\nRing(s) of size %d atoms\n"), j);
1050 k = this_proj -> modelgl -> num_rings[rid][h][j-1];
1051 // ring size
1052 for (l=0; l<k; l++)
1053 {
1054 str = ring_atoms (this_proj, rid, h, j-1, l, TRUE);
1055 fprintf (fp, (this_proj -> steps > 1) ? "\t\tN°%d\t:\t%s\n" : "\tN°%d\t:\t%s\n", l+1, str);
1056 g_free (str);
1057 }
1058 }
1059 }
1060 fclose (fp);
1061 }
1062 else
1063 {
1064 str = g_strdup_printf (_("Impossible to open file: %s"), rings_file);
1065 show_error (str, 0, this_proj -> modelgl -> coord_win -> win);
1066 g_free (str);
1067 }
1068 }
1069 }
1070 }
1071#ifdef GTK4
1073#else
1074 destroy_this_dialog (info);
1075#endif
1076}
1077
1086G_MODULE_EXPORT void save_rings_to_file (GtkButton * but, gpointer data)
1087{
1088 tint * dat = (tint *) data;
1089#ifdef GTK4
1090 GtkFileChooserNative * info;
1091#else
1092 GtkWidget * info;
1093#endif
1094 gchar * crname = g_strdup_printf (_("Save atoms in %s rings to file"), _(rtype[dat -> b]));
1095 info = create_file_chooser (crname,
1096 GTK_WINDOW(MainWindow),
1097 GTK_FILE_CHOOSER_ACTION_SAVE,
1098 _("Save"));
1099 g_free (crname);
1100 GtkFileChooser * chooser = GTK_FILE_CHOOSER(info);
1101#ifdef GTK3
1102 gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE);
1103#endif
1105
1106 gchar * rings_file = g_strdup_printf ("%s-rings.dat", _(rtype[dat -> b]));
1107 gtk_file_chooser_set_current_name (chooser, rings_file);
1108 // g_free (rings_file);
1109#ifdef GTK4
1110 run_this_gtk_native_dialog ((GtkNativeDialog *)info, G_CALLBACK(run_save_rings_to_file), data);
1111#else
1112 run_this_gtk_dialog (info, G_CALLBACK(run_save_rings_to_file), data);
1113#endif
1114}
1115
1124GtkWidget * rings_tab (glwin * view, int rid)
1125{
1126 GtkWidget * rings = create_vbox (0);
1127 GtkWidget * scroll = create_scroll (rings, -1, -1, GTK_SHADOW_NONE);
1128 gtk_widget_set_hexpand (rings, TRUE);
1129 gtk_widget_set_vexpand (rings, TRUE);
1130 int h, i, j, k;
1131 project * this_proj = get_project_by_id(view -> proj);
1132 k = 0;
1133 for (h=0; h < this_proj -> steps; h++)
1134 {
1135 for (i=0; i < this_proj -> coord -> totcoord[rid+4]; i++)
1136 {
1137 j = this_proj -> coord -> geolist[rid+4][0][i];
1138 k += this_proj -> modelgl -> num_rings[rid][h][j-1];
1139 }
1140 }
1141 if (k < GTK_LIMIT)
1142 {
1143 add_container_child (CONTAINER_SCR, scroll, create_rings_tree (this_proj, rid, TRUE));
1144 }
1145 else
1146 {
1147 add_container_child (CONTAINER_SCR, scroll, create_rings_search (this_proj, rid));
1148 }
1149 GtkWidget * hbox = create_hbox (0);
1150 add_box_child_start (GTK_ORIENTATION_VERTICAL, rings, hbox, FALSE, FALSE, 2);
1151 GtkWidget * hhbox = create_hbox (0);
1152 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, TRUE, TRUE, 100);
1153 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, create_button(_("Save to file"), IMG_NONE, NULL, 50, -1, GTK_RELIEF_NORMAL, G_CALLBACK(save_rings_to_file), & view -> colorp[rid][0]), TRUE, TRUE, 40);
1154 return rings;
1155}
const gchar * dfi[2]
Definition main.c:93
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
color colorp[64]
ColRGBA col
Definition d_measures.c:77
int atoms[NUM_STYLES][2]
GtkTreePath * path
Definition datab.c:103
gchar * ctitle[MAXDATA][12]
Definition dlp_field.c:924
FILE * fp
char * rings_type[5]
Definition global.c:147
GtkWidget * MainWindow
Definition global.c:207
#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...
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:533
@ IMG_NONE
Definition global.h:276
void file_chooser_set_current_folder(GtkFileChooser *chooser)
set current folder in a GtkFilechooser
Definition gtk-misc.c:2358
#define GTK_LIMIT
maximum number of elements in GTK widgets like GtkTreeView, GtkTreeStore or similar rendering widgets...
Definition global.h:77
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1401
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2139
project * proj
gchar * file_chooser_get_file_name(GtkFileChooser *chooser)
get a file name from a GtkFileChooser (single file selected)
Definition gtk-misc.c:2306
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:652
#define BSEP
Definition global.h:261
void opengl_project_changed(int id)
change the OpenGL project
Definition update_p.c:296
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:669
G_MODULE_EXPORT void select_unselect_this_atom(GtkWidget *widg, gpointer data)
select / unselect this atom callback GTK3
Definition popup.c:1196
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_SCR
Definition global.h:267
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
G_MODULE_EXPORT void show_hide_this_atom(GtkWidget *widg, gpointer data)
show / hide this atom callback GTK3
Definition popup.c:1038
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 add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2235
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:726
gchar * prepare_for_title(gchar *init)
prepare a string for a window title, getting rid of all markup
Definition tools.c:71
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
GtkWidget * create_file_chooser(const gchar *title, GtkWindow *parent, GtkFileChooserAction act, const gchar *act_name)
create a GtkFileChooser, utility to select file(s)
Definition gtk-misc.c:2393
void destroy_this_native_dialog(GtkNativeDialog *dialog)
destroy a GtkNativeDialog
Definition gtk-misc.c:2254
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...
void re_create_md_shaders(int nshaders, int shaders[nshaders], project *this_proj)
re-initialize some MD dependent OpenGL shaders
gboolean pick
int step
Definition ogl_draw.c:76
shaders
The different types of shaders in the atomes program.
Definition glwin.h:88
@ LABEL
Definition glwin.h:98
@ RINGS
Definition glwin.h:96
Function declarations for the creation of the OpenGL window.
void show_error(char *error, int val, GtkWidget *win)
show error message
Definition interface.c:299
gchar * exact_name(gchar *name)
short cut to print string without spaces
Definition interface.c:434
Messaging function declarations.
Definition glwin.h:967
Definition global.h:118
void rings_set_visible(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
show / hide cell renderer in the ring search tree store
Definition w_rings.c:174
GtkWidget * res[2]
Definition w_encode.c:342
GtkWidget * create_rings_search(project *this_proj, int rid)
create the ring(s) search widget
Definition w_rings.c:946
void add_this_ring_to_search_tree(project *this_proj, int rid)
add ring in the search tree based on ring size and id
Definition w_rings.c:455
void rings_set_markup(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
Rings tree view set color and Pango markup in tree view.
Definition w_rings.c:393
GtkWidget * rings_tab(glwin *view, int rid)
create the ring(s) tab for the advanced environments window
Definition w_rings.c:1124
G_MODULE_EXPORT void run_save_rings_to_file(GtkDialog *info, gint response_id, gpointer data)
save rings data to file: run the dialog
Definition w_rings.c:1014
void fill_rings_model(GtkTreeStore *store, project *this_proj, int rid)
fill the entire ring(s) tree store
Definition w_rings.c:305
int get_rmin(project *this_proj, int rid, int step)
get ring(s) max size for the MD step
Definition w_rings.c:782
gchar * rtype[5]
Definition w_rings.c:61
G_MODULE_EXPORT void update_rings_search(GtkEntry *res, gpointer data)
update the ring(s) search widget
Definition w_rings.c:821
GtkWidget * create_rings_tree(project *this_proj, int rid, gboolean fill_this)
create the ring(s) search tree store
Definition w_rings.c:408
G_MODULE_EXPORT void on_select_rings(GtkCellRendererToggle *cell_renderer, gchar *string_path, gpointer data)
on select ring toggle callback
Definition w_rings.c:72
gchar * ring_atoms(project *this_proj, int ring, int step, int size, int rid, gboolean to_file)
Definition w_rings.c:266
void rings_set_visible(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
show / hide cell renderer in the ring search tree store
Definition w_rings.c:174
int get_rmax(project *this_proj, int rid, int step)
get ring(s) min size for the MD step
Definition w_rings.c:802
G_MODULE_EXPORT void save_rings_to_file(GtkButton *but, gpointer data)
save rings data to file
Definition w_rings.c:1086
GtkWidget * hbox
Definition workspace.c:71