atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
preferences.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-2025 by CNRS and University of Strasbourg */
15
22/*
23* This file: 'configuration.c'
24*
25* Contains:
26*
27
28 - The GUI for the general configuration window
29 - The associated controllers
30
31*
32* List of functions:
33
34 int xml_save_color_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, ColRGBA col);
35 int xml_save_xyz_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, vec3_t data);
36 int xml_save_parameter_to_file (xmlTextWriterPtr writer, gchar * xml_leg, gchar * xml_key, gboolean doid, int xml_id, gchar * value);
37 int save_preferences_to_xml_file ();
38
39 ColRGBA get_spec_color (int z, , element_color * clist);
40
41 gboolean are_identical_colors (ColRGBA col_a, ColRGBA col_b);
42 gboolean not_in_cutoffs (int z_a, int z_b);
43
44 float get_radius (int object, int col, int z, element_radius * rad_list);
45
46 double xml_string_to_double (gchar * content);
47
48 G_MODULE_EXPORT gboolean pref_color_button_event (GtkWidget * widget, GdkEventButton * event, gpointer data);
49
50 bond_cutoff * duplicate_cutoffs (bond_cutoff * old_cutoff);
51 element_radius * duplicate_element_radius (element_radius * old_list);
52 element_color * duplicate_element_color (element_color * old_list);
53
54 void set_parameter (gchar * content, gchar * key, int vid, dint * bond, vec3_t * vect, float start, float end, ColRGBA * col);
55 void read_parameter (xmlNodePtr parameter_node);
56 void read_light (xmlNodePtr light_node);
57 void read_preferences (xmlNodePtr preference_node);
58 void read_style_from_xml_file (xmlNodePtr style_node, int style);
59 void read_preferences_from_xml_file ();
60 void set_atomes_defaults ();
61 void set_atomes_preferences ();
62 void color_set_color (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
63 void radius_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
64 void color_button_event (GtkWidget * widget, double event_x, double event_y, guint event_button, gpointer data);
65 void add_cut_box ();
66 void clean_all_tmp ();
67 void duplicate_rep_data (rep_data * new_rep, rep_data * old_rep);
68 void duplicate_background_data (background * new_back, background * old_back);
69 void duplicate_box_data (box * new_box, box * old_box);
70 void duplicate_axis_data (axis * new_axis, axis * old_axis);
71 void prepare_tmp_default ();
72 void save_preferences ();
73 void adjust_preferences_window ();
74 void create_configuration_dialog ();
75 void add_global_option (GtkWidget * vbox, tint * oid);
76
77 G_MODULE_EXPORT void set_measures (GtkComboBox * box, gpointer data);
78 G_MODULE_EXPORT void set_selection_color (GtkColorChooser * colob, gpointer data);
79 G_MODULE_EXPORT void toggled_default_stuff (GtkCheckButton * but, gpointer data);
80 G_MODULE_EXPORT void toggled_default_stuff (GtkToggleButton * but, gpointer data);
81 G_MODULE_EXPORT void set_default_stuff (GtkEntry * res, gpointer data);
82 G_MODULE_EXPORT void edit_pref (GtkCellRendererText * cell, gchar * path_string, gchar * new_text, gpointer user_data);
83 G_MODULE_EXPORT void edit_chem_preferences (GtkDialog * edit_chem, gint response_id, gpointer data);
84 G_MODULE_EXPORT void run_ac_color (GtkDialog * win, gint response_id, gpointer data);
85 G_MODULE_EXPORT void pref_color_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
86 G_MODULE_EXPORT void set_stuff_color (GtkColorChooser * colob, gpointer data);
87 G_MODULE_EXPORT void edit_species_parameters (GtkButton * but, gpointer data);
88 G_MODULE_EXPORT void set_default_style (GtkComboBox * box, gpointer data);
89 G_MODULE_EXPORT void set_default_map (GtkComboBox * box, gpointer data);
90 G_MODULE_EXPORT void set_default_num_delta (GtkEntry * res, gpointer data);
91 G_MODULE_EXPORT void tunit_changed (GtkComboBox * box, gpointer data);
92 G_MODULE_EXPORT void edit_pc_value (GtkEntry * res, gpointer data);
93 G_MODULE_EXPORT void toggle_use_cutoff (GtkCheckButton * but, gpointer data);
94 G_MODULE_EXPORT void toggle_use_cutoff (GtkToggleButton * but, gpointer data);
95 G_MODULE_EXPORT void totcut_changed (GtkComboBox * box, gpointer data);
96 G_MODULE_EXPORT void cut_spec_changed (GtkComboBox * box, gpointer data);
97 G_MODULE_EXPORT void set_cutoffs_default (GtkButton * but, gpointer data);
98 G_MODULE_EXPORT void update_projects (GtkDialog * proj_sel, gint response_id, gpointer data);
99 G_MODULE_EXPORT void toggle_select_project (GtkCheckButton * but, gpointer data);
100 G_MODULE_EXPORT void toggle_select_project (GtkToggleButton * but, gpointer data);
101 G_MODULE_EXPORT void restore_all_defaults (GtkButton * but, gpointer data);
102 G_MODULE_EXPORT void edit_preferences (GtkDialog * edit_prefs, gint response_id, gpointer data);
103 G_MODULE_EXPORT void set_default_options (GtkButton * but, gpointer data);
104
105 GtkWidget * pref_list (gchar * mess[2], int nelem, gchar * mlist[nelem][2], gchar * end);
106 GtkWidget * view_preferences ();
107 GtkWidget * over_param (int object, int style);
108 GtkWidget * style_tab (int style);
109 GtkWidget * model_preferences ();
110 GtkWidget * combo_map (int obj);
111 GtkWidget * opengl_preferences ();
112 GtkWidget * calc_preferences ();
113
114 GtkTreeModel * style_combo_tree ();
115
116*/
117
118#include "global.h"
119#include "callbacks.h"
120#include "interface.h"
121#include "project.h"
122#include "workspace.h"
123#include "glview.h"
124#include "glwin.h"
125#include "bind.h"
126#include "preferences.h"
127#include <libxml/encoding.h>
128#include <libxml/xmlwriter.h>
129#include <libxml/xmlreader.h>
130#include <libxml/parser.h>
131#include <unistd.h>
132#include <sys/types.h>
133
134#ifndef G_OS_WIN32
135#include <pwd.h>
136#else
137#include <errno.h>
138#endif
139
140extern void apply_default_parameters_to_project (project * this_proj);
141extern xmlNodePtr findnode (xmlNodePtr startnode, char * nname);
142extern int search_type;
143extern void edit_bonds (GtkWidget * vbox);
144extern void calc_rings (GtkWidget * vbox);
145extern gchar * substitute_string (gchar * init, gchar * o_motif, gchar * n_motif);
146extern G_MODULE_EXPORT gboolean scroll_scale_quality (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
147extern GtkWidget * materials_tab (glwin * view, opengl_edition * ogl_edit, Material * the_mat);
148extern GtkWidget * lights_tab (glwin * view, opengl_edition * ogl_edit, Lightning * the_light);
149extern GtkWidget * fog_tab (glwin * view, opengl_edition * ogl_edit, Fog * the_fog);
150extern GtkWidget * labels_tab (glwin * view, int lid);
151extern void update_light_data (int li, opengl_edition * ogl_win);
152extern void setup_fog_dialogs (opengl_edition * ogl_edit, int fid);
153extern G_MODULE_EXPORT void box_advanced (GtkWidget * widg, gpointer data);
154extern G_MODULE_EXPORT void axis_advanced (GtkWidget * widg, gpointer data);
155extern G_MODULE_EXPORT void representation_advanced (GtkWidget * widg, gpointer data);
156extern void update_gradient_widgets (gradient_edition * gradient_win, background * back);
157extern G_MODULE_EXPORT void gradient_advanced (GtkWidget * widg, gpointer data);
158extern G_MODULE_EXPORT void scale_quality (GtkRange * range, gpointer data);
159extern void duplicate_fog (Fog * new_fog, Fog * old_fog);
160extern void duplicate_material (Material * new_mat, Material * old_mat);
161extern void duplicate_screen_label (screen_label * new_lab, screen_label * old_lab);
162extern Light init_light_source (int type, float val, float vbl);
163extern Light * copy_light_sources (int dima, int dimb, Light * old_sp);
164extern GtkWidget * lightning_fix (glwin * view, Material * this_material);
165extern GtkWidget * adv_box (GtkWidget * box, char * lab, int vspace, int size, float xalign);
166extern float mat_min_max[5][2];
167extern gchar * ogl_settings[3][10];
168
169GtkWidget * atom_entry_over[8];
170GtkWidget * bond_entry_over[6];
171GtkWidget * meas_combo;
172GtkWidget * meas_box[2];
173GtkWidget * sel_combo;
174GtkWidget * sel_box[2];
175GtkWidget * preference_notebook = NULL;
176
181int * default_num_delta = NULL;
182int * tmp_num_delta = NULL;
183double * default_delta_t = NULL;
184double * tmp_delta_t = NULL;
185
186int * default_rsparam = NULL;
194int * tmp_rsparam = NULL;
195int * default_csparam = NULL;
203int * tmp_csparam = NULL;
204
205// 5+3 styles + 5+3 cloned styles
208// 3 styles + 3 cloned styles
211// atoms + clones
216
218
219int * default_opengl = NULL;
220int * tmp_opengl = NULL;
227
228// Model
230gboolean tmp_clones;
232gboolean tmp_cell;
234gboolean * tmp_o_at_rs;
236double * tmp_at_rs;
238gboolean * tmp_o_bd_rw;
240double * tmp_bd_rw;
241
246gboolean default_mtilt[2];
247gboolean tmp_mtilt[2];
253double tmp_mwidth[2];
254
262box * tmp_box = NULL;
265axis * tmp_axis = NULL;
269
270gboolean preferences = FALSE;
272gchar * pref_error = NULL;
273
275
276gchar * xml_style_leg[6] = {"ball_and_stick", "wireframes", "spacefilled", "spheres", "cylinders", "dots"};
277gchar * xml_filled_leg[4] = {"covalent", "ionic", "van-der-waals", "crystal"};
278gchar * xml_atom_leg[3] = {"atoms_radius", "dot_size", "sphere_radius"};
279gchar * xml_bond_leg[3] = {"bond_radius", "wireframe_width", "cylinder_radius"};
280
291int xml_save_color_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, ColRGBA col)
292{
293 int rc;
294 gchar * str;
295 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
296 if (rc < 0) return 0;
297 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST legend);
298 if (rc < 0) return 0;
299 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST key);
300 if (rc < 0) return 0;
301 if (did > -1)
302 {
303 str = g_strdup_printf ("%d", did);
304 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST str);
305 g_free (str);
306 if (rc < 0) return 0;
307 }
308 str = g_strdup_printf ("%f", col.red);
309 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"red", BAD_CAST str);
310 g_free (str);
311 if (rc < 0) return 0;
312 str = g_strdup_printf ("%f", col.green);
313 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"green", BAD_CAST str);
314 g_free (str);
315 if (rc < 0) return 0;
316 str = g_strdup_printf ("%f", col.blue);
317 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"blue", BAD_CAST str);
318 g_free (str);
319 if (rc < 0) return 0;
320 str = g_strdup_printf ("%f", col.alpha);
321 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"alpha", BAD_CAST str);
322 g_free (str);
323 if (rc < 0) return 0;
324 rc = xmlTextWriterEndElement (writer);
325 if (rc < 0) return 0;
326 return 1;
327}
328
339int xml_save_xyz_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, vec3_t data)
340{
341 int rc;
342 gchar * str;
343 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
344 if (rc < 0) return 0;
345 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST legend);
346 if (rc < 0) return 0;
347 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST key);
348 if (rc < 0) return 0;
349 if (did > -1)
350 {
351 str = g_strdup_printf ("%d", did);
352 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST str);
353 g_free (str);
354 if (rc < 0) return 0;
355 }
356 str = g_strdup_printf ("%f", data.x);
357 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"x", BAD_CAST str);
358 g_free (str);
359 if (rc < 0) return 0;
360 str = g_strdup_printf ("%f", data.y);
361 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"y", BAD_CAST str);
362 g_free (str);
363 if (rc < 0) return 0;
364 str = g_strdup_printf ("%f", data.z);
365 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"z", BAD_CAST str);
366 g_free (str);
367 if (rc < 0) return 0;
368 rc = xmlTextWriterEndElement (writer);
369 if (rc < 0) return 0;
370 return 1;
371}
372
385int xml_save_parameter_to_file (xmlTextWriterPtr writer, gchar * xml_leg, gchar * xml_key, gboolean doid, int xml_id, gchar * value)
386{
387 int rc;
388 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
389 if (rc < 0) return 0;
390 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"info", BAD_CAST xml_leg);
391 if (rc < 0) return 0;
392 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST xml_key);
393 if (rc < 0) return 0;
394 if (doid)
395 {
396 gchar * str;
397 str = g_strdup_printf ("%d", xml_id);
398 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST (const xmlChar *)str);
399 g_free (str);
400 if (rc < 0) return 0;
401 }
402 rc = xmlTextWriterWriteFormatString (writer, "%s", value);
403 if (rc < 0) return 0;
404 rc = xmlTextWriterEndElement (writer);
405 if (rc < 0) return 0;
406 return 1;
407}
408
415{
416 int rc;
417 pref_error = NULL;
419 {
420#ifdef G_OS_WIN32
421 if (! CreateDirectory(ATOMES_CONFIG_DIR, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
422 {
423 pref_error = g_strdup_printf ("Error: impossible to create %s (code: %lu)\n", ATOMES_CONFIG_DIR, GetLastError());
424 return 0;
425 }
426#else
427 if (mkdir(ATOMES_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IRWXO) && errno != EEXIST)
428 {
429 pref_error = g_strdup_printf ("Error: impossible to create %s (code: %s)\n", ATOMES_CONFIG_DIR, strerror(errno));
430 return 0;
431 }
432#endif
433 }
434 xmlTextWriterPtr writer;
435
436 gchar * xml_delta_num_leg[8] = {"g(r): number of δr", "s(q): number of δq", "s(k): number of δk", "g(r) FFT: number of δr",
437 "Dij: number of δr [min(Dij)-max(Dij)]", "Angles distribution: number of δθ [0-180°]",
438 "Spherical harmonics: l(max) in [2-40]", "MSD: steps between configurations"};
439 gchar * xml_delta_t_leg[2] = {"MSD: time steps δt", "MSD: time unit"};
440 gchar * xml_rings_leg[7] = {"Default search",
441 "Atom(s) to initiate the search from",
442 "Maximum size for a ring",
443 "Maximum number of rings of size n per MD step",
444 "Only search for ABAB rings",
445 "No homopolar bonds in the rings (A-A, B-B ...)",
446 "No homopolar bonds in the connectivity matrix"};
447 gchar * xml_chain_leg[7] = {"Atom(s) to initiate the search from",
448 "Maximum size for a ring",
449 "Maximum number of rings of size n per MD step",
450 "Only search for AAAA chains",
451 "Only search for ABAB chains",
452 "No homopolar bonds in the chains (A-A, B-B ...)",
453 "Only search for 1-(2)n-1 chains"};
454 gchar * xml_opengl_leg[4] = {"Default style",
455 "Atom(s) color map",
456 "Polyhedra color map",
457 "Quality"};
458 gchar * xml_material_leg[8] = {"Predefine material",
459 "Lightning model",
460 "Metallic",
461 "Roughness",
462 "Back lightning",
463 "Gamma",
464 "Opacity",
465 "Albedo"};
466 gchar * xml_lightning_leg[7] = {"Type",
467 "Fix",
468 "Position",
469 "Direction",
470 "Intensity",
471 "Attenuation",
472 "Spot specifics"};
473 gchar * xml_fog_leg[5] = {"Mode",
474 "Type",
475 "Density",
476 "Depth",
477 "Color"};
478 gchar * xml_model_leg[2] = {"Show clones",
479 "Show box"};
480 gchar * xml_label_leg[6] = {"Position",
481 "Rendering" ,
482 "Scaling",
483 "Font",
484 "Shift",
485 "Colors"};
486 gchar * xml_axis_leg[3] = {"Legend on x",
487 "Legend on y",
488 "Legend on z"};
489
490 /* Create a new XmlWriter for ATOMES_CONFIG, with no compression. */
491 writer = xmlNewTextWriterFilename (ATOMES_CONFIG, 0);
492 if (writer == NULL) return 0;
493 rc = xmlTextWriterSetIndent(writer, 1);
494 if (rc < 0) return 0;
495 /* Start the document with the xml default for the version,
496 * encoding MY_ENCODING and the default for the standalone
497 * declaration. */
498 rc = xmlTextWriterStartDocument (writer, NULL, MY_ENCODING, NULL);
499 if (rc < 0) return 0;
500
501 rc = xmlTextWriterWriteComment (writer, (const xmlChar *)"atomes preferences XML file");
502 if (rc < 0) return 0;
503
504 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atomes_preferences-xml");
505 if (rc < 0) return 0;
506
507 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"analysis");
508 if (rc < 0) return 0;
509 int i, j, k, l, m, n, o;
510 gchar * str;
511
513 {
514 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"cutoffs");
515 if (rc < 0) return 0;
516 if (default_totcut > 0.0)
517 {
518 str = g_strdup_printf ("%lf", default_totcut);
519 rc = xml_save_parameter_to_file (writer, "Total cutoff", "default_totcut", TRUE, 0, str);
520 g_free (str);
521 if (! rc) return 0;
522 }
524 {
525 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"partials");
526 if (rc < 0) return 0;
528 while (tmp_cut)
529 {
530 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
531 if (rc < 0) return 0;
532 str = g_strdup_printf ("cutoff %s-%s", periodic_table_info[tmp_cut -> Z[0]].lab, periodic_table_info[tmp_cut -> Z[1]].lab);
533 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST str);
534 g_free (str);
535 if (rc < 0) return 0;
536 str = g_strdup_printf ("%d", tmp_cut -> Z[0]);
537 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"α", BAD_CAST str);
538 g_free (str);
539 if (rc < 0) return 0;
540 str = g_strdup_printf ("%d", tmp_cut -> Z[1]);
541 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"β", BAD_CAST str);
542 g_free (str);
543 if (rc < 0) return 0;
544 str = g_strdup_printf ("%lf", tmp_cut -> cutoff);
545 rc = xmlTextWriterWriteFormatString (writer, "%s", str);
546 g_free (str);
547 if (rc < 0) return 0;
548 rc = xmlTextWriterEndElement (writer);
549 if (rc < 0) return 0;
550 tmp_cut = tmp_cut -> next;
551 }
552 rc = xmlTextWriterEndElement (writer);
553 if (rc < 0) return 0;
554 }
555 rc = xmlTextWriterEndElement (writer);
556 if (rc < 0) return 0;
557 }
558
559 for (i=0; i<8; i++)
560 {
561 str = g_strdup_printf ("%d", default_num_delta[i]);
562 rc = xml_save_parameter_to_file (writer, xml_delta_num_leg[i], "default_num_delta", TRUE, i, str);
563 g_free (str);
564 if (! rc) return 0;
565 }
566 // Delta t
567 for (i=0; i<2; i++)
568 {
569 str = g_strdup_printf ("%f", default_delta_t[i]);
570 rc = xml_save_parameter_to_file (writer, xml_delta_t_leg[i], "default_delta_t", TRUE, i, str);
571 g_free (str);
572 if (! rc) return 0;
573 }
574 // Rings
575 for (i=0; i<7; i++)
576 {
577 str = g_strdup_printf ("%d", default_rsparam[i]);
578 rc = xml_save_parameter_to_file (writer, xml_rings_leg[i], "default_rsparam", TRUE, i, str);
579 g_free (str);
580 if (! rc) return 0;
581 }
582 // Chains
583 for (i=0; i<7; i++)
584 {
585 str = g_strdup_printf ("%d", default_csparam[i]);
586 rc = xml_save_parameter_to_file (writer, xml_chain_leg[i], "default_csparam", TRUE, i, str);
587 g_free (str);
588 if (! rc) return 0;
589 }
590
591 // End analysis
592 rc = xmlTextWriterEndElement (writer);
593 if (rc < 0) return 0;
594
595 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"opengl");
596 if (rc < 0) return 0;
597 for (i=0; i<4; i++)
598 {
599
600 str = g_strdup_printf ("%d", default_opengl[i]);
601 rc = xml_save_parameter_to_file (writer, xml_opengl_leg[i], "default_opengl", TRUE, i, str);
602 g_free (str);
603 if (! rc) return 0;
604 }
605
606 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"material");
607 if (rc < 0) return 0;
608
609 str = g_strdup_printf ("%d", default_material.predefine);
610 rc = xml_save_parameter_to_file (writer, xml_material_leg[0], "default_material", TRUE, -1, str);
611 g_free (str);
612 if (! rc) return 0;
613
614 for (i=0; i<6; i++)
615 {
616 str = g_strdup_printf ("%f", default_material.param[i]);
617 rc = xml_save_parameter_to_file (writer, xml_material_leg[i+1], "default_material", TRUE, i, str);
618 g_free (str);
619 if (! rc) return 0;
620 }
621
622 rc = xml_save_xyz_to_file (writer, 6, xml_material_leg[7], "default_material", default_material.albedo);
623 if (! rc) return rc;
624
625 // End material
626 rc = xmlTextWriterEndElement (writer);
627 if (rc < 0) return 0;
628
629 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"lightning");
630 if (rc < 0) return 0;
631
632 str = g_strdup_printf ("%d", default_lightning.lights);
633 rc = xml_save_parameter_to_file (writer, "Number of lights", "default_lightning", TRUE, 0, str);
634 g_free (str);
635 if (! rc) return 0;
636
637 for (i=0; i<default_lightning.lights; i++)
638 {
639 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"light");
640 if (rc < 0) return 0;
641 str = g_strdup_printf ("%d", i);
642 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST (const xmlChar *)str);
643 g_free (str);
644 if (rc < 0) return 0;
645
646 str = g_strdup_printf ("%d", default_lightning.spot[i].type);
647 rc = xml_save_parameter_to_file (writer, xml_lightning_leg[0], "light.type", FALSE, 0, str);
648 g_free (str);
649 if (! rc) return 0;
650 str = g_strdup_printf ("%d", default_lightning.spot[i].fix);
651 rc = xml_save_parameter_to_file (writer, xml_lightning_leg[1], "light.fix", FALSE, 0, str);
652 g_free (str);
653 if (! rc) return 0;
654
656 {
657 rc = xml_save_xyz_to_file (writer, -1, xml_lightning_leg[2], "light.position", default_lightning.spot[i].position);
658 if (! rc) return rc;
659 }
660 if (default_lightning.spot[i].type != 1)
661 {
662 rc = xml_save_xyz_to_file (writer, -1, xml_lightning_leg[3], "light.direction", default_lightning.spot[i].direction);
663 if (! rc) return rc;
664 }
665 rc = xml_save_xyz_to_file (writer, -1, xml_lightning_leg[4], "light.intensity", default_lightning.spot[i].intensity);
666 if (! rc) return rc;
668 {
669 rc = xml_save_xyz_to_file (writer, -1, xml_lightning_leg[5], "light.attenuation", default_lightning.spot[i].attenuation);
670 if (! rc) return rc;
671 rc = xml_save_xyz_to_file (writer, -1, xml_lightning_leg[6], "light.spot", default_lightning.spot[i].spot_data);
672 if (! rc) return rc;
673 }
674 rc = xmlTextWriterEndElement (writer);
675 if (rc < 0) return 0;
676 }
677
678 // End lightning
679 rc = xmlTextWriterEndElement (writer);
680 if (rc < 0) return 0;
681
682 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"fog");
683 if (rc < 0) return 0;
684 // Mode
685 str = g_strdup_printf ("%d", default_fog.mode);
686 rc = xml_save_parameter_to_file (writer, xml_fog_leg[0], "fog.mode", TRUE, 0, str);
687 g_free (str);
688 if (! rc) return 0;
689 // Type
690 str = g_strdup_printf ("%d", default_fog.based);
691 rc = xml_save_parameter_to_file (writer, xml_fog_leg[1], "fog.type", TRUE, 1, str);
692 g_free (str);
693 if (! rc) return 0;
694 // Density
695 str = g_strdup_printf ("%f", default_fog.density);
696 rc = xml_save_parameter_to_file (writer, xml_fog_leg[2], "fog.density", TRUE, 2, str);
697 g_free (str);
698 if (! rc) return 0;
699 // Depth
700 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
701 if (rc < 0) return 0;
702 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"info", BAD_CAST xml_fog_leg[3]);
703 if (rc < 0) return 0;
704 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST "fog.depth");
705 if (rc < 0) return 0;
706 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST "3");
707 if (rc < 0) return 0;
708 str = g_strdup_printf ("%f", default_fog.depth[0]);
709 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"start", BAD_CAST str);
710 g_free (str);
711 if (rc < 0) return 0;
712 str = g_strdup_printf ("%f", default_fog.depth[1]);
713 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"end", BAD_CAST str);
714 g_free (str);
715 if (rc < 0) return 0;
716 rc = xmlTextWriterEndElement (writer);
717 if (rc < 0) return 0;
718 // Color
719 rc = xml_save_xyz_to_file (writer, 4, xml_fog_leg[4], "fog.color", default_fog.color);
720 if (! rc) return rc;
721 // End fog
722 rc = xmlTextWriterEndElement (writer);
723 if (rc < 0) return 0;
724
725 // End opengl
726 rc = xmlTextWriterEndElement (writer);
727 if (rc < 0) return 0;
728
729 // Model
730 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"model");
731 if (rc < 0) return 0;
732
733 if (default_clones)
734 {
735 str = g_strdup_printf ("%d", default_clones);
736 rc = xml_save_parameter_to_file (writer, xml_model_leg[0], "default_clones", FALSE, 0, str);
737 g_free (str);
738 if (! rc) return 0;
739 }
740 if (! default_cell)
741 {
742 str = g_strdup_printf ("%d", default_cell);
743 rc = xml_save_parameter_to_file (writer, xml_model_leg[1], "default_cell", FALSE, 0, str);
744 g_free (str);
745 if (! rc) return 0;
746 }
747 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atoms_and_bonds");
748 if (rc < 0) return 0;
749
750 element_radius * tmp_rad;
751 gboolean do_atoms;
752 gboolean do_bonds;
753 gchar * str_a, * str_b;
754 for (i=0; i<OGL_STYLES; i++)
755 {
756 do_atoms = do_bonds = FALSE;
757 if (i != 4)
758 {
759 j = (i < 4) ? i : 4;
760 if (default_o_at_rs[j] || default_o_at_rs[j+5]) do_atoms = TRUE;
761 if (default_atomic_rad[j] || default_atomic_rad[j+5]) do_atoms = TRUE;
762 if (! do_atoms)
763 {
764 if (j == 2)
765 {
766 for (k=0; k<3; k++)
767 {
768 if (default_atomic_rad[10+k] || default_atomic_rad[13+k]) do_atoms = TRUE;
769 }
770 }
771 }
772 }
773 if (i != 2 && i != 3 && i != 5)
774 {
775 j = (i < 2) ? i : 2;
776 if (default_o_bd_rw[j] || default_o_bd_rw[j+3]) do_bonds = TRUE;
777 if (default_bond_rad[j] || default_bond_rad[j+3]) do_bonds = TRUE;
778 }
779 if (do_atoms || do_bonds)
780 {
781 rc = xmlTextWriterStartElement (writer, BAD_CAST xml_style_leg[i]);
782 if (rc < 0) return 0;
783 if (do_atoms)
784 {
785 j = (i < 4) ? i : 4;
786 k = (j == 0 || j == 2) ? 0 : (j == 1 || j == 4) ? 1 : 2;
787 for (l=0; l<2; l++)
788 {
789 if (default_o_at_rs[j+l*5])
790 {
791 str_a = (l) ? g_strdup_printf ("clone-%s", xml_atom_leg[k]) : g_strdup_printf ("%s", xml_atom_leg[k]);
792 str_b = g_strdup_printf ("%f", default_at_rs[j+l*5]);
793 rc = xml_save_parameter_to_file (writer, str_a, "default_at_rs", TRUE, j+l*5, str_b);
794 g_free (str_a);
795 g_free (str_b);
796 if (! rc) return 0;
797 }
798 }
799 l = (j == 2) ? 4 : 1;
800 for (m=0; m < l; m++)
801 {
802 n = (m) ? 7 : 0;
803 for (o= 0; o<2; o++)
804 {
805 n = (o && m) ? 5 : n;
806 if (default_atomic_rad[j+n+5*o+m])
807 {
808 str_a = (o) ? g_strdup_printf ("clone-%s", (j == 2) ? xml_filled_leg[m] : xml_atom_leg[k]) : g_strdup_printf ("%s", (j == 2) ? xml_filled_leg[m] : xml_atom_leg[k]);
809 rc = xmlTextWriterStartElement (writer, BAD_CAST str_a);
810 g_free (str_a);
811 if (rc < 0) return 0;
812 tmp_rad = default_atomic_rad[j+n+5*o+m];
813 while (tmp_rad)
814 {
815 str = g_strdup_printf ("%f", tmp_rad -> rad);
816 rc = xml_save_parameter_to_file (writer, periodic_table_info[tmp_rad -> Z].lab, "default_atomic_rad", TRUE, tmp_rad -> Z, str);
817 g_free (str);
818 if (! rc) return 0;
819 tmp_rad = tmp_rad -> next;
820 }
821 rc = xmlTextWriterEndElement (writer);
822 if (rc < 0) return 0;
823 }
824 }
825 }
826 }
827 if (do_bonds)
828 {
829 j = (i < 2) ? i : 2;
830 for (k=0; k<2; k++)
831 {
832 if (default_o_bd_rw[j+k*3])
833 {
834 str_a = (k) ? g_strdup_printf ("clone-%s", xml_bond_leg[j]) : g_strdup_printf ("%s", xml_bond_leg[j]);
835 str_b = g_strdup_printf ("%f", default_bd_rw[j+k*3]);
836 rc = xml_save_parameter_to_file (writer, str_a, "default_bd_rw", TRUE, j+k*3, str_b);
837 g_free (str_a);
838 g_free (str_b);
839 if (! rc) return 0;
840 }
841 if (default_bond_rad[j+k*3])
842 {
843 str_a = (k) ? g_strdup_printf ("clone-%s", xml_bond_leg[j]) : g_strdup_printf ("%s", xml_bond_leg[j]);
844 rc = xmlTextWriterStartElement (writer, BAD_CAST str_a);
845 g_free (str_a);
846 if (rc < 0) return 0;
847 tmp_rad = default_bond_rad[j+k*3];
848 while (tmp_rad)
849 {
850 str = g_strdup_printf ("%f", tmp_rad -> rad);
851 rc = xml_save_parameter_to_file (writer, periodic_table_info[tmp_rad -> Z].lab, "default_bond_rad", TRUE, tmp_rad -> Z, str);
852 g_free (str);
853 if (! rc) return 0;
854 tmp_rad = tmp_rad -> next;
855 }
856 rc = xmlTextWriterEndElement (writer);
857 if (rc < 0) return 0;
858 }
859 }
860 }
861 rc = xmlTextWriterEndElement (writer);
862 if (rc < 0) return 0;
863 }
864 }
865
866 // End atoms_and_bonds
867 rc = xmlTextWriterEndElement (writer);
868 if (rc < 0) return 0;
869
870 element_color * tmp_col;
871 // atoms and clones labels
872 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
873 if (rc < 0) return 0;
874 gchar * obj[2]={"atoms", "clones"};
875 for (i=0; i<2; i++)
876 {
877 rc = xmlTextWriterStartElement (writer, BAD_CAST obj[i]);
878 if (rc < 0) return 0;
879
880 str = g_strdup_printf ("%d", default_label[i].position);
881 rc = xml_save_parameter_to_file (writer, xml_label_leg[0], "default_label", TRUE, 0, str);
882 g_free (str);
883 if (! rc) return 0;
884 str = g_strdup_printf ("%d", default_label[i].render);
885 rc = xml_save_parameter_to_file (writer, xml_label_leg[1], "default_label", TRUE, 1, str);
886 g_free (str);
887 if (! rc) return 0;
888 str = g_strdup_printf ("%d", default_label[i].scale);
889 rc = xml_save_parameter_to_file (writer, xml_label_leg[2], "default_label", TRUE, 2, str);
890 g_free (str);
891 if (! rc) return 0;
892 rc = xml_save_parameter_to_file (writer, xml_label_leg[3], "default_label", TRUE, 3, default_label[i].font);
893 if (! rc) return 0;
894 rc = xml_save_xyz_to_file (writer, 4, xml_label_leg[4], "default_label", vec3(default_label[i].shift[0], default_label[i].shift[1], default_label[i].shift[2]));
895 if (! rc) return 0;
896 str = g_strdup_printf ("%d", default_acl_format[i]);
897 rc = xml_save_parameter_to_file (writer, "Format", "default_label", TRUE, 5, str);
898 g_free (str);
899 if (! rc) return 0;
900 if (default_label[i].n_colors || default_label_color[i])
901 {
902 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"colors");
903 if (rc < 0) return 0;
904 if (default_label[i].n_colors)
905 {
906 xml_save_color_to_file (writer, i, "Only label color", "only_label_color", default_label[i].color[0]);
907 }
908 else
909 {
910 tmp_col = default_label_color[i];
911 while (tmp_col)
912 {
913 rc = xml_save_color_to_file (writer, tmp_col -> Z, periodic_table_info[tmp_col -> Z].lab, "default_label_color", tmp_col -> col);
914 if (! rc) return 0;
915 tmp_col = tmp_col -> next;
916 }
917 }
918 rc = xmlTextWriterEndElement (writer);
919 if (rc < 0) return 0;
920 }
921
922 rc = xmlTextWriterEndElement (writer);
923 if (rc < 0) return 0;
924 }
925
926 // End atoms and clones colors
927 rc = xmlTextWriterEndElement (writer);
928 if (rc < 0) return 0;
929
930 do_atoms = (default_atom_color[0] || default_atom_color[1]) ? TRUE : FALSE;
931 if (do_atoms)
932 {
933 // atoms and clones colors
934 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"colors");
935 if (rc < 0) return 0;
936 for (i=0; i<2; i++)
937 {
938 if (default_atom_color[i])
939 {
940 rc = xmlTextWriterStartElement (writer, BAD_CAST obj[i]);
941 if (rc < 0) return 0;
942 tmp_col = default_atom_color[i];
943 while (tmp_col)
944 {
945 rc = xml_save_color_to_file (writer, tmp_col -> Z, periodic_table_info[tmp_col -> Z].lab, "default_atom_color", tmp_col -> col);
946 if (! rc) return 0;
947 tmp_col = tmp_col -> next;
948 }
949 rc = xmlTextWriterEndElement (writer);
950 if (rc < 0) return 0;
951 }
952 }
953 }
954
955 if (default_box.box != NONE)
956 {
957 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"box");
958 if (rc < 0) return 0;
959 str = g_strdup_printf ("%f", (default_box.box == WIREFRAME) ? default_box.line : default_box.rad);
960 rc = xml_save_parameter_to_file (writer, (default_box.box == WIREFRAME) ? "Wireframe width" : "Cylinder radius", "default_box", TRUE, default_box.box, str);
961 g_free (str);
962 if (! rc) return 0;
963 rc = xml_save_color_to_file (writer, -1, "Color", "default_box", default_box.color);
964 if (! rc) return 0;
965 // End box
966 rc = xmlTextWriterEndElement (writer);
967 if (rc < 0) return 0;
968 }
969
970 // End model
971 rc = xmlTextWriterEndElement (writer);
972 if (rc < 0) return 0;
973
974 // View
975 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"view");
976 if (rc < 0) return 0;
977
978 // Background
979 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"background");
980 str = g_strdup_printf ("%d", default_background.gradient);
981 rc = xml_save_parameter_to_file (writer, "Gradient", "default_background", TRUE, 0, str);
982 g_free (str);
983 if (! rc) return 0;
985 {
986 str = g_strdup_printf ("%d", default_background.direction);
987 rc = xml_save_parameter_to_file (writer, "Direction", "default_background", TRUE, 1, str);
988 g_free (str);
989 if (! rc) return 0;
990 str = g_strdup_printf ("%f", default_background.position);
991 rc = xml_save_parameter_to_file (writer, "Mixed position", "default_background", TRUE, 2, str);
992 g_free (str);
993 if (! rc) return 0;
994 for (i=0; i<2; i++)
995 {
996 rc = xml_save_color_to_file (writer, i+3, "Color", "default_background", default_background.gradient_color[i]);
997 if (! rc) return 0;
998 }
999 }
1000 else
1001 {
1002 rc = xml_save_color_to_file (writer, -1, "Color", "default_background", default_background.color);
1003 if (! rc) return 0;
1004 }
1005
1006 rc = xmlTextWriterEndElement (writer);
1007 if (rc < 0) return 0;
1008
1009
1010 // Representation
1011 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"representation");
1012 if (rc < 0) return 0;
1013 str = g_strdup_printf ("%d", default_rep.rep);
1014 rc = xml_save_parameter_to_file (writer, "Representation type", "default_rep", TRUE, 0, str);
1015 g_free (str);
1016 if (! rc) return 0;
1017 if (default_rep.rep)
1018 {
1019 str = g_strdup_printf ("%lf", default_rep.gnear);
1020 rc = xml_save_parameter_to_file (writer, "Camera depth", "default_rep", TRUE, 1, str);
1021 g_free (str);
1022 if (! rc) return 0;
1023 }
1024
1025 str = g_strdup_printf ("%lf", 1.0 - 0.5*default_rep.zoom);
1026 rc = xml_save_parameter_to_file (writer, "Zoom", "default_rep", TRUE, 2, str);
1027 g_free (str) ;
1028 if (! rc) return 0;
1029 for (i=0; i<2; i++)
1030 {
1031 str = g_strdup_printf ("%lf", - default_rep.c_angle[i]);
1032 rc = xml_save_parameter_to_file (writer, (i) ? "Camera pitch" : "Camera heading", "default_rep", TRUE, 3+i, str);
1033 g_free (str) ;
1034 if (! rc) return 0;
1035 }
1036 for (i=0; i<2; i++)
1037 {
1038 str = g_strdup_printf ("%lf", default_rep.c_shift[i]);
1039 rc = xml_save_parameter_to_file (writer, (i) ? "Camera x" : "Camera y", "default_rep", TRUE, 5+i, str);
1040 g_free (str) ;
1041 if (! rc) return 0;
1042 }
1043 // End representation
1044 rc = xmlTextWriterEndElement (writer);
1045 if (rc < 0) return 0;
1046
1047
1048 if (default_axis.axis != NONE)
1049 {
1050 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"axis");
1051 if (rc < 0) return 0;
1052 if (default_axis.t_pos != NONE)
1053 {
1054 str = g_strdup_printf ("%d", default_axis.t_pos);
1055 rc = xml_save_parameter_to_file (writer, "Template position", "default_axis", TRUE, 0, str);
1056 g_free (str);
1057 if (! rc) return 0;
1058 }
1059 else
1060 {
1061 rc = xml_save_xyz_to_file (writer, 0, "Custom position", "default_axis", vec3(default_axis.c_pos[0], default_axis.c_pos[1], default_axis.c_pos[2]));
1062 if (! rc) return 0;
1063 }
1064 str = g_strdup_printf ("%f", (default_axis.axis == WIREFRAME) ? default_axis.line : default_axis.rad);
1065 rc = xml_save_parameter_to_file (writer, (default_axis.axis == WIREFRAME) ? "Wireframe width" : "Cylinder radius", "default_axis", TRUE, default_axis.axis, str);
1066 g_free (str);
1067 if (! rc) return 0;
1068 str = g_strdup_printf ("%f", default_axis.length);
1069 rc = xml_save_parameter_to_file (writer, "Length", "default_axis", TRUE, 2, str);
1070 g_free (str);
1071 if (! rc) return 0;
1072 if (default_axis.labels)
1073 {
1074 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
1075 if (rc < 0) return 0;
1076 str = g_strdup_printf ("%d", default_label[2].render);
1077 rc = xml_save_parameter_to_file (writer, xml_label_leg[1], "default_label", TRUE, 1, str);
1078 g_free (str);
1079 if (! rc) return 0;
1080 str = g_strdup_printf ("%d", default_label[2].scale);
1081 rc = xml_save_parameter_to_file (writer, xml_label_leg[2], "default_label", TRUE, 2, str);
1082 g_free (str);
1083 if (! rc) return 0;
1084 rc = xml_save_parameter_to_file (writer, xml_label_leg[3], "default_label", TRUE, 3, default_label[2].font);
1085 if (! rc) return 0;
1086 for (i=0; i<3; i++)
1087 {
1088 rc = xml_save_parameter_to_file (writer, xml_axis_leg[i], "axis_legend", TRUE, i, default_axis.title[i]);
1089 if (! rc) return 0;
1090 }
1091 rc = xmlTextWriterEndElement (writer);
1092 if (rc < 0) return 0;
1093 }
1094 if (default_axis.color)
1095 {
1096 for (i=0; i<3; i++)
1097 {
1098 rc = xml_save_color_to_file (writer, i, "Color", "default_axis", default_axis.color[i]);
1099 if (! rc) return 0;
1100 }
1101 }
1102 // End axis
1103 rc = xmlTextWriterEndElement (writer);
1104 if (rc < 0) return 0;
1105 }
1106
1107 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"measures");
1108 if (rc < 0) return 0;
1109 gchar * m_key[2]={"standard", "selection"};
1110 for (i=0; i<2; i++)
1111 {
1112 rc = xmlTextWriterStartElement (writer, BAD_CAST m_key[i]);
1113 if (rc < 0) return 0;
1114 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
1115 if (rc < 0) return 0;
1116 str = g_strdup_printf ("%d", default_label[i+3].position);
1117 rc = xml_save_parameter_to_file (writer, xml_label_leg[0], "default_label", TRUE, 0, str);
1118 g_free (str);
1119 if (! rc) return 0;
1120 str = g_strdup_printf ("%d", default_label[i+3].render);
1121 rc = xml_save_parameter_to_file (writer, xml_label_leg[1], "default_label", TRUE, 1, str);
1122 g_free (str);
1123 if (! rc) return 0;
1124 str = g_strdup_printf ("%d", default_label[i+3].scale);
1125 rc = xml_save_parameter_to_file (writer, xml_label_leg[2], "default_label", TRUE, 2, str);
1126 g_free (str);
1127 if (! rc) return 0;
1128 rc = xml_save_parameter_to_file (writer, xml_label_leg[3], "default_label", TRUE, 3, default_label[i+3].font);
1129 if (! rc) return 0;
1130 xml_save_color_to_file (writer, i+3, "Font color", "default_font_color", default_label[i+3].color[0]);
1131 if (! rc) return 0;
1132
1133 rc = xmlTextWriterEndElement (writer); // End label
1134 if (rc < 0) return 0;
1135 // mtilt
1136 str = g_strdup_printf ("%d", default_mtilt[i]);
1137 rc = xml_save_parameter_to_file (writer, "Tilt along", "default_mtilt", TRUE, i, str);
1138 g_free (str);
1139 if (! rc) return 0;
1140 // mtilt
1141 str = g_strdup_printf ("%d", default_mpattern[i]);
1142 rc = xml_save_parameter_to_file (writer, "Pattern", "default_mpattern", TRUE, i, str);
1143 g_free (str);
1144 if (! rc) return 0;
1145 // mfactor
1146 str = g_strdup_printf ("%d", default_mfactor[i]);
1147 rc = xml_save_parameter_to_file (writer, "Factor", "default_mfactor", TRUE, i, str);
1148 g_free (str);
1149 if (! rc) return 0;
1150 // mfactor
1151 str = g_strdup_printf ("%lf", default_mwidth[i]);
1152 rc = xml_save_parameter_to_file (writer, "Width", "default_mwidth", TRUE, i, str);
1153 g_free (str);
1154 if (! rc) return 0;
1155
1156 rc = xmlTextWriterEndElement (writer); // End measures type
1157 if (rc < 0) return 0;
1158 }
1159
1160 rc = xmlTextWriterEndElement (writer); // End measures
1161 if (rc < 0) return 0;
1162
1163 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atom-selections");
1164 if (rc < 0) return 0;
1165 for (i=0; i<2; i++)
1166 {
1167 xml_save_color_to_file (writer, i, "Selection color", "default_sel_color", default_sel_color[i]);
1168 if (! rc) return 0;
1169 }
1170 rc = xmlTextWriterEndElement (writer);
1171 if (rc < 0) return 0;
1172
1173 // End view
1174 rc = xmlTextWriterEndElement (writer);
1175 if (rc < 0) return 0;
1176
1177 rc = xmlTextWriterEndElement (writer);
1178 if (rc < 0) return 0;
1179
1180 rc = xmlTextWriterEndDocument (writer);
1181 if (rc < 0) return 0;
1182
1183 xmlFreeTextWriter (writer);
1184 return 1;
1185}
1186
1188
1196double xml_string_to_double (gchar * content)
1197{
1198 return (g_strcmp0(content, "") == 0) ? 0.0 : string_to_double ((gpointer)content);
1199}
1200
1215void set_parameter (gchar * content, gchar * key, int vid, dint * bond, vec3_t * vect, float start, float end, ColRGBA * col)
1216{
1217 element_radius * tmp_rad;
1218 element_color * tmp_col;
1219 if (bond)
1220 {
1221 bond_cutoff * cut;
1223 {
1224 cut = default_bond_cutoff;
1225 while (cut -> next)
1226 {
1227 cut = cut -> next;
1228 }
1229 cut -> next = g_malloc0(sizeof*cut);
1230 cut = cut -> next;
1231 }
1232 else
1233 {
1234 default_bond_cutoff = g_malloc0(sizeof*default_bond_cutoff);
1235 cut = default_bond_cutoff;
1236 }
1237 cut -> Z[0] = bond -> a;
1238 cut -> Z[1] = bond -> b;
1239 cut -> use = TRUE;
1240 cut -> cutoff = xml_string_to_double(content);
1241 }
1242 else if (g_strcmp0(key, "default_totcut") == 0)
1243 {
1245 }
1246 else if (g_strcmp0(key, "default_num_delta") == 0)
1247 {
1248 default_num_delta[vid] = (int)xml_string_to_double(content);
1249 }
1250 else if (g_strcmp0(key, "default_delta_t") == 0)
1251 {
1252 default_delta_t[vid] = xml_string_to_double(content);
1253 }
1254 else if (g_strcmp0(key, "default_rsparam") == 0)
1255 {
1256 default_rsparam[vid] = (int)xml_string_to_double(content);
1257 }
1258 else if (g_strcmp0(key, "default_csparam") == 0)
1259 {
1260 default_csparam[vid] = (int)xml_string_to_double(content);
1261 }
1262 else if (g_strcmp0(key, "default_opengl") == 0)
1263 {
1264 default_opengl[vid] = (int)xml_string_to_double(content);
1265 }
1266 else if (g_strcmp0(key, "default_material") == 0)
1267 {
1268 if (vid < 0)
1269 {
1271 }
1272 else if (vid == 6 && vect)
1273 {
1274 default_material.albedo = * vect;
1275 }
1276 else
1277 {
1279 }
1280 }
1281 else if (g_strcmp0(key, "default_lightning") == 0)
1282 {
1284 }
1285 else if (g_strcmp0(key, "light.type") == 0)
1286 {
1287 default_lightning.spot[vid].type = (int)xml_string_to_double(content);
1288 }
1289 else if (g_strcmp0(key, "light.fix") == 0)
1290 {
1291 default_lightning.spot[vid].fix = (int)xml_string_to_double(content);
1292 }
1293 else if (g_strcmp0(key, "light.direction") == 0 && vect)
1294 {
1295 default_lightning.spot[vid].direction = * vect;
1296 }
1297 else if (g_strcmp0(key, "light.position") == 0 && vect)
1298 {
1299 default_lightning.spot[vid].position = * vect;
1300 }
1301 else if (g_strcmp0(key, "light.intensity") == 0 && vect)
1302 {
1303 default_lightning.spot[vid].intensity = * vect;
1304 }
1305 else if (g_strcmp0(key, "light.attenuation") == 0 && vect)
1306 {
1307 default_lightning.spot[vid].attenuation = * vect;
1308 }
1309 else if (g_strcmp0(key, "light.spot") == 0 && vect)
1310 {
1311 default_lightning.spot[vid].spot_data = * vect;
1312 }
1313 else if (g_strcmp0(key, "fog.mode") == 0)
1314 {
1315 default_fog.mode = (int)xml_string_to_double(content);
1316 }
1317 else if (g_strcmp0(key, "fog.type") == 0)
1318 {
1319 default_fog.based = (int)xml_string_to_double(content);
1320 }
1321 else if (g_strcmp0(key, "fog.density") == 0)
1322 {
1324 }
1325 else if (g_strcmp0(key, "fog.depth") == 0)
1326 {
1327 if (start != -1.0) default_fog.depth[0] = start;
1328 if (end != -1.0) default_fog.depth[1] = end;
1329 }
1330 else if (g_strcmp0(key, "fog.color") == 0 && vect)
1331 {
1332 default_fog.color = * vect;
1333 }
1334 else if (g_strcmp0(key, "default_cell") == 0)
1335 {
1336 default_cell = (int)xml_string_to_double(content);
1337 }
1338 else if (g_strcmp0(key, "default_clones") == 0)
1339 {
1340 default_clones = (int)xml_string_to_double(content);
1341 }
1342 else if (g_strcmp0(key, "default_at_rs") == 0)
1343 {
1344 default_o_at_rs[vid] = TRUE;
1345 default_at_rs[vid] = xml_string_to_double(content);
1346 }
1347 else if (g_strcmp0(key, "default_bd_rw") == 0)
1348 {
1349 default_o_bd_rw[vid] = TRUE;
1350 default_bd_rw[vid] = xml_string_to_double(content);
1351 }
1352 else if (g_strcmp0(key, "default_atomic_rad") == 0)
1353 {
1355 {
1356 tmp_rad = default_atomic_rad[radius_id];
1357 while (tmp_rad -> next)
1358 {
1359 tmp_rad = tmp_rad -> next;
1360 }
1361 tmp_rad -> next = g_malloc0(sizeof*tmp_rad);
1362 tmp_rad = tmp_rad -> next;
1363 }
1364 else
1365 {
1367 tmp_rad = default_atomic_rad[radius_id];
1368 }
1369 tmp_rad -> Z = vid;
1370 tmp_rad -> rad = xml_string_to_double(content);
1371 }
1372 else if (g_strcmp0(key, "default_bond_rad") == 0)
1373 {
1375 {
1376 tmp_rad = default_bond_rad[radius_id];
1377 while (tmp_rad -> next)
1378 {
1379 tmp_rad = tmp_rad -> next;
1380 }
1381 tmp_rad -> next = g_malloc0(sizeof*tmp_rad);
1382 tmp_rad = tmp_rad -> next;
1383 }
1384 else
1385 {
1387 tmp_rad = default_bond_rad[radius_id];
1388 }
1389 tmp_rad -> Z = vid;
1390 tmp_rad -> rad = xml_string_to_double(content);
1391 }
1392 else if (g_strcmp0(key, "default_label") == 0)
1393 {
1394 switch (vid)
1395 {
1396 case 0:
1398 break;
1399 case 1:
1401 break;
1402 case 2:
1404 break;
1405 case 3:
1406 default_label[label_id].font = g_strdup_printf ("%s", content);
1407 break;
1408 case 4:
1409 default_label[label_id].shift[0] = vect -> x;
1410 default_label[label_id].shift[1] = vect -> y;
1411 default_label[label_id].shift[2] = vect -> z;
1412 break;
1413 case 5:
1415 break;
1416 }
1417 }
1418 else if (g_strcmp0(key, "default_label_color") == 0)
1419 {
1420 if (! vid)
1421 {
1424 }
1425 else
1426 {
1428 {
1429 tmp_col = default_label_color[label_id];
1430 while (tmp_col -> next)
1431 {
1432 tmp_col = tmp_col -> next;
1433 }
1434 tmp_col -> next = g_malloc0(sizeof*tmp_col);
1435 tmp_col = tmp_col -> next;
1436 }
1437 else
1438 {
1440 tmp_col = default_label_color[label_id];
1441 }
1442 tmp_col -> Z = vid;
1443 tmp_col -> col = * col;
1444 }
1445 }
1446 else if (g_strcmp0(key, "default_font_color") == 0)
1447 {
1450 }
1451 else if (g_strcmp0(key, "default_atom_color") == 0)
1452 {
1454 {
1455 tmp_col = default_atom_color[label_id];
1456 while (tmp_col -> next)
1457 {
1458 tmp_col = tmp_col -> next;
1459 }
1460 tmp_col -> next = g_malloc0(sizeof*tmp_col);
1461 tmp_col = tmp_col -> next;
1462 }
1463 else
1464 {
1466 tmp_col = default_atom_color[label_id];
1467 }
1468 tmp_col -> Z = vid;
1469 tmp_col -> col = * col;
1470 }
1471 else if (g_strcmp0(key, "only_label_color") == 0)
1472 {
1476 }
1477 else if (g_strcmp0(key, "default_box") == 0)
1478 {
1479 if (col)
1480 {
1481 default_box.color = * col;
1482 }
1483 else
1484 {
1485 default_box.box = vid;
1486 if (default_box.box == WIREFRAME)
1487 {
1489 }
1490 else
1491 {
1493 }
1494 }
1495 }
1496 else if (g_strcmp0(key, "default_background") == 0)
1497 {
1498 switch (vid)
1499 {
1500 case -1:
1502 break;
1503 case 0:
1505 break;
1506 case 1:
1508 break;
1509 case 2:
1511 break;
1512 default:
1513 if (col) default_background.gradient_color[vid-3] = * col;
1514 break;
1515 }
1516 }
1517 else if (g_strcmp0(key, "default_rep") == 0)
1518 {
1519 switch (vid)
1520 {
1521 case 0:
1522 default_rep.rep = (int) xml_string_to_double(content);
1523 break;
1524 case 1:
1526 break;
1527 case 2:
1528 default_rep.zoom = 2.0*(1.0 - xml_string_to_double(content));
1529 break;
1530 default:
1531 if (vid < 5)
1532 {
1533 default_rep.c_angle[vid-3] = - xml_string_to_double(content);
1534 }
1535 else
1536 {
1537 default_rep.c_shift[vid-5] = xml_string_to_double(content);
1538 }
1539 break;
1540 }
1541 }
1542 else if (g_strcmp0(key, "default_axis") == 0)
1543 {
1544 if (vect)
1545 {
1546 default_axis.c_pos[0] = vect -> x;
1547 default_axis.c_pos[1] = vect -> y;
1548 default_axis.c_pos[2] = vect -> z;
1549 }
1550 else if (col)
1551 {
1552 if (! default_axis.color) default_axis.color = g_malloc0(3*sizeof*default_axis.color);
1553 default_axis.color[vid] = * col;
1554 }
1555 else
1556 {
1557 if (vid == 1 || vid == 4)
1558 {
1559 default_axis.axis = vid;
1560 if (vid == 1) default_axis.line = xml_string_to_double(content);
1561 if (vid == 4) default_axis.rad = xml_string_to_double(content);
1562 }
1563 else if (vid == 2)
1564 {
1566 }
1567 else if (! vid)
1568 {
1569 default_axis.t_pos = (int) xml_string_to_double(content);
1570 }
1571 }
1572 }
1573 else if (g_strcmp0(key, "axis_legend") == 0)
1574 {
1575 default_axis.title[vid] = g_strdup_printf ("%s", content);
1576 }
1577 else if (g_strcmp0(key, "default_mtilt") == 0)
1578 {
1579 default_mtilt[vid] = (int) xml_string_to_double(content);
1580 }
1581 else if (g_strcmp0(key, "default_mpattern") == 0)
1582 {
1583 default_mpattern[vid] = (int) xml_string_to_double(content);
1584 }
1585 else if (g_strcmp0(key, "default_mfactor") == 0)
1586 {
1587 default_mfactor[vid] = (int) xml_string_to_double(content);
1588 }
1589 else if (g_strcmp0(key, "default_mwidth") == 0)
1590 {
1591 default_mwidth[vid] = xml_string_to_double(content);
1592 }
1593 else if (g_strcmp0(key, "default_sel_color") == 0)
1594 {
1595 if (col)
1596 {
1597 default_sel_color[vid] = * col;
1598 }
1599 }
1600}
1601
1609void read_parameter (xmlNodePtr parameter_node)
1610{
1611 xmlNodePtr p_node;
1612 xmlAttrPtr p_details;
1613 gboolean set_codevar, set_id;
1614 gboolean set_x, set_y, set_z;
1615 gboolean set_r, set_g, set_b, set_a;
1616 gboolean set_alpha, set_beta;
1617 ColRGBA col;
1618 gchar * key;
1619 gchar * content;
1620 int id;
1621 dint bond;
1622 float start, end;
1623 vec3_t vec;
1624 while (parameter_node)
1625 {
1626 content = g_strdup_printf ("%s", xmlNodeGetContent(parameter_node));
1627 p_details = parameter_node -> properties;
1628 set_codevar = set_id = FALSE;
1629 set_x = set_y = set_z = FALSE;
1630 set_r = set_g = set_b = set_a = FALSE;
1631 set_alpha = set_beta = FALSE;
1632 start = end = -1.0;
1633 id = -1;
1634 while (p_details)
1635 {
1636 p_node = p_details -> children;
1637 if (p_node)
1638 {
1639 if (g_strcmp0("key",(char *)p_details -> name) == 0)
1640 {
1641 key = g_strdup_printf ("%s", xmlNodeGetContent(p_node));
1642 set_codevar = TRUE;
1643 }
1644 else if (g_strcmp0("id",(char *)p_details -> name) == 0)
1645 {
1646 id = (int) string_to_double ((gpointer)xmlNodeGetContent(p_node));
1647 set_id = TRUE;
1648 }
1649 else if (g_strcmp0("α",(char *)p_details -> name) == 0)
1650 {
1651 bond.a = (int) string_to_double ((gpointer)xmlNodeGetContent(p_node));
1652 set_alpha = TRUE;
1653 }
1654 else if (g_strcmp0("β",(char *)p_details -> name) == 0)
1655 {
1656 bond.b = (int) string_to_double ((gpointer)xmlNodeGetContent(p_node));
1657 set_beta = TRUE;
1658 }
1659 else if (g_strcmp0("x",(char *)p_details -> name) == 0)
1660 {
1661 vec.x = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1662 set_x = TRUE;
1663 }
1664 else if (g_strcmp0("y",(char *)p_details -> name) == 0)
1665 {
1666 vec.y = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1667 set_y = TRUE;
1668 }
1669 else if (g_strcmp0("z",(char *)p_details -> name) == 0)
1670 {
1671 vec.z = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1672 set_z = TRUE;
1673 }
1674 else if (g_strcmp0("start",(char *)p_details -> name) == 0)
1675 {
1676 start = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1677 }
1678 else if (g_strcmp0("end",(char *)p_details -> name) == 0)
1679 {
1680 end = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1681 }
1682 else if (g_strcmp0("red",(char *)p_details -> name) == 0)
1683 {
1684 col.red = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1685 set_r = TRUE;
1686 }
1687 else if (g_strcmp0("green",(char *)p_details -> name) == 0)
1688 {
1689 col.green = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1690 set_g = TRUE;
1691 }
1692 else if (g_strcmp0("blue",(char *)p_details -> name) == 0)
1693 {
1694 col.blue = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1695 set_b = TRUE;
1696 }
1697 else if (g_strcmp0("alpha",(char *)p_details -> name) == 0)
1698 {
1699 col.alpha = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1700 set_a = TRUE;
1701 }
1702 }
1703 p_details = p_details -> next;
1704 }
1705
1706 if ((set_codevar && (set_id || (set_r && set_g && set_b && set_a))) || (set_alpha && set_beta))
1707 {
1708 // g_print ("key= %s, id= %d, content= %s\n", key, id, content);
1709 set_parameter (content, key, id, (set_alpha && set_beta) ? & bond : NULL, (set_x && set_y && set_z) ? & vec : NULL, start, end, (set_r && set_g && set_b && set_a) ? & col : NULL);
1710 }
1711 g_free (content);
1712 parameter_node = parameter_node -> next;
1713 parameter_node = findnode (parameter_node, "parameter");
1714 }
1715}
1716
1724void read_light (xmlNodePtr light_node)
1725{
1726 xmlNodePtr l_node, p_node;
1727 xmlNodePtr parameter_node;
1728 xmlAttrPtr l_details, p_details;
1729 gchar * key;
1730 int lid;
1731 gboolean set_codevar;
1732 gboolean set_lid = FALSE;
1733 gboolean set_x, set_y, set_z;
1734 gchar * content;
1735 vec3_t vec;
1736 l_details = light_node -> properties;
1737 while (l_details)
1738 {
1739 l_node = l_details -> children;
1740 if (l_node)
1741 {
1742 if (g_strcmp0("id",(char *)l_details -> name) == 0)
1743 {
1744 lid = (int) string_to_double ((gpointer)xmlNodeGetContent(l_node));
1745 set_lid = TRUE;
1746 }
1747 }
1748 l_details = l_details -> next;
1749 }
1750 if (set_lid)
1751 {
1752 parameter_node = findnode (light_node -> children, "parameter");
1753 set_codevar = FALSE;
1754 set_x = set_y = set_z = FALSE;
1755 while (parameter_node)
1756 {
1757 content = g_strdup_printf ("%s", xmlNodeGetContent(parameter_node));
1758 p_details = parameter_node -> properties;
1759 while (p_details)
1760 {
1761 p_node = p_details -> children;
1762 if (p_node)
1763 {
1764 if (g_strcmp0("key",(char *)p_details -> name) == 0)
1765 {
1766 key = g_strdup_printf ("%s", xmlNodeGetContent(p_node));
1767 set_codevar = TRUE;
1768 }
1769 else if (g_strcmp0("x",(char *)p_details -> name) == 0)
1770 {
1771 vec.x = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1772 set_x = TRUE;
1773 }
1774 else if (g_strcmp0("y",(char *)p_details -> name) == 0)
1775 {
1776 vec.y = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1777 set_y = TRUE;
1778 }
1779 else if (g_strcmp0("z",(char *)p_details -> name) == 0)
1780 {
1781 vec.z = string_to_double ((gpointer)xmlNodeGetContent(p_node));
1782 set_z = TRUE;
1783 }
1784 }
1785 p_details = p_details -> next;
1786 }
1787 if (set_codevar)
1788 {
1789 set_parameter (content, key, lid, NULL, (set_x && set_y && set_z) ? & vec : NULL, -1.0, -1.0, NULL);
1790 }
1791 g_free (content);
1792 parameter_node = parameter_node -> next;
1793 parameter_node = findnode (parameter_node, "parameter");
1794 }
1795 }
1796}
1797
1805void read_preferences (xmlNodePtr preference_node)
1806{
1807 xmlNodePtr node;
1808 node = findnode (preference_node -> children, "parameter");
1809 read_parameter (node);
1810}
1811
1820void read_style_from_xml_file (xmlNodePtr style_node, int style)
1821{
1822 xmlNodePtr node;
1823 gchar * str;
1824 int i, j, k, l;
1825 i = (style == 0 || style == 2) ? 0 : (style == 1 || style == 4) ? 1 : 2;
1826 for (j=0; j<2; j++)
1827 {
1828 k = (style == 2) ? 4 : 1;
1829 for (l=0; l<k; l++)
1830 {
1831 str = (j) ? g_strdup_printf ("clone-%s", (k == 4) ? xml_filled_leg[l] : xml_atom_leg[i]) : g_strdup_printf ("%s", (k == 4) ? xml_filled_leg[l] : xml_atom_leg[i]);
1832 node = findnode (style_node, str);
1833 if (node)
1834 {
1835 if (j)
1836 {
1837 radius_id = (l) ? 12 + l : style + 5;
1838 }
1839 else
1840 {
1841 radius_id = (l) ? 9 + l : style;
1842 }
1843 read_preferences (node);
1844 }
1845 }
1846 }
1847 i = (style < 2) ? style : 2;
1848 for (j=0; j<2; j++)
1849 {
1850 str = (j) ? g_strdup_printf ("clone-%s", xml_bond_leg[i]) : g_strdup_printf ("%s", xml_bond_leg[i]);
1851 node = findnode (style_node, str);
1852 radius_id = (j) ? style + 3 : style;
1853 if (node) read_preferences(node);
1854 }
1855}
1856
1863{
1864 xmlDoc * doc;
1865 xmlTextReaderPtr reader;
1866 xmlNodePtr racine;
1867 xmlNodePtr node, p_node, l_node, c_node;
1868 const xmlChar aml[22]="atomes_preferences-xml";
1869 int i;
1870 reader = xmlReaderForFile (ATOMES_CONFIG, NULL, 0);
1871 if (reader)
1872 {
1873 doc = xmlParseFile (ATOMES_CONFIG);
1874 if (doc)
1875 {
1876 racine = xmlDocGetRootElement (doc);
1877 if (! g_strcmp0 ((char *)(racine -> name), (char *)aml))
1878 {
1879 node = findnode(racine -> children, "analysis");
1880 if (node)
1881 {
1882 p_node = findnode (node -> children, "cutoffs");
1883 if (p_node)
1884 {
1885 read_preferences (p_node);
1886 l_node = findnode(p_node -> children, "partials");
1887 if (l_node)
1888 {
1889 read_preferences (l_node);
1890 }
1891 }
1892 read_preferences (node);
1893 }
1894 node = findnode(racine -> children, "opengl");
1895 if (node)
1896 {
1897 p_node = findnode (node -> children, "material");
1898 if (p_node)
1899 {
1900 read_preferences (p_node);
1901 }
1902 p_node = findnode (node -> children, "lightning");
1903 if (p_node)
1904 {
1905 read_preferences (p_node);
1906 l_node = findnode (p_node -> children, "light");
1907 while (l_node)
1908 {
1909 read_light (l_node);
1910 l_node = l_node -> next;
1911 l_node = findnode (l_node, "light");
1912 }
1913 }
1914 p_node = findnode (node -> children, "fog");
1915 if (p_node)
1916 {
1917 read_preferences(p_node);
1918 }
1919 read_preferences (node);
1920 }
1921 node = findnode(racine -> children, "model");
1922 if (node)
1923 {
1924 read_preferences (node);
1925 p_node = findnode(node -> children, "atoms_and_bonds");
1926 if (p_node)
1927 {
1928 for (i=0; i<OGL_STYLES; i++)
1929 {
1930 l_node = findnode (p_node -> children, xml_style_leg[i]);
1931 if (l_node)
1932 {
1933 read_style_from_xml_file (l_node -> children, i);
1934 }
1935 }
1936 }
1937 p_node = findnode(node -> children, "labels");
1938 if (p_node)
1939 {
1940 for (i=0; i<2; i++)
1941 {
1942 l_node = findnode (p_node -> children, (i) ? "clones" : "atoms");
1943 if (l_node)
1944 {
1945 label_id = i;
1946 read_preferences (l_node);
1947 c_node = findnode(l_node -> children, "colors");
1948 if (c_node)
1949 {
1950 read_preferences (c_node);
1951 }
1952 }
1953 }
1954 }
1955 c_node = findnode(node -> children, "colors");
1956 if (c_node)
1957 {
1958 for (i=0; i<2; i++)
1959 {
1960 l_node = findnode (c_node -> children, (i) ? "clones" : "atoms");
1961 if (l_node)
1962 {
1963 label_id = i;
1964 read_preferences (l_node);
1965 }
1966 }
1967 }
1968 p_node = findnode(node -> children, "box");
1969 if (p_node)
1970 {
1971 read_preferences (p_node);
1972 }
1973 }
1974 node = findnode(racine -> children, "view");
1975 if (node)
1976 {
1977 read_preferences (node);
1978 p_node = findnode(node -> children, "background");
1979 if (p_node)
1980 {
1981 read_preferences (p_node);
1982 }
1983 p_node = findnode(node -> children, "representation");
1984 if (p_node)
1985 {
1986 read_preferences (p_node);
1987 }
1988 p_node = findnode(node -> children, "axis");
1989 if (p_node)
1990 {
1991 read_preferences (p_node);
1992 l_node = findnode(p_node -> children, "labels");
1993 if (l_node)
1994 {
1995 label_id = 2;
1996 default_axis.labels = TRUE;
1997 read_preferences (l_node);
1998 }
1999 c_node = findnode(p_node -> children, "colors");
2000 if (c_node)
2001 {
2002 read_preferences (c_node);
2003 }
2004 }
2005 p_node = findnode(node -> children, "measures");
2006 if (p_node)
2007 {
2008 l_node = findnode(p_node -> children, "standard");
2009 if (l_node)
2010 {
2011 c_node = findnode(l_node -> children, "labels");
2012 if (c_node)
2013 {
2014 label_id = 3;
2015 read_preferences (c_node);
2016 }
2017 read_preferences (l_node);
2018 }
2019 l_node = findnode(p_node -> children, "selection");
2020 if (l_node)
2021 {
2022 c_node = findnode(l_node -> children, "labels");
2023 if (c_node)
2024 {
2025 label_id = 4;
2026 read_preferences (c_node);
2027 }
2028 read_preferences (l_node);
2029 }
2030 }
2031 p_node = findnode(node -> children, "atom-selections");
2032 if (p_node)
2033 {
2034 read_preferences (p_node);
2035 }
2036 }
2037 }
2038 xmlFreeDoc(doc);
2039 }
2040 xmlFreeTextReader(reader);
2041 }
2042 xmlCleanupParser();
2043}
2044
2051{
2052 int i, j;
2053 // Analysis preferences
2054
2055 default_totcut = 0.0;
2057 default_bond_cutoff = NULL;
2058 default_num_delta[GR] = 1000;
2059 default_num_delta[SQ] = 1000;
2060 default_num_delta[SK] = 1000;
2061 default_num_delta[GK] = 1000;
2062 default_num_delta[BD] = 100;
2063 default_num_delta[AN] = 90;
2064 default_num_delta[CH-1] = 20;
2065 default_num_delta[MS-2] = 0;
2066 default_delta_t[0] = 0.0;
2067 default_delta_t[1] = -1.0;
2068
2069 default_rsparam[0] = -1;
2070 default_rsparam[1] = 0;
2071 default_rsparam[2] = 10;
2072 default_rsparam[3] = 500;
2073 default_rsparam[4] = 0;
2074 default_rsparam[5] = 0;
2075 default_rsparam[6] = 0;
2076
2077 default_csparam[0] = 0;
2078 default_csparam[1] = 10;
2079 default_csparam[2] = 500;
2080 default_csparam[3] = 0;
2081 default_csparam[4] = 0;
2082 default_csparam[5] = 0;
2083
2084 for (i=0; i<3; i++) default_opengl[i] = 0;
2086 // Material
2087 default_material.predefine = 4; // Plastic
2088 default_material.albedo = vec3(0.5, 0.5, 0.5);
2095
2096 // Lights
2099 default_lightning.spot = g_malloc0 (3*sizeof*default_lightning.spot);
2100 default_lightning.spot[0] = init_light_source (0, 1.0, 1.0);
2101 default_lightning.spot[1] = init_light_source (1, 1.0, 1.0);
2102 default_lightning.spot[2] = init_light_source (1, 1.0, 1.0);
2103
2104 // Fog
2105 default_fog.mode = 1;
2106 default_fog.based = 0;
2107 default_fog.density = 0.5;
2108 default_fog.depth[0] = 15.0;
2109 default_fog.depth[1] = 40.0;
2110 default_fog.color = vec3 (0.01f, 0.01f, 0.01f);
2111
2112 // Model
2113 default_clones = FALSE;
2114 default_cell = TRUE;
2115 for (i=0; i<5; i++)
2116 {
2117 default_o_at_rs[i] = default_o_at_rs[i+5] = FALSE;
2118 default_at_rs[i] = default_at_rs[i+5] = (i == 0 || i == 2) ? 0.5 : DEFAULT_SIZE;
2119 }
2120
2121 for (i=0; i<16; i++)
2122 {
2123 if (default_atomic_rad[i])
2124 {
2125 g_free (default_atomic_rad[i]);
2126 default_atomic_rad[i] = NULL;
2127 }
2128 }
2129 for (i=0; i<3; i++)
2130 {
2131 default_o_bd_rw[i] = default_o_bd_rw[i+3] = (i == 2) ? TRUE : FALSE;
2132 default_bd_rw[i] = default_bd_rw[i+3] = (i == 0 || i == 2) ? 0.5 : DEFAULT_SIZE;
2133 }
2134 for (i=0; i<6; i++)
2135 {
2136 if (default_bond_rad[i])
2137 {
2138 g_free (default_bond_rad[i]);
2139 default_bond_rad[i] = NULL;
2140 }
2141 }
2142 for (i=0; i<2; i++)
2143 {
2144 if (default_atom_color[i])
2145 {
2146 g_free (default_atom_color[i]);
2147 default_atom_color[i] = NULL;
2148 }
2149 if (default_label_color[i])
2150 {
2151 g_free (default_label_color[i]);
2152 default_label_color[i] = NULL;
2153 }
2154 }
2155 for (i=0; i<5; i++)
2156 {
2157 default_label[i].position = 1;
2159 default_label[i].scale = 0;
2160 for (j=0; j<3; j++) default_label[i].shift[j] = 0.0;
2161 default_label[i].n_colors = (i > 2) ? 1 : 0;
2162 if (default_label[i].n_colors)
2163 {
2164 default_label[i].color = g_malloc (sizeof*default_label[i].color);
2165 default_label[i].color[0].red = 1.0;
2166 default_label[i].color[0].green = 1.0;
2167 default_label[i].color[0].blue = 1.0;
2168 default_label[i].color[0].alpha = 1.0;
2169 }
2170 default_label[i].font = (i > 2) ? g_strdup_printf ("FreeMono Bold 18") : g_strdup_printf ("Sans Bold 12");
2171 default_label[i].list = NULL;
2172 }
2173 for (i=0; i<2; i++)
2174 {
2176 default_mtilt[i] = TRUE;
2177 default_mpattern[i] = 0;
2178 default_mfactor[i] = 1;
2179 default_mwidth[i] = 1.0;
2180 }
2181
2183 default_box.color.red = 0.0;
2184 default_box.color.green = 1.0;
2185 default_box.color.blue = 0.0;
2186 default_box.color.alpha = 1.0;
2188 default_box.rad = 0.05;
2189
2190 // Representation
2191
2192 // Background color
2208
2210 default_rep.proj = -1;
2214 for (i=0; i<2; i++) default_rep.c_shift[i] = 0.0;
2215 default_rep.gnear = 6.0;
2216
2217 // Axis
2220 default_axis.rad = 0.1;
2223 default_axis.c_pos[0] = default_axis.c_pos[1] = 50.0;
2224 default_axis.c_pos[2] = 0.0;
2225 default_axis.title[0] = "x";
2226 default_axis.title[1] = "y";
2227 default_axis.title[2] = "z";
2228 if (default_axis.color) g_free (default_axis.color);
2229 default_axis.color = NULL;
2230
2231 // Selection color
2232 default_sel_color[0].red = 0.0;
2233 default_sel_color[0].green = 1.0;
2234 default_sel_color[0].blue = 1.0;
2236 // Selection color - edition mode
2237 default_sel_color[1].red = 1.0;
2238 default_sel_color[1].green = 0.00;
2239 default_sel_color[1].blue = 0.84;
2241}
2242
2264
2275GtkWidget * pref_list (gchar * mess[2], int nelem, gchar * mlist[nelem][2], gchar * end)
2276{
2277 gchar * str;
2278 GtkWidget * vbox = create_vbox (BSEP);
2279 GtkWidget * vvbox = create_vbox (BSEP);
2280 GtkWidget * hbox;
2281 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label(mess[0], -1, -1, 0.5, 0.5), FALSE, FALSE, 5);
2282 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label(mess[1], -1, -1, 0.5, 0.5), FALSE, FALSE, 0);
2283 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 20);
2284 int i;
2285 for (i=0; i<nelem; i++)
2286 {
2287 hbox = create_hbox (BSEP);
2288 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
2289 str = g_strdup_printf ("<b>%s</b>", mlist[i][0]);
2290 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 120, -1, 0.0, 0.5), FALSE, FALSE, 5);
2291 g_free (str);
2292 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(":", -1, -1, 1.0, 0.5), FALSE, FALSE, 0);
2293 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(mlist[i][1], -1, -1, 0.0, 0.5), FALSE, FALSE, 10);
2294 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2295 }
2296 if (end)
2297 {
2298 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(end, -1, -1, 0.5, 0.5), FALSE, FALSE, 20);
2299 }
2300 return vbox;
2301}
2302
2311G_MODULE_EXPORT void set_measures (GtkComboBox * box, gpointer data)
2312{
2313 int i, j;
2314 i = GPOINTER_TO_INT (data);
2315 j = combo_get_active ((GtkWidget *)box);
2316 if (i)
2317 {
2320 }
2321 else
2322 {
2325 }
2326}
2327
2336G_MODULE_EXPORT void set_selection_color (GtkColorChooser * colob, gpointer data)
2337{
2338 int i = GPOINTER_TO_INT (data);
2339 tmp_sel_color[i] = get_button_color (colob);
2340}
2341
2347GtkWidget * view_preferences ()
2348{
2349 GtkWidget * notebook = gtk_notebook_new ();
2350 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
2351 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
2352 GtkWidget * vbox = create_vbox (BSEP);
2353 gchar * info[2] = {"The <b>View</b> tab regroups representation options",
2354 "which effect apply to the general aspect of the model:"};
2355 gchar * m_list[3][2] = {{"Representation", "scene set-up and orientation"},
2356 {"Axis", "axis options"},
2357 {"Tools", "measures and selections option"}};
2358 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 30, 0.0, 0.0), FALSE, FALSE, 0);
2359 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, NULL), FALSE, FALSE, 30);
2360
2361 pref_gradient_win = g_malloc0(sizeof*pref_gradient_win);
2362 gradient_advanced (NULL, NULL);
2363 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_gradient_win -> win, FALSE, FALSE, 5);
2364
2365 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("General"));
2366
2367 // Tab for representation
2368 pref_rep_win = g_malloc0(sizeof*pref_rep_win);
2369 representation_advanced (NULL, NULL);
2370 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_rep_win -> win, gtk_label_new ("Representation"));
2371
2372 // Axis
2373 pref_axis_win = g_malloc0(sizeof*pref_axis_win);
2374 axis_advanced (NULL, NULL);
2375 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_axis_win -> win, gtk_label_new ("Axis"));
2376
2377 // Measures
2378 vbox = create_vbox (BSEP);
2379 GtkWidget * hbox;
2380 hbox = adv_box (vbox, "<b>Select measure type</b>", 5, 120, 0.0);
2382 combo_text_append (meas_combo, "Standard");
2383 combo_text_append (meas_combo, "Edition mode");
2385 g_signal_connect (G_OBJECT(meas_combo), "changed", G_CALLBACK(set_measures), GINT_TO_POINTER(0));
2386 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, meas_combo , FALSE, FALSE, 40);
2387 int i;
2388 for (i=0; i<2; i++)
2389 {
2390 meas_box[i] = create_vbox (BSEP);
2391 hbox = create_hbox (BSEP);
2392 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, labels_tab(NULL, i+3), FALSE, FALSE, 60);
2393 add_box_child_start (GTK_ORIENTATION_VERTICAL, meas_box[i], hbox, FALSE, FALSE, 5);
2394 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, meas_box[i], FALSE, FALSE, 0);
2395 }
2396
2397 hbox = adv_box (vbox, "<b>Select selection type</b>", 15, 120, 0.0);
2399 combo_text_append (sel_combo, "Standard");
2400 combo_text_append (sel_combo, "Edition mode");
2402 g_signal_connect (G_OBJECT(sel_combo), "changed", G_CALLBACK(set_measures), GINT_TO_POINTER(1));
2403 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sel_combo , FALSE, FALSE, 40);
2404 GtkWidget * hhbox, * vvbox;
2405 for (i=0; i<2; i++)
2406 {
2407 sel_box[i] = create_vbox (BSEP);
2408 hbox = create_hbox (BSEP);
2409 vvbox = create_hbox (BSEP);
2410 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vvbox, FALSE, FALSE, 60);
2411 hhbox = abox (vvbox, "Color", 0);
2412 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, color_button(tmp_sel_color[i], TRUE, 100, -1, G_CALLBACK(set_selection_color), GINT_TO_POINTER(i)), FALSE, FALSE, 0);
2413 add_box_child_start (GTK_ORIENTATION_VERTICAL, sel_box[i], hbox, FALSE, FALSE, 5);
2414 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, sel_box[i], FALSE, FALSE, 0);
2415 }
2416
2417 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("Tools"));
2418
2419 show_the_widgets (notebook);
2420
2421 return notebook;
2422}
2423
2427GtkWidget * pref_tree;
2429GtkWidget * edit_scrol;
2430GtkWidget * edit_colob;
2432
2433#ifdef GTK4
2442G_MODULE_EXPORT void toggled_default_stuff (GtkCheckButton * but, gpointer data)
2443#else
2452G_MODULE_EXPORT void toggled_default_stuff (GtkToggleButton * but, gpointer data)
2453#endif
2454{
2455 int status = button_get_status ((GtkWidget *)but);
2456 int object = GPOINTER_TO_INT(data);
2457 switch (object)
2458 {
2459 case 0:
2461 break;
2462 case 1:
2463 tmp_cell = status;
2464 break;
2465 default:
2466 if (object < 0)
2467 {
2468 // Bonds
2469 tmp_o_bd_rw[-object-2] = status;
2471 }
2472 else if (object < 100)
2473 {
2474 tmp_o_at_rs[object-2] = status;
2476 }
2477 else
2478 {
2481 ColRGBA col;
2482 col.red = col.green = col.blue = col.alpha = 1.0;
2483 if (status)
2484 {
2485 tmp_color = g_malloc0(sizeof*tmp_color);
2486 tmp_color -> red = tmp_color -> green = tmp_color -> blue = tmp_color -> alpha = 1.0;
2487 }
2488 else
2489 {
2490 if (tmp_color) g_free (tmp_color);
2491 tmp_color = NULL;
2492 }
2493 GdkRGBA rgb_col = colrgba_togtkrgba(col);
2494 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(edit_colob), & rgb_col);
2495 }
2496 break;
2497 }
2498}
2499
2508G_MODULE_EXPORT void set_default_stuff (GtkEntry * res, gpointer data)
2509{
2510 int i = GPOINTER_TO_INT(data);
2511 const gchar * m = entry_get_text (res);
2512 double value = string_to_double ((gpointer)m);
2513 if (i < 0)
2514 {
2515 // Bonds
2516 tmp_bd_rw[-i-2] = value;
2517 }
2518 else
2519 {
2520 tmp_at_rs[i-2] = value;
2521 }
2522 update_entry_double (res, value);
2523}
2524
2533{
2534 if (! old_list) return NULL;
2535 element_radius * new_list = g_malloc0(sizeof*new_list);
2536 element_radius * tmp_rad, * tmp_rbd;
2537 tmp_rad = old_list;
2538 tmp_rbd = new_list;
2539 while (tmp_rad)
2540 {
2541 tmp_rbd -> Z = tmp_rad -> Z;
2542 tmp_rbd -> rad = tmp_rad -> rad;
2543 if (tmp_rad -> next)
2544 {
2545 tmp_rbd -> next = g_malloc0(sizeof*tmp_rbd -> next);
2546 tmp_rbd -> next -> prev = tmp_rbd;
2547 tmp_rbd = tmp_rbd -> next;
2548 }
2549 tmp_rad = tmp_rad -> next;
2550 }
2551 return new_list;
2552}
2553
2564float get_radius (int object, int col, int z, element_radius * rad_list)
2565{
2566 element_radius * tmp_rad = rad_list;
2567 int ft;
2568 while (tmp_rad)
2569 {
2570 if (tmp_rad -> Z == z)
2571 {
2572 user_defined = TRUE;
2573 return tmp_rad -> rad;
2574 }
2575 tmp_rad = tmp_rad -> next;
2576 }
2577 if (object < 0)
2578 {
2579 object = - object - 2;
2580 // Bonds
2581 if (object == 0 || object == 3)
2582 {
2583 if (z < 119)
2584 {
2585 ft = 0;
2586 return set_radius_ (& z, & ft) / 4.0;
2587 }
2588 }
2589 else
2590 {
2591 return DEFAULT_SIZE;
2592 }
2593 }
2594 else
2595 {
2596 object -= 2;
2597 if (object == 2 || object == 7 || col)
2598 {
2599 ft = col;
2600 if (z < 119)
2601 {
2602 return set_radius_ (& z, & ft);
2603 }
2604 }
2605 else if (object == 1 || object == 4 || object == 6 || object == 9)
2606 {
2607 // Dots
2608 return DEFAULT_SIZE;
2609 }
2610 else if (object == 0 || object == 3 || object == 5 || object == 8)
2611 {
2612 ft = 0;
2613 return set_radius_ (& z, & ft) / 2.0;
2614 }
2615 }
2616 return 0.0;
2617}
2618
2627{
2628 if (! old_list) return NULL;
2629 element_color * new_list = g_malloc0(sizeof*new_list);
2630 element_color * tmp_rad, * tmp_rbd;
2631 tmp_rad = old_list;
2632 tmp_rbd = new_list;
2633 while (tmp_rad)
2634 {
2635 tmp_rbd -> Z = tmp_rad -> Z;
2636 tmp_rbd -> col = tmp_rad -> col;
2637 if (tmp_rad -> next)
2638 {
2639 tmp_rbd -> next = g_malloc0(sizeof*tmp_rbd -> next);
2640 tmp_rbd -> next -> prev = tmp_rbd;
2641 tmp_rbd = tmp_rbd -> next;
2642 }
2643 tmp_rad = tmp_rad -> next;
2644 }
2645 return new_list;
2646}
2647
2657{
2658 element_color * tmp_col = clist;
2659 while (tmp_col)
2660 {
2661 if (tmp_col -> Z == z)
2662 {
2663 user_defined = TRUE;
2664 return tmp_col -> col;
2665 }
2666 tmp_col = tmp_col -> next;
2667 }
2668 return set_default_color (z);
2669}
2670
2681G_MODULE_EXPORT void edit_pref (GtkCellRendererText * cell, gchar * path_string, gchar * new_text, gpointer user_data)
2682{
2683 int col = GPOINTER_TO_INT(user_data);
2684 GtkTreeModel * pref_model = gtk_tree_view_get_model(GTK_TREE_VIEW(pref_tree));
2685 GtkTreeIter row;
2686 gtk_tree_model_get_iter_from_string (pref_model, & row, path_string);
2687 int z;
2688 float val = string_to_double ((gpointer)new_text);
2689 gtk_tree_model_get (pref_model, & row, 3, & z, -1);
2690 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, col+4, val, -1);
2691 gboolean add_elem = FALSE;
2692 gboolean remove_elem = FALSE;
2693 element_radius * tmp_list;
2694 int col_val[4] = {1, 3, 5, 10};
2695 float v = get_radius (the_object, col, z, NULL);
2696 if (edit_list[col])
2697 {
2698 tmp_list = edit_list[col];
2699 add_elem = TRUE;
2700 while (tmp_list)
2701 {
2702 if (tmp_list -> Z == z)
2703 {
2704 tmp_list -> rad = val;
2705 if (val == v)
2706 {
2707 remove_elem = TRUE;
2708 if (tmp_list -> next)
2709 {
2710 if (tmp_list -> prev)
2711 {
2712 tmp_list -> prev -> next = tmp_list -> next;
2713 tmp_list -> next -> prev = tmp_list -> prev;
2714 }
2715 else
2716 {
2717 edit_list[col] = tmp_list -> next;
2718 edit_list[col] -> prev = NULL;
2719 }
2720 }
2721 else if (tmp_list -> prev)
2722 {
2723 edit_list[col] -> rad = tmp_list -> rad;
2724 edit_list[col] -> Z = tmp_list -> Z;
2725 edit_list[col] -> prev = NULL;
2726 }
2727 else
2728 {
2729 g_free (edit_list[col]);
2730 edit_list[col] = NULL;
2731 }
2732 add_elem = FALSE;
2733 }
2734 else
2735 {
2736 add_elem = FALSE;
2737 }
2738 }
2739 tmp_list = tmp_list -> next;
2740 }
2741 }
2742 else if (val != v)
2743 {
2744 add_elem = TRUE;
2745 }
2746
2747 if (add_elem)
2748 {
2749 if (edit_list[col])
2750 {
2751 tmp_list = edit_list[col];
2752 while (tmp_list)
2753 {
2754 if (! tmp_list -> next) break;
2755 tmp_list = tmp_list -> next;
2756 }
2757 tmp_list -> next = g_malloc0(sizeof*tmp_list -> next);
2758 tmp_list -> next -> prev = tmp_list;
2759 tmp_list = tmp_list -> next;
2760 }
2761 else
2762 {
2763 edit_list[col] = g_malloc0(sizeof*edit_list[col]);
2764 tmp_list = edit_list[col];
2765 }
2766 tmp_list -> Z = z;
2767 tmp_list -> rad = val;
2768 gtk_tree_model_get (pref_model, & row, 0, & z, -1);
2769 if (! z)
2770 {
2771 z = col_val[col];
2772 }
2773 else
2774 {
2775 int a, b, c, d;
2776 a = z / 10;
2777 b = (z - a * 10) / 5;
2778 c = (z - a * 10 - b * 5) / 3;
2779 d = z - a * 10 - b * 5 - c * 3;
2780 z = 0;
2781 if (a || col == 3) z += 10;
2782 if (b || col == 2) z += 5;
2783 if (c || col == 1) z += 3;
2784 if (d || col == 0) z += 1;
2785 }
2786 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, 0, z, -1);
2787 }
2788 else if (remove_elem)
2789 {
2790 gtk_tree_model_get (pref_model, & row, 0, & z, -1);
2791 z -= col_val[col];
2792 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, 0, z, -1);
2793 }
2794}
2795
2805G_MODULE_EXPORT void edit_chem_preferences (GtkDialog * edit_chem, gint response_id, gpointer data)
2806{
2807 int i, j, k, l;
2808 int object = GPOINTER_TO_INT (data);
2809 gboolean do_style = (object < 100) ? TRUE : FALSE;
2810 gboolean do_label = (object == 1000 || object == 1001) ? TRUE : FALSE;
2811 switch (response_id)
2812 {
2813 case GTK_RESPONSE_APPLY:
2814 if (do_style)
2815 {
2816 if (object < 0)
2817 {
2818 object = - object - 2;
2819 if (tmp_bond_rad[object]) g_free (tmp_bond_rad[object]);
2821 }
2822 else
2823 {
2824 j = (object == 4 || object == 9) ? 4 : 1;
2825 k = (object < 5) ? 7 : 5;
2826 object = object - 2;
2827 for (i=0; i<j; i++)
2828 {
2829 l = (i) ? 1 : 0;
2830 if (tmp_atomic_rad[object+l*k+i]) g_free (tmp_atomic_rad[object+l*k+i]);
2832 }
2833 }
2834 }
2835 else if (do_label)
2836 {
2837 object -= 1000;
2838 if (tmp_label_color[object]) g_free (tmp_label_color[object]);
2840 if (tmp_color)
2841 {
2842 if (! tmp_label[object] -> color) tmp_label[object] -> color = g_malloc0(sizeof*tmp_label[object] -> color);
2843 tmp_label[object] -> color[0] = * tmp_color;
2844 tmp_label[object] -> n_colors = 1;
2845 }
2846 }
2847 else
2848 {
2849 object -= 100;
2850 if (tmp_atom_color[object]) g_free (tmp_atom_color[object]);
2852 }
2853 break;
2854 default:
2855 if (do_style)
2856 {
2857 j = (object < 0) ? 1 : (object == 4 || object == 9) ? 4 : 1;
2858 for (i=0; i<j; i++)
2859 {
2860 if (edit_list[i])
2861 {
2862 g_free (edit_list[i]);
2863 edit_list[i] = NULL;
2864 }
2865 }
2866 g_free (edit_list);
2867 edit_list = NULL;
2868 }
2869 else
2870 {
2871 g_free (color_list);
2872 color_list = NULL;
2873 }
2874 break;
2875 }
2876 if (tmp_color) g_free (tmp_color);
2877 tmp_color = NULL;
2879}
2880
2892void color_set_color (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
2893{
2894 int z;
2895 gtk_tree_model_get (mod, iter, 3, & z, -1);
2896 GdkRGBA colo = colrgba_togtkrgba (get_spec_color (z, color_list));
2897 if (tmp_color) colo.alpha = 0.5;
2898 g_object_set (renderer, "background-rgba", & colo, "background-set", TRUE, NULL);
2899}
2900
2912void radius_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
2913{
2914 int cid = GPOINTER_TO_INT (data);
2915 int vid;
2916 gtk_tree_model_get (mod, iter, 0, & vid, -1);
2917 gboolean docol = FALSE;
2918 switch (vid)
2919 {
2920 case 1:
2921 docol = (cid == 0) ? TRUE : FALSE;
2922 break;
2923 case 3:
2924 docol = (cid == 1) ? TRUE : FALSE;
2925 break;
2926 case 5:
2927 docol = (cid == 2) ? TRUE : FALSE;
2928 break;
2929 case 10:
2930 docol = (cid == 3) ? TRUE : FALSE;
2931 break;
2932 case 4:
2933 docol = (cid == 0 || cid == 1) ? TRUE : FALSE;
2934 break;
2935 case 6:
2936 docol = (cid == 0 || cid == 2) ? TRUE : FALSE;
2937 break;
2938 case 8:
2939 docol = (cid == 1 || cid == 2) ? TRUE : FALSE;
2940 break;
2941 case 11:
2942 docol = (cid == 0 || cid == 3) ? TRUE : FALSE;
2943 break;
2944 case 13:
2945 docol = (cid == 1 || cid == 3) ? TRUE : FALSE;
2946 break;
2947 case 15:
2948 docol = (cid == 2 || cid == 3) ? TRUE : FALSE;
2949 break;
2950 case 9:
2951 docol = (cid != 3) ? TRUE : FALSE;
2952 break;
2953 case 14:
2954 docol = (cid != 2) ? TRUE : FALSE;
2955 break;
2956 case 16:
2957 docol = (cid != 1) ? TRUE : FALSE;
2958 break;
2959 case 18:
2960 docol = (cid != 0) ? TRUE : FALSE;
2961 break;
2962 case 19:
2963 docol = TRUE;
2964 break;
2965 }
2966 set_renderer_color (docol, renderer, init_color (cid, 4));
2967}
2968
2977gboolean are_identical_colors (ColRGBA col_a, ColRGBA col_b)
2978{
2979 if (col_a.red != col_b.red) return FALSE;
2980 if (col_a.green != col_b.green) return FALSE;
2981 if (col_a.blue != col_b.blue) return FALSE;
2982 if (col_a.alpha != col_b.alpha) return FALSE;
2983 return TRUE;
2984}
2985
2995G_MODULE_EXPORT void run_ac_color (GtkDialog * win, gint response_id, gpointer data)
2996{
2997 if (response_id == GTK_RESPONSE_OK)
2998 {
2999 ColRGBA colo = get_window_color (GTK_WIDGET(win));
3000 int i = GPOINTER_TO_INT (data);
3001 ColRGBA orig = set_default_color (i);
3002 gboolean add_elem;
3003 element_color * tmp_list;
3004 if (color_list)
3005 {
3006 tmp_list = color_list;
3007 add_elem = TRUE;
3008 while (tmp_list)
3009 {
3010 if (tmp_list -> Z == i)
3011 {
3012 tmp_list -> col = colo;
3013 if (are_identical_colors(colo, orig))
3014 {
3015 if (tmp_list -> next)
3016 {
3017 if (tmp_list -> prev)
3018 {
3019 tmp_list -> prev -> next = tmp_list -> next;
3020 tmp_list -> next -> prev = tmp_list -> prev;
3021 }
3022 else
3023 {
3024 color_list = tmp_list -> next;
3025 color_list -> prev = NULL;
3026 }
3027 }
3028 else if (tmp_list -> prev)
3029 {
3030 color_list -> col = tmp_list -> col;
3031 color_list -> Z = tmp_list -> Z;
3032 color_list -> prev = NULL;
3033 }
3034 else
3035 {
3036 g_free (color_list);
3037 color_list = NULL;
3038 }
3039 add_elem = FALSE;
3040 }
3041 else
3042 {
3043 add_elem = FALSE;
3044 }
3045 }
3046 tmp_list = tmp_list -> next;
3047 }
3048 }
3049 else if (! are_identical_colors(colo, orig))
3050 {
3051 add_elem = TRUE;
3052 }
3053 if (add_elem)
3054 {
3055 if (color_list)
3056 {
3057 tmp_list = color_list;
3058 while (tmp_list)
3059 {
3060 if (! tmp_list -> next) break;
3061 tmp_list = tmp_list -> next;
3062 }
3063 tmp_list -> next = g_malloc0(sizeof*tmp_list -> next);
3064 tmp_list -> next -> prev = tmp_list;
3065 tmp_list = tmp_list -> next;
3066 }
3067 else
3068 {
3069 color_list = g_malloc0(sizeof*color_list);
3070 tmp_list = color_list;
3071 }
3072 tmp_list -> Z = i;
3073 tmp_list -> col = colo;
3074 }
3075 }
3076 destroy_this_dialog (win);
3077}
3078
3090void color_button_event (GtkWidget * widget, double event_x, double event_y, guint event_button, gpointer data)
3091{
3092 if (event_button == 1)
3093 {
3094 GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
3095 GtkTreePath * path;
3096 GtkTreeViewColumn * column;
3097 int i, j;
3098#ifdef GTK4
3099 int e_x, e_y;
3100 gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW(widget), event_x, event_y, & e_x, & e_y);
3101 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), e_x, e_y, & path, & column, & i, & j))
3102#else
3103 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), event_x, event_y, & path, & column, & i, & j))
3104#endif
3105 {
3106 if (g_strcmp0("Color", gtk_tree_view_column_get_title (column)) == 0)
3107 {
3108 GtkTreeIter row;
3109 if (gtk_tree_model_get_iter (model, & row, path))
3110 {
3111 i = GPOINTER_TO_INT(data);
3112 gchar * obj[2]={"atom", "clone"};
3113 int z;
3114 gtk_tree_model_get (model, & row, 3, & z, -1);
3115 gchar * str = g_strdup_printf ("%s %s color", periodic_table_info[z].lab, obj[i]);
3117 GtkWidget * win = gtk_color_chooser_dialog_new (str, GTK_WINDOW(MainWindow));
3118 gtk_window_set_modal (GTK_WINDOW(win), TRUE);
3119 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(win), TRUE);
3120 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(win), & col);
3121 g_free (str);
3122 run_this_gtk_dialog (win, G_CALLBACK(run_ac_color), GINT_TO_POINTER(z));
3123 }
3124 }
3125 }
3126 }
3127}
3128
3129#ifdef GTK4
3141G_MODULE_EXPORT void pref_color_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
3142{
3143 color_button_event (gtk_event_controller_get_widget ((GtkEventController*)gesture), x, y,
3144 gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), data);
3145}
3146#else
3156G_MODULE_EXPORT gboolean pref_color_button_event (GtkWidget * widget, GdkEvent * event, gpointer data)
3157{
3158 if (event -> type == GDK_BUTTON_PRESS)
3159 {
3160 GdkEventButton * bevent = (GdkEventButton*)event;
3161 color_button_event (widget, bevent -> x, bevent -> y, bevent -> button, data);
3162 }
3163 return FALSE;
3164}
3165#endif
3166
3175G_MODULE_EXPORT void set_stuff_color (GtkColorChooser * colob, gpointer data)
3176{
3177 * tmp_color = get_button_color (colob);
3178}
3179
3188G_MODULE_EXPORT void edit_species_parameters (GtkButton * but, gpointer data)
3189{
3190 gchar * ats[3]={"atom(s)", "dot(s)", "sphere(s)"};
3191 gchar * dim[3]={"radius", "size", "width"};
3192 gchar * bts[3]={"bond(s)", "wireframe(s)", "cylinder(s)"};
3193 the_object = GPOINTER_TO_INT(data);
3194 int i, j, k, l, n, m;
3195 int aid, bid;
3196 int num_col;
3197 gchar * str;
3198 gboolean do_style = (the_object < 100) ? TRUE : FALSE;
3199 gboolean do_label = FALSE;
3200 if (do_style)
3201 {
3202 if (the_object < 0)
3203 {
3204 // Going for bonds
3205 aid = - the_object - 2;
3206 aid = (aid) > 2 ? aid - 3 : aid;
3207 bid = (the_object == -3 || the_object == -6) ? 2 : 0;
3208 str = (the_object < -4) ? g_strdup_printf ("Edit cloned %s %s", bts[aid], dim[bid]) : g_strdup_printf ("Edit %s %s", bts[aid], dim[bid]);
3209 num_col = 5;
3210 }
3211 else
3212 {
3213 // Going for atoms
3214 aid = the_object - 2;
3215 aid = (aid == 0 || aid == 2 || aid == 5 || aid == 7) ? 0 : (aid == 1 || aid == 4 || aid == 6 || aid == 9) ? 1 : 2;
3216 bid = (the_object == 1 || the_object == 6) ? 1 : 0;
3217 str = (the_object - 2 > 4) ? g_strdup_printf ("Edit cloned %s %s", ats[aid], dim[bid]) : g_strdup_printf ("Edit %s %s", ats[aid], dim[bid]);
3218 num_col = (the_object == 4 || the_object == 9) ? 8 : 5;
3219 }
3220 }
3221 else
3222 {
3223 // Going for colors
3224 if (the_object < 1000)
3225 {
3226 aid = the_object - 100;
3227 str = g_strdup_printf ("Select %s color", (aid) ? "clone" : "atom");
3228 }
3229 else
3230 {
3231 aid = the_object - 1000;
3232 str = g_strdup_printf ("Select %s label color", (aid) ? "clone" : "atom");
3233 do_label = TRUE;
3234 }
3235 num_col = 5;
3236 }
3237 edit_list = NULL;
3238 color_list = NULL;
3239 tmp_color = NULL;
3240 GtkWidget * win = dialog_cancel_apply (str, MainWindow, TRUE);
3241 g_free (str);
3242 gtk_window_set_default_size (GTK_WINDOW(win), (num_col == 8) ? 600 : 300, 600);
3243 GtkWidget * vbox = dialog_get_content_area (win);
3244 GType s_type[8] = {G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE};
3245 GType c_type[5] = {G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING};
3246 GtkTreeViewColumn * pref_col[num_col];
3247 GtkCellRenderer * pref_cel[num_col];
3248 GtkTreeSelection * pref_select;
3249 GtkListStore * pref_model;
3250 GtkTreeIter elem;
3251 if (do_style)
3252 {
3253 pref_model = gtk_list_store_newv (num_col, s_type);
3254 i = (the_object < 0) ? - the_object - 2 : the_object - 2;
3255 j = (num_col == 8) ? 4 : 1;
3256 k = ((the_object < 0 && i > 2) || (the_object > 0 && i > 4)) ? 1 : 0;
3257 edit_list = g_malloc0(j*sizeof*edit_list);
3258 for (l=0; l<j; l++)
3259 {
3260 if (the_object < 0)
3261 {
3263 }
3264 else
3265 {
3266 m = (k) ? 5 : 7;
3267 n = (l) ? 1 : 0;
3269 }
3270 }
3271 }
3272 else
3273 {
3274 pref_model = gtk_list_store_newv (num_col, c_type);
3276 }
3277
3278 for (i=1; i<119; i++)
3279 {
3280 user_defined = FALSE;
3281 gtk_list_store_append (pref_model, & elem);
3282 if (do_style)
3283 {
3284 gtk_list_store_set (pref_model, & elem, 0, user_defined,
3285 1, periodic_table_info[i].name,
3287 3, periodic_table_info[i].Z,
3288 4, get_radius (the_object, 0, i, edit_list[0]), -1);
3289 if (num_col == 8)
3290 {
3291 j = user_defined;
3292 user_defined = FALSE;
3293 gtk_list_store_set (pref_model, & elem, 5, get_radius (the_object, 1, i, edit_list[1]), -1);
3294 j += (user_defined) ? 3 : 0;
3295 user_defined = FALSE;
3296 gtk_list_store_set (pref_model, & elem, 6, get_radius (the_object, 2, i, edit_list[2]), -1);
3297 j += (user_defined) ? 5 : 0;
3298 user_defined = FALSE;
3299 gtk_list_store_set (pref_model, & elem, 7, get_radius (the_object, 3, i, edit_list[3]), -1);
3300 j += (user_defined) ? 10 : 0;
3301 user_defined = FALSE;
3302 gtk_list_store_set (pref_model, & elem, 0, j, -1);
3303 }
3304 }
3305 else
3306 {
3307 gtk_list_store_set (pref_model, & elem, 0, user_defined,
3308 1, periodic_table_info[i].name,
3310 3, periodic_table_info[i].Z,
3311 4, NULL, -1);
3312 }
3313 }
3314
3315 pref_tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(pref_model));
3316 gchar * name[3] = {"Element", "Symbol", "Z"};
3317 gchar * g_name[3] = {"Radius", "Size", "Width"};
3318 gchar * f_name[4] = {"Covalent [1]","Ionic [2]","van Der Waals [3]", "Crystal [4,5]"};
3319 for (i=0; i<num_col; i++)
3320 {
3321 pref_cel[i] = gtk_cell_renderer_text_new();
3322 if (i > 3)
3323 {
3324 if (do_style)
3325 {
3326 g_object_set (pref_cel[i], "editable", TRUE, NULL);
3327 gtk_cell_renderer_set_alignment (pref_cel[i], 0.5, 0.5);
3328 g_signal_connect (G_OBJECT(pref_cel[i]), "edited", G_CALLBACK(edit_pref), GINT_TO_POINTER(i-4));
3329 pref_col[i] = gtk_tree_view_column_new_with_attributes((num_col) == 8 ? f_name[i-4] : g_name[bid], pref_cel[i], "text", i, NULL);
3330 gtk_tree_view_column_set_cell_data_func (pref_col[i], pref_cel[i], radius_set_color_and_markup, GINT_TO_POINTER(i-4), NULL);
3331 }
3332 else
3333 {
3334 gtk_cell_renderer_set_alignment (pref_cel[i], 0.5, 0.5);
3335 pref_col[i] = gtk_tree_view_column_new_with_attributes("Color", pref_cel[i], "text", i, NULL);
3336 gtk_tree_view_column_set_cell_data_func (pref_col[i], pref_cel[i], color_set_color, NULL, NULL);
3337 }
3338 }
3339 else if (i)
3340 {
3341 pref_col[i] = gtk_tree_view_column_new_with_attributes(name[i-1], pref_cel[i], "text", i, NULL);
3342 gtk_tree_view_column_set_alignment (pref_col[i], 0.5);
3343 gtk_tree_view_column_set_resizable (pref_col[i], TRUE);
3344 gtk_tree_view_column_set_min_width (pref_col[i], 50);
3345 }
3346 else
3347 {
3348 pref_col[i] = gtk_tree_view_column_new_with_attributes("", pref_cel[i], "text", i, NULL);
3349 gtk_tree_view_column_set_visible (pref_col[i], FALSE);
3350 }
3351 gtk_tree_view_append_column(GTK_TREE_VIEW(pref_tree), pref_col[i]);
3352 }
3353 g_object_unref (pref_model);
3354 pref_select = gtk_tree_view_get_selection (GTK_TREE_VIEW(pref_tree));
3355 gtk_tree_selection_set_mode (pref_select, GTK_SELECTION_SINGLE);
3356 gtk_tree_view_expand_all (GTK_TREE_VIEW(pref_tree));
3357
3358#ifdef GTK3
3359 g_signal_connect (G_OBJECT(pref_tree), "button_press_event", G_CALLBACK(pref_color_button_event), GINT_TO_POINTER(aid));
3360#else
3361 add_widget_gesture_and_key_action (pref_tree, "pref-context-click", G_CALLBACK(pref_color_button_pressed), GINT_TO_POINTER(aid),
3362 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
3363#endif
3364
3365 edit_scrol = create_scroll (vbox, -1, 570, GTK_SHADOW_ETCHED_IN);
3367 if (! do_label)
3368 {
3369 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<i>User defined values appear in colored bold font.</i>", -1, 40, 0.5, 0.5), FALSE, FALSE, 0);
3370 if (num_col == 8)
3371 {
3372 gchar * legend={"\n<sub>[1] B. Cordero and al. <i>Dalton Trans</i>, <b>213</b>:1112 (2008).</sub>\n"
3373 "<sub>[2] Slater. <i>J. Chem. Phys.</i>, <b>41</b>:3199 (1964).</sub>\n"
3374 "<sub>[3] Bondi A. <i>J. Phys. Chem.</i>, <b>68</b>:441 (1964).</sub>\n"
3375 "<sub>[4] R.D. Shannon and C.T. Prewitt <i>Acta Cryst. B</i>, <b>25</b>:925-946 (1969).</sub>\n"
3376 "<sub>[5] R.D. Shannon <i>Acta Cryst. A</i>, <b>23</b>:751-767 (1976).</sub>"};
3377 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(legend, -1, 25, 0.0, 0.5), FALSE, FALSE, 0);
3378 }
3379 }
3380 else if (do_label)
3381 {
3382 gtk_widget_set_sensitive (edit_scrol, ! tmp_label[aid] -> n_colors);
3383 GtkWidget * vvbox = create_vbox (BSEP);
3384 GtkWidget * hbox = create_hbox (BSEP);
3385 gchar * info[3] = {"By default label and species colors are similar,", "you can modify that using this dialog window.", "You can also use a single color for all labels:"};
3386 for (i=0; i<2; i++)
3387 {
3388 hbox = create_hbox (BSEP);
3389 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(info[i], 300, -1, 0.5, 0.5), FALSE, FALSE, 5);
3390 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, hbox, FALSE, FALSE, 0);
3391 }
3392 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 10);
3393 hbox = create_hbox (BSEP);
3394 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(info[i], 300, -1, 0.5, 0.5), FALSE, FALSE, 5);
3395 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3396 hbox = create_hbox (BSEP);
3397 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button ("Use single color", -1, -1, tmp_label[aid] -> n_colors, G_CALLBACK(toggled_default_stuff), data), FALSE, FALSE, 30);
3399 if (tmp_label[aid] -> n_colors)
3400 {
3401 tmp_color = g_malloc0(sizeof*tmp_color);
3402 * tmp_color = tmp_label[aid] -> color[0];
3403 active_col = tmp_label[aid] -> color[0];
3404 }
3405 active_col.red = active_col.green = active_col.blue = active_col.alpha = 1.0;
3406 edit_colob = color_button (active_col, TRUE, 100, -1, G_CALLBACK(set_stuff_color), tmp_color);
3407 widget_set_sensitive (edit_colob, tmp_label[aid] -> n_colors);
3408 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, edit_colob, FALSE, FALSE, 0);
3409 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3410 }
3411 run_this_gtk_dialog (win, G_CALLBACK(edit_chem_preferences), data);
3412}
3413
3422GtkWidget * over_param (int object, int style)
3423{
3424 GtkWidget * vbox = create_vbox (BSEP);
3425 GtkWidget * hbox = create_hbox (BSEP);
3426 int clone = ((object && style > 2) || (! object && style > 4)) ? 20 : 0;
3427 int mod = (object) ? -1 : 1;
3428 gboolean over = (! object) ? TRUE : (object && (style != 2 && style != 5)) ? TRUE : FALSE;
3429 gchar * leg;
3430 if (over)
3431 {
3432 hbox = create_hbox (BSEP);
3433 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3434 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, create_button ("Edit species related parameters", IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(edit_species_parameters), GINT_TO_POINTER(mod*(style+2))), FALSE, FALSE, 60);
3435 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3436 hbox = create_hbox (BSEP);
3437 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3438 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button ("Override species based parameters", -1, -1, (object) ? tmp_o_bd_rw[style] : tmp_o_at_rs[style], G_CALLBACK(toggled_default_stuff), GINT_TO_POINTER(mod*(style+2))), FALSE, FALSE, 10);
3439 }
3440 else
3441 {
3442 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3443 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Set default value", -1, -1, 0.0, 0.5), FALSE, FALSE, 10);
3444 }
3445 if (object)
3446 {
3447 bond_entry_over[style] = create_entry(G_CALLBACK(set_default_stuff), 100, 10, FALSE, GINT_TO_POINTER(mod*(style+2)));
3448 update_entry_double (GTK_ENTRY(bond_entry_over[style]), tmp_bd_rw[style]);
3449 if (over) widget_set_sensitive (bond_entry_over[style], tmp_o_bd_rw[style]);
3450 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, bond_entry_over[style], FALSE, FALSE, 0);
3451 leg = g_strdup_printf ("%s", (style == 1 || style == 4) ? "pts" : "&#xC5;");
3452 }
3453 else
3454 {
3455 atom_entry_over[style] = create_entry(G_CALLBACK(set_default_stuff), 100, 10, FALSE, GINT_TO_POINTER(mod*(style+2)));
3456 update_entry_double (GTK_ENTRY(atom_entry_over[style]), tmp_at_rs[style]);
3457 if (over) widget_set_sensitive (atom_entry_over[style], tmp_o_at_rs[style]);
3458 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, atom_entry_over[style], FALSE, FALSE, 0);
3459 leg = g_strdup_printf ("%s", (style == 1 || style == 6 || style == 4 || style == 9) ? "pts" : "&#xC5;");
3460 }
3461 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(leg, -1, -1, 0.0, 0.5), FALSE, FALSE, 5);
3462 g_free (leg);
3463 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3464 return vbox;
3465}
3466
3474GtkWidget * style_tab (int style)
3475{
3476 GtkWidget * vbox = create_vbox (BSEP);
3477 gchar * object[3]={"<b>Atom(s)</b>", "<b>Bond(s)</b>", "\t<u>Clone(s)</u>"};
3478 gchar * ats[3]={"tom(s) ", "ot(s)", "phere(s)"};
3479 gchar * ha_init[3]={"A", "D", "S"};
3480 gchar * la_init[3]={"a", "d", "s"};
3481 gchar * dim[3]={"radius", "size", "width"};
3482 gchar * bts[3]={"ond(s)", "ireframe(s)", "ylinder(s)"};
3483 gchar * hb_init[3]={"B", "W", "C"};
3484 gchar * lb_init[3]={"b", "w", "c"};
3485 int i;
3486 int bsid;
3487 int lid;
3488 gchar * str;
3489 gboolean do_atoms = FALSE;
3490 gboolean do_bonds = FALSE;
3491 if (style == 0 || style == 1 || style == 2 || style == 3 || style == 5)
3492 {
3493 do_atoms = TRUE;
3494 }
3495 if (style == 0 || style == 1 || style == 4)
3496 {
3497 do_bonds = TRUE;
3498 bsid = (style == 4) ? 2 : style;
3499 }
3500 if (do_atoms)
3501 {
3502 lid = (style == 3) ? 2 : (style == 1 || style == 5) ? 1 : 0;
3503 for (i=0; i<2; i++)
3504 {
3505 adv_box (vbox, object[i*2], 10-5*i, 120, 0.0);
3506 if (! i)
3507 {
3508 str = g_strdup_printf ("\t%s%s %s", ha_init[lid], ats[lid], dim[(lid != 1) ? 0 : 1]);
3509 }
3510 else
3511 {
3512 str = g_strdup_printf ("\t\tClone %s%s %s", la_init[lid], ats[lid], dim[(lid != 1) ? 0 : 1]);
3513 }
3514 adv_box (vbox, str, 10, 120, 0.0);
3515 g_free (str);
3516 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, over_param (0, (style < 5) ? style+5*i : 4 + 5*i), FALSE, FALSE, 0);
3517 }
3518 }
3519 if (do_bonds)
3520 {
3521 // Bond(s) parameters
3522 for (i=0; i<2; i++)
3523 {
3524 adv_box (vbox, object[i+1], 10-5*i, 120, 0.0);
3525 if (! i)
3526 {
3527 str = g_strdup_printf ("\t%s%s %s", hb_init[bsid], bts[bsid], dim[(bsid != 1) ? 0 : 2]);
3528 }
3529 else
3530 {
3531 str = g_strdup_printf ("\t\tClone %s%s %s", lb_init[bsid], bts[bsid], dim[(bsid != 1) ? 0 : 2]);
3532 }
3533 adv_box (vbox, str, 10, 120, 0.0);
3534 g_free (str);
3535 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, over_param (1, bsid+3*i), FALSE, FALSE, 0);
3536 }
3537 }
3538
3539 return vbox;
3540}
3541
3547GtkWidget * model_preferences ()
3548{
3549 GtkWidget * notebook = gtk_notebook_new ();
3550 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
3551 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
3552 GtkWidget * vbox = create_vbox (BSEP);
3553 //GtkWidget * hbox;
3554 //GtkWidget * combo;
3555 gchar * info[2] = {"The <b>Model</b> tab regroups atom(s), bond(s) and clone(s) options",
3556 "which effect apply when the corresponding <b>OpenGL</b> style is used:"};
3557 gchar * m_list[4][2] = {{"Ball and stick", "atoms<sup>*</sup> and bonds radii"},
3558 {"Wireframe", "dots<sup>**</sup> size and wireframes width"},
3559 {"Spacefill", "tabulated parameters"},
3560 {"Cylinders", "bonds radii"}};
3561 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 30, 0.0, 0.0), FALSE, FALSE, 0);
3562 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 4, m_list, NULL), FALSE, FALSE, 0);
3563 gchar * other_info[2] = {"It also provides options to customize atomic label(s),", "and, the model box, if any:"};
3564 gchar * o_list[2][2] = {{"Labels", "atom labels"},
3565 {"Box", "model box details"}};
3566 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (other_info, 2, o_list, NULL), FALSE, FALSE, 15);
3567 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 20, 0.0, 0.0), FALSE, FALSE, 0);
3568
3569 GtkWidget * hbox;
3570 gchar * obj[2] = {"<b>Atoms</b>", "<b>Clones</b>"};
3571 int i;
3572 for (i=0; i<2; i++)
3573 {
3574 hbox = adv_box (vbox, obj[i], 5, 150, 1.0);
3575 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, create_button ("Edit species colors", IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(edit_species_parameters), GINT_TO_POINTER(100+i)), FALSE, FALSE, 30);
3576 }
3577 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 5, 0.0, 0.0), FALSE, FALSE, 0);
3578 hbox = create_hbox (BSEP);
3579 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button ("Always show clone(s), if any.", 250, -1, tmp_clones, G_CALLBACK(toggled_default_stuff), GINT_TO_POINTER(0)), FALSE, FALSE, 30);
3580 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3581 hbox = create_hbox (BSEP);
3582 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button ("Always show box, if any.", 250, -1, tmp_clones, G_CALLBACK(toggled_default_stuff), GINT_TO_POINTER(1)), FALSE, FALSE, 30);
3583 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3584 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 5, 0.0, 0.0), FALSE, FALSE, 0);
3585
3586 append_comments (vbox, "<sup>*</sup>", "the same parameters are also used for the <b>spheres</b> style");
3587 append_comments (vbox, "<sup>**</sup>", "the same parameters are also used for the <b>dots</b> style");
3588
3589 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("General"));
3590
3591 for (i=0; i<OGL_STYLES; i++)
3592 {
3593 if (i != 3 && i != 5) gtk_notebook_append_page (GTK_NOTEBOOK(notebook), style_tab (i), gtk_label_new (text_styles[i]));
3594 }
3595
3596 vbox = create_vbox (BSEP);
3597 GtkWidget * hhbox;
3598 for (i=0; i<2; i++)
3599 {
3600 hbox = adv_box (vbox, obj[i], 5, 120, 0.0);
3601 hbox = create_hbox (BSEP);
3602 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, labels_tab(NULL, i), FALSE, FALSE, 40);
3603 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3604 hbox = create_hbox (BSEP);
3605 hhbox = create_hbox (BSEP);
3606 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
3607 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label("Colors", 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
3608 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, create_button ("Adjust color(s)", IMG_NONE, NULL, 220, -1, GTK_RELIEF_NORMAL, G_CALLBACK(edit_species_parameters), GINT_TO_POINTER(1000+i)), FALSE, FALSE, 15);
3609 add_box_child_start (GTK_ORIENTATION_VERTICAL, hbox, hhbox, FALSE, FALSE, 40);
3610 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3611 }
3612 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("Labels"));
3613
3614 pref_box_win = g_malloc0(sizeof*pref_box_win);
3615 box_advanced (NULL, NULL);
3616 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_box_win -> win, gtk_label_new ("Box"));
3617 show_the_widgets (notebook);
3618 return notebook;
3619}
3620
3629G_MODULE_EXPORT void set_default_style (GtkComboBox * box, gpointer data)
3630{
3631 GtkTreeIter iter;
3632 if (gtk_combo_box_get_active_iter (box, & iter))
3633 {
3634 GtkTreeModel * model = gtk_combo_box_get_model (box);
3635 int i;
3636 gtk_tree_model_get (model, & iter, 1, & i, -1);
3637 tmp_opengl[0] = (! i) ? 0 : i;
3638 }
3639}
3640
3646GtkTreeModel * style_combo_tree ()
3647{
3648 GtkTreeIter iter, iter2;
3649 GtkTreeStore * store;
3650 int i, j;
3651 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
3652 gtk_tree_store_append (store, & iter, NULL);
3653 gtk_tree_store_set (store, & iter, 0, "f(atoms) <sup>*</sup>", 1, 0, -1);
3654 for (i=0; i<OGL_STYLES; i++)
3655 {
3656 gtk_tree_store_append (store, & iter, NULL);
3657 gtk_tree_store_set (store, & iter, 0, text_styles[i], 1, i+1, -1);
3658 if (i == SPACEFILL)
3659 {
3660 for (j=0; j<FILLED_STYLES; j++)
3661 {
3662 gtk_tree_store_append (store, & iter2, & iter);
3663 gtk_tree_store_set (store, & iter2, 0, text_filled[j], 1, -j-1, -1);
3664 }
3665 }
3666 }
3667 return GTK_TREE_MODEL (store);
3668}
3669
3678G_MODULE_EXPORT void set_default_map (GtkComboBox * box, gpointer data)
3679{
3680 int i, j;
3681 i = combo_get_active ((GtkWidget *)box);
3682 j = GPOINTER_TO_INT(data);
3683 tmp_opengl[j+1] = i;
3684}
3685
3693GtkWidget * combo_map (int obj)
3694{
3695 GtkWidget * combo = create_combo ();
3696 combo_text_append (combo, "Atomic species");
3697 combo_text_append (combo, "Total coordination(s)");
3698 combo_text_append (combo, "Partial coordination(s)");
3699 combo_set_active (combo, tmp_opengl[1+obj]);
3700 g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(set_default_map), GINT_TO_POINTER(obj));
3701 return combo;
3702}
3703
3710{
3711 GtkWidget * notebook = gtk_notebook_new ();
3712 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
3713 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
3714 GtkWidget * vbox = create_vbox (BSEP);
3715 GtkWidget * hbox;
3716 GtkWidget * combo;
3717
3718 // Creating an OpenGL edition data structure
3719 pref_ogl_edit = g_malloc0(sizeof*pref_ogl_edit);
3720 int i;
3721 for (i=0; i<6; i++)
3722 {
3723 pref_ogl_edit -> pointer[i].a = -1;
3724 pref_ogl_edit -> pointer[i].b = i;
3725 }
3726
3727 gchar * info[2] = {"The <b>OpenGL</b> tab regroups rendering options",
3728 "use it to configure the OpenGL 3D scene:"};
3729 gchar * m_list[3][2] = {{"Material", "aspect for atom(s) and bond(s)"},
3730 {"Lights", "lightning of the scene"},
3731 {"Fog", "atmosphere effects"}};
3732 gchar * end = {"It also offers to adjust the main visualization style and the color maps"};
3733
3734 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, end), FALSE, FALSE, 30);
3735
3736 hbox = create_hbox (BSEP);
3737 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label ("<b>Style</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3738 GtkTreeModel * model = style_combo_tree ();
3739 combo = gtk_combo_box_new_with_model (model);
3740 g_object_unref (model);
3741 GtkCellRenderer * renderer = gtk_cell_renderer_combo_new ();
3742 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
3743 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "text", 0, NULL);
3744 combo_set_active (combo, tmp_opengl[0]);
3745 combo_set_markup (combo);
3746 g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(set_default_style), NULL);
3747 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 0);
3748 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3749 append_comments (vbox, "<sup>*</sup>", "if 10 000 atoms or more: <b>Wireframe</b>, otherwise: <b>Ball and stick</b>");
3750
3751 hbox = create_hbox (BSEP);
3752 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label ("<b>Color maps</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3753 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 15);
3754 hbox = create_hbox (BSEP);
3755 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label ("\tatom(s) and bond(s)", 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3756 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo_map(0), FALSE, FALSE, 0);
3757 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3758
3759 hbox = create_hbox (BSEP);
3760 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label ("\tpolyhedra", 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3761 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo_map(1), FALSE, FALSE, 0);
3762 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3763
3765
3766 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("General"));
3767
3768 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), materials_tab (NULL, pref_ogl_edit, & tmp_material), gtk_label_new ("Material"));
3769 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), lights_tab (NULL, pref_ogl_edit, & tmp_lightning), gtk_label_new ("Lights"));
3770 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), fog_tab (NULL, pref_ogl_edit, & tmp_fog), gtk_label_new ("Fog"));
3771
3772 gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), 0);
3773 return notebook;
3774}
3775
3784G_MODULE_EXPORT void set_default_num_delta (GtkEntry * res, gpointer data)
3785{
3786 int i = GPOINTER_TO_INT(data);
3787 const gchar * m = entry_get_text (res);
3788 double value = string_to_double ((gpointer)m);
3789 if (i == -1)
3790 {
3791 if (value > 0.0)
3792 {
3793 tmp_totcut = value;
3794 }
3796 }
3797 else if (i < 8)
3798 {
3799 if (value > 0) tmp_num_delta[i] = (int) value;
3801 }
3802 else
3803 {
3804 if (value > 0.0) tmp_delta_t[0] = value;
3806 }
3807}
3808
3817G_MODULE_EXPORT void tunit_changed (GtkComboBox * box, gpointer data)
3818{
3819 tmp_delta_t[1] = (double) combo_get_active ((GtkWidget *)box);
3820}
3821
3822GtkWidget * all_cut_box;
3823GtkWidget * cut_combo[2];
3824GtkWidget * pcut_box[2];
3825GtkWidget * tcut_entry;
3826GtkWidget * tcut_box;
3827GtkWidget * cut_comments;
3829
3838G_MODULE_EXPORT void totcut_changed (GtkComboBox * box, gpointer data)
3839{
3840 if (combo_get_active((GtkWidget *)box))
3841 {
3842 tmp_totcut = 2.0;
3844 }
3845 else
3846 {
3847 tmp_totcut = 0.0;
3849 }
3851}
3852
3861G_MODULE_EXPORT void edit_pc_value (GtkEntry * res, gpointer data)
3862{
3863 bond_cutoff * cut = (bond_cutoff *)data;
3864 const gchar * m = entry_get_text (res);
3865 double value = string_to_double ((gpointer)m);
3866 if (value > 0.0)
3867 {
3868 cut -> cutoff = value;
3869 }
3870 update_entry_double (res, cut -> cutoff);
3871}
3872
3873#ifdef GTK4
3882G_MODULE_EXPORT void toggled_use_cutoff (GtkCheckButton * but, gpointer data)
3883#else
3892G_MODULE_EXPORT void toggled_use_cutoff (GtkToggleButton * but, gpointer data)
3893#endif
3894{
3895 bond_cutoff * cut = (bond_cutoff *)data;
3896 cut -> use = button_get_status ((GtkWidget *)but);
3897}
3898
3905{
3906 GtkWidget * hbox;
3907 GtkWidget * entry;
3908
3909 int i;
3910 for (i=0; i<2; i++)
3911 {
3912 if (pcut_box[i])
3913 {
3915 }
3916 }
3917 pcut_box[0] = create_vbox (BSEP);
3918 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, pcut_box[0], FALSE, FALSE, 10);
3919 if (cut_list)
3920 {
3921 hbox = create_hbox (BSEP);
3922 add_box_child_start (GTK_ORIENTATION_VERTICAL, pcut_box[0], hbox, FALSE, FALSE, 10);
3923 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Spec. &#x3B1;", 60, -1, 0.0, 0.5), FALSE, FALSE, 10);
3924 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Spec. &#x3B2;", 60, -1, 0.0, 0.5), FALSE, FALSE, 10);
3925 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("R<sub>cut</sub> (&#x3B1;, &#x3B2;)", 100, -1, 0.5, 0.5), FALSE, FALSE, 10);
3926 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Use <sup>*</sup>", 20, -1, 0.5, 0.5), FALSE, FALSE, 10);
3927 }
3928 pcut_box[1] = create_vbox (BSEP);
3929 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, pcut_box[1], FALSE, FALSE, 10);
3930 bond_cutoff * tmp_cut = cut_list;
3931 while (tmp_cut)
3932 {
3933 hbox = create_hbox (BSEP);
3934 add_box_child_start (GTK_ORIENTATION_VERTICAL, pcut_box[1], hbox, FALSE, FALSE, 0);
3935 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(periodic_table_info[tmp_cut -> Z[0]].lab, 60, -1, 0.5, 0.5), FALSE, FALSE, 10);
3936 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(periodic_table_info[tmp_cut -> Z[1]].lab, 60, -1, 0.5, 0.5), FALSE, FALSE, 10);
3937 entry = create_entry (G_CALLBACK(edit_pc_value), 100, 10, FALSE, (gpointer)tmp_cut);
3938 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
3939 update_entry_double ((GtkEntry *)entry, tmp_cut -> cutoff);
3940 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button (NULL, 20, -1, tmp_cut -> use, G_CALLBACK(toggled_use_cutoff), (gpointer)tmp_cut), FALSE, FALSE, 10);
3941 tmp_cut = tmp_cut -> next;
3942 }
3943
3946 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, cut_comments, FALSE, FALSE, 10);
3947 if (cut_list) append_comments (cut_comments, "<sup>*</sup>", "Unused values will not be saved !");
3948
3949 for (i=0; i<2; i++) combo_set_active (cut_combo[i], -1);
3951}
3952
3958gboolean not_in_cutoffs (int z_a, int z_b)
3959{
3960 bond_cutoff * tmp_cut = cut_list;
3961 while (tmp_cut)
3962 {
3963 if (tmp_cut -> Z[0] == z_a && tmp_cut -> Z[1] == z_b) return FALSE;
3964 tmp_cut = tmp_cut -> next;
3965 }
3966 return TRUE;
3967}
3968
3977G_MODULE_EXPORT void cut_spec_changed (GtkComboBox * box, gpointer data)
3978{
3979 int i, j, k, l;
3980 i = combo_get_active (cut_combo[0]);
3981 j = combo_get_active (cut_combo[1]);
3982 k = min (i+1, j+1);
3983 l = max (i+1, j+1);
3984 if (k && l)
3985 {
3986 if (not_in_cutoffs(k, l))
3987 {
3988 bond_cutoff * tmp_cut;
3989 if (! cut_list)
3990 {
3991 cut_list = g_malloc0(sizeof*cut_list);
3992 tmp_cut = cut_list;
3993 }
3994 else
3995 {
3996 tmp_cut = cut_list;
3997 while (tmp_cut -> next)
3998 {
3999 tmp_cut = tmp_cut -> next;
4000 }
4001 tmp_cut -> next = g_malloc0(sizeof*tmp_cut -> next);
4002 tmp_cut -> next -> prev = tmp_cut;
4003 tmp_cut = tmp_cut -> next;
4004 }
4005 tmp_cut -> Z[0] = min(k, l);
4006 tmp_cut -> Z[1] = max(k, l);
4007 tmp_cut -> use = FALSE;
4008 tmp_cut -> cutoff = 1.0;
4009 add_cut_box ();
4010 }
4011 }
4012}
4013
4022{
4023 bond_cutoff * new_cutoff = NULL;
4024 bond_cutoff * cut_a, * cut_b;
4025 cut_a = old_cutoff;
4026 while (cut_a)
4027 {
4028 if (cut_a -> use)
4029 {
4030 if (! new_cutoff)
4031 {
4032 new_cutoff = g_malloc0(sizeof*new_cutoff);
4033 cut_b = new_cutoff;
4034 }
4035 else
4036 {
4037 cut_b -> next = g_malloc0(sizeof*cut_b -> next);
4038 cut_b -> next -> prev = cut_b;
4039 cut_b = cut_b -> next;
4040 }
4041 cut_b -> Z[0] = cut_a -> Z[0];
4042 cut_b -> Z[1] = cut_a -> Z[1];
4043 cut_b -> use = cut_a -> use;
4044 cut_b -> cutoff = cut_a -> cutoff;
4045 }
4046 cut_a = cut_a -> next;
4047 }
4048 return new_cutoff;
4049}
4050
4060G_MODULE_EXPORT void edit_cutoffs (GtkDialog * edit_cuts, gint response_id, gpointer data)
4061{
4062 switch (response_id)
4063 {
4064 case GTK_RESPONSE_APPLY:
4066 break;
4067 }
4068 if (cut_list)
4069 {
4070 g_free (cut_list);
4071 cut_list = NULL;
4072 }
4073 int i;
4074 for (i=0; i<2; i++)
4075 {
4078 }
4081 destroy_this_widget ((GtkWidget *)edit_cuts);
4082}
4083
4092G_MODULE_EXPORT void set_cutoffs_default (GtkButton * but, gpointer data)
4093{
4094 GtkWidget * win = dialog_cancel_apply ("Select partial cutoffs(s)", MainWindow, TRUE);
4095 GtkWidget * vbox = dialog_get_content_area (win);
4096 GtkWidget * hbox = create_hbox (BSEP);
4097 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4099 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, all_cut_box, FALSE, FALSE, 50);
4101 hbox = create_hbox (BSEP);
4102 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, hbox, FALSE, FALSE, 5);
4103 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Spec. &#x3B1;", 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
4104 int i, j;
4105 for (i=0; i<2; i++)
4106 {
4107 cut_combo[i] = NULL;
4108 cut_combo[i] = create_combo ();
4109 for (j=1; j<119; j++)
4110 {
4112 }
4113 g_signal_connect(G_OBJECT(cut_combo[i]), "changed", G_CALLBACK(cut_spec_changed), NULL);
4115 }
4116 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, cut_combo[0], FALSE, FALSE, 5);
4117 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 20, -1, 0.0, 0.5), FALSE, FALSE, 0);
4118 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Spec. &#x3B2;", 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
4119 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, cut_combo[1], FALSE, FALSE, 5);
4120
4121 add_cut_box ();
4122
4123 run_this_gtk_dialog (win, G_CALLBACK(edit_cutoffs), NULL);
4124}
4125
4131GtkWidget * calc_preferences ()
4132{
4133 GtkWidget * notebook = gtk_notebook_new ();
4134 GtkWidget * vbox;
4135 GtkWidget * hbox;
4136 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
4137 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
4138 gchar * default_delta_num_leg[8] = {"<b>g(r)</b>: number of &#x3b4;r", "<b>s(q)</b>: number of &#x3b4;q", "<b>s(k)</b>: number of &#x3b4;k", "<b>g(r) FFT</b>: number of &#x3b4;r",
4139 "<b>D<sub>ij</sub></b>: number of &#x3b4;r [D<sub>ij</sub>min-D<sub>ij</sub>max]", "<b>Angles distribution</b>: number of &#x3b4;&#x3b8; [0-180°]",
4140 "<b>Spherical harmonics</b>: l<sub>max</sub> in [2-40]", "step(s) between configurations"};
4141 gchar * info[2] = {"The <b>Analysis</b> tab regroups calculation options",
4142 "use it to setup your own default parameters:"};
4143 gchar * m_list[3][2] = {{"Calculations", "most analysis options"},
4144 {"Rings", "ring statistics options"},
4145 {"Chains", "chain statistics options"}};
4146
4147 vbox = create_vbox (BSEP);
4148 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, NULL), FALSE, FALSE, 20);
4149
4150 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("To determine the existence, or the absence, of a chemical bond", -1, -1, 0.5, 0.5), FALSE, FALSE, 0);
4151 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("between 2 atoms is a key feature in the <b>atomes</b> software", -1, -1, 0.5, 0.5), FALSE, FALSE, 0);
4152 GtkWidget * vvbox = create_vbox (BSEP);
4153 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 10);
4154 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label("It is used for analysis purposes, and, to draw bonds in the OpenGL window.", -1, -1, 0.5, 0.5), FALSE, FALSE, 0);
4155 edit_bonds (vbox);
4156 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("You can adapt below the distance cutoffs:", -1, -1, 0.5, 0.5), FALSE, FALSE, 5);
4157
4158 hbox = create_hbox (BSEP);
4159 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4160 GtkWidget * hhbox = create_hbox (BSEP);
4161 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
4162 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label("<b>Total cutoff</b>", 120, -1, 0.0, 0.5), FALSE, FALSE, 0);
4163 GtkWidget * combo = create_combo();
4164 combo_text_append (combo, "Evaluated by <b>atomes</b>");
4165 combo_text_append (combo, "User defined <sup>*</sup>");
4166 combo_set_markup (combo);
4167 gtk_widget_set_size_request (combo, 180, -1);
4168 combo_set_active (combo, (tmp_totcut == 0.0) ? 0 : 1);
4169 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(totcut_changed), NULL);
4170 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, combo, FALSE, FALSE, 10);
4171
4173 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, tcut_box, FALSE, FALSE, 10);
4174 tcut_entry = create_entry (G_CALLBACK(set_default_num_delta), 100, 10, FALSE, GINT_TO_POINTER(-1));
4176 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, tcut_box, tcut_entry, FALSE, FALSE, 0);
4177 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, tcut_box, markup_label ("&#xC5;", -1, -1, 0.0, 0.5), FALSE, FALSE, 5);
4178
4179 hbox = create_hbox (BSEP);
4180 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
4181 hhbox = create_hbox (BSEP);
4182 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
4183 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label("<b>Partial cutoff(s)</b>", 120, -1, 0.0, 0.5), FALSE, FALSE, 0);
4184 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, create_button ("Set default cutoff(s)", IMG_NONE, NULL, 180, -1, GTK_RELIEF_NORMAL, G_CALLBACK(set_cutoffs_default), NULL), FALSE, FALSE, 10);
4185
4186 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 20, 0.0, 0.0), FALSE, FALSE, 0);
4187 append_comments (vbox, "<sup>*</sup>", "The highest this value is, the highest the number of neighbors around an atom.");
4188
4189 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("General"));
4190
4191 GtkWidget * entry;
4192 vbox = create_vbox (BSEP);
4193 int i;
4194 for (i=0; i<8; i++)
4195 {
4196 if (i == 7)
4197 {
4198 hbox = create_hbox (BSEP);
4199 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label ("<b>Mean Squared Displacement</b>:", 310, -1, 0.0, 0.5), FALSE, FALSE, 15);
4200 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4201 }
4202 hbox = create_hbox (BSEP);
4203 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (default_delta_num_leg[i], (i ==7) ? 285 : 310, -1, 0.0, 0.5), FALSE, FALSE, (i == 7) ? 30 : 15);
4204 entry = create_entry (G_CALLBACK(set_default_num_delta), 110, 10, FALSE, GINT_TO_POINTER(i));
4205 update_entry_int ((GtkEntry *)entry, tmp_num_delta[i]);
4206 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 0);
4207 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4208 }
4209 hbox = create_hbox (BSEP);
4210 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label ("time step(s) &#x3b4;t", 285, -1, 0.0, 0.5), FALSE, FALSE, 30);
4211 entry = create_entry (G_CALLBACK(set_default_num_delta), 110, 10, FALSE, GINT_TO_POINTER(i));
4212 update_entry_double ((GtkEntry *)entry, tmp_delta_t[0]);
4213 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 0);
4214 GtkWidget * tcombo = create_combo ();
4215 for (i=0; i<5 ; i++) combo_text_append (tcombo, untime[i]);
4216
4217 combo_set_active (tcombo, (int)tmp_delta_t[1]);
4218 g_signal_connect(G_OBJECT(tcombo), "changed", G_CALLBACK(tunit_changed), NULL);
4219 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, tcombo, FALSE, FALSE, 0);
4220
4221 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4222
4223 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ("Calculations"));
4224
4225 for (i=0; i<2; i++)
4226 {
4227 vbox = create_vbox (BSEP);
4228 search_type = i;
4229 calc_rings (vbox);
4230 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ((i) ? "Chains" : "Rings"));
4231 }
4232 show_the_widgets (notebook);
4233 return notebook;
4234}
4235
4242{
4243 if (tmp_num_delta)
4244 {
4245 g_free (tmp_num_delta);
4246 tmp_num_delta = NULL;
4247 }
4248 if (tmp_delta_t)
4249 {
4250 g_free (tmp_delta_t);
4251 tmp_delta_t = NULL;
4252 }
4253 if (tmp_rsparam)
4254 {
4255 g_free (tmp_rsparam);
4256 tmp_rsparam = NULL;
4257 }
4258 if (tmp_csparam)
4259 {
4260 g_free (tmp_csparam);
4261 tmp_csparam = NULL;
4262 }
4263 if (tmp_opengl)
4264 {
4265 g_free (tmp_opengl);
4266 tmp_opengl = NULL;
4267 }
4268 if (tmp_lightning.spot)
4269 {
4270 g_free (tmp_lightning.spot);
4271 tmp_lightning.spot = NULL;
4272 }
4273 if (tmp_o_at_rs)
4274 {
4275 g_free (tmp_o_at_rs);
4276 tmp_o_at_rs = NULL;
4277 }
4278 if (tmp_at_rs)
4279 {
4280 g_free (tmp_at_rs);
4281 tmp_at_rs = NULL;
4282 }
4283 if (tmp_o_bd_rw)
4284 {
4285 g_free (tmp_o_bd_rw);
4286 tmp_o_bd_rw = NULL;
4287 }
4288 if (tmp_bd_rw)
4289 {
4290 g_free (tmp_bd_rw);
4291 tmp_bd_rw = NULL;
4292 }
4293 int i;
4294 for (i=0; i<16; i++)
4295 {
4296 if (tmp_atomic_rad[i])
4297 {
4298 g_free (tmp_atomic_rad[i]);
4299 tmp_atomic_rad[i] = NULL;
4300 }
4301 }
4302 for (i=0; i<6; i++)
4303 {
4304 if (tmp_bond_rad[i])
4305 {
4306 g_free (tmp_bond_rad[i]);
4307 tmp_bond_rad[i] = NULL;
4308 }
4309 }
4310 for (i=0; i<2; i++)
4311 {
4312 if (tmp_atom_color[i])
4313 {
4314 g_free (tmp_atom_color[i]);
4315 tmp_atom_color[i] = NULL;
4316 }
4317 if (tmp_label_color[i])
4318 {
4319 g_free (tmp_label_color[i]);
4320 tmp_label_color[i] = NULL;
4321 }
4322 }
4323 for (i=0; i<5; i++)
4324 {
4325 if (tmp_label[i])
4326 {
4327 g_free (tmp_label[i]);
4328 tmp_label[i] = NULL;
4329 }
4330 }
4331 if (tmp_box)
4332 {
4333 g_free (tmp_box);
4334 tmp_box = NULL;
4335 }
4336 if (tmp_axis)
4337 {
4338 g_free (tmp_axis);
4339 tmp_axis = NULL;
4340 }
4341 if (tmp_rep)
4342 {
4343 g_free (tmp_rep);
4344 tmp_rep = NULL;
4345 }
4346}
4347
4356void duplicate_rep_data (rep_data * new_rep, rep_data * old_rep)
4357{
4358 new_rep -> rep = old_rep -> rep;
4359 new_rep -> proj = old_rep -> proj;
4360 new_rep -> zoom = old_rep -> zoom;
4361 new_rep -> gnear = old_rep -> gnear;
4362 int i;
4363 for (i=0; i<2; i++)
4364 {
4365 new_rep -> c_angle[i] = old_rep -> c_angle[i];
4366 new_rep -> c_shift[i] = old_rep -> c_shift[i];
4367 }
4368}
4369
4379{
4380 new_back -> gradient = old_back -> gradient;
4381 new_back -> direction = old_back -> direction;
4382 new_back -> position = old_back -> position;
4383 new_back -> color = old_back -> color;
4384 int i;
4385 for (i=0; i<2; i++)
4386 {
4387 new_back -> gradient_color[i] = old_back -> gradient_color[i];
4388 }
4389}
4390
4399void duplicate_box_data (box * new_box, box * old_box)
4400{
4401 new_box -> box = old_box -> box;
4402 new_box -> color = old_box -> color;
4403 new_box -> line = old_box -> line;
4404 new_box -> rad = old_box -> rad;
4405}
4406
4415void duplicate_axis_data (axis * new_axis, axis * old_axis)
4416{
4417 new_axis -> axis = old_axis -> axis;
4418 new_axis -> length = old_axis -> length;
4419 new_axis -> color = old_axis -> color;
4420 new_axis -> line = old_axis -> line;
4421 new_axis -> rad = old_axis -> rad;
4422 new_axis -> t_pos = old_axis -> t_pos;
4423 new_axis -> labels = old_axis -> labels;
4424 int i;
4425 for (i=0; i<3; i++)
4426 {
4427 new_axis -> c_pos[i] = old_axis -> c_pos[i];
4428 if (old_axis -> title[i]) new_axis -> title[i] = g_strdup_printf ("%s", old_axis -> title[i]);
4429 }
4430 if (old_axis -> color)
4431 {
4432 new_axis -> color = duplicate_color (3, old_axis -> color);
4433 }
4434}
4435
4442{
4443 clean_all_tmp ();
4461 int i;
4462 for (i=0; i<16; i++)tmp_atomic_rad[i] = duplicate_element_radius (default_atomic_rad[i]);
4463 for (i=0; i<6; i++) tmp_bond_rad[i] = duplicate_element_radius (default_bond_rad[i]);
4464 for (i=0; i<2; i++)
4465 {
4468 }
4469 for (i=0; i<5; i++)
4470 {
4471 tmp_label[i] = g_malloc(sizeof*tmp_label[i]);
4473 }
4474 for (i=0; i<2; i++)
4475 {
4477 tmp_mtilt[i] = default_mtilt[i];
4480 tmp_mwidth[i] = default_mwidth[i];
4481 }
4482
4483 tmp_box = g_malloc0(sizeof*tmp_box);
4485
4486 tmp_background = g_malloc0(sizeof*tmp_background);
4488
4489 tmp_rep = g_malloc0(sizeof*tmp_rep);
4491
4492 tmp_axis = g_malloc0(sizeof*tmp_axis);
4494
4495 for (i=0; i<2; i++) tmp_sel_color[i] = default_sel_color[i];
4496}
4497
4498gboolean * up_project;
4499
4509G_MODULE_EXPORT void update_projects (GtkDialog * proj_sel, gint response_id, gpointer data)
4510{
4511 int i;
4512 switch (response_id)
4513 {
4514 case GTK_RESPONSE_OK:
4515 // To write apply to opened projects
4516 for (i=0; i<nprojects; i++)
4517 {
4519 }
4520 break;
4521 default:
4522 break;
4523 }
4524 g_free (up_project);
4525 up_project = NULL;
4526 destroy_this_dialog (proj_sel);
4527}
4528
4529#ifdef GTK4
4538G_MODULE_EXPORT void toggled_select_project (GtkCheckButton * but, gpointer data)
4539#else
4548G_MODULE_EXPORT void toggled_select_project (GtkToggleButton * but, gpointer data)
4549#endif
4550{
4551 up_project[GPOINTER_TO_INT(data)] = button_get_status ((GtkWidget *)but);
4552}
4553
4560{
4563 {
4564 g_free (default_bond_cutoff);
4565 default_bond_cutoff = NULL;
4566 }
4569 {
4570 g_free (default_num_delta);
4571 default_num_delta = NULL;
4572 }
4575 if (default_rsparam)
4576 {
4577 g_free (default_rsparam);
4578 default_rsparam = NULL;
4579 }
4581 if (default_csparam)
4582 {
4583 g_free (default_csparam);
4584 default_csparam = NULL;
4585 }
4587 if (default_opengl)
4588 {
4589 g_free (default_opengl);
4590 default_opengl = NULL;
4591 }
4597
4598 // Model
4601 if (default_o_at_rs)
4602 {
4603 g_free (default_o_at_rs);
4604 default_o_at_rs = NULL;
4605 }
4607 if (default_at_rs)
4608 {
4609 g_free (default_at_rs);
4610 default_at_rs = NULL;
4611 }
4613 if (default_o_bd_rw)
4614 {
4615 g_free (default_o_bd_rw);
4616 default_o_bd_rw = NULL;
4617 }
4619 if (default_bd_rw)
4620 {
4621 g_free (default_bd_rw);
4622 default_bd_rw = NULL;
4623 }
4625 int i;
4626 for (i=0; i<16; i++)
4627 {
4628 if (default_atomic_rad[i]) g_free (default_atomic_rad[i]);
4630 }
4631 for (i=0; i<6; i++)
4632 {
4633 if (default_bond_rad[i]) g_free (default_bond_rad[i]);
4635 }
4636 for (i=0; i<2; i++)
4637 {
4638 if (default_atom_color[i]) g_free (default_atom_color[i]);
4640 if (default_label_color[i]) g_free (default_label_color[i]);
4642 }
4643 for (i=0; i<5; i++)
4644 {
4646 }
4647 for (i=0; i<2; i++)
4648 {
4650 default_mtilt[i] = tmp_mtilt[i];
4653 default_mwidth[i] = tmp_mwidth[i];
4654 }
4659
4660 for (i=0; i<2; i++) default_sel_color[i] = tmp_sel_color[i];
4661
4662 if (nprojects)
4663 {
4664 if (ask_yes_no("Apply to projet(s) in workspace ?", "Preferences were saved for the active session !\n Do you want to apply preferences to the project(s) opened in the workspace ?", GTK_MESSAGE_QUESTION, pref_ogl_edit -> win))
4665 {
4666 // Select project here
4667 GtkWidget * proj_sel = message_dialogmodal ("Project selection", "Select to apply preferences", GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK, MainWindow);
4668 GtkWidget * vbox = dialog_get_content_area (proj_sel);
4669 GtkWidget * hbox;
4671 for (i=0; i<nprojects; i++)
4672 {
4673 hbox = create_hbox (BSEP);
4674 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
4675 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button (get_project_by_id(i) -> name, 200, -1, FALSE, G_CALLBACK(toggled_select_project), GINT_TO_POINTER(i)), FALSE, FALSE, 40);
4676 }
4677 run_this_gtk_dialog (proj_sel, G_CALLBACK(update_projects), NULL);
4678 }
4679 }
4680}
4681
4688{
4689 int i;
4690 if (tmp_totcut == 0.0)
4691 {
4693 }
4694 else
4695 {
4697 }
4701 if (tmp_box -> box > NONE)
4702 {
4703 hide_the_widgets ((tmp_box -> box == WIREFRAME) ? pref_box_win -> radius_box : pref_box_win -> width_box);
4704 }
4705 hide_the_widgets ((tmp_axis -> axis == WIREFRAME) ? pref_axis_win -> radius_box : pref_axis_win -> width_box);
4706 for (i=0; i<2; i++) widget_set_sensitive (pref_axis_win -> axis_label_box[i], tmp_axis -> labels);
4709 i = (i < 0) ? 0 : i;
4713 i = (i < 0) ? 0 : i;
4716}
4717
4726G_MODULE_EXPORT void restore_defaults_parameters (GtkButton * but, gpointer data)
4727{
4728
4729 if (ask_yes_no("Restore default parameters", "Are you sure ?", GTK_MESSAGE_QUESTION, MainWindow))
4730 {
4733 int i;
4734 for (i=4; i>0; i--)
4735 {
4736 destroy_this_widget (gtk_notebook_get_nth_page (GTK_NOTEBOOK (preference_notebook), i));
4737 }
4738 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), calc_preferences(), gtk_label_new ("Analysis"));
4739 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), opengl_preferences(), gtk_label_new ("OpenGL"));
4740 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), model_preferences(), gtk_label_new ("Model"));
4741 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), view_preferences(), gtk_label_new ("View"));
4742 gtk_notebook_set_current_page (GTK_NOTEBOOK(preference_notebook), 0);
4745 }
4746}
4747
4757G_MODULE_EXPORT void edit_preferences (GtkDialog * edit_prefs, gint response_id, gpointer data)
4758{
4759 switch (response_id)
4760 {
4761 case GTK_RESPONSE_APPLY:
4762 if (ask_yes_no("Save parameters", "Are you sure ?", GTK_MESSAGE_QUESTION, MainWindow))
4763 {
4765 gchar * str = g_strdup_printf ("Do you want to save <b>atomes</b> preferences in:\n\n\t%s\n\nIf found this file is processed at every <b>atomes</b> startup.\n\n\t\t\t\t\t\tSave file ?", ATOMES_CONFIG);
4766 if (ask_yes_no("Save atomes preferences to file ?", str, GTK_MESSAGE_QUESTION, (GtkWidget *)edit_prefs))
4767 {
4769 {
4770 show_error ((pref_error) ? pref_error : "Error while trying to save preferences to file", 0, MainWindow);
4771 g_free (pref_error);
4772 pref_error = NULL;
4773 }
4774 }
4775 g_free (str);
4776 }
4777 break;
4778 default:
4779 destroy_this_dialog (edit_prefs);
4780 preferences = FALSE;
4781 clean_all_tmp ();
4782 g_free (pref_pointer);
4783 pref_pointer = NULL;
4784 if (pref_box_win) g_free (pref_box_win);
4785 pref_box_win = NULL;
4786 if (pref_rep_win) g_free (pref_rep_win);
4787 pref_rep_win = NULL;
4788 if (pref_axis_win) g_free (pref_axis_win);
4789 pref_axis_win = NULL;
4791 pref_gradient_win = NULL;
4792 preference_notebook = NULL;
4793 break;
4794 }
4795}
4796
4803{
4804 GtkWidget * win = dialog_cancel_apply ("User preferences", MainWindow, TRUE);
4805 preferences = TRUE;
4807 GtkWidget * vbox = dialog_get_content_area (win);
4808 gtk_widget_set_size_request (win, 625, 645);
4809 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
4810 preference_notebook = gtk_notebook_new ();
4811 gtk_notebook_set_scrollable (GTK_NOTEBOOK(preference_notebook), TRUE);
4812 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(preference_notebook), GTK_POS_LEFT);
4813 gtk_widget_set_size_request (preference_notebook, 600, 635);
4814 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, preference_notebook, FALSE, FALSE, 0);
4815
4816 GtkWidget * gbox = create_vbox (BSEP);
4817 gchar * mess[2] = {"Browse the following to modify the default configuration of <b>atomes</b>",
4818 "by replacing internal parameters by user defined preferences."};
4819 gchar * mlist[4][2]= {{"Analysis", "calculation preferences"},
4820 {"OpenGL", "rendering preferences"},
4821 {"Model", "atom(s), bond(s) and box preferences"},
4822 {"View", "representation and projection preferences"}};
4823 gchar * end = "Default parameters are used for any new project added to the workspace\n";
4824
4825 pref_pointer = g_malloc0(NUM_COLORS*sizeof*pref_pointer);
4826 int i;
4827 for (i=0; i<NUM_COLORS; i++)
4828 {
4829 pref_pointer[i].a = -1;
4830 pref_pointer[i].b = i;
4831 pref_pointer[i].c = -1;
4832 }
4833
4834 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, pref_list(mess, 4, mlist, end), FALSE, FALSE, 20);
4835
4836 GtkWidget * hbox = create_hbox (BSEP);
4837 GtkWidget * but = create_button (NULL, IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(restore_defaults_parameters), NULL);
4838 GtkWidget * but_lab = markup_label ("Restore <b>atomes</b> default parameters", -1, -1, 0.5, 0.5);
4839 add_container_child (CONTAINER_BUT, but, but_lab);
4840 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, but, FALSE, FALSE, 150);
4841 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, hbox, FALSE, FALSE, 0);
4842 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), gbox, gtk_label_new ("General"));
4843
4844 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), calc_preferences(), gtk_label_new ("Analysis"));
4845 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), opengl_preferences(), gtk_label_new ("OpenGL"));
4846 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), model_preferences(), gtk_label_new ("Model"));
4847 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), view_preferences(), gtk_label_new ("View"));
4849 gtk_notebook_set_current_page (GTK_NOTEBOOK(preference_notebook), 0);
4850 run_this_gtk_dialog (win, G_CALLBACK(edit_preferences), NULL);
4851}
4852
4861G_MODULE_EXPORT void set_default_options (GtkButton * but, gpointer data)
4862{
4863 tint * oid = (tint *)data;
4864 gchar * pstring[5]={"rendering", "box", "axis", "backgorund", "representation"};
4865 gchar * str = g_strdup_printf ("Set %s preferences as default preferences ?", pstring[oid -> b]);
4866 project * this_proj = get_project_by_id(oid -> a);
4867 if (ask_yes_no("Set model preferences as default ?", str, GTK_MESSAGE_QUESTION, this_proj -> modelgl -> win))
4868 {
4869 g_free (str);
4870 image * img = this_proj -> modelgl -> anim -> last -> img;
4871 switch (oid -> b)
4872 {
4873 case 0:
4874 // OpenGL preferences, style and color mpas not included : rendering only
4875 default_opengl[3] = img -> quality;
4876 duplicate_material (& default_material, & img -> m_terial);
4877 default_lightning.lights = img -> l_ghtning.lights;
4878 default_lightning.spot = copy_light_sources (img -> l_ghtning.lights, img -> l_ghtning.lights, img -> l_ghtning.spot);
4879 duplicate_fog (& default_fog, & img -> f_g);
4880 break;
4881 case 1:
4882 // Box
4884 break;
4885 case 2:
4886 // Axis
4888 break;
4889 case 3:
4890 // Background
4892 break;
4893 case 4:
4894 // Representation
4895 default_rep.rep = img -> rep;
4896 default_rep.zoom = img -> zoom;
4897 default_rep.gnear = img -> gnear;
4898 int i;
4899 for (i=0; i<2; i++)
4900 {
4901 default_rep.c_angle[i] = img -> c_angle[i];
4902 default_rep.c_shift[i] = img -> c_shift[i];
4903 }
4904 break;
4905 }
4906 str = g_strdup_printf ("Do you want to save <b>atomes</b> preferences in:\n\n\t%s\n\nIf found this file is processed at every <b>atomes</b> startup.\n\n\t\t\t\t\t\tSave file ?", ATOMES_CONFIG);
4907 if (ask_yes_no("Save atomes preferences to file ?", str, GTK_MESSAGE_QUESTION, this_proj -> modelgl -> win))
4908 {
4910 {
4911 show_error ((pref_error) ? pref_error : "Error while trying to save preferences to file", 0, MainWindow);
4912 g_free (pref_error);
4913 pref_error = NULL;
4914 }
4915 }
4916 g_free (str);
4917 }
4918 else
4919 {
4920 g_free (str);
4921 }
4922}
4923
4932void add_global_option (GtkWidget * vbox, tint * oid)
4933{
4934 GtkWidget * hbox = create_hbox (5);
4935 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, TRUE, FALSE, 0);
4936 GtkWidget * but = create_button ("Set default", IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(set_default_options), oid);
4937 add_box_child_end (hbox, but, FALSE, FALSE, 0);
4938}
Binding to the Fortran90 subroutines.
double set_radius_(int *, int *)
Callback declarations for main window.
ColRGBA init_color(int id, int numid)
initialize color based id number over total number of elements
Definition initcoord.c:81
double scale(double axe)
find appropriate major tick spacing based on axis length
Definition curve.c:204
ColRGBA col
Definition d_measures.c:77
int * shift
Definition d_measures.c:72
GtkTreePath * path
Definition datab.c:103
GtkTreeIter row
Definition datab.c:104
float val
Definition dlp_init.c:117
dint rep
Definition dlp_edit.c:2227
int * duplicate_int(int num, int *old_val)
copy a list of int
Definition global.c:560
gboolean * duplicate_bool(int num, gboolean *old_val)
copy a list of gboolean
Definition global.c:576
int active_col
Definition dlp_mol.c:57
void edit_chem(GtkWidget *vbox)
creation of the edit chemical properties widgets
Definition edit_menu.c:414
gchar * ATOMES_CONFIG
Definition global.c:136
double * duplicate_double(int num, double *old_val)
copy a list of double
Definition global.c:608
gboolean * allocbool(int val)
allocate a gboolean * pointer
Definition global.c:254
char * untime[5]
Definition global.c:150
int nprojects
Definition global.c:158
double * allocdouble(int val)
allocate a double * pointer
Definition global.c:459
GtkWidget * MainWindow
Definition global.c:201
int * allocint(int val)
allocate an int * pointer
Definition global.c:314
gchar * ATOMES_CONFIG_DIR
Definition global.c:135
double string_to_double(gpointer string)
convert string to double
Definition global.c:624
Global variable declarations Global convenience function declarations Global data structure defin...
GtkWidget * dialog_cancel_apply(gchar *title, GtkWidget *parent, gboolean resiz)
create a dialog modal offering a choice to apply something or not
Definition gtk-misc.c:571
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:501
@ IMG_NONE
Definition global.h:262
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:909
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1375
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:643
void set_renderer_color(int tocol, GtkCellRenderer *renderer, ColRGBA col)
set the color of a GtkCellRenderer
Definition gtk-misc.c:1714
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2004
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2095
void combo_set_markup(GtkWidget *combo)
use pango markup in combo widget
Definition gtk-misc.c:944
element_data periodic_table_info[]
Definition w_library.c:71
ColRGBA get_window_color(GtkWidget *color_win)
get the ColRGBA color from a color selection window
Definition gtk-misc.c:2385
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:932
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:607
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1695
#define BSEP
Definition global.h:247
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:624
#define GR
Definition global.h:324
#define SQ
Definition global.h:325
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1893
@ CONTAINER_BUT
Definition global.h:255
@ CONTAINER_SCR
Definition global.h:253
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:1955
#define BD
Definition global.h:328
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:984
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:835
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1646
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:308
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2371
#define MY_ENCODING
Definition global.h:91
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:215
#define AN
Definition global.h:329
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2200
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:823
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:961
#define MS
Definition global.h:333
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2169
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1789
void add_box_child_end(GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the end position.
Definition gtk-misc.c:286
#define min(a, b)
Definition global.h:81
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:235
GtkWidget * message_dialogmodal(gchar *message, gchar *title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget *parent)
create a modal (cannot be ignored) message window
Definition gtk-misc.c:541
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:198
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
ColRGBA * duplicate_color(int num, ColRGBA *col)
duplicate a ColRGBA pointer
Definition gtk-misc.c:1663
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1855
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2023
#define SK
Definition global.h:326
#define GK
Definition global.h:327
#define CH
Definition global.h:331
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:182
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
#define max(a, b)
Definition global.h:80
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1017
ColRGBA set_default_color(int z)
pick the default color for an atom
Definition glview.c:195
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
@ BETTER_TEXT
Definition glview.h:243
#define DEFAULT_LIGHTNING
Default OpenGL material ligthning.
Definition glview.h:50
#define DEFAULT_AMBIANT_OCCLUSION
Default OpenGL material ambiant occlusion.
Definition glview.h:65
@ BOTTOM_RIGHT
Definition glview.h:216
#define DEFAULT_GAMMA_CORRECTION
Default OpenGL material gamma correction.
Definition glview.h:70
#define CAMERA_ANGLE_X
Default value for the OpenGL camera pitch in °
Definition glview.h:109
#define DEFAULT_OPACITY
Default OpenGL opacity.
Definition glview.h:75
render
Definition glview.h:191
@ PERSPECTIVE
Definition glview.h:161
#define DEFAULT_SIZE
Definition glview.h:45
#define DEFAULT_ROUGHNESS
Default OpenGL material roughness.
Definition glview.h:60
#define DEFAULT_METALLIC
Default OpenGL material metallic.
Definition glview.h:55
labels
Definition glview.h:223
@ SYMBOL_AND_NUM
Definition glview.h:226
#define ZOOM
Default value for the OpenGL zoom.
Definition glview.h:124
#define QUALITY
Default OpenGL quality (number of polygons)
Definition glview.h:39
#define CAMERA_ANGLE_Y
Default value for the OpenGL camera heading in °
Definition glview.h:114
@ SPACEFILL
Definition glview.h:184
@ WIREFRAME
Definition glview.h:183
@ NONE
Definition glview.h:181
Variable declarations related the OpenGL window Data structure declarations related the OpenGL wind...
#define FILLED_STYLES
Definition glwin.h:106
struct box box
box layout data structure
Definition glwin.h:349
#define NUM_COLORS
Definition glwin.h:65
struct axis axis
axis layout data structure
Definition glwin.h:331
char * text_filled[FILLED_STYLES]
Definition m_style.c:62
#define OGL_STYLES
Definition glwin.h:107
char * text_styles[OGL_STYLES]
Definition m_style.c:55
void show_error(char *error, int val, GtkWidget *win)
show error message
Definition interface.c:293
gboolean ask_yes_no(gchar *title, gchar *text, int type, GtkWidget *widg)
ask yes or no for something: prepare dialog
Definition interface.c:356
Messaging function declarations.
position
Definition m_proj.c:48
double z
Definition ogl_draw.c:61
double y
Definition ogl_draw.c:61
double x
Definition ogl_draw.c:61
gboolean default_cell
GtkWidget * over_param(int object, int style)
create override check button and entry
int * default_csparam
GtkWidget * all_cut_box
element_color * tmp_label_color[2]
background default_background
gchar * pref_error
gboolean are_identical_colors(ColRGBA col_a, ColRGBA col_b)
test if two colors are identicals
axis_edition * pref_axis_win
Lightning default_lightning
void create_user_preferences_dialog()
G_MODULE_EXPORT void set_cutoffs_default(GtkButton *but, gpointer data)
set default cutoff radii
opengl_edition * pref_ogl_edit
element_radius * tmp_atomic_rad[16]
GtkWidget * pref_tree
element_color * duplicate_element_color(element_color *old_list)
duplicate an element color data structure
xmlNodePtr findnode(xmlNodePtr startnode, char *nname)
find XML node
void read_light(xmlNodePtr light_node)
read light preferences from XML configuration
gradient_edition * pref_gradient_win
Light * copy_light_sources(int dima, int dimb, Light *old_sp)
create a copy of a list of light sources
Definition w_advance.c:402
int * tmp_csparam
int * tmp_rsparam
G_MODULE_EXPORT void edit_pref(GtkCellRendererText *cell, gchar *path_string, gchar *new_text, gpointer user_data)
edit cell in the preferences tree model
void radius_set_color_and_markup(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
set text font and color
GtkWidget * tcut_box
GtkWidget * lights_tab(glwin *view, opengl_edition *ogl_edit, Lightning *the_light)
OpenGL light(s) parameters tab.
Definition w_advance.c:938
GtkWidget * meas_box[2]
GtkWidget * sel_combo
gboolean default_clones
GtkWidget * combo_map(int obj)
create color map combo
void read_style_from_xml_file(xmlNodePtr style_node, int style)
read style preferences from XML file
rep_data default_rep
GtkWidget * materials_tab(glwin *view, opengl_edition *ogl_edit, Material *the_mat)
OpenGL material parameters tab.
Definition w_advance.c:1323
gchar * substitute_string(gchar *init, gchar *o_motif, gchar *n_motif)
substitute all patterns in string
Definition w_library.c:372
GtkWidget * atom_entry_over[8]
double default_mwidth[2]
G_MODULE_EXPORT void toggled_select_project(GtkToggleButton *but, gpointer data)
toggle select / unselect project to update callback GTK3
gboolean user_defined
GtkWidget * pcut_box[2]
int tmp_mfactor[2]
ColRGBA default_sel_color[2]
double * default_at_rs
void edit_bonds(GtkWidget *vbox)
creation of the edit bond cutoff widgets
Definition edit_menu.c:699
G_MODULE_EXPORT void edit_cutoffs(GtkDialog *edit_cuts, gint response_id, gpointer data)
edit partial cutoffs - running the dialog
int default_acl_format[2]
gboolean * tmp_o_at_rs
ColRGBA get_spec_color(int z, element_color *clist)
retrieve the color of a chemical species
double * default_bd_rw
void setup_fog_dialogs(opengl_edition *ogl_edit, int fid)
update OpenGL fog tab based of fog type
Definition w_advance.c:1509
void prepare_tmp_default()
prepare temporary parameters
box_edition * pref_box_win
bond_cutoff * duplicate_cutoffs(bond_cutoff *old_cutoff)
duplicate bond cutoff data structure
gchar * xml_bond_leg[3]
void duplicate_material(Material *new_mat, Material *old_mat)
duplicate material data
Definition ogl_draw.c:186
G_MODULE_EXPORT void set_default_map(GtkComboBox *box, gpointer data)
change default atom(s) or polyhedra color map
void apply_default_parameters_to_project(project *this_proj)
apply new default parameters to project
Definition init_p.c:86
G_MODULE_EXPORT void set_default_style(GtkComboBox *box, gpointer data)
change default atom(s) and bond(s) style
G_MODULE_EXPORT void edit_preferences(GtkDialog *edit_prefs, gint response_id, gpointer data)
edit preferences - running the dialog
GtkWidget * opengl_preferences()
OpenGL preferences.
G_MODULE_EXPORT void set_default_options(GtkButton *but, gpointer data)
set options as default options
box default_box
Material tmp_material
int * tmp_num_delta
gboolean * up_project
int default_mpattern[2]
element_radius * tmp_bond_rad[6]
G_MODULE_EXPORT gboolean scroll_scale_quality(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update OpenGL quality - scroll callback
Definition w_advance.c:1263
bond_cutoff * cut_list
void duplicate_screen_label(screen_label *new_lab, screen_label *old_lab)
copy screen_label data structure
Definition ogl_draw.c:239
axis * tmp_axis
G_MODULE_EXPORT void restore_defaults_parameters(GtkButton *but, gpointer data)
box * tmp_box
element_color * color_list
int * default_num_delta
float get_radius(int object, int col, int z, element_radius *rad_list)
retrieve the radius/width of a species depending on style
G_MODULE_EXPORT void gradient_advanced(GtkWidget *widg, gpointer data)
Background configuration window.
Definition w_colors.c:434
gchar * xml_atom_leg[3]
GtkWidget * view_preferences()
view preferences
G_MODULE_EXPORT void set_measures(GtkComboBox *box, gpointer data)
change measure type
int * default_opengl
GtkWidget * tcut_entry
int xml_save_xyz_to_file(xmlTextWriterPtr writer, int did, gchar *legend, gchar *key, vec3_t data)
save vector data (x,y,z) to XML file
GtkWidget * cut_comments
element_radius * duplicate_element_radius(element_radius *old_list)
duplicate an element radius data structure
void add_global_option(GtkWidget *vbox, tint *oid)
add a button to update global user preferences
Light init_light_source(int type, float val, float vbl)
initialize a light source
Definition w_advance.c:337
G_MODULE_EXPORT void set_selection_color(GtkColorChooser *colob, gpointer data)
change selection color
tint * pref_pointer
element_color * default_atom_color[2]
int * tmp_opengl
GtkWidget * bond_entry_over[6]
void duplicate_box_data(box *new_box, box *old_box)
duplicate box_data data structure
GtkWidget * style_tab(int style)
create preferences tab for a style
GtkWidget * meas_combo
G_MODULE_EXPORT void toggled_default_stuff(GtkToggleButton *but, gpointer data)
toggle set / unset default callback GTK3
void read_parameter(xmlNodePtr parameter_node)
read preferences from XML configuration
G_MODULE_EXPORT void set_default_num_delta(GtkEntry *res, gpointer data)
update default number of delta preferences
GtkWidget * pref_list(gchar *mess[2], int nelem, gchar *mlist[nelem][2], gchar *end)
print information message with item list of elements
int default_mfactor[2]
bond_cutoff * tmp_bond_cutoff
G_MODULE_EXPORT void totcut_changed(GtkComboBox *box, gpointer data)
change method to evaluate the total cutoff
GtkWidget * fog_tab(glwin *view, opengl_edition *ogl_edit, Fog *the_fog)
OpenGL fog parameters tab.
Definition w_advance.c:1566
gboolean * default_o_at_rs
int tmp_mpattern[2]
G_MODULE_EXPORT void set_default_stuff(GtkEntry *res, gpointer data)
update default number of delta preferences
int xml_save_parameter_to_file(xmlTextWriterPtr writer, gchar *xml_leg, gchar *xml_key, gboolean doid, int xml_id, gchar *value)
save single parameter to XML file
G_MODULE_EXPORT void axis_advanced(GtkWidget *widg, gpointer data)
create the axis advanced parameters window
Definition w_axis.c:786
Material default_material
void color_set_color(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
set background color
element_radius ** edit_list
element_color * tmp_atom_color[2]
element_radius * default_bond_rad[6]
G_MODULE_EXPORT void edit_chem_preferences(GtkDialog *edit_chem, gint response_id, gpointer data)
edit chem preferences - running the dialog
void read_preferences(xmlNodePtr preference_node)
read preferences from XML configuration
element_color * default_label_color[2]
gboolean tmp_mtilt[2]
int radius_id
int label_id
void set_atomes_preferences()
set software default parameters
GtkTreeModel * style_combo_tree()
create opengl style combo model
G_MODULE_EXPORT void run_ac_color(GtkDialog *win, gint response_id, gpointer data)
window color chooser - running the dialog
rep_edition * pref_rep_win
int * default_rsparam
float mat_min_max[5][2]
Definition w_advance.c:113
gboolean default_mtilt[2]
void duplicate_background_data(background *new_back, background *old_back)
duplicate background data structure
void update_light_data(int li, opengl_edition *ogl_win)
update light data
Definition w_advance.c:474
Lightning tmp_lightning
void set_atomes_defaults()
set atomes default parameters
double default_totcut
G_MODULE_EXPORT gboolean pref_color_button_event(GtkWidget *widget, GdkEvent *event, gpointer data)
gchar * ogl_settings[3][10]
Definition w_advance.c:119
void duplicate_axis_data(axis *new_axis, axis *old_axis)
duplicate axis_data data structure
element_radius * default_atomic_rad[16]
GtkWidget * calc_preferences()
analysis preferences
G_MODULE_EXPORT void edit_pc_value(GtkEntry *res, gpointer data)
update partial cutoff value
void update_gradient_widgets(gradient_edition *gradient_win, background *back)
update the widgets of the gradient window
Definition w_colors.c:84
gchar * xml_filled_leg[4]
GtkWidget * lightning_fix(glwin *view, Material *this_material)
Definition w_advance.c:1296
void save_preferences()
save user preferences
gboolean tmp_cell
screen_label * tmp_label[5]
G_MODULE_EXPORT void tunit_changed(GtkComboBox *box, gpointer data)
change default time units
gboolean * default_o_bd_rw
G_MODULE_EXPORT void edit_species_parameters(GtkButton *but, gpointer data)
edit atoms and bonds species related parameters
void duplicate_fog(Fog *new_fog, Fog *old_fog)
duplicate fog data
Definition ogl_draw.c:203
gboolean * tmp_o_bd_rw
double * tmp_at_rs
gchar * xml_style_leg[6]
axis default_axis
bond_cutoff * default_bond_cutoff
GtkWidget * edit_colob
ColRGBA * tmp_color
GtkWidget * preference_notebook
double * tmp_delta_t
G_MODULE_EXPORT void update_projects(GtkDialog *proj_sel, gint response_id, gpointer data)
update projects in the workspace using new preferences
G_MODULE_EXPORT void box_advanced(GtkWidget *widg, gpointer data)
create the box edition window
Definition w_box.c:338
screen_label default_label[5]
GtkWidget * adv_box(GtkWidget *box, char *lab, int vspace, int size, float xalign)
create a box with markup label
Definition w_advance.c:151
background * tmp_background
G_MODULE_EXPORT void scale_quality(GtkRange *range, gpointer data)
update OpenGL quality - range callback
Definition w_advance.c:1280
G_MODULE_EXPORT void cut_spec_changed(GtkComboBox *box, gpointer data)
partial cutoff chemical species
ColRGBA tmp_sel_color[2]
double * default_delta_t
void calc_rings(GtkWidget *vbox)
creation of the rings statistics calculation widgets
Definition calc_menu.c:516
gboolean not_in_cutoffs(int z_a, int z_b)
look in bond cutoff between species a and b is already defined
void color_button_event(GtkWidget *widget, double event_x, double event_y, guint event_button, gpointer data)
species color selection mouse button event
GtkWidget * model_preferences()
model preferences
Fog default_fog
double * tmp_bd_rw
gboolean preferences
int search_type
Definition calc_menu.c:92
int tmp_acl_format[2]
double xml_string_to_double(gchar *content)
convert XML string to double
void duplicate_rep_data(rep_data *new_rep, rep_data *old_rep)
duplicate rep_data data structure
void read_preferences_from_xml_file()
read software preferences from XML file
gboolean tmp_clones
int the_object
rep_data * tmp_rep
GtkWidget * cut_combo[2]
G_MODULE_EXPORT void representation_advanced(GtkWidget *widg, gpointer data)
open advanced representation dialog
Definition m_rep.c:424
double tmp_totcut
G_MODULE_EXPORT void set_stuff_color(GtkColorChooser *colob, gpointer data)
change stuff color
void clean_all_tmp()
free all temporary buffers
void add_cut_box()
update partial cutoffs widgets
void set_parameter(gchar *content, gchar *key, int vid, dint *bond, vec3_t *vect, float start, float end, ColRGBA *col)
set default parameter
double tmp_mwidth[2]
void adjust_preferences_window()
adjust the widgets of the preferences window
GtkWidget * labels_tab(glwin *view, int lid)
create atomic label(s) tab for the atom(s) / clone(s) window
Definition w_labels.c:624
GtkWidget * edit_scrol
GtkWidget * sel_box[2]
int xml_save_color_to_file(xmlTextWriterPtr writer, int did, gchar *legend, gchar *key, ColRGBA col)
save color data (red, green, blue, alpha) to XML file
G_MODULE_EXPORT void toggled_use_cutoff(GtkToggleButton *but, gpointer data)
Fog tmp_fog
int save_preferences_to_xml_file()
save software preferences to XML file
Preference variable declarations.
Function declarations for reading atomes project file Function declarations for saving atomes proje...
float blue
Definition global.h:126
float alpha
Definition global.h:127
float red
Definition global.h:124
float green
Definition global.h:125
Definition glwin.h:234
int based
Definition glwin.h:236
int mode
Definition glwin.h:235
vec3_t color
Definition glwin.h:239
float density
Definition glwin.h:237
float depth[2]
Definition glwin.h:238
Definition glwin.h:182
int fix
Definition glwin.h:184
vec3_t spot_data
Definition glwin.h:190
vec3_t direction
Definition glwin.h:187
vec3_t attenuation
Definition glwin.h:189
int type
Definition glwin.h:183
vec3_t position
Definition glwin.h:186
vec3_t intensity
Definition glwin.h:188
int lights
Definition glwin.h:200
Light * spot
Definition glwin.h:201
GLfloat param[6]
Definition glwin.h:219
vec3_t albedo
Definition glwin.h:212
int predefine
Definition glwin.h:211
Definition glwin.h:333
int labels
Definition glwin.h:340
ColRGBA * color
Definition glwin.h:342
gchar * title[3]
Definition glwin.h:341
int axis
Definition glwin.h:334
double length
Definition glwin.h:337
double rad
Definition glwin.h:336
GLfloat c_pos[3]
Definition glwin.h:339
int t_pos
Definition glwin.h:338
double line
Definition glwin.h:335
float position
Definition glwin.h:322
ColRGBA gradient_color[2]
Definition glwin.h:324
int direction
Definition glwin.h:306
ColRGBA color
Definition glwin.h:323
int gradient
Definition glwin.h:303
Definition glwin.h:351
double rad
Definition glwin.h:354
ColRGBA color
Definition glwin.h:355
int box
Definition glwin.h:352
double line
Definition glwin.h:353
Definition global.h:99
int b
Definition global.h:101
int a
Definition global.h:100
Definition glwin.h:965
Definition glwin.h:365
GLdouble c_shift[2]
Definition preferences.h:85
GLdouble zoom
Definition preferences.h:87
GLdouble c_angle[2]
Definition preferences.h:84
GLdouble gnear
Definition preferences.h:86
ColRGBA * color
Definition glwin.h:268
int position
Definition glwin.h:263
int scale
Definition glwin.h:265
int render
Definition glwin.h:264
double shift[3]
Definition glwin.h:269
int n_colors
Definition glwin.h:267
gchar * font
Definition glwin.h:266
screen_string * list
Definition glwin.h:270
Definition global.h:106
int b
Definition global.h:108
int c
Definition global.h:109
int a
Definition global.h:107
float y
Definition math_3d.h:130
float x
Definition math_3d.h:130
float z
Definition math_3d.h:130
int b
Definition tab-1.c:95
int c
Definition tab-1.c:95
int d
Definition tab-1.c:95
int a
Definition tab-1.c:95
int status
Definition w_advance.c:178
GtkWidget * res[2]
Definition w_encode.c:212
G_MODULE_EXPORT void set_id(GtkEntry *entry, gpointer data)
set search id if >= 10 000 atoms
Definition w_search.c:1708
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72
GtkWidget * lab
Definition workspace.c:73
Function declarations for workspace managment.