atomes 1.3.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-2026 by CNRS and University of Strasbourg */
15
21
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 (xmlChar * 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 dyna_parameters (GtkWidget * vbox, int cid);
67 void clean_all_tmp ();
68 void duplicate_rep_data (rep_data * new_rep, rep_data * old_rep);
69 void duplicate_background_data (background * new_back, background * old_back);
70 void duplicate_box_data (box * new_box, box * old_box);
71 void duplicate_axis_data (axis * new_axis, axis * old_axis);
72 void prepare_tmp_default ();
73 void save_preferences ();
74 void adjust_preferences_window ();
75 void create_configuration_dialog ();
76 void add_global_option (GtkWidget * vbox, tint * oid);
77
78 G_MODULE_EXPORT void set_measures (GtkComboBox * box, gpointer data);
79 G_MODULE_EXPORT void set_selection_color (GtkColorChooser * colob, gpointer data);
80 G_MODULE_EXPORT void toggled_default_stuff (GtkCheckButton * but, gpointer data);
81 G_MODULE_EXPORT void toggled_default_stuff (GtkToggleButton * but, gpointer data);
82 G_MODULE_EXPORT void set_default_stuff (GtkEntry * res, gpointer data);
83 G_MODULE_EXPORT void edit_pref (GtkCellRendererText * cell, gchar * path_string, gchar * new_text, gpointer user_data);
84 G_MODULE_EXPORT void edit_chem_preferences (GtkDialog * edit_chem, gint response_id, gpointer data);
85 G_MODULE_EXPORT void run_ac_color (GtkDialog * win, gint response_id, gpointer data);
86 G_MODULE_EXPORT void pref_color_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
87 G_MODULE_EXPORT void set_stuff_color (GtkColorChooser * colob, gpointer data);
88 G_MODULE_EXPORT void edit_species_parameters (GtkButton * but, gpointer data);
89 G_MODULE_EXPORT void set_default_style (GtkComboBox * box, gpointer data);
90 G_MODULE_EXPORT void set_default_map (GtkComboBox * box, gpointer data);
91 G_MODULE_EXPORT void set_default_num_delta (GtkEntry * res, gpointer data);
92 G_MODULE_EXPORT void tunit_changed (GtkComboBox * box, gpointer data);
93 G_MODULE_EXPORT void edit_pc_value (GtkEntry * res, gpointer data);
94 G_MODULE_EXPORT void toggle_use_cutoff (GtkCheckButton * but, gpointer data);
95 G_MODULE_EXPORT void toggle_use_cutoff (GtkToggleButton * but, gpointer data);
96 G_MODULE_EXPORT void totcut_changed (GtkComboBox * box, gpointer data);
97 G_MODULE_EXPORT void cut_spec_changed (GtkComboBox * box, gpointer data);
98 G_MODULE_EXPORT void set_cutoffs_default (GtkButton * but, gpointer data);
99 G_MODULE_EXPORT void update_projects (GtkDialog * proj_sel, gint response_id, gpointer data);
100 G_MODULE_EXPORT void toggle_select_project (GtkCheckButton * but, gpointer data);
101 G_MODULE_EXPORT void toggle_select_project (GtkToggleButton * but, gpointer data);
102 G_MODULE_EXPORT void restore_all_defaults (GtkButton * but, gpointer data);
103 G_MODULE_EXPORT void edit_preferences (GtkDialog * edit_prefs, gint response_id, gpointer data);
104 G_MODULE_EXPORT void set_default_options (GtkButton * but, gpointer data);
105
106 GtkWidget * pref_list (gchar * mess[2], int nelem, gchar * mlist[nelem][2], gchar * end);
107 GtkWidget * view_preferences ();
108 GtkWidget * over_param (int object, int style);
109 GtkWidget * style_tab (int style);
110 GtkWidget * model_preferences ();
111 GtkWidget * combo_map (int obj);
112 GtkWidget * opengl_preferences ();
113 GtkWidget * calc_preferences ();
114
115 GtkTreeModel * style_combo_tree ();
116
117*/
118
119#include "global.h"
120#include "callbacks.h"
121#include "interface.h"
122#include "project.h"
123#include "workspace.h"
124#include "glview.h"
125#include "glwin.h"
126#include "bind.h"
127#include "preferences.h"
128#include <libxml/encoding.h>
129#include <libxml/xmlwriter.h>
130#include <libxml/xmlreader.h>
131#include <libxml/parser.h>
132#include <unistd.h>
133#include <sys/types.h>
134
135#ifndef G_OS_WIN32
136#include <pwd.h>
137#else
138#include <errno.h>
139#endif
140
141extern void apply_default_parameters_to_project (project * this_proj, gboolean with_analysis);
142extern xmlNodePtr findnode (xmlNodePtr startnode, char * nname);
143extern int search_type;
144extern void edit_bonds (GtkWidget * vbox);
145extern void update_omega_max ();
146extern void calc_rings (GtkWidget * vbox);
147extern void calc_sk_t (GtkWidget * vbox);
148extern gchar * substitute_string (gchar * init, gchar * o_motif, gchar * n_motif);
149extern G_MODULE_EXPORT gboolean scroll_scale_quality (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
150extern GtkWidget * materials_tab (glwin * view, opengl_edition * ogl_edit, Material * the_mat);
151extern GtkWidget * lights_tab (glwin * view, opengl_edition * ogl_edit, Lightning * the_light);
152extern GtkWidget * fog_tab (glwin * view, opengl_edition * ogl_edit, Fog * the_fog);
153extern GtkWidget * labels_tab (glwin * view, int lid);
154extern void update_light_data (int li, opengl_edition * ogl_win);
155extern void setup_fog_dialogs (opengl_edition * ogl_edit, int fid);
156extern G_MODULE_EXPORT void box_advanced (GtkWidget * widg, gpointer data);
157extern G_MODULE_EXPORT void axis_advanced (GtkWidget * widg, gpointer data);
158extern G_MODULE_EXPORT void representation_advanced (GtkWidget * widg, gpointer data);
159extern void update_gradient_widgets (gradient_edition * gradient_win, background * back);
160extern G_MODULE_EXPORT void gradient_advanced (GtkWidget * widg, gpointer data);
161extern G_MODULE_EXPORT void scale_quality (GtkRange * range, gpointer data);
162extern void duplicate_fog (Fog * new_fog, Fog * old_fog);
163extern void duplicate_material (Material * new_mat, Material * old_mat);
164extern void duplicate_screen_label (screen_label * new_lab, screen_label * old_lab);
165extern Light * init_light_source (int type, float size);
166extern Light ** copy_light_sources (int dima, int dimb, Light ** old_sp);
167extern GtkWidget * lightning_fix (glwin * view, Material * this_material);
168extern GtkWidget * adv_box (GtkWidget * box, char * lab, int vspace, int size, float xalign);
169extern float mat_min_max[5][2];
170extern GtkWidget * omega_max_hbox;
171extern GtkWidget * omega_max_info;
172extern GtkWidget * skt_all_info;
173
174GtkWidget * dyna_entry[2][2];
175GtkWidget * dyna_combo[2];
176GtkWidget * atom_entry_over[8];
177GtkWidget * bond_entry_over[6];
178GtkWidget * meas_combo;
179GtkWidget * meas_box[2];
180GtkWidget * sel_combo;
181GtkWidget * sel_box[2];
182GtkWidget * preference_notebook = NULL;
183
188
189// Generic parameters for all calculations
190#define NUM_DELTA 9
191int * default_num_delta = NULL;
192int * tmp_num_delta = NULL;
193
194// Dynamical calculations
195double * default_delta_t = NULL;
196double * tmp_delta_t = NULL;
197
198// Ring statistics
199int * default_rsparam = NULL;
207int * tmp_rsparam = NULL;
208
209// Chain statistics
210int * default_csparam = NULL;
218int * tmp_csparam = NULL;
219
220// F(k,t) and S(q,w)
229
230// 5+3 styles + 5+3 cloned styles
233// 3 styles + 3 cloned styles
236// atoms + clones
241
243
244int * default_opengl = NULL;
245int * tmp_opengl = NULL;
252
253// Model
255gboolean tmp_clones;
257gboolean tmp_cell;
259gboolean * tmp_o_at_rs;
261double * tmp_at_rs;
263gboolean * tmp_o_bd_rw;
265double * tmp_bd_rw;
266
271gboolean default_mtilt[2];
272gboolean tmp_mtilt[2];
278double tmp_mwidth[2];
279
287box * tmp_box = NULL;
290axis * tmp_axis = NULL;
294
295gboolean preferences = FALSE;
297gchar * pref_error = NULL;
298
300
301gchar * xml_style_leg[6] = {"ball_and_stick", "wireframes", "spacefilled", "spheres", "cylinders", "dots"};
302gchar * xml_filled_leg[4] = {"covalent", "ionic", "van-der-waals", "crystal"};
303gchar * xml_atom_leg[3] = {"atoms_radius", "dot_size", "sphere_radius"};
304gchar * xml_bond_leg[3] = {"bond_radius", "wireframe_width", "cylinder_radius"};
305
316int xml_save_color_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, ColRGBA col)
317{
318 int rc;
319 gchar * str;
320 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
321 if (rc < 0) return 0;
322 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST legend);
323 if (rc < 0) return 0;
324 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST key);
325 if (rc < 0) return 0;
326 if (did > -1)
327 {
328 str = g_strdup_printf ("%d", did);
329 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST str);
330 g_free (str);
331 if (rc < 0) return 0;
332 }
333 str = g_strdup_printf ("%f", col.red);
334 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"red", BAD_CAST str);
335 g_free (str);
336 if (rc < 0) return 0;
337 str = g_strdup_printf ("%f", col.green);
338 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"green", BAD_CAST str);
339 g_free (str);
340 if (rc < 0) return 0;
341 str = g_strdup_printf ("%f", col.blue);
342 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"blue", BAD_CAST str);
343 g_free (str);
344 if (rc < 0) return 0;
345 str = g_strdup_printf ("%f", col.alpha);
346 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"alpha", BAD_CAST str);
347 g_free (str);
348 if (rc < 0) return 0;
349 rc = xmlTextWriterEndElement (writer);
350 if (rc < 0) return 0;
351 return 1;
352}
353
364int xml_save_xyz_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, vec3_t data)
365{
366 int rc;
367 gchar * str;
368 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
369 if (rc < 0) return 0;
370 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST legend);
371 if (rc < 0) return 0;
372 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST key);
373 if (rc < 0) return 0;
374 if (did > -1)
375 {
376 str = g_strdup_printf ("%d", did);
377 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST str);
378 g_free (str);
379 if (rc < 0) return 0;
380 }
381 str = g_strdup_printf ("%f", data.x);
382 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"x", BAD_CAST str);
383 g_free (str);
384 if (rc < 0) return 0;
385 str = g_strdup_printf ("%f", data.y);
386 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"y", BAD_CAST str);
387 g_free (str);
388 if (rc < 0) return 0;
389 str = g_strdup_printf ("%f", data.z);
390 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"z", BAD_CAST str);
391 g_free (str);
392 if (rc < 0) return 0;
393 rc = xmlTextWriterEndElement (writer);
394 if (rc < 0) return 0;
395 return 1;
396}
397
410int xml_save_parameter_to_file (xmlTextWriterPtr writer, gchar * xml_leg, gchar * xml_key, gboolean doid, int xml_id, gchar * value)
411{
412 int rc;
413 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
414 if (rc < 0) return 0;
415 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"info", BAD_CAST xml_leg);
416 if (rc < 0) return 0;
417 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST xml_key);
418 if (rc < 0) return 0;
419 if (doid)
420 {
421 gchar * str;
422 str = g_strdup_printf ("%d", xml_id);
423 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST (const xmlChar *)str);
424 g_free (str);
425 if (rc < 0) return 0;
426 }
427 rc = xmlTextWriterWriteFormatString (writer, "%s", value);
428 if (rc < 0) return 0;
429 rc = xmlTextWriterEndElement (writer);
430 if (rc < 0) return 0;
431 return 1;
432}
433
440{
441 int rc;
442 pref_error = NULL;
444 {
445#ifdef G_OS_WIN32
446 if (! CreateDirectory(ATOMES_CONFIG_DIR, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
447 {
448 pref_error = g_strdup_printf (_("Error: impossible to create %s (code: %lu)\n"), ATOMES_CONFIG_DIR, GetLastError());
449 return 0;
450 }
451#else
452 if (mkdir(ATOMES_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IRWXO) && errno != EEXIST)
453 {
454 pref_error = g_strdup_printf (_("Error: impossible to create %s (code: %s)\n"), ATOMES_CONFIG_DIR, strerror(errno));
455 return 0;
456 }
457#endif
458 }
459 xmlTextWriterPtr writer;
460
461 gchar * xml_delta_num_leg[NUM_DELTA] = {i18n("g(r): number of δr"), i18n("s(q): number of δq"), i18n("s(k): number of δk"), i18n("g(r) FFT: number of δr"),
462 i18n("Dij: number of δr [min(Dij)-max(Dij)]"), i18n("Angles distribution: number of δθ [0-180°]"),
463 i18n("Spherical harmonics: l(max) in [2-40]"), i18n("MSD: steps between configurations"),
464 i18n("F(k,t): number of δk")};
465 gchar * xml_delta_t_leg[2] = {i18n("MSD: time steps δt"), i18n("MSD: time unit")};
466 gchar * xml_rings_leg[7] = {i18n("Default search"),
467 i18n("Atom(s) to initiate the search from"),
468 i18n("Maximum size for a ring"),
469 i18n("Maximum number of rings of size n per MD step"),
470 i18n("Only search for ABAB rings"),
471 i18n("No homopolar bonds in the rings (A-A, B-B ...)"),
472 i18n("No homopolar bonds in the connectivity matrix")};
473 gchar * xml_chain_leg[7] = {i18n("Atom(s) to initiate the search from"),
474 i18n("Maximum size for a ring"),
475 i18n("Maximum number of rings of size n per MD step"),
476 i18n("Only search for AAAA chains"),
477 i18n("Only search for ABAB chains"),
478 i18n("No homopolar bonds in the chains (A-A, B-B ...)"),
479 i18n("Only search for 1-(2)n-1 chains")};
480 gchar * xml_skt_leg[4] = {i18n("Analyze all correlated δt steps"),
481 i18n("Number of analyzed δt steps"),
482 i18n("Number of analyzed q points"),
483 i18n("Number of frequency points")};
484 gchar * xml_opengl_leg[5] = {i18n("Default style"),
485 i18n("Atom(s) color map"),
486 i18n("Polyhedra color map"),
487 i18n("Quality"),
488 i18n("Ray Tracing")};
489 gchar * xml_material_leg[8] = {i18n("Predefine material"),
490 i18n("Lightning model"),
491 i18n("Metallic"),
492 i18n("Roughness"),
493 i18n("Back lightning"),
494 "Gamma",
495 i18n("Opacity"),
496 i18n("Albedo")};
497 gchar * xml_lightning_leg[7] = {i18n("Type"),
498 i18n("Fix"),
499 i18n("Position"),
500 i18n("Direction"),
501 i18n("Intensity"),
502 i18n("Attenuation"),
503 i18n("Spot specifics")};
504 gchar * xml_fog_leg[5] = {i18n("Mode"),
505 i18n("Type"),
506 i18n("Density"),
507 i18n("Depth"),
508 i18n("Color")};
509 gchar * xml_model_leg[2] = {i18n("Show clones"),
510 i18n("Show box")};
511 gchar * xml_label_leg[6] = {i18n("Position"),
512 i18n("Rendering") ,
513 i18n("Scaling"),
514 i18n("Font"),
515 i18n("Shift"),
516 i18n("Colors")};
517 gchar * xml_axis_leg[3] = {i18n("Legend on x"),
518 i18n("Legend on y"),
519 i18n("Legend on z")};
520
521 /* Create a new XmlWriter for ATOMES_CONFIG, with no compression. */
522 writer = xmlNewTextWriterFilename (ATOMES_CONFIG, 0);
523 if (writer == NULL) return 0;
524 rc = xmlTextWriterSetIndent(writer, 1);
525 if (rc < 0) return 0;
526 /* Start the document with the xml default for the version,
527 * encoding MY_ENCODING and the default for the standalone
528 * declaration. */
529 rc = xmlTextWriterStartDocument (writer, NULL, MY_ENCODING, NULL);
530 if (rc < 0) return 0;
531
532 rc = xmlTextWriterWriteComment (writer, (const xmlChar *)_("atomes preferences XML file"));
533 if (rc < 0) return 0;
534
535 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atomes_preferences-xml");
536 if (rc < 0) return 0;
537
538 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"analysis");
539 if (rc < 0) return 0;
540 int i, j, k, l, m, n, o;
541 gchar * str;
542
544 {
545 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"cutoffs");
546 if (rc < 0) return 0;
547 if (default_totcut > 0.0)
548 {
549 str = g_strdup_printf ("%lf", default_totcut);
550 rc = xml_save_parameter_to_file (writer, _("Total cutoff"), "default_totcut", TRUE, 0, str);
551 g_free (str);
552 if (! rc) return 0;
553 }
555 {
556 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"partials");
557 if (rc < 0) return 0;
559 while (tmp_cut)
560 {
561 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
562 if (rc < 0) return 0;
563 str = g_strdup_printf (_("cutoff %s-%s"), periodic_table_info[tmp_cut -> Z[0]].lab, periodic_table_info[tmp_cut -> Z[1]].lab);
564 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST str);
565 g_free (str);
566 if (rc < 0) return 0;
567 str = g_strdup_printf ("%d", tmp_cut -> Z[0]);
568 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"α", BAD_CAST str);
569 g_free (str);
570 if (rc < 0) return 0;
571 str = g_strdup_printf ("%d", tmp_cut -> Z[1]);
572 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"β", BAD_CAST str);
573 g_free (str);
574 if (rc < 0) return 0;
575 str = g_strdup_printf ("%lf", tmp_cut -> cutoff);
576 rc = xmlTextWriterWriteFormatString (writer, "%s", str);
577 g_free (str);
578 if (rc < 0) return 0;
579 rc = xmlTextWriterEndElement (writer);
580 if (rc < 0) return 0;
581 tmp_cut = tmp_cut -> next;
582 }
583 rc = xmlTextWriterEndElement (writer);
584 if (rc < 0) return 0;
585 }
586 rc = xmlTextWriterEndElement (writer);
587 if (rc < 0) return 0;
588 }
589
590 for (i=0; i<NUM_DELTA; i++)
591 {
592 str = g_strdup_printf ("%d", default_num_delta[i]);
593 rc = xml_save_parameter_to_file (writer, _(xml_delta_num_leg[i]), "default_num_delta", TRUE, i, str);
594 g_free (str);
595 if (! rc) return 0;
596 }
597 // Delta t
598 for (i=0; i<2; i++)
599 {
600 str = g_strdup_printf ("%f", default_delta_t[i]);
601 rc = xml_save_parameter_to_file (writer, _(xml_delta_t_leg[i]), "default_delta_t", TRUE, i, str);
602 g_free (str);
603 if (! rc) return 0;
604 }
605 // Rings
606 for (i=0; i<7; i++)
607 {
608 str = g_strdup_printf ("%d", default_rsparam[i]);
609 rc = xml_save_parameter_to_file (writer, _(xml_rings_leg[i]), "default_rsparam", TRUE, i, str);
610 g_free (str);
611 if (! rc) return 0;
612 }
613 // Chains
614 for (i=0; i<7; i++)
615 {
616 str = g_strdup_printf ("%d", default_csparam[i]);
617 rc = xml_save_parameter_to_file (writer, _(xml_chain_leg[i]), "default_csparam", TRUE, i, str);
618 g_free (str);
619 if (! rc) return 0;
620 }
621 // F(k,t) and S(q,w)
622 // Work to do here !
623 str = g_strdup_printf ("%d", default_skt_sets);
624 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[0]), "default_skt_sets", FALSE, i, str);
625 g_free (str);
626 if (! rc) return 0;
627 str = g_strdup_printf ("%d", default_skt_n_sets);
628 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[1]), "default_skt_n_sets", FALSE, i, str);
629 g_free (str);
630 if (! rc) return 0;
631 str = g_strdup_printf ("%d", default_sqw_n_sets);
632 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[2]), "default_sqw_n_sets", FALSE, i, str);
633 g_free (str);
634 if (! rc) return 0;
635 str = g_strdup_printf ("%d", default_sqw_freq);
636 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[2]), "default_sqw_freq", FALSE, i, str);
637 g_free (str);
638 if (! rc) return 0;
639
640 // End analysis
641 rc = xmlTextWriterEndElement (writer);
642 if (rc < 0) return 0;
643
644 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"opengl");
645 if (rc < 0) return 0;
646 for (i=0; i<5; i++)
647 {
648
649 str = g_strdup_printf ("%d", default_opengl[i]);
650 rc = xml_save_parameter_to_file (writer, _(xml_opengl_leg[i]), "default_opengl", TRUE, i, str);
651 g_free (str);
652 if (! rc) return 0;
653 }
654
655 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"material");
656 if (rc < 0) return 0;
657
658 str = g_strdup_printf ("%d", default_material.predefine);
659 rc = xml_save_parameter_to_file (writer, _(xml_material_leg[0]), "default_material", TRUE, -1, str);
660 g_free (str);
661 if (! rc) return 0;
662
663 for (i=0; i<6; i++)
664 {
665 str = g_strdup_printf ("%f", default_material.param[i]);
666 rc = xml_save_parameter_to_file (writer, _(xml_material_leg[i+1]), "default_material", TRUE, i, str);
667 g_free (str);
668 if (! rc) return 0;
669 }
670
671 rc = xml_save_xyz_to_file (writer, 6, _(xml_material_leg[7]), "default_material", default_material.albedo);
672 if (! rc) return rc;
673
674 // End material
675 rc = xmlTextWriterEndElement (writer);
676 if (rc < 0) return 0;
677
678 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"lightning");
679 if (rc < 0) return 0;
680
681 str = g_strdup_printf ("%d", default_lightning.lights);
682 rc = xml_save_parameter_to_file (writer, _("Number of lights"), "default_lightning", TRUE, 0, str);
683 g_free (str);
684 if (! rc) return 0;
685
686 for (i=0; i<default_lightning.lights; i++)
687 {
688 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"light");
689 if (rc < 0) return 0;
690 str = g_strdup_printf ("%d", i);
691 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST (const xmlChar *)str);
692 g_free (str);
693 if (rc < 0) return 0;
694
695 str = g_strdup_printf ("%d", default_lightning.spot[i] -> type);
696 rc = xml_save_parameter_to_file (writer, _(xml_lightning_leg[0]), "light.type", FALSE, 0, str);
697 g_free (str);
698 if (! rc) return 0;
699 str = g_strdup_printf ("%d", default_lightning.spot[i] -> fix);
700 rc = xml_save_parameter_to_file (writer, _(xml_lightning_leg[1]), "light.fix", FALSE, 0, str);
701 g_free (str);
702 if (! rc) return 0;
703
704 if (default_lightning.spot[i] -> type)
705 {
706 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[2]), "light.position", default_lightning.spot[i] -> position);
707 if (! rc) return rc;
708 }
709 if (default_lightning.spot[i] -> type != 1)
710 {
711 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[3]), "light.direction", default_lightning.spot[i] -> direction);
712 if (! rc) return rc;
713 }
714 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[4]), "light.intensity", default_lightning.spot[i] -> intensity);
715 if (! rc) return rc;
716 if (default_lightning.spot[i] -> type)
717 {
718 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[5]), "light.attenuation", default_lightning.spot[i] -> attenuation);
719 if (! rc) return rc;
720 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[6]), "light.spot", default_lightning.spot[i] -> spot_data);
721 if (! rc) return rc;
722 }
723 rc = xmlTextWriterEndElement (writer);
724 if (rc < 0) return 0;
725 }
726
727 // End lightning
728 rc = xmlTextWriterEndElement (writer);
729 if (rc < 0) return 0;
730
731 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"fog");
732 if (rc < 0) return 0;
733 // Mode
734 str = g_strdup_printf ("%d", default_fog.mode);
735 rc = xml_save_parameter_to_file (writer, _(xml_fog_leg[0]), "fog.mode", TRUE, 0, str);
736 g_free (str);
737 if (! rc) return 0;
738 // Type
739 str = g_strdup_printf ("%d", default_fog.based);
740 rc = xml_save_parameter_to_file (writer, _(xml_fog_leg[1]), "fog.type", TRUE, 1, str);
741 g_free (str);
742 if (! rc) return 0;
743 // Density
744 str = g_strdup_printf ("%f", default_fog.density);
745 rc = xml_save_parameter_to_file (writer, _(xml_fog_leg[2]), "fog.density", TRUE, 2, str);
746 g_free (str);
747 if (! rc) return 0;
748 // Depth
749 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
750 if (rc < 0) return 0;
751 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"info", BAD_CAST xml_fog_leg[3]);
752 if (rc < 0) return 0;
753 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST "fog.depth");
754 if (rc < 0) return 0;
755 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST "3");
756 if (rc < 0) return 0;
757 str = g_strdup_printf ("%f", default_fog.depth[0]);
758 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"start", BAD_CAST str);
759 g_free (str);
760 if (rc < 0) return 0;
761 str = g_strdup_printf ("%f", default_fog.depth[1]);
762 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"end", BAD_CAST str);
763 g_free (str);
764 if (rc < 0) return 0;
765 rc = xmlTextWriterEndElement (writer);
766 if (rc < 0) return 0;
767 // Color
768 rc = xml_save_xyz_to_file (writer, 4, xml_fog_leg[4], "fog.color", default_fog.color);
769 if (! rc) return rc;
770 // End fog
771 rc = xmlTextWriterEndElement (writer);
772 if (rc < 0) return 0;
773
774 // End opengl
775 rc = xmlTextWriterEndElement (writer);
776 if (rc < 0) return 0;
777
778 // Model
779 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"model");
780 if (rc < 0) return 0;
781
782 if (default_clones)
783 {
784 str = g_strdup_printf ("%d", default_clones);
785 rc = xml_save_parameter_to_file (writer, _(xml_model_leg[0]), "default_clones", FALSE, 0, str);
786 g_free (str);
787 if (! rc) return 0;
788 }
789 if (! default_cell)
790 {
791 str = g_strdup_printf ("%d", default_cell);
792 rc = xml_save_parameter_to_file (writer, _(xml_model_leg[1]), "default_cell", FALSE, 0, str);
793 g_free (str);
794 if (! rc) return 0;
795 }
796 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atoms_and_bonds");
797 if (rc < 0) return 0;
798
799 element_radius * tmp_rad;
800 gboolean do_atoms;
801 gboolean do_bonds;
802 gchar * str_a, * str_b;
803 for (i=0; i<OGL_STYLES; i++)
804 {
805 do_atoms = do_bonds = FALSE;
806 if (i != 4)
807 {
808 j = (i < 4) ? i : 4;
809 if (default_o_at_rs[j] || default_o_at_rs[j+5]) do_atoms = TRUE;
810 if (default_atomic_rad[j] || default_atomic_rad[j+5]) do_atoms = TRUE;
811 if (! do_atoms)
812 {
813 if (j == 2)
814 {
815 for (k=0; k<3; k++)
816 {
817 if (default_atomic_rad[10+k] || default_atomic_rad[13+k]) do_atoms = TRUE;
818 }
819 }
820 }
821 }
822 if (i != 2 && i != 3 && i != 5)
823 {
824 j = (i < 2) ? i : 2;
825 if (default_o_bd_rw[j] || default_o_bd_rw[j+3]) do_bonds = TRUE;
826 if (default_bond_rad[j] || default_bond_rad[j+3]) do_bonds = TRUE;
827 }
828 if (do_atoms || do_bonds)
829 {
830 rc = xmlTextWriterStartElement (writer, BAD_CAST xml_style_leg[i]);
831 if (rc < 0) return 0;
832 if (do_atoms)
833 {
834 j = (i < 4) ? i : 4;
835 k = (j == 0 || j == 2) ? 0 : (j == 1 || j == 4) ? 1 : 2;
836 for (l=0; l<2; l++)
837 {
838 if (default_o_at_rs[j+l*5])
839 {
840 str_a = (l) ? g_strdup_printf ("clone-%s", _(xml_atom_leg[k])) : g_strdup_printf ("%s", _(xml_atom_leg[k]));
841 str_b = g_strdup_printf ("%f", default_at_rs[j+l*5]);
842 rc = xml_save_parameter_to_file (writer, str_a, "default_at_rs", TRUE, j+l*5, str_b);
843 g_free (str_a);
844 g_free (str_b);
845 if (! rc) return 0;
846 }
847 }
848 l = (j == 2) ? 4 : 1;
849 for (m=0; m < l; m++)
850 {
851 n = (m) ? 7 : 0;
852 for (o= 0; o<2; o++)
853 {
854 n = (o && m) ? 5 : n;
855 if (default_atomic_rad[j+n+5*o+m])
856 {
857 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]));
858 rc = xmlTextWriterStartElement (writer, BAD_CAST str_a);
859 g_free (str_a);
860 if (rc < 0) return 0;
861 tmp_rad = default_atomic_rad[j+n+5*o+m];
862 while (tmp_rad)
863 {
864 str = g_strdup_printf ("%f", tmp_rad -> rad);
865 rc = xml_save_parameter_to_file (writer, periodic_table_info[tmp_rad -> Z].lab, "default_atomic_rad", TRUE, tmp_rad -> Z, str);
866 g_free (str);
867 if (! rc) return 0;
868 tmp_rad = tmp_rad -> next;
869 }
870 rc = xmlTextWriterEndElement (writer);
871 if (rc < 0) return 0;
872 }
873 }
874 }
875 }
876 if (do_bonds)
877 {
878 j = (i < 2) ? i : 2;
879 for (k=0; k<2; k++)
880 {
881 if (default_o_bd_rw[j+k*3])
882 {
883 str_a = (k) ? g_strdup_printf ("clone-%s", _(xml_bond_leg[j])) : g_strdup_printf ("%s", _(xml_bond_leg[j]));
884 str_b = g_strdup_printf ("%f", default_bd_rw[j+k*3]);
885 rc = xml_save_parameter_to_file (writer, str_a, "default_bd_rw", TRUE, j+k*3, str_b);
886 g_free (str_a);
887 g_free (str_b);
888 if (! rc) return 0;
889 }
890 if (default_bond_rad[j+k*3])
891 {
892 str_a = (k) ? g_strdup_printf ("clone-%s", _(xml_bond_leg[j])) : g_strdup_printf ("%s", _(xml_bond_leg[j]));
893 rc = xmlTextWriterStartElement (writer, BAD_CAST str_a);
894 g_free (str_a);
895 if (rc < 0) return 0;
896 tmp_rad = default_bond_rad[j+k*3];
897 while (tmp_rad)
898 {
899 str = g_strdup_printf ("%f", tmp_rad -> rad);
900 rc = xml_save_parameter_to_file (writer, periodic_table_info[tmp_rad -> Z].lab, "default_bond_rad", TRUE, tmp_rad -> Z, str);
901 g_free (str);
902 if (! rc) return 0;
903 tmp_rad = tmp_rad -> next;
904 }
905 rc = xmlTextWriterEndElement (writer);
906 if (rc < 0) return 0;
907 }
908 }
909 }
910 rc = xmlTextWriterEndElement (writer);
911 if (rc < 0) return 0;
912 }
913 }
914
915 // End atoms_and_bonds
916 rc = xmlTextWriterEndElement (writer);
917 if (rc < 0) return 0;
918
919 element_color * tmp_col;
920 // atoms and clones labels
921 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
922 if (rc < 0) return 0;
923 gchar * obj[2]={"atoms", "clones"};
924 for (i=0; i<2; i++)
925 {
926 rc = xmlTextWriterStartElement (writer, BAD_CAST obj[i]);
927 if (rc < 0) return 0;
928
929 str = g_strdup_printf ("%d", default_label[i].position);
930 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[0]), "default_label", TRUE, 0, str);
931 g_free (str);
932 if (! rc) return 0;
933 str = g_strdup_printf ("%d", default_label[i].render);
934 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[1]), "default_label", TRUE, 1, str);
935 g_free (str);
936 if (! rc) return 0;
937 str = g_strdup_printf ("%d", default_label[i].scale);
938 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[2]), "default_label", TRUE, 2, str);
939 g_free (str);
940 if (! rc) return 0;
941 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[3]), "default_label", TRUE, 3, default_label[i].font);
942 if (! rc) return 0;
943 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]));
944 if (! rc) return 0;
945 str = g_strdup_printf ("%d", default_acl_format[i]);
946 rc = xml_save_parameter_to_file (writer, _("Format"), "default_label", TRUE, 5, str);
947 g_free (str);
948 if (! rc) return 0;
949 if (default_label[i].n_colors || default_label_color[i])
950 {
951 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"colors");
952 if (rc < 0) return 0;
953 if (default_label[i].n_colors)
954 {
955 xml_save_color_to_file (writer, i, _("Only label color"), "only_label_color", default_label[i].color[0]);
956 }
957 else
958 {
959 tmp_col = default_label_color[i];
960 while (tmp_col)
961 {
962 rc = xml_save_color_to_file (writer, tmp_col -> Z, periodic_table_info[tmp_col -> Z].lab, "default_label_color", tmp_col -> col);
963 if (! rc) return 0;
964 tmp_col = tmp_col -> next;
965 }
966 }
967 rc = xmlTextWriterEndElement (writer);
968 if (rc < 0) return 0;
969 }
970
971 rc = xmlTextWriterEndElement (writer);
972 if (rc < 0) return 0;
973 }
974
975 // End atoms and clones colors
976 rc = xmlTextWriterEndElement (writer);
977 if (rc < 0) return 0;
978
979 do_atoms = (default_atom_color[0] || default_atom_color[1]) ? TRUE : FALSE;
980 if (do_atoms)
981 {
982 // atoms and clones colors
983 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"colors");
984 if (rc < 0) return 0;
985 for (i=0; i<2; i++)
986 {
987 if (default_atom_color[i])
988 {
989 rc = xmlTextWriterStartElement (writer, BAD_CAST obj[i]);
990 if (rc < 0) return 0;
991 tmp_col = default_atom_color[i];
992 while (tmp_col)
993 {
994 rc = xml_save_color_to_file (writer, tmp_col -> Z, periodic_table_info[tmp_col -> Z].lab, "default_atom_color", tmp_col -> col);
995 if (! rc) return 0;
996 tmp_col = tmp_col -> next;
997 }
998 rc = xmlTextWriterEndElement (writer);
999 if (rc < 0) return 0;
1000 }
1001 }
1002 }
1003
1004 if (default_box.box != NONE)
1005 {
1006 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"box");
1007 if (rc < 0) return 0;
1008 str = g_strdup_printf ("%f", (default_box.box == WIREFRAME) ? default_box.line : default_box.rad);
1009 rc = xml_save_parameter_to_file (writer, (default_box.box == WIREFRAME) ? _("Wireframe width") : _("Cylinder radius"), "default_box", TRUE, default_box.box, str);
1010 g_free (str);
1011 if (! rc) return 0;
1012 rc = xml_save_color_to_file (writer, -1, _("Color"), "default_box", default_box.color);
1013 if (! rc) return 0;
1014 // End box
1015 rc = xmlTextWriterEndElement (writer);
1016 if (rc < 0) return 0;
1017 }
1018
1019 // End model
1020 rc = xmlTextWriterEndElement (writer);
1021 if (rc < 0) return 0;
1022
1023 // View
1024 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"view");
1025 if (rc < 0) return 0;
1026
1027 // Background
1028 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"background");
1029 str = g_strdup_printf ("%d", default_background.gradient);
1030 rc = xml_save_parameter_to_file (writer, _("Gradient"), "default_background", TRUE, 0, str);
1031 g_free (str);
1032 if (! rc) return 0;
1033 if (default_background.gradient)
1034 {
1035 str = g_strdup_printf ("%d", default_background.direction);
1036 rc = xml_save_parameter_to_file (writer, _("Direction"), "default_background", TRUE, 1, str);
1037 g_free (str);
1038 if (! rc) return 0;
1039 str = g_strdup_printf ("%f", default_background.position);
1040 rc = xml_save_parameter_to_file (writer, _("Mixed position"), "default_background", TRUE, 2, str);
1041 g_free (str);
1042 if (! rc) return 0;
1043 for (i=0; i<2; i++)
1044 {
1045 rc = xml_save_color_to_file (writer, i+3, _("Color"), "default_background", default_background.gradient_color[i]);
1046 if (! rc) return 0;
1047 }
1048 }
1049 else
1050 {
1051 rc = xml_save_color_to_file (writer, -1, _("Color"), "default_background", default_background.color);
1052 if (! rc) return 0;
1053 }
1054
1055 rc = xmlTextWriterEndElement (writer);
1056 if (rc < 0) return 0;
1057
1058
1059 // Representation
1060 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"representation");
1061 if (rc < 0) return 0;
1062 str = g_strdup_printf ("%d", default_rep.rep);
1063 rc = xml_save_parameter_to_file (writer, _("Representation type"), "default_rep", TRUE, 0, str);
1064 g_free (str);
1065 if (! rc) return 0;
1066 if (default_rep.rep)
1067 {
1068 str = g_strdup_printf ("%lf", default_rep.gnear);
1069 rc = xml_save_parameter_to_file (writer, _("Camera depth"), "default_rep", TRUE, 1, str);
1070 g_free (str);
1071 if (! rc) return 0;
1072 }
1073
1074 str = g_strdup_printf ("%lf", 1.0 - 0.5*default_rep.zoom);
1075 rc = xml_save_parameter_to_file (writer, _("Zoom"), "default_rep", TRUE, 2, str);
1076 g_free (str) ;
1077 if (! rc) return 0;
1078 for (i=0; i<2; i++)
1079 {
1080 str = g_strdup_printf ("%lf", - default_rep.c_angle[i]);
1081 rc = xml_save_parameter_to_file (writer, (i) ? _("Camera pitch") : _("Camera heading"), "default_rep", TRUE, 3+i, str);
1082 g_free (str) ;
1083 if (! rc) return 0;
1084 }
1085 for (i=0; i<2; i++)
1086 {
1087 str = g_strdup_printf ("%lf", default_rep.c_shift[i]);
1088 rc = xml_save_parameter_to_file (writer, (i) ? _("Camera x") : _("Camera y"), "default_rep", TRUE, 5+i, str);
1089 g_free (str) ;
1090 if (! rc) return 0;
1091 }
1092 // End representation
1093 rc = xmlTextWriterEndElement (writer);
1094 if (rc < 0) return 0;
1095
1096
1097 if (default_axis.axis != NONE)
1098 {
1099 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"axis");
1100 if (rc < 0) return 0;
1101 if (default_axis.t_pos != NONE)
1102 {
1103 str = g_strdup_printf ("%d", default_axis.t_pos);
1104 rc = xml_save_parameter_to_file (writer, _("Template position"), "default_axis", TRUE, 0, str);
1105 g_free (str);
1106 if (! rc) return 0;
1107 }
1108 else
1109 {
1110 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]));
1111 if (! rc) return 0;
1112 }
1113 str = g_strdup_printf ("%f", (default_axis.axis == WIREFRAME) ? default_axis.line : default_axis.rad);
1114 rc = xml_save_parameter_to_file (writer, (default_axis.axis == WIREFRAME) ? _("Wireframe width") : _("Cylinder radius"), "default_axis", TRUE, default_axis.axis, str);
1115 g_free (str);
1116 if (! rc) return 0;
1117 str = g_strdup_printf ("%f", default_axis.length);
1118 rc = xml_save_parameter_to_file (writer, _("Length"), "default_axis", TRUE, 2, str);
1119 g_free (str);
1120 if (! rc) return 0;
1121 if (default_axis.labels)
1122 {
1123 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
1124 if (rc < 0) return 0;
1125 str = g_strdup_printf ("%d", default_label[2].render);
1126 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[1]), "default_label", TRUE, 1, str);
1127 g_free (str);
1128 if (! rc) return 0;
1129 str = g_strdup_printf ("%d", default_label[2].scale);
1130 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[2]), "default_label", TRUE, 2, str);
1131 g_free (str);
1132 if (! rc) return 0;
1133 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[3]), "default_label", TRUE, 3, default_label[2].font);
1134 if (! rc) return 0;
1135 for (i=0; i<3; i++)
1136 {
1137 rc = xml_save_parameter_to_file (writer, _(xml_axis_leg[i]), "axis_legend", TRUE, i, default_axis.title[i]);
1138 if (! rc) return 0;
1139 }
1140 rc = xmlTextWriterEndElement (writer);
1141 if (rc < 0) return 0;
1142 }
1143 if (default_axis.color)
1144 {
1145 for (i=0; i<3; i++)
1146 {
1147 rc = xml_save_color_to_file (writer, i, _("Color"), "default_axis", default_axis.color[i]);
1148 if (! rc) return 0;
1149 }
1150 }
1151 // End axis
1152 rc = xmlTextWriterEndElement (writer);
1153 if (rc < 0) return 0;
1154 }
1155
1156 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"measures");
1157 if (rc < 0) return 0;
1158 gchar * m_key[2]={"standard", "selection"};
1159 for (i=0; i<2; i++)
1160 {
1161 rc = xmlTextWriterStartElement (writer, BAD_CAST m_key[i]);
1162 if (rc < 0) return 0;
1163 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
1164 if (rc < 0) return 0;
1165 str = g_strdup_printf ("%d", default_label[i+3].position);
1166 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[0]), "default_label", TRUE, 0, str);
1167 g_free (str);
1168 if (! rc) return 0;
1169 str = g_strdup_printf ("%d", default_label[i+3].render);
1170 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[1]), "default_label", TRUE, 1, str);
1171 g_free (str);
1172 if (! rc) return 0;
1173 str = g_strdup_printf ("%d", default_label[i+3].scale);
1174 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[2]), "default_label", TRUE, 2, str);
1175 g_free (str);
1176 if (! rc) return 0;
1177 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[3]), "default_label", TRUE, 3, default_label[i+3].font);
1178 if (! rc) return 0;
1179 xml_save_color_to_file (writer, i+3, _("Font color"), "default_font_color", default_label[i+3].color[0]);
1180 if (! rc) return 0;
1181
1182 rc = xmlTextWriterEndElement (writer); // End label
1183 if (rc < 0) return 0;
1184 // mtilt
1185 str = g_strdup_printf ("%d", default_mtilt[i]);
1186 rc = xml_save_parameter_to_file (writer, _("Tilt along"), "default_mtilt", TRUE, i, str);
1187 g_free (str);
1188 if (! rc) return 0;
1189 // mtilt
1190 str = g_strdup_printf ("%d", default_mpattern[i]);
1191 rc = xml_save_parameter_to_file (writer, _("Pattern"), "default_mpattern", TRUE, i, str);
1192 g_free (str);
1193 if (! rc) return 0;
1194 // mfactor
1195 str = g_strdup_printf ("%d", default_mfactor[i]);
1196 rc = xml_save_parameter_to_file (writer, _("Factor"), "default_mfactor", TRUE, i, str);
1197 g_free (str);
1198 if (! rc) return 0;
1199 // mfactor
1200 str = g_strdup_printf ("%lf", default_mwidth[i]);
1201 rc = xml_save_parameter_to_file (writer, _("Width"), "default_mwidth", TRUE, i, str);
1202 g_free (str);
1203 if (! rc) return 0;
1204
1205 rc = xmlTextWriterEndElement (writer); // End measures type
1206 if (rc < 0) return 0;
1207 }
1208
1209 rc = xmlTextWriterEndElement (writer); // End measures
1210 if (rc < 0) return 0;
1211
1212 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atom-selections");
1213 if (rc < 0) return 0;
1214 for (i=0; i<2; i++)
1215 {
1216 xml_save_color_to_file (writer, i, _("Selection color"), "default_sel_color", default_sel_color[i]);
1217 if (! rc) return 0;
1218 }
1219 rc = xmlTextWriterEndElement (writer);
1220 if (rc < 0) return 0;
1221
1222 // End view
1223 rc = xmlTextWriterEndElement (writer);
1224 if (rc < 0) return 0;
1225
1226 rc = xmlTextWriterEndElement (writer);
1227 if (rc < 0) return 0;
1228
1229 rc = xmlTextWriterEndDocument (writer);
1230 if (rc < 0) return 0;
1231
1232 xmlFreeTextWriter (writer);
1233 return 1;
1234}
1235
1237
1245double xml_string_to_double (xmlChar * content)
1246{
1247 return (g_strcmp0((const char *)content, "") == 0) ? 0.0 : string_to_double ((gpointer)content);
1248}
1249
1264void set_parameter (xmlChar * content, gchar * key, int vid, dint * bond, vec3_t * vect, float start, float end, ColRGBA * col)
1265{
1266 element_radius * tmp_rad;
1267 element_color * tmp_col;
1268 if (bond)
1269 {
1270 bond_cutoff * cut;
1272 {
1273 cut = default_bond_cutoff;
1274 while (cut -> next)
1275 {
1276 cut = cut -> next;
1277 }
1278 cut -> next = g_malloc0(sizeof*cut);
1279 cut = cut -> next;
1280 }
1281 else
1282 {
1283 default_bond_cutoff = g_malloc0(sizeof*default_bond_cutoff);
1284 cut = default_bond_cutoff;
1285 }
1286 cut -> Z[0] = bond -> a;
1287 cut -> Z[1] = bond -> b;
1288 cut -> use = TRUE;
1289 cut -> cutoff = xml_string_to_double(content);
1290 }
1291 else if (g_strcmp0(key, "default_totcut") == 0)
1292 {
1294 }
1295 else if (g_strcmp0(key, "default_num_delta") == 0)
1296 {
1297 default_num_delta[vid] = (int)xml_string_to_double(content);
1298 }
1299 else if (g_strcmp0(key, "default_delta_t") == 0)
1300 {
1301 default_delta_t[vid] = xml_string_to_double(content);
1302 }
1303 else if (g_strcmp0(key, "default_rsparam") == 0)
1304 {
1305 default_rsparam[vid] = (int)xml_string_to_double(content);
1306 }
1307 else if (g_strcmp0(key, "default_csparam") == 0)
1308 {
1309 default_csparam[vid] = (int)xml_string_to_double(content);
1310 }
1311 else if (g_strcmp0(key, "default_skt_sets") == 0)
1312 {
1313 default_skt_sets = (int)xml_string_to_double(content);
1314 }
1315 else if (g_strcmp0(key, "default_skt_n_sets") == 0)
1316 {
1318 }
1319 else if (g_strcmp0(key, "default_sqw_n_sets") == 0)
1320 {
1322 }
1323 else if (g_strcmp0(key, "default_sqw_freq") == 0)
1324 {
1325 default_sqw_freq = (int)xml_string_to_double(content);
1326 }
1327 else if (g_strcmp0(key, "default_opengl") == 0)
1328 {
1329 default_opengl[vid] = (int)xml_string_to_double(content);
1330 }
1331 else if (g_strcmp0(key, "default_material") == 0)
1332 {
1333 if (vid < 0)
1334 {
1335 default_material.predefine = (int)xml_string_to_double(content);
1336 }
1337 else if (vid == 6 && vect)
1338 {
1339 default_material.albedo = * vect;
1340 }
1341 else
1342 {
1343 default_material.param[vid] = xml_string_to_double(content);
1344 }
1345 }
1346 else if (g_strcmp0(key, "default_lightning") == 0)
1347 {
1348 int lights = (int)xml_string_to_double(content);
1349 if (default_lightning.lights != lights)
1350 {
1351 int i;
1352 for (i=0; i<default_lightning.lights; i++)
1353 {
1354 g_free (default_lightning.spot[i]);
1355 }
1356 g_free (default_lightning.spot);
1357 default_lightning.lights = lights;
1358 default_lightning.spot = g_malloc0 (default_lightning.lights*sizeof*default_lightning.spot);
1359 for (i=0; i<default_lightning.lights; i++)
1360 {
1361 default_lightning.spot[i] = init_light_source ((i < 3) ? i : 1, 1.0);
1362 }
1363 }
1364 }
1365 else if (g_strcmp0(key, "light.type") == 0)
1366 {
1367 default_lightning.spot[vid] -> type = (int)xml_string_to_double(content);
1368 }
1369 else if (g_strcmp0(key, "light.fix") == 0)
1370 {
1371 default_lightning.spot[vid] -> fix = (int)xml_string_to_double(content);
1372 }
1373 else if (g_strcmp0(key, "light.direction") == 0 && vect)
1374 {
1375 default_lightning.spot[vid] -> direction = * vect;
1376 }
1377 else if (g_strcmp0(key, "light.position") == 0 && vect)
1378 {
1379 default_lightning.spot[vid] -> position = * vect;
1380 }
1381 else if (g_strcmp0(key, "light.intensity") == 0 && vect)
1382 {
1383 default_lightning.spot[vid] -> intensity = * vect;
1384 }
1385 else if (g_strcmp0(key, "light.attenuation") == 0 && vect)
1386 {
1387 default_lightning.spot[vid] -> attenuation = * vect;
1388 }
1389 else if (g_strcmp0(key, "light.spot") == 0 && vect)
1390 {
1391 default_lightning.spot[vid] -> spot_data = * vect;
1392 }
1393 else if (g_strcmp0(key, "fog.mode") == 0)
1394 {
1395 default_fog.mode = (int)xml_string_to_double(content);
1396 }
1397 else if (g_strcmp0(key, "fog.type") == 0)
1398 {
1399 default_fog.based = (int)xml_string_to_double(content);
1400 }
1401 else if (g_strcmp0(key, "fog.density") == 0)
1402 {
1403 default_fog.density = xml_string_to_double(content);
1404 }
1405 else if (g_strcmp0(key, "fog.depth") == 0)
1406 {
1407 if (start != -1.0) default_fog.depth[0] = start;
1408 if (end != -1.0) default_fog.depth[1] = end;
1409 }
1410 else if (g_strcmp0(key, "fog.color") == 0 && vect)
1411 {
1412 default_fog.color = * vect;
1413 }
1414 else if (g_strcmp0(key, "default_cell") == 0)
1415 {
1416 default_cell = (int)xml_string_to_double(content);
1417 }
1418 else if (g_strcmp0(key, "default_clones") == 0)
1419 {
1420 default_clones = (int)xml_string_to_double(content);
1421 }
1422 else if (g_strcmp0(key, "default_at_rs") == 0)
1423 {
1424 default_o_at_rs[vid] = TRUE;
1425 default_at_rs[vid] = xml_string_to_double(content);
1426 }
1427 else if (g_strcmp0(key, "default_bd_rw") == 0)
1428 {
1429 default_o_bd_rw[vid] = TRUE;
1430 default_bd_rw[vid] = xml_string_to_double(content);
1431 }
1432 else if (g_strcmp0(key, "default_atomic_rad") == 0)
1433 {
1435 {
1436 tmp_rad = default_atomic_rad[radius_id];
1437 while (tmp_rad -> next)
1438 {
1439 tmp_rad = tmp_rad -> next;
1440 }
1441 tmp_rad -> next = g_malloc0(sizeof*tmp_rad);
1442 tmp_rad = tmp_rad -> next;
1443 }
1444 else
1445 {
1447 tmp_rad = default_atomic_rad[radius_id];
1448 }
1449 tmp_rad -> Z = vid;
1450 tmp_rad -> rad = xml_string_to_double(content);
1451 }
1452 else if (g_strcmp0(key, "default_bond_rad") == 0)
1453 {
1455 {
1456 tmp_rad = default_bond_rad[radius_id];
1457 while (tmp_rad -> next)
1458 {
1459 tmp_rad = tmp_rad -> next;
1460 }
1461 tmp_rad -> next = g_malloc0(sizeof*tmp_rad);
1462 tmp_rad = tmp_rad -> next;
1463 }
1464 else
1465 {
1467 tmp_rad = default_bond_rad[radius_id];
1468 }
1469 tmp_rad -> Z = vid;
1470 tmp_rad -> rad = xml_string_to_double(content);
1471 }
1472 else if (g_strcmp0(key, "default_label") == 0)
1473 {
1474 switch (vid)
1475 {
1476 case 0:
1477 default_label[label_id].position = (int)xml_string_to_double(content);
1478 break;
1479 case 1:
1480 default_label[label_id].render = (int)xml_string_to_double(content);
1481 break;
1482 case 2:
1483 default_label[label_id].scale = (int)xml_string_to_double(content);
1484 break;
1485 case 3:
1486 default_label[label_id].font = g_strdup_printf ("%s", content);
1487 break;
1488 case 4:
1489 default_label[label_id].shift[0] = vect -> x;
1490 default_label[label_id].shift[1] = vect -> y;
1491 default_label[label_id].shift[2] = vect -> z;
1492 break;
1493 case 5:
1495 break;
1496 }
1497 }
1498 else if (g_strcmp0(key, "default_label_color") == 0)
1499 {
1500 if (! vid)
1501 {
1502 default_label[label_id].color = g_malloc0(sizeof*default_label[label_id].color);
1503 default_label[label_id].color[0] = * col;
1504 }
1505 else
1506 {
1508 {
1509 tmp_col = default_label_color[label_id];
1510 while (tmp_col -> next)
1511 {
1512 tmp_col = tmp_col -> next;
1513 }
1514 tmp_col -> next = g_malloc0(sizeof*tmp_col);
1515 tmp_col = tmp_col -> next;
1516 }
1517 else
1518 {
1520 tmp_col = default_label_color[label_id];
1521 }
1522 tmp_col -> Z = vid;
1523 tmp_col -> col = * col;
1524 }
1525 }
1526 else if (g_strcmp0(key, "default_font_color") == 0)
1527 {
1528 default_label[label_id].color = g_malloc0(sizeof*default_label[label_id].color);
1529 default_label[label_id].color[0] = * col;
1530 }
1531 else if (g_strcmp0(key, "default_atom_color") == 0)
1532 {
1534 {
1535 tmp_col = default_atom_color[label_id];
1536 while (tmp_col -> next)
1537 {
1538 tmp_col = tmp_col -> next;
1539 }
1540 tmp_col -> next = g_malloc0(sizeof*tmp_col);
1541 tmp_col = tmp_col -> next;
1542 }
1543 else
1544 {
1546 tmp_col = default_atom_color[label_id];
1547 }
1548 tmp_col -> Z = vid;
1549 tmp_col -> col = * col;
1550 }
1551 else if (g_strcmp0(key, "only_label_color") == 0)
1552 {
1553 default_label[label_id].n_colors = 1;
1554 default_label[label_id].color = g_malloc0(sizeof*default_label[label_id].color);
1555 default_label[label_id].color[0] = * col;
1556 }
1557 else if (g_strcmp0(key, "default_box") == 0)
1558 {
1559 if (col)
1560 {
1561 default_box.color = * col;
1562 }
1563 else
1564 {
1565 default_box.box = vid;
1566 if (default_box.box == WIREFRAME)
1567 {
1568 default_box.line = xml_string_to_double(content);
1569 }
1570 else
1571 {
1572 default_box.rad = xml_string_to_double(content);
1573 }
1574 }
1575 }
1576 else if (g_strcmp0(key, "default_background") == 0)
1577 {
1578 switch (vid)
1579 {
1580 case -1:
1581 if (col) default_background.color = * col;
1582 break;
1583 case 0:
1584 default_background.gradient = (int) xml_string_to_double(content);
1585 break;
1586 case 1:
1587 default_background.direction = (int) xml_string_to_double(content);
1588 break;
1589 case 2:
1590 default_background.position = xml_string_to_double(content);
1591 break;
1592 default:
1593 if (col) default_background.gradient_color[vid-3] = * col;
1594 break;
1595 }
1596 }
1597 else if (g_strcmp0(key, "default_rep") == 0)
1598 {
1599 switch (vid)
1600 {
1601 case 0:
1602 default_rep.rep = (int) xml_string_to_double(content);
1603 break;
1604 case 1:
1605 default_rep.gnear = xml_string_to_double(content);
1606 break;
1607 case 2:
1608 default_rep.zoom = 2.0*(1.0 - xml_string_to_double(content));
1609 break;
1610 default:
1611 if (vid < 5)
1612 {
1613 default_rep.c_angle[vid-3] = - xml_string_to_double(content);
1614 }
1615 else
1616 {
1617 default_rep.c_shift[vid-5] = xml_string_to_double(content);
1618 }
1619 break;
1620 }
1621 }
1622 else if (g_strcmp0(key, "default_axis") == 0)
1623 {
1624 if (vect)
1625 {
1626 default_axis.c_pos[0] = vect -> x;
1627 default_axis.c_pos[1] = vect -> y;
1628 default_axis.c_pos[2] = vect -> z;
1629 }
1630 else if (col)
1631 {
1632 if (! default_axis.color) default_axis.color = g_malloc0(3*sizeof*default_axis.color);
1633 default_axis.color[vid] = * col;
1634 }
1635 else
1636 {
1637 if (vid == 1 || vid == 4)
1638 {
1639 default_axis.axis = vid;
1640 if (vid == 1) default_axis.line = xml_string_to_double(content);
1641 if (vid == 4) default_axis.rad = xml_string_to_double(content);
1642 }
1643 else if (vid == 2)
1644 {
1645 default_axis.length = xml_string_to_double(content);
1646 }
1647 else if (! vid)
1648 {
1649 default_axis.t_pos = (int) xml_string_to_double(content);
1650 }
1651 }
1652 }
1653 else if (g_strcmp0(key, "axis_legend") == 0)
1654 {
1655 default_axis.title[vid] = g_strdup_printf ("%s", content);
1656 }
1657 else if (g_strcmp0(key, "default_mtilt") == 0)
1658 {
1659 default_mtilt[vid] = (int) xml_string_to_double(content);
1660 }
1661 else if (g_strcmp0(key, "default_mpattern") == 0)
1662 {
1663 default_mpattern[vid] = (int) xml_string_to_double(content);
1664 }
1665 else if (g_strcmp0(key, "default_mfactor") == 0)
1666 {
1667 default_mfactor[vid] = (int) xml_string_to_double(content);
1668 }
1669 else if (g_strcmp0(key, "default_mwidth") == 0)
1670 {
1671 default_mwidth[vid] = xml_string_to_double(content);
1672 }
1673 else if (g_strcmp0(key, "default_sel_color") == 0)
1674 {
1675 if (col)
1676 {
1677 default_sel_color[vid] = * col;
1678 }
1679 }
1680}
1681
1689void read_parameter (xmlNodePtr parameter_node)
1690{
1691 xmlNodePtr p_node;
1692 xmlAttrPtr p_details;
1693 gboolean set_codevar, set_id;
1694 gboolean set_x, set_y, set_z;
1695 gboolean set_r, set_g, set_b, set_a;
1696 gboolean set_alpha, set_beta;
1697 ColRGBA col;
1698 gchar * key = NULL;
1699 xmlChar * content, * p_cont;
1700 int id;
1701 dint bond;
1702 float start, end;
1703 vec3_t vec;
1704 while (parameter_node)
1705 {
1706 content = xmlNodeGetContent(parameter_node);
1707 p_details = parameter_node -> properties;
1708 set_codevar = set_id = FALSE;
1709 set_x = set_y = set_z = FALSE;
1710 set_r = set_g = set_b = set_a = FALSE;
1711 set_alpha = set_beta = FALSE;
1712 start = end = -1.0;
1713 id = -1;
1714 while (p_details)
1715 {
1716 p_node = p_details -> children;
1717 if (p_node)
1718 {
1719 p_cont = xmlNodeGetContent(p_node);
1720 if (g_strcmp0("key",(char *)p_details -> name) == 0)
1721 {
1722 key = g_strdup_printf ("%s", p_cont);
1723 set_codevar = TRUE;
1724 }
1725 else if (g_strcmp0("id",(char *)p_details -> name) == 0)
1726 {
1727 id = (int) string_to_double ((gpointer)p_cont);
1728 set_id = TRUE;
1729 }
1730 else if (g_strcmp0("α",(char *)p_details -> name) == 0)
1731 {
1732 bond.a = (int) string_to_double ((gpointer)p_cont);
1733 set_alpha = TRUE;
1734 }
1735 else if (g_strcmp0("β",(char *)p_details -> name) == 0)
1736 {
1737 bond.b = (int) string_to_double ((gpointer)p_cont);
1738 set_beta = TRUE;
1739 }
1740 else if (g_strcmp0("x",(char *)p_details -> name) == 0)
1741 {
1742 vec.x = string_to_double ((gpointer)p_cont);
1743 set_x = TRUE;
1744 }
1745 else if (g_strcmp0("y",(char *)p_details -> name) == 0)
1746 {
1747 vec.y = string_to_double ((gpointer)p_cont);
1748 set_y = TRUE;
1749 }
1750 else if (g_strcmp0("z",(char *)p_details -> name) == 0)
1751 {
1752 vec.z = string_to_double ((gpointer)p_cont);
1753 set_z = TRUE;
1754 }
1755 else if (g_strcmp0("start",(char *)p_details -> name) == 0)
1756 {
1757 start = string_to_double ((gpointer)p_cont);
1758 }
1759 else if (g_strcmp0("end",(char *)p_details -> name) == 0)
1760 {
1761 end = string_to_double ((gpointer)p_cont);
1762 }
1763 else if (g_strcmp0("red",(char *)p_details -> name) == 0)
1764 {
1765 col.red = string_to_double ((gpointer)p_cont);
1766 set_r = TRUE;
1767 }
1768 else if (g_strcmp0("green",(char *)p_details -> name) == 0)
1769 {
1770 col.green = string_to_double ((gpointer)p_cont);
1771 set_g = TRUE;
1772 }
1773 else if (g_strcmp0("blue",(char *)p_details -> name) == 0)
1774 {
1775 col.blue = string_to_double ((gpointer)p_cont);
1776 set_b = TRUE;
1777 }
1778 else if (g_strcmp0("alpha",(char *)p_details -> name) == 0)
1779 {
1780 col.alpha = string_to_double ((gpointer)p_cont);
1781 set_a = TRUE;
1782 }
1783 xmlFree (p_cont);
1784 }
1785 p_details = p_details -> next;
1786 }
1787
1788 if ((set_codevar && (set_id || (set_r && set_g && set_b && set_a))) || (set_alpha && set_beta))
1789 {
1790 // g_print ("key= %s, id= %d, content= %s\n", key, id, content);
1791 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);
1792 }
1793 if (key) g_free (key);
1794 xmlFree (content);
1795 parameter_node = parameter_node -> next;
1796 parameter_node = findnode (parameter_node, "parameter");
1797 }
1798}
1799
1807void read_light (xmlNodePtr light_node)
1808{
1809 xmlNodePtr l_node, p_node;
1810 xmlNodePtr parameter_node;
1811 xmlAttrPtr l_details, p_details;
1812 gchar * key = NULL;
1813 int lid;
1814 gboolean set_codevar;
1815 gboolean set_lid = FALSE;
1816 gboolean set_x, set_y, set_z;
1817 xmlChar * content, * p_cont;
1818 vec3_t vec;
1819 l_details = light_node -> properties;
1820 while (l_details)
1821 {
1822 l_node = l_details -> children;
1823 if (l_node)
1824 {
1825 if (g_strcmp0("id",(char *)l_details -> name) == 0)
1826 {
1827 content = xmlNodeGetContent(l_node);
1828 lid = (int) string_to_double ((gpointer)content);
1829 xmlFree (content);
1830 set_lid = TRUE;
1831 }
1832 }
1833 l_details = l_details -> next;
1834 }
1835 if (set_lid)
1836 {
1837 parameter_node = findnode (light_node -> children, "parameter");
1838 set_codevar = FALSE;
1839 set_x = set_y = set_z = FALSE;
1840 while (parameter_node)
1841 {
1842 content = xmlNodeGetContent(parameter_node);
1843 p_details = parameter_node -> properties;
1844 while (p_details)
1845 {
1846 p_node = p_details -> children;
1847 if (p_node)
1848 {
1849 p_cont = xmlNodeGetContent(p_node);
1850 if (g_strcmp0("key",(char *)p_details -> name) == 0)
1851 {
1852 key = g_strdup_printf ("%s", p_cont);
1853 set_codevar = TRUE;
1854 }
1855 else if (g_strcmp0("x",(char *)p_details -> name) == 0)
1856 {
1857 vec.x = string_to_double ((gpointer)p_cont);
1858 set_x = TRUE;
1859 }
1860 else if (g_strcmp0("y",(char *)p_details -> name) == 0)
1861 {
1862 vec.y = string_to_double ((gpointer)p_cont);
1863 set_y = TRUE;
1864 }
1865 else if (g_strcmp0("z",(char *)p_details -> name) == 0)
1866 {
1867 vec.z = string_to_double ((gpointer)p_cont);
1868 set_z = TRUE;
1869 }
1870 xmlFree (p_cont);
1871 }
1872 p_details = p_details -> next;
1873 }
1874 if (set_codevar)
1875 {
1876 set_parameter (content, key, lid, NULL, (set_x && set_y && set_z) ? & vec : NULL, -1.0, -1.0, NULL);
1877 }
1878 if (key) g_free (key);
1879 xmlFree (content);
1880 parameter_node = parameter_node -> next;
1881 parameter_node = findnode (parameter_node, "parameter");
1882 }
1883 }
1884}
1885
1893void read_preferences (xmlNodePtr preference_node)
1894{
1895 xmlNodePtr node;
1896 node = findnode (preference_node -> children, "parameter");
1897 read_parameter (node);
1898}
1899
1908void read_style_from_xml_file (xmlNodePtr style_node, int style)
1909{
1910 xmlNodePtr node;
1911 gchar * str;
1912 int i, j, k, l;
1913 i = (style == 0 || style == 2) ? 0 : (style == 1 || style == 4) ? 1 : 2;
1914 for (j=0; j<2; j++)
1915 {
1916 k = (style == 2) ? 4 : 1;
1917 for (l=0; l<k; l++)
1918 {
1919 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]);
1920 node = findnode (style_node, str);
1921 if (node)
1922 {
1923 if (j)
1924 {
1925 radius_id = (l) ? 12 + l : style + 5;
1926 }
1927 else
1928 {
1929 radius_id = (l) ? 9 + l : style;
1930 }
1931 read_preferences (node);
1932 }
1933 }
1934 }
1935 i = (style < 2) ? style : 2;
1936 for (j=0; j<2; j++)
1937 {
1938 str = (j) ? g_strdup_printf ("clone-%s", xml_bond_leg[i]) : g_strdup_printf ("%s", xml_bond_leg[i]);
1939 node = findnode (style_node, str);
1940 radius_id = (j) ? style + 3 : style;
1941 if (node) read_preferences(node);
1942 }
1943}
1944
1951{
1952 xmlDoc * doc;
1953 xmlTextReaderPtr reader;
1954 xmlNodePtr racine;
1955 xmlNodePtr node, p_node, l_node, c_node;
1956 int i;
1957 reader = xmlReaderForFile (ATOMES_CONFIG, NULL, 0);
1958 if (reader)
1959 {
1960 doc = xmlParseFile (ATOMES_CONFIG);
1961 if (doc)
1962 {
1963 racine = xmlDocGetRootElement (doc);
1964 if (racine)
1965 {
1966 if (g_strcmp0 ((char *)(racine -> name), "atomes_preferences-xml") == 0)
1967 {
1968 node = findnode(racine -> children, "analysis");
1969 if (node)
1970 {
1971 p_node = findnode (node -> children, "cutoffs");
1972 if (p_node)
1973 {
1974 read_preferences (p_node);
1975 l_node = findnode(p_node -> children, "partials");
1976 if (l_node)
1977 {
1978 read_preferences (l_node);
1979 }
1980 }
1981 read_preferences (node);
1982 }
1983 node = findnode(racine -> children, "opengl");
1984 if (node)
1985 {
1986 p_node = findnode (node -> children, "material");
1987 if (p_node)
1988 {
1989 read_preferences (p_node);
1990 }
1991 p_node = findnode (node -> children, "lightning");
1992 if (p_node)
1993 {
1994 read_preferences (p_node);
1995 l_node = findnode (p_node -> children, "light");
1996 while (l_node)
1997 {
1998 read_light (l_node);
1999 l_node = l_node -> next;
2000 l_node = findnode (l_node, "light");
2001 }
2002 }
2003 p_node = findnode (node -> children, "fog");
2004 if (p_node)
2005 {
2006 read_preferences(p_node);
2007 }
2008 read_preferences (node);
2009 }
2010 node = findnode(racine -> children, "model");
2011 if (node)
2012 {
2013 read_preferences (node);
2014 p_node = findnode(node -> children, "atoms_and_bonds");
2015 if (p_node)
2016 {
2017 for (i=0; i<OGL_STYLES; i++)
2018 {
2019 l_node = findnode (p_node -> children, xml_style_leg[i]);
2020 if (l_node)
2021 {
2022 read_style_from_xml_file (l_node -> children, i);
2023 }
2024 }
2025 }
2026 p_node = findnode(node -> children, "labels");
2027 if (p_node)
2028 {
2029 for (i=0; i<2; i++)
2030 {
2031 l_node = findnode (p_node -> children, (i) ? "clones" : "atoms");
2032 if (l_node)
2033 {
2034 label_id = i;
2035 read_preferences (l_node);
2036 c_node = findnode(l_node -> children, "colors");
2037 if (c_node)
2038 {
2039 read_preferences (c_node);
2040 }
2041 }
2042 }
2043 }
2044 c_node = findnode(node -> children, "colors");
2045 if (c_node)
2046 {
2047 for (i=0; i<2; i++)
2048 {
2049 l_node = findnode (c_node -> children, (i) ? "clones" : "atoms");
2050 if (l_node)
2051 {
2052 label_id = i;
2053 read_preferences (l_node);
2054 }
2055 }
2056 }
2057 p_node = findnode(node -> children, "box");
2058 if (p_node)
2059 {
2060 read_preferences (p_node);
2061 }
2062 }
2063 node = findnode(racine -> children, "view");
2064 if (node)
2065 {
2066 read_preferences (node);
2067 p_node = findnode(node -> children, "background");
2068 if (p_node)
2069 {
2070 read_preferences (p_node);
2071 }
2072 p_node = findnode(node -> children, "representation");
2073 if (p_node)
2074 {
2075 read_preferences (p_node);
2076 }
2077 p_node = findnode(node -> children, "axis");
2078 if (p_node)
2079 {
2080 read_preferences (p_node);
2081 l_node = findnode(p_node -> children, "labels");
2082 if (l_node)
2083 {
2084 label_id = 2;
2085 default_axis.labels = TRUE;
2086 read_preferences (l_node);
2087 }
2088 c_node = findnode(p_node -> children, "colors");
2089 if (c_node)
2090 {
2091 read_preferences (c_node);
2092 }
2093 }
2094 p_node = findnode(node -> children, "measures");
2095 if (p_node)
2096 {
2097 l_node = findnode(p_node -> children, "standard");
2098 if (l_node)
2099 {
2100 c_node = findnode(l_node -> children, "labels");
2101 if (c_node)
2102 {
2103 label_id = 3;
2104 read_preferences (c_node);
2105 }
2106 read_preferences (l_node);
2107 }
2108 l_node = findnode(p_node -> children, "selection");
2109 if (l_node)
2110 {
2111 c_node = findnode(l_node -> children, "labels");
2112 if (c_node)
2113 {
2114 label_id = 4;
2115 read_preferences (c_node);
2116 }
2117 read_preferences (l_node);
2118 }
2119 }
2120 p_node = findnode(node -> children, "atom-selections");
2121 if (p_node)
2122 {
2123 read_preferences (p_node);
2124 }
2125 }
2126 }
2127 }
2128 xmlFreeDoc(doc);
2129 }
2130 xmlFreeTextReader(reader);
2131 }
2132 xmlCleanupParser();
2133}
2134
2141{
2142 int i, j;
2143 // Analysis preferences
2144
2145 default_totcut = 2.0;
2147 default_bond_cutoff = NULL;
2148 default_num_delta[GDR] = 1000;
2149 default_num_delta[SQD] = 1000;
2150 default_num_delta[SKD] = 1000;
2151 default_num_delta[GDK] = 1000;
2152 default_num_delta[BND] = 100;
2153 default_num_delta[ANG] = 90;
2154 default_num_delta[CHA-1] = 20;
2155 default_num_delta[MSD-2] = 0;
2156 default_num_delta[SKT-2] = 1000;
2157
2158 // Dynamical calculations
2159 default_delta_t[0] = 0.0;
2160 default_delta_t[1] = -1.0;
2161
2162 // Ring statistics
2163 default_rsparam[0] = -1;
2164 default_rsparam[1] = 0;
2165 default_rsparam[2] = 10;
2166 default_rsparam[3] = 500;
2167 default_rsparam[4] = 0;
2168 default_rsparam[5] = 0;
2169 default_rsparam[6] = 0;
2170
2171 // Chain statistics
2172 default_csparam[0] = 0;
2173 default_csparam[1] = 10;
2174 default_csparam[2] = 500;
2175 default_csparam[3] = 0;
2176 default_csparam[4] = 0;
2177 default_csparam[5] = 0;
2178
2179 // F(k,t) and S(q,w)
2180 default_skt_sets = FALSE;
2183 default_sqw_freq = 1000;
2184
2185 for (i=0; i<3; i++) default_opengl[i] = 0;
2187 default_opengl[4] = TRUE;
2188 // Material
2189 default_material.predefine = 4; // Plastic
2190 default_material.albedo = vec3(0.5, 0.5, 0.5);
2197
2198 // Lights
2199 default_lightning.lights = 3;
2200 if (default_lightning.spot)
2201 {
2202 for (i=0; i<default_lightning.lights; i++)
2203 {
2204 g_free (default_lightning.spot[i]);
2205 }
2206 g_free (default_lightning.spot);
2207 }
2208 default_lightning.spot = g_malloc0(3*sizeof*default_lightning.spot);
2209 default_lightning.spot[0] = init_light_source (0, 1.0);
2210 default_lightning.spot[1] = init_light_source (1, 1.0);
2211 default_lightning.spot[2] = init_light_source (2, 1.0);
2212
2213 // Fog
2214 default_fog.mode = 1;
2215 default_fog.based = 0;
2216 default_fog.density = 0.5;
2217 default_fog.depth[0] = 15.0;
2218 default_fog.depth[1] = 40.0;
2219 default_fog.color = vec3 (0.01f, 0.01f, 0.01f);
2220
2221 // Model
2222 default_clones = FALSE;
2223 default_cell = TRUE;
2224 for (i=0; i<5; i++)
2225 {
2226 default_o_at_rs[i] = default_o_at_rs[i+5] = FALSE;
2227 default_at_rs[i] = default_at_rs[i+5] = (i == 0 || i == 2) ? 0.5 : DEFAULT_SIZE;
2228 }
2229
2230 for (i=0; i<16; i++)
2231 {
2232 if (default_atomic_rad[i])
2233 {
2234 g_free (default_atomic_rad[i]);
2235 default_atomic_rad[i] = NULL;
2236 }
2237 }
2238 for (i=0; i<3; i++)
2239 {
2240 default_o_bd_rw[i] = default_o_bd_rw[i+3] = (i == 2) ? TRUE : FALSE;
2241 default_bd_rw[i] = default_bd_rw[i+3] = (i == 0) ? 0.5 : (i == 2) ? 0.1 : DEFAULT_SIZE;
2242 }
2243 for (i=0; i<6; i++)
2244 {
2245 if (default_bond_rad[i])
2246 {
2247 g_free (default_bond_rad[i]);
2248 default_bond_rad[i] = NULL;
2249 }
2250 }
2251 for (i=0; i<2; i++)
2252 {
2253 if (default_atom_color[i])
2254 {
2255 g_free (default_atom_color[i]);
2256 default_atom_color[i] = NULL;
2257 }
2258 if (default_label_color[i])
2259 {
2260 g_free (default_label_color[i]);
2261 default_label_color[i] = NULL;
2262 }
2263 }
2264 for (i=0; i<5; i++)
2265 {
2266 default_label[i].position = 1;
2267 default_label[i].render = BETTER_TEXT;
2268 default_label[i].scale = 0;
2269 for (j=0; j<3; j++) default_label[i].shift[j] = 0.0;
2270 default_label[i].n_colors = (i > 2) ? 1 : 0;
2271 if (default_label[i].n_colors)
2272 {
2273 default_label[i].color = g_malloc0(sizeof*default_label[i].color);
2274 default_label[i].color[0].red = 1.0;
2275 default_label[i].color[0].green = 1.0;
2276 default_label[i].color[0].blue = 1.0;
2277 default_label[i].color[0].alpha = 1.0;
2278 }
2279 default_label[i].font = (i > 2) ? g_strdup_printf ("FreeMono Bold 18") : g_strdup_printf ("Sans Bold 12");
2280 default_label[i].list = NULL;
2281 }
2282 for (i=0; i<2; i++)
2283 {
2285 default_mtilt[i] = TRUE;
2286 default_mpattern[i] = 0;
2287 default_mfactor[i] = 1;
2288 default_mwidth[i] = 1.0;
2289 }
2290
2291 default_box.box = WIREFRAME;
2292 default_box.color.red = 0.0;
2293 default_box.color.green = 1.0;
2294 default_box.color.blue = 0.0;
2295 default_box.color.alpha = 1.0;
2297 default_box.rad = 0.05;
2298
2299 // Representation
2300
2301 // Background color
2302 default_background.color.red = 0.0;
2303 default_background.color.green = 0.0;
2304 default_background.color.blue = 0.0;
2305 default_background.color.alpha = 1.0;
2306 default_background.gradient = 2;
2307 default_background.direction = 8;
2308 default_background.position = 0.5;
2309 default_background.gradient_color[0].red = 0.0;
2310 default_background.gradient_color[0].green = 0.01;
2311 default_background.gradient_color[0].blue = 0.21;
2312 default_background.gradient_color[0].alpha = 1.0;
2313 default_background.gradient_color[1].red = 0.0;
2314 default_background.gradient_color[1].green = 0.0;
2315 default_background.gradient_color[1].blue = 0.0;
2316 default_background.gradient_color[1].alpha = 1.0;
2317
2319 default_rep.proj = -1;
2320 default_rep.zoom = ZOOM;
2321 default_rep.c_angle[0] = - CAMERA_ANGLE_X;
2322 default_rep.c_angle[1] = - CAMERA_ANGLE_Y;
2323 for (i=0; i<2; i++) default_rep.c_shift[i] = 0.0;
2324 default_rep.gnear = 6.0;
2325
2326 // Axis
2327 default_axis.axis = NONE;
2329 default_axis.rad = 0.1;
2330 default_axis.t_pos = BOTTOM_RIGHT;
2331 default_axis.length = 2.0*DEFAULT_SIZE;
2332 default_axis.c_pos[0] = default_axis.c_pos[1] = 50.0;
2333 default_axis.c_pos[2] = 0.0;
2334 default_axis.title[0] = "x";
2335 default_axis.title[1] = "y";
2336 default_axis.title[2] = "z";
2337 if (default_axis.color) g_free (default_axis.color);
2338 default_axis.color = NULL;
2339
2340 // Selection color
2341 default_sel_color[0].red = 0.0;
2342 default_sel_color[0].green = 1.0;
2343 default_sel_color[0].blue = 1.0;
2344 default_sel_color[0].alpha = DEFAULT_OPACITY*0.75;
2345 // Selection color - edition mode
2346 default_sel_color[1].red = 1.0;
2347 default_sel_color[1].green = 0.00;
2348 default_sel_color[1].blue = 0.84;
2349 default_sel_color[1].alpha = DEFAULT_OPACITY*0.75;
2350}
2351
2373
2384GtkWidget * pref_list (gchar * mess[2], int nelem, gchar * mlist[nelem][2], gchar * end)
2385{
2386 gchar * str;
2387 GtkWidget * vbox = create_vbox (BSEP);
2388 GtkWidget * vvbox = create_vbox (BSEP);
2389 GtkWidget * hbox;
2390 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label(_(mess[0]), -1, -1, 0.5, 0.5), FALSE, FALSE, 5);
2391 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label(_(mess[1]), -1, -1, 0.5, 0.5), FALSE, FALSE, 0);
2392 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 20);
2393 int i;
2394 for (i=0; i<nelem; i++)
2395 {
2396 hbox = create_hbox (BSEP);
2397 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
2398 str = g_strdup_printf ("<b>%s</b>", _(mlist[i][0]));
2399 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 120, -1, 0.0, 0.5), FALSE, FALSE, 5);
2400 g_free (str);
2401 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(":", -1, -1, 1.0, 0.5), FALSE, FALSE, 0);
2402 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(mlist[i][1]), -1, -1, 0.0, 0.5), FALSE, FALSE, 10);
2403 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2404 }
2405 if (end)
2406 {
2407 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_(end), -1, -1, 0.5, 0.5), FALSE, FALSE, 20);
2408 }
2409 return vbox;
2410}
2411
2420G_MODULE_EXPORT void set_measures (GtkComboBox * box, gpointer data)
2421{
2422 int i, j;
2423 i = GPOINTER_TO_INT (data);
2424 j = combo_get_active ((GtkWidget *)box);
2425 if (i)
2426 {
2429 }
2430 else
2431 {
2434 }
2435}
2436
2445G_MODULE_EXPORT void set_selection_color (GtkColorChooser * colob, gpointer data)
2446{
2447 int i = GPOINTER_TO_INT (data);
2448 tmp_sel_color[i] = get_button_color (colob);
2449}
2450
2456GtkWidget * view_preferences ()
2457{
2458 GtkWidget * notebook = gtk_notebook_new ();
2459 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
2460 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
2461 GtkWidget * vbox = create_vbox (BSEP);
2462 gchar * info[2] = {i18n("The <b>View</b> tab regroups representation options"),
2463 i18n("which effect apply to the general aspect of the model:")};
2464 gchar * m_list[3][2] = {{i18n("Representation"), i18n("scene set-up and orientation")},
2465 {i18n("Axis"), i18n("axis options")},
2466 {i18n("Tools"), i18n("measures and selections option")}};
2467 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 30, 0.0, 0.0), FALSE, FALSE, 0);
2468 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, NULL), FALSE, FALSE, 30);
2469
2470 pref_gradient_win = g_malloc0(sizeof*pref_gradient_win);
2471 gradient_advanced (NULL, NULL);
2472 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_gradient_win -> win, FALSE, FALSE, 5);
2473
2474 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
2475
2476 // Tab for representation
2477 pref_rep_win = g_malloc0(sizeof*pref_rep_win);
2478 representation_advanced (NULL, NULL);
2479 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_rep_win -> win, gtk_label_new (_("Representation")));
2480
2481 // Axis
2482 pref_axis_win = g_malloc0(sizeof*pref_axis_win);
2483 axis_advanced (NULL, NULL);
2484 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_axis_win -> win, gtk_label_new (_("Axis")));
2485
2486 // Measures
2487 vbox = create_vbox (BSEP);
2488 GtkWidget * hbox;
2489 hbox = adv_box (vbox, _("<b>Select measure type</b>"), 5, 120, 0.0);
2491 combo_text_append (meas_combo, _("Standard"));
2492 combo_text_append (meas_combo, _("Edition mode"));
2494 g_signal_connect (G_OBJECT(meas_combo), "changed", G_CALLBACK(set_measures), GINT_TO_POINTER(0));
2495 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, meas_combo , FALSE, FALSE, 40);
2496 int i;
2497 for (i=0; i<2; i++)
2498 {
2499 meas_box[i] = create_vbox (BSEP);
2500 hbox = create_hbox (BSEP);
2501 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, labels_tab(NULL, i+3), FALSE, FALSE, 60);
2502 add_box_child_start (GTK_ORIENTATION_VERTICAL, meas_box[i], hbox, FALSE, FALSE, 5);
2503 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, meas_box[i], FALSE, FALSE, 0);
2504 }
2505
2506 hbox = adv_box (vbox, _("<b>Select selection type</b>"), 15, 120, 0.0);
2508 combo_text_append (sel_combo, _("Standard"));
2509 combo_text_append (sel_combo, _("Edition mode"));
2511 g_signal_connect (G_OBJECT(sel_combo), "changed", G_CALLBACK(set_measures), GINT_TO_POINTER(1));
2512 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sel_combo , FALSE, FALSE, 40);
2513 GtkWidget * hhbox, * vvbox;
2514 for (i=0; i<2; i++)
2515 {
2516 sel_box[i] = create_vbox (BSEP);
2517 hbox = create_hbox (BSEP);
2518 vvbox = create_hbox (BSEP);
2519 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vvbox, FALSE, FALSE, 60);
2520 hhbox = abox (vvbox, _("Color"), 0);
2521 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);
2522 add_box_child_start (GTK_ORIENTATION_VERTICAL, sel_box[i], hbox, FALSE, FALSE, 5);
2523 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, sel_box[i], FALSE, FALSE, 0);
2524 }
2525
2526 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("Tools")));
2527
2528 show_the_widgets (notebook);
2529
2530 return notebook;
2531}
2532
2536GtkWidget * pref_tree;
2538GtkWidget * edit_scrol;
2539GtkWidget * edit_colob;
2541
2542#ifdef GTK4
2551G_MODULE_EXPORT void toggled_default_stuff (GtkCheckButton * but, gpointer data)
2552#else
2561G_MODULE_EXPORT void toggled_default_stuff (GtkToggleButton * but, gpointer data)
2562#endif
2563{
2564 int status = button_get_status ((GtkWidget *)but);
2565 int object = GPOINTER_TO_INT(data);
2566 switch (object)
2567 {
2568 case 0:
2570 break;
2571 case 1:
2572 tmp_cell = status;
2573 break;
2574 default:
2575 if (object < 0)
2576 {
2577 // Bonds
2578 tmp_o_bd_rw[-object-2] = status;
2580 }
2581 else if (object < 100)
2582 {
2583 tmp_o_at_rs[object-2] = status;
2585 }
2586 else
2587 {
2590 ColRGBA col;
2591 col.red = col.green = col.blue = col.alpha = 1.0;
2592 if (status)
2593 {
2594 tmp_color = g_malloc0(sizeof*tmp_color);
2595 tmp_color -> red = tmp_color -> green = tmp_color -> blue = tmp_color -> alpha = 1.0;
2596 }
2597 else
2598 {
2599 if (tmp_color) g_free (tmp_color);
2600 tmp_color = NULL;
2601 }
2602 GdkRGBA rgb_col = colrgba_togtkrgba(col);
2603 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(edit_colob), & rgb_col);
2604 }
2605 break;
2606 }
2607}
2608
2617G_MODULE_EXPORT void set_default_stuff (GtkEntry * res, gpointer data)
2618{
2619 int i = GPOINTER_TO_INT(data);
2620 const gchar * m = entry_get_text (res);
2621 double value = string_to_double ((gpointer)m);
2622 if (i < 0)
2623 {
2624 // Bonds
2625 tmp_bd_rw[-i-2] = value;
2626 }
2627 else
2628 {
2629 tmp_at_rs[i-2] = value;
2630 }
2631 update_entry_double (res, value);
2632}
2633
2642{
2643 if (! old_list) return NULL;
2644 element_radius * new_list = g_malloc0(sizeof*new_list);
2645 element_radius * tmp_rad, * tmp_rbd;
2646 tmp_rad = old_list;
2647 tmp_rbd = new_list;
2648 while (tmp_rad)
2649 {
2650 tmp_rbd -> Z = tmp_rad -> Z;
2651 tmp_rbd -> rad = tmp_rad -> rad;
2652 if (tmp_rad -> next)
2653 {
2654 tmp_rbd -> next = g_malloc0(sizeof*tmp_rbd -> next);
2655 tmp_rbd -> next -> prev = tmp_rbd;
2656 tmp_rbd = tmp_rbd -> next;
2657 }
2658 tmp_rad = tmp_rad -> next;
2659 }
2660 return new_list;
2661}
2662
2673float get_radius (int object, int col, int z, element_radius * rad_list)
2674{
2675 element_radius * tmp_rad = rad_list;
2676 int ft;
2677 while (tmp_rad)
2678 {
2679 if (tmp_rad -> Z == z)
2680 {
2681 user_defined = TRUE;
2682 return tmp_rad -> rad;
2683 }
2684 tmp_rad = tmp_rad -> next;
2685 }
2686 if (object < 0)
2687 {
2688 object = - object - 2;
2689 // Bonds
2690 if (object == 0 || object == 3)
2691 {
2692 if (z < 119)
2693 {
2694 ft = 0;
2695 return set_radius_ (& z, & ft) / 4.0;
2696 }
2697 }
2698 else
2699 {
2700 return DEFAULT_SIZE;
2701 }
2702 }
2703 else
2704 {
2705 object -= 2;
2706 if (object == 2 || object == 7 || col)
2707 {
2708 ft = col;
2709 if (z < 119)
2710 {
2711 return set_radius_ (& z, & ft);
2712 }
2713 }
2714 else if (object == 1 || object == 4 || object == 6 || object == 9)
2715 {
2716 // Dots
2717 return DEFAULT_SIZE;
2718 }
2719 else if (object == 0 || object == 3 || object == 5 || object == 8)
2720 {
2721 ft = 0;
2722 return set_radius_ (& z, & ft) / 2.0;
2723 }
2724 }
2725 return 0.0;
2726}
2727
2736{
2737 if (! old_list) return NULL;
2738 element_color * new_list = g_malloc0(sizeof*new_list);
2739 element_color * tmp_rad, * tmp_rbd;
2740 tmp_rad = old_list;
2741 tmp_rbd = new_list;
2742 while (tmp_rad)
2743 {
2744 tmp_rbd -> Z = tmp_rad -> Z;
2745 tmp_rbd -> col = tmp_rad -> col;
2746 if (tmp_rad -> next)
2747 {
2748 tmp_rbd -> next = g_malloc0(sizeof*tmp_rbd -> next);
2749 tmp_rbd -> next -> prev = tmp_rbd;
2750 tmp_rbd = tmp_rbd -> next;
2751 }
2752 tmp_rad = tmp_rad -> next;
2753 }
2754 return new_list;
2755}
2756
2766{
2767 element_color * tmp_col = clist;
2768 while (tmp_col)
2769 {
2770 if (tmp_col -> Z == z)
2771 {
2772 user_defined = TRUE;
2773 return tmp_col -> col;
2774 }
2775 tmp_col = tmp_col -> next;
2776 }
2777 return set_default_color (z);
2778}
2779
2790G_MODULE_EXPORT void edit_pref (GtkCellRendererText * cell, gchar * path_string, gchar * new_text, gpointer user_data)
2791{
2792 int col = GPOINTER_TO_INT(user_data);
2793 GtkTreeModel * pref_model = gtk_tree_view_get_model(GTK_TREE_VIEW(pref_tree));
2794 GtkTreeIter row;
2795 gtk_tree_model_get_iter_from_string (pref_model, & row, path_string);
2796 int z;
2797 float val = string_to_double ((gpointer)new_text);
2798 gtk_tree_model_get (pref_model, & row, 3, & z, -1);
2799 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, col+4, val, -1);
2800 gboolean add_elem = FALSE;
2801 gboolean remove_elem = FALSE;
2802 element_radius * tmp_list;
2803 int col_val[4] = {1, 3, 5, 10};
2804 float v = get_radius (the_object, col, z, NULL);
2805 if (edit_list[col])
2806 {
2807 tmp_list = edit_list[col];
2808 add_elem = TRUE;
2809 while (tmp_list)
2810 {
2811 if (tmp_list -> Z == z)
2812 {
2813 tmp_list -> rad = val;
2814 if (val == v)
2815 {
2816 remove_elem = TRUE;
2817 if (tmp_list -> next)
2818 {
2819 if (tmp_list -> prev)
2820 {
2821 tmp_list -> prev -> next = tmp_list -> next;
2822 tmp_list -> next -> prev = tmp_list -> prev;
2823 }
2824 else
2825 {
2826 edit_list[col] = tmp_list -> next;
2827 edit_list[col] -> prev = NULL;
2828 }
2829 }
2830 else if (tmp_list -> prev)
2831 {
2832 edit_list[col] -> rad = tmp_list -> rad;
2833 edit_list[col] -> Z = tmp_list -> Z;
2834 edit_list[col] -> prev = NULL;
2835 }
2836 else
2837 {
2838 g_free (edit_list[col]);
2839 edit_list[col] = NULL;
2840 }
2841 add_elem = FALSE;
2842 }
2843 else
2844 {
2845 add_elem = FALSE;
2846 }
2847 }
2848 tmp_list = tmp_list -> next;
2849 }
2850 }
2851 else if (val != v)
2852 {
2853 add_elem = TRUE;
2854 }
2855
2856 if (add_elem)
2857 {
2858 if (edit_list[col])
2859 {
2860 tmp_list = edit_list[col];
2861 while (tmp_list)
2862 {
2863 if (! tmp_list -> next) break;
2864 tmp_list = tmp_list -> next;
2865 }
2866 tmp_list -> next = g_malloc0(sizeof*tmp_list -> next);
2867 tmp_list -> next -> prev = tmp_list;
2868 tmp_list = tmp_list -> next;
2869 }
2870 else
2871 {
2872 edit_list[col] = g_malloc0(sizeof*edit_list[col]);
2873 tmp_list = edit_list[col];
2874 }
2875 tmp_list -> Z = z;
2876 tmp_list -> rad = val;
2877 gtk_tree_model_get (pref_model, & row, 0, & z, -1);
2878 if (! z)
2879 {
2880 z = col_val[col];
2881 }
2882 else
2883 {
2884 int a, b, c, d;
2885 a = z / 10;
2886 b = (z - a * 10) / 5;
2887 c = (z - a * 10 - b * 5) / 3;
2888 d = z - a * 10 - b * 5 - c * 3;
2889 z = 0;
2890 if (a || col == 3) z += 10;
2891 if (b || col == 2) z += 5;
2892 if (c || col == 1) z += 3;
2893 if (d || col == 0) z += 1;
2894 }
2895 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, 0, z, -1);
2896 }
2897 else if (remove_elem)
2898 {
2899 gtk_tree_model_get (pref_model, & row, 0, & z, -1);
2900 z -= col_val[col];
2901 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, 0, z, -1);
2902 }
2903}
2904
2914G_MODULE_EXPORT void edit_chem_preferences (GtkDialog * edit_chem, gint response_id, gpointer data)
2915{
2916 int i, j, k, l;
2917 int object = GPOINTER_TO_INT (data);
2918 gboolean do_style = (object < 100) ? TRUE : FALSE;
2919 gboolean do_label = (object == 1000 || object == 1001) ? TRUE : FALSE;
2920 switch (response_id)
2921 {
2922 case GTK_RESPONSE_APPLY:
2923 if (do_style)
2924 {
2925 if (object < 0)
2926 {
2927 object = - object - 2;
2928 if (tmp_bond_rad[object]) g_free (tmp_bond_rad[object]);
2930 }
2931 else
2932 {
2933 j = (object == 4 || object == 9) ? 4 : 1;
2934 k = (object < 5) ? 7 : 5;
2935 object = object - 2;
2936 for (i=0; i<j; i++)
2937 {
2938 l = (i) ? 1 : 0;
2939 if (tmp_atomic_rad[object+l*k+i]) g_free (tmp_atomic_rad[object+l*k+i]);
2941 }
2942 }
2943 }
2944 else if (do_label)
2945 {
2946 object -= 1000;
2947 if (tmp_label_color[object]) g_free (tmp_label_color[object]);
2949 if (tmp_color)
2950 {
2951 if (! tmp_label[object] -> color) tmp_label[object] -> color = g_malloc0(sizeof*tmp_label[object] -> color);
2952 tmp_label[object] -> color[0] = * tmp_color;
2953 tmp_label[object] -> n_colors = 1;
2954 }
2955 }
2956 else
2957 {
2958 object -= 100;
2959 if (tmp_atom_color[object]) g_free (tmp_atom_color[object]);
2961 }
2962 break;
2963 default:
2964 if (do_style)
2965 {
2966 j = (object < 0) ? 1 : (object == 4 || object == 9) ? 4 : 1;
2967 for (i=0; i<j; i++)
2968 {
2969 if (edit_list[i])
2970 {
2971 g_free (edit_list[i]);
2972 edit_list[i] = NULL;
2973 }
2974 }
2975 g_free (edit_list);
2976 edit_list = NULL;
2977 }
2978 else
2979 {
2980 g_free (color_list);
2981 color_list = NULL;
2982 }
2983 break;
2984 }
2985 if (tmp_color) g_free (tmp_color);
2986 tmp_color = NULL;
2988}
2989
3001void color_set_color (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
3002{
3003 int z;
3004 gtk_tree_model_get (mod, iter, 3, & z, -1);
3005 GdkRGBA colo = colrgba_togtkrgba (get_spec_color (z, color_list));
3006 if (tmp_color) colo.alpha = 0.5;
3007 g_object_set (renderer, "background-rgba", & colo, "background-set", TRUE, NULL);
3008}
3009
3021void radius_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
3022{
3023 int cid = GPOINTER_TO_INT (data);
3024 int vid;
3025 gtk_tree_model_get (mod, iter, 0, & vid, -1);
3026 gboolean docol = FALSE;
3027 switch (vid)
3028 {
3029 case 1:
3030 docol = (cid == 0) ? TRUE : FALSE;
3031 break;
3032 case 3:
3033 docol = (cid == 1) ? TRUE : FALSE;
3034 break;
3035 case 5:
3036 docol = (cid == 2) ? TRUE : FALSE;
3037 break;
3038 case 10:
3039 docol = (cid == 3) ? TRUE : FALSE;
3040 break;
3041 case 4:
3042 docol = (cid == 0 || cid == 1) ? TRUE : FALSE;
3043 break;
3044 case 6:
3045 docol = (cid == 0 || cid == 2) ? TRUE : FALSE;
3046 break;
3047 case 8:
3048 docol = (cid == 1 || cid == 2) ? TRUE : FALSE;
3049 break;
3050 case 11:
3051 docol = (cid == 0 || cid == 3) ? TRUE : FALSE;
3052 break;
3053 case 13:
3054 docol = (cid == 1 || cid == 3) ? TRUE : FALSE;
3055 break;
3056 case 15:
3057 docol = (cid == 2 || cid == 3) ? TRUE : FALSE;
3058 break;
3059 case 9:
3060 docol = (cid != 3) ? TRUE : FALSE;
3061 break;
3062 case 14:
3063 docol = (cid != 2) ? TRUE : FALSE;
3064 break;
3065 case 16:
3066 docol = (cid != 1) ? TRUE : FALSE;
3067 break;
3068 case 18:
3069 docol = (cid != 0) ? TRUE : FALSE;
3070 break;
3071 case 19:
3072 docol = TRUE;
3073 break;
3074 }
3075 set_renderer_color (docol, renderer, init_color (cid, 4));
3076}
3077
3086gboolean are_identical_colors (ColRGBA col_a, ColRGBA col_b)
3087{
3088 if (col_a.red != col_b.red) return FALSE;
3089 if (col_a.green != col_b.green) return FALSE;
3090 if (col_a.blue != col_b.blue) return FALSE;
3091 if (col_a.alpha != col_b.alpha) return FALSE;
3092 return TRUE;
3093}
3094
3104G_MODULE_EXPORT void run_ac_color (GtkDialog * win, gint response_id, gpointer data)
3105{
3106 if (response_id == GTK_RESPONSE_OK)
3107 {
3108 ColRGBA colo = get_window_color (GTK_WIDGET(win));
3109 int i = GPOINTER_TO_INT (data);
3110 ColRGBA orig = set_default_color (i);
3111 gboolean add_elem;
3112 element_color * tmp_list;
3113 if (color_list)
3114 {
3115 tmp_list = color_list;
3116 add_elem = TRUE;
3117 while (tmp_list)
3118 {
3119 if (tmp_list -> Z == i)
3120 {
3121 tmp_list -> col = colo;
3122 if (are_identical_colors(colo, orig))
3123 {
3124 if (tmp_list -> next)
3125 {
3126 if (tmp_list -> prev)
3127 {
3128 tmp_list -> prev -> next = tmp_list -> next;
3129 tmp_list -> next -> prev = tmp_list -> prev;
3130 }
3131 else
3132 {
3133 color_list = tmp_list -> next;
3134 color_list -> prev = NULL;
3135 }
3136 }
3137 else if (tmp_list -> prev)
3138 {
3139 color_list -> col = tmp_list -> col;
3140 color_list -> Z = tmp_list -> Z;
3141 color_list -> prev = NULL;
3142 }
3143 else
3144 {
3145 g_free (color_list);
3146 color_list = NULL;
3147 }
3148 add_elem = FALSE;
3149 }
3150 else
3151 {
3152 add_elem = FALSE;
3153 }
3154 }
3155 tmp_list = tmp_list -> next;
3156 }
3157 }
3158 else if (! are_identical_colors(colo, orig))
3159 {
3160 add_elem = TRUE;
3161 }
3162 if (add_elem)
3163 {
3164 if (color_list)
3165 {
3166 tmp_list = color_list;
3167 while (tmp_list)
3168 {
3169 if (! tmp_list -> next) break;
3170 tmp_list = tmp_list -> next;
3171 }
3172 tmp_list -> next = g_malloc0(sizeof*tmp_list -> next);
3173 tmp_list -> next -> prev = tmp_list;
3174 tmp_list = tmp_list -> next;
3175 }
3176 else
3177 {
3178 color_list = g_malloc0(sizeof*color_list);
3179 tmp_list = color_list;
3180 }
3181 tmp_list -> Z = i;
3182 tmp_list -> col = colo;
3183 }
3184 }
3185 destroy_this_dialog (win);
3186}
3187
3199void color_button_event (GtkWidget * widget, double event_x, double event_y, guint event_button, gpointer data)
3200{
3201 if (event_button == 1)
3202 {
3203 GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
3204 GtkTreePath * path;
3205 GtkTreeViewColumn * column;
3206 int i, j;
3207#ifdef GTK4
3208 int e_x, e_y;
3209 gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW(widget), event_x, event_y, & e_x, & e_y);
3210 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), e_x, e_y, & path, & column, & i, & j))
3211#else
3212 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), event_x, event_y, & path, & column, & i, & j))
3213#endif
3214 {
3215 if (g_strcmp0(_("Color"), gtk_tree_view_column_get_title (column)) == 0)
3216 {
3217 GtkTreeIter row;
3218 if (gtk_tree_model_get_iter (model, & row, path))
3219 {
3220 i = GPOINTER_TO_INT(data);
3221 gchar * obj[2]={_("atom"), _("clone")};
3222 int z;
3223 gtk_tree_model_get (model, & row, 3, & z, -1);
3224 gchar * str = g_strdup_printf (_("%s %s color"), periodic_table_info[z].lab, obj[i]);
3226 GtkWidget * win = gtk_color_chooser_dialog_new (str, GTK_WINDOW(MainWindow));
3227 gtk_window_set_modal (GTK_WINDOW(win), TRUE);
3228 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(win), TRUE);
3229 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(win), & col);
3230 g_free (str);
3231 run_this_gtk_dialog (win, G_CALLBACK(run_ac_color), GINT_TO_POINTER(z));
3232 }
3233 }
3234 }
3235 }
3236}
3237
3238#ifdef GTK4
3250G_MODULE_EXPORT void pref_color_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
3251{
3252 color_button_event (gtk_event_controller_get_widget ((GtkEventController*)gesture), x, y,
3253 gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), data);
3254}
3255#else
3265G_MODULE_EXPORT gboolean pref_color_button_event (GtkWidget * widget, GdkEvent * event, gpointer data)
3266{
3267 if (event -> type == GDK_BUTTON_PRESS)
3268 {
3269 GdkEventButton * bevent = (GdkEventButton*)event;
3270 color_button_event (widget, bevent -> x, bevent -> y, bevent -> button, data);
3271 }
3272 return FALSE;
3273}
3274#endif
3275
3284G_MODULE_EXPORT void set_stuff_color (GtkColorChooser * colob, gpointer data)
3285{
3286 * tmp_color = get_button_color (colob);
3287}
3288
3297G_MODULE_EXPORT void edit_species_parameters (GtkButton * but, gpointer data)
3298{
3299 gchar * ats[3]={_("atom(s)"), _("dot(s)"), _("sphere(s)")};
3300 gchar * dim[3]={_("radius"), _("size"), _("width")};
3301 gchar * bts[3]={_("bond(s)"), _("wireframe(s)"), _("cylinder(s)")};
3302 the_object = GPOINTER_TO_INT(data);
3303 int i, j, k, l, n, m;
3304 int aid, bid;
3305 int num_col;
3306 gchar * str;
3307 gboolean do_style = (the_object < 100) ? TRUE : FALSE;
3308 gboolean do_label = FALSE;
3309 if (do_style)
3310 {
3311 if (the_object < 0)
3312 {
3313 // Going for bonds
3314 aid = - the_object - 2;
3315 aid = (aid) > 2 ? aid - 3 : aid;
3316 bid = (the_object == -3 || the_object == -6) ? 2 : 0;
3317 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]);
3318 num_col = 5;
3319 }
3320 else
3321 {
3322 // Going for atoms
3323 aid = the_object - 2;
3324 aid = (aid == 0 || aid == 2 || aid == 5 || aid == 7) ? 0 : (aid == 1 || aid == 4 || aid == 6 || aid == 9) ? 1 : 2;
3325 bid = (the_object == 1 || the_object == 6) ? 1 : 0;
3326 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]);
3327 num_col = (the_object == 4 || the_object == 9) ? 8 : 5;
3328 }
3329 }
3330 else
3331 {
3332 // Going for colors
3333 if (the_object < 1000)
3334 {
3335 aid = the_object - 100;
3336 str = g_strdup_printf (_("Select %s color"), (aid) ? _("clone") : _("atom"));
3337 }
3338 else
3339 {
3340 aid = the_object - 1000;
3341 str = g_strdup_printf (_("Select %s label color"), (aid) ? _("clone") : _("atom"));
3342 do_label = TRUE;
3343 }
3344 num_col = 5;
3345 }
3346 edit_list = NULL;
3347 color_list = NULL;
3348 tmp_color = NULL;
3349 GtkWidget * win = dialog_cancel_apply (str, MainWindow, TRUE);
3350 g_free (str);
3351 gtk_window_set_default_size (GTK_WINDOW(win), (num_col == 8) ? 600 : 300, 600);
3352 GtkWidget * vbox = dialog_get_content_area (win);
3353 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};
3354 GType c_type[5] = {G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING};
3355 GtkTreeViewColumn * pref_col[num_col];
3356 GtkCellRenderer * pref_cel[num_col];
3357 GtkTreeSelection * pref_select;
3358 GtkListStore * pref_model;
3359 GtkTreeIter elem;
3360 if (do_style)
3361 {
3362 pref_model = gtk_list_store_newv (num_col, s_type);
3363 i = (the_object < 0) ? - the_object - 2 : the_object - 2;
3364 j = (num_col == 8) ? 4 : 1;
3365 k = ((the_object < 0 && i > 2) || (the_object > 0 && i > 4)) ? 1 : 0;
3366 edit_list = g_malloc0(j*sizeof*edit_list);
3367 for (l=0; l<j; l++)
3368 {
3369 if (the_object < 0)
3370 {
3372 }
3373 else
3374 {
3375 m = (k) ? 5 : 7;
3376 n = (l) ? 1 : 0;
3378 }
3379 }
3380 }
3381 else
3382 {
3383 pref_model = gtk_list_store_newv (num_col, c_type);
3385 }
3386
3387 for (i=1; i<119; i++)
3388 {
3389 user_defined = FALSE;
3390 gtk_list_store_append (pref_model, & elem);
3391 if (do_style)
3392 {
3393 gtk_list_store_set (pref_model, & elem, 0, user_defined,
3394 1, periodic_table_info[i].name,
3396 3, periodic_table_info[i].Z,
3397 4, get_radius (the_object, 0, i, edit_list[0]), -1);
3398 if (num_col == 8)
3399 {
3400 j = user_defined;
3401 user_defined = FALSE;
3402 gtk_list_store_set (pref_model, & elem, 5, get_radius (the_object, 1, i, edit_list[1]), -1);
3403 j += (user_defined) ? 3 : 0;
3404 user_defined = FALSE;
3405 gtk_list_store_set (pref_model, & elem, 6, get_radius (the_object, 2, i, edit_list[2]), -1);
3406 j += (user_defined) ? 5 : 0;
3407 user_defined = FALSE;
3408 gtk_list_store_set (pref_model, & elem, 7, get_radius (the_object, 3, i, edit_list[3]), -1);
3409 j += (user_defined) ? 10 : 0;
3410 user_defined = FALSE;
3411 gtk_list_store_set (pref_model, & elem, 0, j, -1);
3412 }
3413 }
3414 else
3415 {
3416 gtk_list_store_set (pref_model, & elem, 0, user_defined,
3417 1, periodic_table_info[i].name,
3419 3, periodic_table_info[i].Z,
3420 4, NULL, -1);
3421 }
3422 }
3423
3424 pref_tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(pref_model));
3425 gchar * name[3] = {_("Element"), _("Symbol"), "Z"};
3426 gchar * g_name[3] = {_("Radius"), _("Size"), _("Width")};
3427 gchar * f_name[4] = {_("Covalent [1]"),_("Ionic [2]"),"van der Waals [3]", _("Crystal [4,5]")};
3428 for (i=0; i<num_col; i++)
3429 {
3430 pref_cel[i] = gtk_cell_renderer_text_new();
3431 if (i > 3)
3432 {
3433 if (do_style)
3434 {
3435 g_object_set (pref_cel[i], "editable", TRUE, NULL);
3436 gtk_cell_renderer_set_alignment (pref_cel[i], 0.5, 0.5);
3437 g_signal_connect (G_OBJECT(pref_cel[i]), "edited", G_CALLBACK(edit_pref), GINT_TO_POINTER(i-4));
3438 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);
3439 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);
3440 }
3441 else
3442 {
3443 gtk_cell_renderer_set_alignment (pref_cel[i], 0.5, 0.5);
3444 pref_col[i] = gtk_tree_view_column_new_with_attributes(_("Color"), pref_cel[i], "text", i, NULL);
3445 gtk_tree_view_column_set_cell_data_func (pref_col[i], pref_cel[i], color_set_color, NULL, NULL);
3446 }
3447 }
3448 else if (i)
3449 {
3450 pref_col[i] = gtk_tree_view_column_new_with_attributes(name[i-1], pref_cel[i], "text", i, NULL);
3451 gtk_tree_view_column_set_alignment (pref_col[i], 0.5);
3452 gtk_tree_view_column_set_resizable (pref_col[i], TRUE);
3453 gtk_tree_view_column_set_min_width (pref_col[i], 50);
3454 }
3455 else
3456 {
3457 pref_col[i] = gtk_tree_view_column_new_with_attributes("", pref_cel[i], "text", i, NULL);
3458 gtk_tree_view_column_set_visible (pref_col[i], FALSE);
3459 }
3460 gtk_tree_view_append_column(GTK_TREE_VIEW(pref_tree), pref_col[i]);
3461 }
3462 g_object_unref (pref_model);
3463 pref_select = gtk_tree_view_get_selection (GTK_TREE_VIEW(pref_tree));
3464 gtk_tree_selection_set_mode (pref_select, GTK_SELECTION_SINGLE);
3465 gtk_tree_view_expand_all (GTK_TREE_VIEW(pref_tree));
3466
3467#ifdef GTK3
3468 g_signal_connect (G_OBJECT(pref_tree), "button_press_event", G_CALLBACK(pref_color_button_event), GINT_TO_POINTER(aid));
3469#else
3470 add_widget_gesture_and_key_action (pref_tree, "pref-context-click", G_CALLBACK(pref_color_button_pressed), GINT_TO_POINTER(aid),
3471 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
3472#endif
3473
3474 edit_scrol = create_scroll (vbox, -1, 570, GTK_SHADOW_ETCHED_IN);
3476 if (! do_label)
3477 {
3478 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);
3479 if (num_col == 8)
3480 {
3481 gchar * legend={_("\n<sub>[1] B. Cordero and al. <i>Dalton Trans</i>, <b>213</b>:1112 (2008).</sub>\n"
3482 "<sub>[2] Slater. <i>J. Chem. Phys.</i>, <b>41</b>:3199 (1964).</sub>\n"
3483 "<sub>[3] Bondi A. <i>J. Phys. Chem.</i>, <b>68</b>:441 (1964).</sub>\n"
3484 "<sub>[4] R.D. Shannon and C.T. Prewitt <i>Acta Cryst. B</i>, <b>25</b>:925-946 (1969).</sub>\n"
3485 "<sub>[5] R.D. Shannon <i>Acta Cryst. A</i>, <b>23</b>:751-767 (1976).</sub>")};
3486 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(legend, -1, 25, 0.0, 0.5), FALSE, FALSE, 0);
3487 }
3488 }
3489 else if (do_label)
3490 {
3491 gtk_widget_set_sensitive (edit_scrol, ! tmp_label[aid] -> n_colors);
3492 GtkWidget * vvbox = create_vbox (BSEP);
3493 GtkWidget * hbox = create_hbox (BSEP);
3494 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:")};
3495 for (i=0; i<2; i++)
3496 {
3497 hbox = create_hbox (BSEP);
3498 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(info[i], 300, -1, 0.5, 0.5), FALSE, FALSE, 5);
3499 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, hbox, FALSE, FALSE, 0);
3500 }
3501 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 10);
3502 hbox = create_hbox (BSEP);
3503 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(info[i], 300, -1, 0.5, 0.5), FALSE, FALSE, 5);
3504 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3505 hbox = create_hbox (BSEP);
3506 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);
3508 if (tmp_label[aid] -> n_colors)
3509 {
3510 tmp_color = g_malloc0(sizeof*tmp_color);
3511 * tmp_color = tmp_label[aid] -> color[0];
3512 active_col = tmp_label[aid] -> color[0];
3513 }
3514 active_col.red = active_col.green = active_col.blue = active_col.alpha = 1.0;
3515 edit_colob = color_button (active_col, TRUE, 100, -1, G_CALLBACK(set_stuff_color), tmp_color);
3516 widget_set_sensitive (edit_colob, tmp_label[aid] -> n_colors);
3517 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, edit_colob, FALSE, FALSE, 0);
3518 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3519 }
3520 run_this_gtk_dialog (win, G_CALLBACK(edit_chem_preferences), data);
3521}
3522
3531GtkWidget * over_param (int object, int style)
3532{
3533 GtkWidget * vbox = create_vbox (BSEP);
3534 GtkWidget * hbox = create_hbox (BSEP);
3535 int clone = ((object && style > 2) || (! object && style > 4)) ? 20 : 0;
3536 int mod = (object) ? -1 : 1;
3537 gboolean over = (! object) ? TRUE : (object && (style != 2 && style != 5)) ? TRUE : FALSE;
3538 gchar * leg;
3539 if (over)
3540 {
3541 hbox = create_hbox (BSEP);
3542 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3543 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);
3544 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3545 hbox = create_hbox (BSEP);
3546 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3547 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);
3548 }
3549 else
3550 {
3551 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3552 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Set default value"), -1, -1, 0.0, 0.5), FALSE, FALSE, 10);
3553 }
3554 if (object)
3555 {
3556 bond_entry_over[style] = create_entry(G_CALLBACK(set_default_stuff), 100, 10, FALSE, GINT_TO_POINTER(mod*(style+2)));
3557 update_entry_double (GTK_ENTRY(bond_entry_over[style]), tmp_bd_rw[style]);
3558 if (over) widget_set_sensitive (bond_entry_over[style], tmp_o_bd_rw[style]);
3559 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, bond_entry_over[style], FALSE, FALSE, 0);
3560 leg = g_strdup_printf ("%s", (style == 1 || style == 4) ? "pts" : "&#xC5;");
3561 }
3562 else
3563 {
3564 atom_entry_over[style] = create_entry(G_CALLBACK(set_default_stuff), 100, 10, FALSE, GINT_TO_POINTER(mod*(style+2)));
3565 update_entry_double (GTK_ENTRY(atom_entry_over[style]), tmp_at_rs[style]);
3566 if (over) widget_set_sensitive (atom_entry_over[style], tmp_o_at_rs[style]);
3567 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, atom_entry_over[style], FALSE, FALSE, 0);
3568 leg = g_strdup_printf ("%s", (style == 1 || style == 6 || style == 4 || style == 9) ? "pts" : "&#xC5;");
3569 }
3570 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(leg, -1, -1, 0.0, 0.5), FALSE, FALSE, 5);
3571 g_free (leg);
3572 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3573 return vbox;
3574}
3575
3583GtkWidget * style_tab (int style)
3584{
3585 GtkWidget * vbox = create_vbox (BSEP);
3586 gchar * object[3]={i18n("<b>Atom(s)</b>"), i18n("<b>Bond(s)</b>"), i18n("\t<u>Clone(s)</u>")};
3587 gchar * dim[3]={i18n("Radius"), i18n("Size"), i18n("Width")};
3588 int i;
3589 int bsid;
3590 int lid;
3591 gchar * str;
3592 gboolean do_atoms = FALSE;
3593 gboolean do_bonds = FALSE;
3594 if (style == 0 || style == 1 || style == 2 || style == 3 || style == 5)
3595 {
3596 do_atoms = TRUE;
3597 }
3598 if (style == 0 || style == 1 || style == 4)
3599 {
3600 do_bonds = TRUE;
3601 bsid = (style == 4) ? 2 : style;
3602 }
3603 if (do_atoms)
3604 {
3605 lid = (style == 3) ? 2 : (style == 1 || style == 5) ? 1 : 0;
3606 for (i=0; i<2; i++)
3607 {
3608 adv_box (vbox, object[i*2], 10-5*i, 120, 0.0);
3609 str = g_strdup_printf ("\t%s", _(dim[(lid != 1) ? 0 : 1]));
3610 adv_box (vbox, str, 10, 120, 0.0);
3611 g_free (str);
3612 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, over_param (0, (style < 5) ? style+5*i : 4 + 5*i), FALSE, FALSE, 0);
3613 }
3614 }
3615 if (do_bonds)
3616 {
3617 // Bond(s) parameters
3618 for (i=0; i<2; i++)
3619 {
3620 adv_box (vbox, object[i+1], 10-5*i, 120, 0.0);
3621 str = g_strdup_printf ("\t%s", _(dim[(bsid != 1) ? 0 : 2]));
3622 adv_box (vbox, str, 10, 120, 0.0);
3623 g_free (str);
3624 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, over_param (1, bsid+3*i), FALSE, FALSE, 0);
3625 }
3626 }
3627
3628 return vbox;
3629}
3630
3636GtkWidget * model_preferences ()
3637{
3638 GtkWidget * notebook = gtk_notebook_new ();
3639 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
3640 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
3641 GtkWidget * vbox = create_vbox (BSEP);
3642 //GtkWidget * hbox;
3643 //GtkWidget * combo;
3644 gchar * info[2] = {i18n("The <b>Model</b> tab regroups atom(s), bond(s) and clone(s) options"),
3645 i18n("which effect apply when the corresponding <b>OpenGL</b> style is used:")};
3646 gchar * m_list[4][2] = {{i18n("Balls and Sticks"), i18n("atoms<sup>*</sup> and bonds radii")},
3647 {i18n("Wireframes"), i18n("dots<sup>**</sup> size and wireframes width")},
3648 {i18n("Spacefilled"), i18n("tabulated parameters")},
3649 {i18n("Cylinders"), i18n("bonds radii")}};
3650 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 30, 0.0, 0.0), FALSE, FALSE, 0);
3651 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 4, m_list, NULL), FALSE, FALSE, 0);
3652 gchar * other_info[2] = {i18n("It also provides options to customize atomic label(s),"), i18n("and, the model box, if any:")};
3653 gchar * o_list[2][2] = {{i18n("Labels"), i18n("atom labels")},
3654 {i18n("Box"), i18n("model box details")}};
3655 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (other_info, 2, o_list, NULL), FALSE, FALSE, 15);
3656 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 20, 0.0, 0.0), FALSE, FALSE, 0);
3657
3658 GtkWidget * hbox;
3659 gchar * obj[2] = {i18n("<b>Atoms</b>"), i18n("<b>Clones</b>")};
3660 int i;
3661 for (i=0; i<2; i++)
3662 {
3663 hbox = adv_box (vbox, _(obj[i]), 5, 150, 1.0);
3664 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);
3665 }
3666 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 5, 0.0, 0.0), FALSE, FALSE, 0);
3667 hbox = create_hbox (BSEP);
3668 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);
3669 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3670 hbox = create_hbox (BSEP);
3671 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);
3672 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3673 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 5, 0.0, 0.0), FALSE, FALSE, 0);
3674
3675 append_comments (vbox, "<sup>*</sup>", _("the same parameters are also used for the <b>spheres</b> style"));
3676 append_comments (vbox, "<sup>**</sup>", _("the same parameters are also used for the <b>dots</b> style"));
3677
3678 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
3679
3680 for (i=0; i<OGL_STYLES; i++)
3681 {
3682 if (i != 3 && i != 5) gtk_notebook_append_page (GTK_NOTEBOOK(notebook), style_tab (i), gtk_label_new (_(text_styles[i])));
3683 }
3684
3685 vbox = create_vbox (BSEP);
3686 GtkWidget * hhbox;
3687 for (i=0; i<2; i++)
3688 {
3689 hbox = adv_box (vbox, obj[i], 5, 120, 0.0);
3690 hbox = create_hbox (BSEP);
3691 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, labels_tab(NULL, i), FALSE, FALSE, 40);
3692 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3693 hbox = create_hbox (BSEP);
3694 hhbox = create_hbox (BSEP);
3695 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
3696 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(_("Colors"), 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
3697 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);
3698 add_box_child_start (GTK_ORIENTATION_VERTICAL, hbox, hhbox, FALSE, FALSE, 40);
3699 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3700 }
3701 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("Labels")));
3702
3703 pref_box_win = g_malloc0(sizeof*pref_box_win);
3704 box_advanced (NULL, NULL);
3705 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_box_win -> win, gtk_label_new (_("Box")));
3706 show_the_widgets (notebook);
3707 return notebook;
3708}
3709
3718G_MODULE_EXPORT void set_default_style (GtkComboBox * box, gpointer data)
3719{
3720 GtkTreeIter iter;
3721 if (gtk_combo_box_get_active_iter (box, & iter))
3722 {
3723 GtkTreeModel * model = gtk_combo_box_get_model (box);
3724 int i;
3725 gtk_tree_model_get (model, & iter, 1, & i, -1);
3726 tmp_opengl[0] = (! i) ? 0 : i;
3727 }
3728}
3729
3735GtkTreeModel * style_combo_tree ()
3736{
3737 GtkTreeIter iter, iter2;
3738 GtkTreeStore * store;
3739 int i, j;
3740 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
3741 gtk_tree_store_append (store, & iter, NULL);
3742 gtk_tree_store_set (store, & iter, 0, _("f(atoms) <sup>*</sup>"), 1, 0, -1);
3743 for (i=0; i<OGL_STYLES; i++)
3744 {
3745 gtk_tree_store_append (store, & iter, NULL);
3746 gtk_tree_store_set (store, & iter, 0, _(text_styles[i]), 1, i+1, -1);
3747 if (i == SPACEFILL)
3748 {
3749 for (j=0; j<FILLED_STYLES; j++)
3750 {
3751 gtk_tree_store_append (store, & iter2, & iter);
3752 gtk_tree_store_set (store, & iter2, 0, _(text_filled[j]), 1, -j-1, -1);
3753 }
3754 }
3755 }
3756 return GTK_TREE_MODEL (store);
3757}
3758
3767G_MODULE_EXPORT void set_default_map (GtkComboBox * box, gpointer data)
3768{
3769 int i, j;
3770 i = combo_get_active ((GtkWidget *)box);
3771 j = GPOINTER_TO_INT(data);
3772 tmp_opengl[j+1] = i;
3773}
3774
3782GtkWidget * combo_map (int obj)
3783{
3784 GtkWidget * combo = create_combo ();
3785 combo_text_append (combo, _("Atomic Species"));
3786 combo_text_append (combo, _("Total Coordination(s)"));
3787 combo_text_append (combo, _("Partial Coordination(s)"));
3788 combo_set_active (combo, tmp_opengl[1+obj]);
3789 g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(set_default_map), GINT_TO_POINTER(obj));
3790 return combo;
3791}
3792
3799{
3800 GtkWidget * notebook = gtk_notebook_new ();
3801 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
3802 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
3803 GtkWidget * vbox = create_vbox (BSEP);
3804 GtkWidget * hbox;
3805 GtkWidget * combo;
3806
3807 // Creating an OpenGL edition data structure
3808 pref_ogl_edit = g_malloc0(sizeof*pref_ogl_edit);
3809 int i;
3810 for (i=0; i<6; i++)
3811 {
3812 pref_ogl_edit -> pointer[i].a = -1;
3813 pref_ogl_edit -> pointer[i].b = i;
3814 }
3815
3816 gchar * info[2] = {i18n("The <b>OpenGL</b> tab regroups rendering options"),
3817 i18n("use it to configure the OpenGL 3D scene:")};
3818 gchar * m_list[3][2] = {{i18n("Material"), i18n("aspect for atom(s) and bond(s)")},
3819 {i18n("Lights"), i18n("lightning of the scene")},
3820 {i18n("Fog"), i18n("atmosphere effects")}};
3821 gchar * end = i18n("It also offers to adjust the main visualization style and the color maps");
3822
3823 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, end), FALSE, FALSE, 30);
3824
3825 hbox = create_hbox (BSEP);
3826 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("<b>Style</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3827 GtkTreeModel * model = style_combo_tree ();
3828 combo = gtk_combo_box_new_with_model (model);
3829 g_object_unref (model);
3830 GtkCellRenderer * renderer = gtk_cell_renderer_combo_new ();
3831 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
3832 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "text", 0, NULL);
3833 combo_set_active (combo, tmp_opengl[0]);
3834 combo_set_markup (combo);
3835 g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(set_default_style), NULL);
3836 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 0);
3837 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3838 append_comments (vbox, "<sup>*</sup>", _("if 10 000 atoms or more: <b>Wireframes</b>, otherwise: <b>Balls and sticks</b>"));
3839
3840 hbox = create_hbox (BSEP);
3841 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("<b>Color maps</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3842 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 15);
3843 hbox = create_hbox (BSEP);
3844 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("\tatom(s) and bond(s)"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3845 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo_map(0), FALSE, FALSE, 0);
3846 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3847
3848 hbox = create_hbox (BSEP);
3849 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("\tpolyhedra"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3850 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo_map(1), FALSE, FALSE, 0);
3851 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3852
3854
3855 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
3856
3857 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), materials_tab (NULL, pref_ogl_edit, & tmp_material), gtk_label_new (_("Material")));
3858 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), lights_tab (NULL, pref_ogl_edit, & tmp_lightning), gtk_label_new (_("Lights")));
3859 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), fog_tab (NULL, pref_ogl_edit, & tmp_fog), gtk_label_new (_("Fog")));
3860
3861 gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), 0);
3862 return notebook;
3863}
3864
3873G_MODULE_EXPORT void set_default_num_delta (GtkEntry * res, gpointer data)
3874{
3875 int i = GPOINTER_TO_INT(data);
3876 const gchar * m = entry_get_text (res);
3877 double value = string_to_double ((gpointer)m);
3878 if (i == -1)
3879 {
3880 if (value > 0.0)
3881 {
3882 tmp_totcut = value;
3883 }
3885 }
3886 else if (i < 9)
3887 {
3888 if (value > 0) tmp_num_delta[i] = (int) value;
3890 if (i == 7 || i == 8)
3891 {
3892 update_entry_int (GTK_ENTRY(dyna_entry[(i == 7) ? 1 : 0][0]), tmp_num_delta[i]);
3894 }
3895 }
3896 else // delta_t
3897 {
3898 if (value > 0.0) tmp_delta_t[0] = value;
3900 update_entry_double (GTK_ENTRY(dyna_entry[(i == 9) ? 1 : 0][1]), tmp_delta_t[0]);
3902 }
3903}
3904
3913G_MODULE_EXPORT void tunit_changed (GtkComboBox * box, gpointer data)
3914{
3915 tmp_delta_t[1] = (double) combo_get_active ((GtkWidget *)box);
3916 int i = GPOINTER_TO_INT(data);
3917 combo_set_active (dyna_combo[(i == 7) ? 1 : 0], (int)tmp_delta_t[1]);
3919}
3920
3921GtkWidget * all_cut_box = NULL;
3922GtkWidget * cut_combo[2];
3923GtkWidget * pcut_box[2];
3924GtkWidget * tcut_entry = NULL;
3925GtkWidget * tcut_box = NULL;
3926GtkWidget * cut_comments = NULL;
3928
3937G_MODULE_EXPORT void totcut_changed (GtkComboBox * box, gpointer data)
3938{
3939 if (combo_get_active((GtkWidget *)box))
3940 {
3941 tmp_totcut = 2.0;
3943 }
3944 else
3945 {
3946 tmp_totcut = 0.0;
3948 }
3950}
3951
3960G_MODULE_EXPORT void edit_pc_value (GtkEntry * res, gpointer data)
3961{
3962 bond_cutoff * cut = (bond_cutoff *)data;
3963 const gchar * m = entry_get_text (res);
3964 double value = string_to_double ((gpointer)m);
3965 if (value > 0.0)
3966 {
3967 cut -> cutoff = value;
3968 }
3969 update_entry_double (res, cut -> cutoff);
3970}
3971
3972#ifdef GTK4
3981G_MODULE_EXPORT void toggled_use_cutoff (GtkCheckButton * but, gpointer data)
3982#else
3991G_MODULE_EXPORT void toggled_use_cutoff (GtkToggleButton * but, gpointer data)
3992#endif
3993{
3994 bond_cutoff * cut = (bond_cutoff *)data;
3995 cut -> use = button_get_status ((GtkWidget *)but);
3996}
3997
4004{
4005 GtkWidget * hbox;
4006 GtkWidget * entry;
4007
4008 int i;
4009 for (i=0; i<2; i++) pcut_box[i] = NULL;
4010 pcut_box[0] = create_vbox (BSEP);
4011 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, pcut_box[0], FALSE, FALSE, 10);
4012 if (cut_list)
4013 {
4014 hbox = create_hbox (BSEP);
4015 add_box_child_start (GTK_ORIENTATION_VERTICAL, pcut_box[0], hbox, FALSE, FALSE, 10);
4016 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B1;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 10);
4017 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B2;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 10);
4018 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);
4019 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Use <sup>*</sup>"), 20, -1, 0.5, 0.5), FALSE, FALSE, 10);
4020 }
4021 pcut_box[1] = create_vbox (BSEP);
4022 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, pcut_box[1], FALSE, FALSE, 10);
4023 bond_cutoff * tmp_cut = cut_list;
4024 while (tmp_cut)
4025 {
4026 hbox = create_hbox (BSEP);
4027 add_box_child_start (GTK_ORIENTATION_VERTICAL, pcut_box[1], hbox, FALSE, FALSE, 0);
4028 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);
4029 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);
4030 entry = create_entry (G_CALLBACK(edit_pc_value), 100, 10, FALSE, (gpointer)tmp_cut);
4031 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
4032 update_entry_double ((GtkEntry *)entry, tmp_cut -> cutoff);
4033 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);
4034 tmp_cut = tmp_cut -> next;
4035 }
4036
4039 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, cut_comments, FALSE, FALSE, 10);
4040 if (cut_list) append_comments (cut_comments, "<sup>*</sup>", _("Unused values will not be saved !"));
4041
4042 for (i=0; i<2; i++) combo_set_active (cut_combo[i], -1);
4044}
4045
4051gboolean not_in_cutoffs (int z_a, int z_b)
4052{
4053 bond_cutoff * tmp_cut = cut_list;
4054 while (tmp_cut)
4055 {
4056 if (tmp_cut -> Z[0] == z_a && tmp_cut -> Z[1] == z_b) return FALSE;
4057 tmp_cut = tmp_cut -> next;
4058 }
4059 return TRUE;
4060}
4061
4070G_MODULE_EXPORT void cut_spec_changed (GtkComboBox * box, gpointer data)
4071{
4072 int i, j, k, l;
4073 i = combo_get_active (cut_combo[0]);
4074 j = combo_get_active (cut_combo[1]);
4075 k = min (i+1, j+1);
4076 l = max (i+1, j+1);
4077 if (k && l)
4078 {
4079 if (not_in_cutoffs(k, l))
4080 {
4081 bond_cutoff * tmp_cut;
4082 if (! cut_list)
4083 {
4084 cut_list = g_malloc0(sizeof*cut_list);
4085 tmp_cut = cut_list;
4086 }
4087 else
4088 {
4089 tmp_cut = cut_list;
4090 while (tmp_cut -> next)
4091 {
4092 tmp_cut = tmp_cut -> next;
4093 }
4094 tmp_cut -> next = g_malloc0(sizeof*tmp_cut -> next);
4095 tmp_cut -> next -> prev = tmp_cut;
4096 tmp_cut = tmp_cut -> next;
4097 }
4098 tmp_cut -> Z[0] = min(k, l);
4099 tmp_cut -> Z[1] = max(k, l);
4100 tmp_cut -> use = FALSE;
4101 tmp_cut -> cutoff = 1.0;
4102 add_cut_box ();
4103 }
4104 }
4105}
4106
4115{
4116 bond_cutoff * new_cutoff = NULL;
4117 bond_cutoff * cut_a, * cut_b;
4118 cut_a = old_cutoff;
4119 while (cut_a)
4120 {
4121 if (cut_a -> use)
4122 {
4123 if (! new_cutoff)
4124 {
4125 new_cutoff = g_malloc0(sizeof*new_cutoff);
4126 cut_b = new_cutoff;
4127 }
4128 else
4129 {
4130 cut_b -> next = g_malloc0(sizeof*cut_b -> next);
4131 cut_b -> next -> prev = cut_b;
4132 cut_b = cut_b -> next;
4133 }
4134 cut_b -> Z[0] = cut_a -> Z[0];
4135 cut_b -> Z[1] = cut_a -> Z[1];
4136 cut_b -> use = cut_a -> use;
4137 cut_b -> cutoff = cut_a -> cutoff;
4138 }
4139 cut_a = cut_a -> next;
4140 }
4141 return new_cutoff;
4142}
4143
4153G_MODULE_EXPORT void edit_cutoffs (GtkDialog * edit_cuts, gint response_id, gpointer data)
4154{
4155 switch (response_id)
4156 {
4157 case GTK_RESPONSE_APPLY:
4159 break;
4160 }
4161 if (cut_list)
4162 {
4163 g_free (cut_list);
4164 cut_list = NULL;
4165 }
4166 int i;
4167 for (i=0; i<2; i++)
4168 {
4171 }
4174 destroy_this_widget ((GtkWidget *)edit_cuts);
4175}
4176
4185G_MODULE_EXPORT void set_cutoffs_default (GtkButton * but, gpointer data)
4186{
4187 GtkWidget * win = dialog_cancel_apply (_("Select partial cutoffs(s)"), MainWindow, TRUE);
4188 GtkWidget * vbox = dialog_get_content_area (win);
4189 GtkWidget * hbox = create_hbox (BSEP);
4190 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4192 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, all_cut_box, FALSE, FALSE, 50);
4194 hbox = create_hbox (BSEP);
4195 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, hbox, FALSE, FALSE, 5);
4196 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B1;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
4197 int i, j;
4198 for (i=0; i<2; i++)
4199 {
4200 cut_combo[i] = NULL;
4201 cut_combo[i] = create_combo ();
4202 for (j=1; j<119; j++)
4203 {
4205 }
4206 g_signal_connect(G_OBJECT(cut_combo[i]), "changed", G_CALLBACK(cut_spec_changed), NULL);
4208 }
4209 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, cut_combo[0], FALSE, FALSE, 5);
4210 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 20, -1, 0.0, 0.5), FALSE, FALSE, 0);
4211 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B2;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
4212 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, cut_combo[1], FALSE, FALSE, 5);
4213
4214 add_cut_box ();
4215
4216 run_this_gtk_dialog (win, G_CALLBACK(edit_cutoffs), NULL);
4217}
4218
4227void dyna_parameters (GtkWidget * vbox, int cid)
4228{
4229 gchar * default_leg[2] = {i18n("Step(s) between configurations"), i18n("Step(s) between conf.")};
4230 int wid = (cid == 7) ? 0 : 1;
4231 GtkWidget * hbox;
4232 hbox = create_hbox (BSEP);
4233 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_(default_leg[(cid == 7) ? 0 : 1]), (cid == 7) ? 285 : 150, -1, 0.0, 0.5), FALSE, FALSE, (cid == 7) ? 30 : 5);
4234 dyna_entry[wid][0] = create_entry (G_CALLBACK(set_default_num_delta), (cid == 7) ? 110 : 100, (cid == 7) ? 10 : 15, FALSE, GINT_TO_POINTER(cid));
4235 update_entry_int ((GtkEntry *)dyna_entry[wid][0], tmp_num_delta[cid]);
4236 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, dyna_entry[wid][0], FALSE, FALSE, (cid == 7) ? 0 : 10);
4237 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4238
4239 hbox = create_hbox (BSEP);
4240 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("Time step &#x3b4;t"), (cid == 7) ? 285 : 150, -1, 0.0, 0.5), FALSE, FALSE, (cid == 7) ? 30 : 5);
4241 dyna_entry[wid][1] = create_entry (G_CALLBACK(set_default_num_delta), (cid == 7) ? 110 : 100, (cid == 7) ? 10 : 15, FALSE, GINT_TO_POINTER(cid+2));
4242 update_entry_double ((GtkEntry *)dyna_entry[wid][1], tmp_delta_t[0]);
4243 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, dyna_entry[wid][1], FALSE, FALSE, (cid == 7) ? 0 : 10);
4244 dyna_combo[wid] = create_combo ();
4245 int i;
4246 for (i=0; i<5 ; i++) combo_text_append (dyna_combo[wid], untime[i]);
4247
4248 combo_set_active (dyna_combo[wid], (int)tmp_delta_t[1]);
4249 g_signal_connect(G_OBJECT(dyna_combo[wid]), "changed", G_CALLBACK(tunit_changed), GINT_TO_POINTER(cid));
4250 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, dyna_combo[wid], FALSE, FALSE, 0);
4251
4252 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4253}
4254
4260GtkWidget * calc_preferences ()
4261{
4262 GtkWidget * notebook = gtk_notebook_new ();
4263 GtkWidget * vbox;
4264 GtkWidget * hbox;
4265 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
4266 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
4267 gchar * default_delta_num_leg[NUM_DELTA] = {i18n("<b>g(r)</b>: number of &#x3b4;r"), i18n("<b>s(q)</b>: number of &#x3b4;q"), i18n("<b>s(k)</b>: number of &#x3b4;k"), i18n("<b>g(r) FFT</b>: number of &#x3b4;r"),
4268 i18n("<b>D<sub>ij</sub></b>: number of &#x3b4;r [D<sub>ij</sub>min-D<sub>ij</sub>max]"), i18n("<b>Angles distribution</b>: number of &#x3b4;&#x3b8; [0-180°]"),
4269 i18n("<b>Spherical harmonics</b>: l<sub>max</sub> &#x2208; [2-40]"), i18n("Step(s) between configurations"), i18n("<b>F(k,&#x3b4;t)</b>: number of &#x3b4;k")};
4270 gchar * info[2] = {i18n("The <b>Analysis</b> tab regroups calculation options"),
4271 i18n("use it to setup your own default parameters:")};
4272 gchar * m_list[4][2] = {{i18n("Calculations"), i18n("most analysis options")},
4273 {i18n("Rings"), i18n("ring statistics options")},
4274 {i18n("Chains"), i18n("chain statistics options")},
4275 {"S(q,&#969;)", i18n("dynamic structure factor options")}};
4276
4277 vbox = create_vbox (BSEP);
4278 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, NULL), FALSE, FALSE, 20);
4279
4280 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);
4281 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);
4282 GtkWidget * vvbox = create_vbox (BSEP);
4283 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 10);
4284 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);
4285 edit_bonds (vbox);
4286 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);
4287
4288 hbox = create_hbox (BSEP);
4289 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4290 GtkWidget * hhbox = create_hbox (BSEP);
4291 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
4292 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(_("<b>Total cutoff</b>"), 120, -1, 0.0, 0.5), FALSE, FALSE, 0);
4293 GtkWidget * combo = create_combo();
4294 combo_text_append (combo, _("Evaluated by <b>atomes</b>"));
4295 combo_text_append (combo, _("User Defined <sup>*</sup>"));
4296 combo_set_markup (combo);
4297 gtk_widget_set_size_request (combo, 180, -1);
4298 combo_set_active (combo, (tmp_totcut == 0.0) ? 0 : 1);
4299 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(totcut_changed), NULL);
4300 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, combo, FALSE, FALSE, 10);
4301
4303 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, tcut_box, FALSE, FALSE, 10);
4304 tcut_entry = create_entry (G_CALLBACK(set_default_num_delta), 100, 10, FALSE, GINT_TO_POINTER(-1));
4306 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, tcut_box, tcut_entry, FALSE, FALSE, 0);
4307 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, tcut_box, markup_label ("&#xC5;", -1, -1, 0.0, 0.5), FALSE, FALSE, 5);
4308
4309 hbox = create_hbox (BSEP);
4310 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
4311 hhbox = create_hbox (BSEP);
4312 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
4313 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(_("<b>Partial cutoff(s)</b>"), 120, -1, 0.0, 0.5), FALSE, FALSE, 0);
4314 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);
4315
4316 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 20, 0.0, 0.0), FALSE, FALSE, 0);
4317 append_comments (vbox, "<sup>*</sup>", _("The highest this value is, the highest the number of neighbors around an atom."));
4318
4319 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
4320
4321 GtkWidget * entry;
4322 vbox = create_vbox (BSEP);
4323 int i;
4324 for (i=0; i<NUM_DELTA; i++)
4325 {
4326 if (i != 7 && i != 8)
4327 {
4328 hbox = create_hbox (BSEP);
4329 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);
4330 entry = create_entry (G_CALLBACK(set_default_num_delta), 110, 10, FALSE, GINT_TO_POINTER(i));
4331 update_entry_int ((GtkEntry *)entry, tmp_num_delta[i]);
4332 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 0);
4333 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4334 }
4335 }
4336 // MSD
4337 i = 7;
4338 hbox = create_hbox (BSEP);
4339 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("<b>Dynamical analysis: MSD, S(q,&#969;)</b>"), 310, -1, 0.0, 0.5), FALSE, FALSE, 15);
4340 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4341 dyna_parameters (vbox, i);
4342
4343 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("Calculations")));
4344
4345 for (i=0; i<2; i++)
4346 {
4347 vbox = create_vbox (BSEP);
4348 search_type = i;
4349 calc_rings (vbox);
4350 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ((i) ? _("Chains") : _("Rings")));
4351 }
4352 /*vbox = create_vbox (BSEP);
4353 calc_sk_t (vbox);
4354 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, markup_label("S(q,&#969;)", -1, -1, 0.0, 0.5));*/
4355
4356 show_the_widgets (notebook);
4357 return notebook;
4358}
4359
4366{
4367 int i;
4368 if (tmp_num_delta)
4369 {
4370 g_free (tmp_num_delta);
4371 tmp_num_delta = NULL;
4372 }
4373 if (tmp_delta_t)
4374 {
4375 g_free (tmp_delta_t);
4376 tmp_delta_t = NULL;
4377 }
4378 if (tmp_rsparam)
4379 {
4380 g_free (tmp_rsparam);
4381 tmp_rsparam = NULL;
4382 }
4383 if (tmp_csparam)
4384 {
4385 g_free (tmp_csparam);
4386 tmp_csparam = NULL;
4387 }
4388 if (tmp_opengl)
4389 {
4390 g_free (tmp_opengl);
4391 tmp_opengl = NULL;
4392 }
4393 if (tmp_lightning.spot)
4394 {
4395 for (i=0; i<tmp_lightning.lights; i++)
4396 {
4397 g_free (tmp_lightning.spot[i]);
4398 }
4399 g_free (tmp_lightning.spot);
4400 tmp_lightning.spot = NULL;
4401 }
4402 if (tmp_o_at_rs)
4403 {
4404 g_free (tmp_o_at_rs);
4405 tmp_o_at_rs = NULL;
4406 }
4407 if (tmp_at_rs)
4408 {
4409 g_free (tmp_at_rs);
4410 tmp_at_rs = NULL;
4411 }
4412 if (tmp_o_bd_rw)
4413 {
4414 g_free (tmp_o_bd_rw);
4415 tmp_o_bd_rw = NULL;
4416 }
4417 if (tmp_bd_rw)
4418 {
4419 g_free (tmp_bd_rw);
4420 tmp_bd_rw = NULL;
4421 }
4422
4423 for (i=0; i<16; i++)
4424 {
4425 if (tmp_atomic_rad[i])
4426 {
4427 g_free (tmp_atomic_rad[i]);
4428 tmp_atomic_rad[i] = NULL;
4429 }
4430 }
4431 for (i=0; i<6; i++)
4432 {
4433 if (tmp_bond_rad[i])
4434 {
4435 g_free (tmp_bond_rad[i]);
4436 tmp_bond_rad[i] = NULL;
4437 }
4438 }
4439 for (i=0; i<2; i++)
4440 {
4441 if (tmp_atom_color[i])
4442 {
4443 g_free (tmp_atom_color[i]);
4444 tmp_atom_color[i] = NULL;
4445 }
4446 if (tmp_label_color[i])
4447 {
4448 g_free (tmp_label_color[i]);
4449 tmp_label_color[i] = NULL;
4450 }
4451 }
4452 for (i=0; i<5; i++)
4453 {
4454 if (tmp_label[i])
4455 {
4456 g_free (tmp_label[i]);
4457 tmp_label[i] = NULL;
4458 }
4459 }
4460 if (tmp_box)
4461 {
4462 g_free (tmp_box);
4463 tmp_box = NULL;
4464 }
4465 if (tmp_axis)
4466 {
4467 g_free (tmp_axis);
4468 tmp_axis = NULL;
4469 }
4470 if (tmp_rep)
4471 {
4472 g_free (tmp_rep);
4473 tmp_rep = NULL;
4474 }
4475}
4476
4485void duplicate_rep_data (rep_data * new_rep, rep_data * old_rep)
4486{
4487 new_rep -> rep = old_rep -> rep;
4488 new_rep -> proj = old_rep -> proj;
4489 new_rep -> zoom = old_rep -> zoom;
4490 new_rep -> gnear = old_rep -> gnear;
4491 int i;
4492 for (i=0; i<2; i++)
4493 {
4494 new_rep -> c_angle[i] = old_rep -> c_angle[i];
4495 new_rep -> c_shift[i] = old_rep -> c_shift[i];
4496 }
4497}
4498
4508{
4509 new_back -> gradient = old_back -> gradient;
4510 new_back -> direction = old_back -> direction;
4511 new_back -> position = old_back -> position;
4512 new_back -> color = old_back -> color;
4513 int i;
4514 for (i=0; i<2; i++)
4515 {
4516 new_back -> gradient_color[i] = old_back -> gradient_color[i];
4517 }
4518}
4519
4528void duplicate_box_data (box * new_box, box * old_box)
4529{
4530 new_box -> box = old_box -> box;
4531 new_box -> color = old_box -> color;
4532 new_box -> line = old_box -> line;
4533 new_box -> rad = old_box -> rad;
4534}
4535
4544void duplicate_axis_data (axis * new_axis, axis * old_axis)
4545{
4546 new_axis -> axis = old_axis -> axis;
4547 new_axis -> length = old_axis -> length;
4548 new_axis -> color = old_axis -> color;
4549 new_axis -> line = old_axis -> line;
4550 new_axis -> rad = old_axis -> rad;
4551 new_axis -> t_pos = old_axis -> t_pos;
4552 new_axis -> labels = old_axis -> labels;
4553 int i;
4554 for (i=0; i<3; i++)
4555 {
4556 new_axis -> c_pos[i] = old_axis -> c_pos[i];
4557 if (old_axis -> title[i]) new_axis -> title[i] = g_strdup_printf ("%s", old_axis -> title[i]);
4558 }
4559 if (old_axis -> color)
4560 {
4561 new_axis -> color = duplicate_color (3, old_axis -> color);
4562 }
4563}
4564
4571{
4572 clean_all_tmp ();
4577 // Ring statistics
4579 // Chain statistics
4581 // F(k,t) and S(q,w)
4586
4589 tmp_lightning.lights = default_lightning.lights;
4598 int i;
4599 for (i=0; i<16; i++)tmp_atomic_rad[i] = duplicate_element_radius (default_atomic_rad[i]);
4600 for (i=0; i<6; i++) tmp_bond_rad[i] = duplicate_element_radius (default_bond_rad[i]);
4601 for (i=0; i<2; i++)
4602 {
4605 }
4606 for (i=0; i<5; i++)
4607 {
4608 tmp_label[i] = g_malloc0(sizeof*tmp_label[i]);
4610 }
4611 for (i=0; i<2; i++)
4612 {
4614 tmp_mtilt[i] = default_mtilt[i];
4617 tmp_mwidth[i] = default_mwidth[i];
4618 }
4619
4620 tmp_box = g_malloc0(sizeof*tmp_box);
4622
4623 tmp_background = g_malloc0(sizeof*tmp_background);
4625
4626 tmp_rep = g_malloc0(sizeof*tmp_rep);
4628
4629 tmp_axis = g_malloc0(sizeof*tmp_axis);
4631
4632 for (i=0; i<2; i++) tmp_sel_color[i] = default_sel_color[i];
4633}
4634
4635gboolean * up_project;
4636
4646G_MODULE_EXPORT void update_projects (GtkDialog * proj_sel, gint response_id, gpointer data)
4647{
4648 int i, j, k, l;
4649 float * tmpcut;
4650 gboolean update_bonds;
4651 switch (response_id)
4652 {
4653 case GTK_RESPONSE_OK:
4654 // To write apply to opened projects
4655 for (i=0; i<nprojects; i++)
4656 {
4657 if (up_project[i])
4658 {
4659 project * this_proj = get_project_by_id(i);
4660 if (up_project[i+nprojects])
4661 {
4662 update_bonds = FALSE;
4663 l = this_proj -> nspec * this_proj -> nspec;
4664 tmpcut = allocfloat(l);
4665 l = 0;
4666 for (j=0; j<this_proj -> nspec; j++)
4667 {
4668 for (k=0; k<this_proj -> nspec; k++, l++)
4669 {
4670 tmpcut[l] = this_proj -> chemistry -> cutoffs[j][k];
4671 }
4672 }
4673 if (this_proj -> chemistry -> grtotcutoff != default_totcut) update_bonds = TRUE;
4674 }
4676 if (up_project[i+nprojects])
4677 {
4678 if (! update_bonds)
4679 {
4680 l = 0;
4681 for (j=0; j<this_proj -> nspec; j++)
4682 {
4683 for (k=0; k<this_proj -> nspec; k++, l++)
4684 {
4685 if (this_proj -> chemistry -> cutoffs[j][k] != tmpcut[l]) update_bonds = TRUE;
4686 }
4687 }
4688 }
4689 if (update_bonds)
4690 {
4691 if (this_proj -> modelgl -> rings)
4692 {
4693 this_proj -> modelgl -> rings = FALSE;
4694 for (j=0; j<5; j++)
4695 {
4696 clean_rings_data (j, this_proj -> modelgl);
4697#ifdef GTK3
4698 update_rings_menus (this_proj -> modelgl);
4699#endif
4700 }
4701 }
4702 if (this_proj -> modelgl -> chains)
4703 {
4704 clean_chains_data (this_proj -> modelgl);
4705#ifdef GTK3
4706 update_chains_menus (this_proj -> modelgl);
4707#endif
4708 }
4709 bonds_update = 1;
4710 frag_update = (this_proj -> natomes > ATOM_LIMIT) ? 0 : 1;
4711 mol_update = (frag_update) ? ((this_proj -> steps > STEP_LIMIT) ? 0 : 1) : 0;
4712 this_proj -> runc[0] = FALSE;
4713 this_proj -> dmtx = FALSE;
4714 if (this_proj -> id != activep)
4715 {
4716 k = activep;
4717 active_project_changed (this_proj -> id);
4718 on_calc_bonds_released (NULL, NULL);
4720 }
4721 else
4722 {
4723 update_project ();
4724 on_calc_bonds_released (NULL, NULL);
4725 }
4726 }
4727 }
4728 }
4729 }
4730 break;
4731 default:
4732 break;
4733 }
4734 g_free (up_project);
4735 up_project = NULL;
4736 destroy_this_dialog (proj_sel);
4737}
4738
4739#ifdef GTK4
4748G_MODULE_EXPORT void toggled_select_project (GtkCheckButton * but, gpointer data)
4749#else
4758G_MODULE_EXPORT void toggled_select_project (GtkToggleButton * but, gpointer data)
4759#endif
4760{
4761 up_project[GPOINTER_TO_INT(data)] = button_get_status ((GtkWidget *)but);
4762}
4763
4770{
4773 {
4774 g_free (default_bond_cutoff);
4775 default_bond_cutoff = NULL;
4776 }
4779 {
4780 g_free (default_num_delta);
4781 default_num_delta = NULL;
4782 }
4785 if (default_rsparam)
4786 {
4787 g_free (default_rsparam);
4788 default_rsparam = NULL;
4789 }
4791 if (default_csparam)
4792 {
4793 g_free (default_csparam);
4794 default_csparam = NULL;
4795 }
4797 if (default_opengl)
4798 {
4799 g_free (default_opengl);
4800 default_opengl = NULL;
4801 }
4806
4809 default_lightning.lights = tmp_lightning.lights;
4812
4813 // Model
4816 if (default_o_at_rs)
4817 {
4818 g_free (default_o_at_rs);
4819 default_o_at_rs = NULL;
4820 }
4822 if (default_at_rs)
4823 {
4824 g_free (default_at_rs);
4825 default_at_rs = NULL;
4826 }
4828 if (default_o_bd_rw)
4829 {
4830 g_free (default_o_bd_rw);
4831 default_o_bd_rw = NULL;
4832 }
4834 if (default_bd_rw)
4835 {
4836 g_free (default_bd_rw);
4837 default_bd_rw = NULL;
4838 }
4840 int i;
4841 for (i=0; i<16; i++)
4842 {
4843 if (default_atomic_rad[i]) g_free (default_atomic_rad[i]);
4845 }
4846 for (i=0; i<6; i++)
4847 {
4848 if (default_bond_rad[i]) g_free (default_bond_rad[i]);
4850 }
4851 for (i=0; i<2; i++)
4852 {
4853 if (default_atom_color[i]) g_free (default_atom_color[i]);
4855 if (default_label_color[i]) g_free (default_label_color[i]);
4857 }
4858 for (i=0; i<5; i++)
4859 {
4861 }
4862 for (i=0; i<2; i++)
4863 {
4865 default_mtilt[i] = tmp_mtilt[i];
4868 default_mwidth[i] = tmp_mwidth[i];
4869 }
4874
4875 for (i=0; i<2; i++) default_sel_color[i] = tmp_sel_color[i];
4876
4877 if (nprojects)
4878 {
4879 if (ask_yes_no(_("Apply to project(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))
4880 {
4881 // Select project here
4882 GtkWidget * proj_sel = message_dialogmodal (_("Project selection"), _("Select to apply preferences"), GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK, MainWindow);
4883 GtkWidget * vbox = dialog_get_content_area (proj_sel);
4884 GtkWidget * hbox;
4886 for (i=0; i<nprojects; i++)
4887 {
4888 hbox = create_hbox (BSEP);
4889 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
4890 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);
4891 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button (_("Including analysis parameters and cutoffs ..."), -1, -1, FALSE, G_CALLBACK(toggled_select_project), GINT_TO_POINTER(i+nprojects)), FALSE, FALSE, 20);
4892 }
4893 run_this_gtk_dialog (proj_sel, G_CALLBACK(update_projects), NULL);
4894 }
4895 }
4896}
4897
4904{
4905 int i;
4906 if (tmp_totcut == 0.0)
4907 {
4909 }
4910 else
4911 {
4913 }
4917 if (tmp_box -> box > NONE)
4918 {
4919 hide_the_widgets ((tmp_box -> box == WIREFRAME) ? pref_box_win -> radius_box : pref_box_win -> width_box);
4920 }
4921 hide_the_widgets ((tmp_axis -> axis == WIREFRAME) ? pref_axis_win -> radius_box : pref_axis_win -> width_box);
4922 for (i=0; i<2; i++) widget_set_sensitive (pref_axis_win -> axis_label_box[i], tmp_axis -> labels);
4925 i = (i < 0) ? 0 : i;
4929 i = (i < 0) ? 0 : i;
4932}
4933
4942G_MODULE_EXPORT void restore_defaults_parameters (GtkButton * but, gpointer data)
4943{
4944
4945 if (ask_yes_no(_("Restore default parameters"), _("Are you sure ?"), GTK_MESSAGE_QUESTION, MainWindow))
4946 {
4949 int i;
4950 for (i=4; i>0; i--)
4951 {
4952 destroy_this_widget (gtk_notebook_get_nth_page (GTK_NOTEBOOK (preference_notebook), i));
4953 }
4954 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), calc_preferences(), gtk_label_new (_("Analysis ")));
4955 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), opengl_preferences(), gtk_label_new ("OpenGL"));
4956 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), model_preferences(), gtk_label_new (_("Model")));
4957 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), view_preferences(), gtk_label_new (_("View")));
4958 gtk_notebook_set_current_page (GTK_NOTEBOOK(preference_notebook), 0);
4961 }
4962}
4963
4973G_MODULE_EXPORT void edit_preferences (GtkDialog * edit_prefs, gint response_id, gpointer data)
4974{
4975 switch (response_id)
4976 {
4977 case GTK_RESPONSE_APPLY:
4978 if (ask_yes_no(_("Save parameters"), _("Are you sure ?"), GTK_MESSAGE_QUESTION, MainWindow))
4979 {
4981 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);
4982 if (ask_yes_no(_("Save atomes preferences to file ?"), str, GTK_MESSAGE_QUESTION, (GtkWidget *)edit_prefs))
4983 {
4985 {
4986 show_error ((pref_error) ? pref_error : _("Error while trying to save preferences to file"), 0, MainWindow);
4987 g_free (pref_error);
4988 pref_error = NULL;
4989 }
4990 }
4991 g_free (str);
4992 }
4993 break;
4994 default:
4998 preferences = FALSE;
4999 clean_all_tmp ();
5000 g_free (pref_pointer);
5001 pref_pointer = NULL;
5002 if (pref_box_win) g_free (pref_box_win);
5003 pref_box_win = NULL;
5004 if (pref_rep_win) g_free (pref_rep_win);
5005 pref_rep_win = NULL;
5006 if (pref_axis_win) g_free (pref_axis_win);
5007 pref_axis_win = NULL;
5009 pref_gradient_win = NULL;
5011 destroy_this_dialog ((GtkDialog *)edit_prefs);
5012 edit_prefs = NULL;
5013 break;
5014 }
5015}
5016
5023{
5024 GtkWidget * win = dialog_cancel_apply (_("User preferences"), MainWindow, TRUE);
5025 preferences = TRUE;
5027 GtkWidget * vbox = dialog_get_content_area (win);
5028 gtk_widget_set_size_request (win, 625, 645);
5029 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
5030 preference_notebook = gtk_notebook_new ();
5031 gtk_notebook_set_scrollable (GTK_NOTEBOOK(preference_notebook), TRUE);
5032 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(preference_notebook), GTK_POS_LEFT);
5033 gtk_widget_set_size_request (preference_notebook, 600, 635);
5034 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, preference_notebook, FALSE, FALSE, 0);
5035
5036 GtkWidget * gbox = create_vbox (BSEP);
5037 gchar * mess[2] = {i18n("Browse the following to modify the default configuration of <b>atomes</b>"),
5038 i18n("by replacing internal parameters by user defined preferences.")};
5039 gchar * mlist[4][2]= {{i18n("Analysis "), i18n("calculation preferences")},
5040 {"OpenGL", i18n("rendering preferences")},
5041 {i18n("Model"), i18n("atom(s), bond(s) and box preferences")},
5042 {i18n("View"), i18n("representation and projection preferences")}};
5043 gchar * end = i18n("Default parameters are used for any new project added to the workspace\n");
5044
5045 pref_pointer = g_malloc0(NUM_COLORS*sizeof*pref_pointer);
5046 int i;
5047 for (i=0; i<NUM_COLORS; i++)
5048 {
5049 pref_pointer[i].a = -1;
5050 pref_pointer[i].b = i;
5051 pref_pointer[i].c = -1;
5052 }
5053
5054 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, pref_list(mess, 4, mlist, end), FALSE, FALSE, 20);
5055
5056 GtkWidget * hbox = create_hbox (BSEP);
5057 GtkWidget * but = create_button (NULL, IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(restore_defaults_parameters), NULL);
5058 GtkWidget * but_lab = markup_label (_("Restore <b>atomes</b> default parameters"), -1, -1, 0.5, 0.5);
5059 add_container_child (CONTAINER_BUT, but, but_lab);
5060 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, but, FALSE, FALSE, 150);
5061 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, hbox, FALSE, FALSE, 0);
5062 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), gbox, gtk_label_new (_("General")));
5063
5064 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), calc_preferences(), gtk_label_new (_("Analysis ")));
5065 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), opengl_preferences(), gtk_label_new ("OpenGL"));
5066 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), model_preferences(), gtk_label_new (_("Model")));
5067 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), view_preferences(), gtk_label_new ("View"));
5069 gtk_notebook_set_current_page (GTK_NOTEBOOK(preference_notebook), 0);
5070 run_this_gtk_dialog (win, G_CALLBACK(edit_preferences), NULL);
5071}
5072
5081G_MODULE_EXPORT void set_default_options (GtkButton * but, gpointer data)
5082{
5083 tint * oid = (tint *)data;
5084 gchar * pstring[5]={i18n("rendering"), i18n("box"), i18n("axis"), i18n("background"), i18n("representation")};
5085 gchar * str = g_strdup_printf (_("Set %s preferences as default preferences ?"), _(pstring[oid -> b]));
5086 project * this_proj = get_project_by_id(oid -> a);
5087 if (ask_yes_no(_("Set model preferences as default ?"), str, GTK_MESSAGE_QUESTION, this_proj -> modelgl -> win))
5088 {
5089 g_free (str);
5090 image * img = this_proj -> modelgl -> anim -> last -> img;
5091 switch (oid -> b)
5092 {
5093 case 0:
5094 // OpenGL preferences, style and color mpas not included : rendering only
5095 default_opengl[3] = img -> quality;
5096 default_opengl[4] = img -> ray_tracing;
5097 duplicate_material (& default_material, & img -> m_terial);
5098 default_lightning.lights = img -> l_ghtning.lights;
5099 default_lightning.spot = copy_light_sources (img -> l_ghtning.lights, img -> l_ghtning.lights, img -> l_ghtning.spot);
5100 duplicate_fog (& default_fog, & img -> f_g);
5101 break;
5102 case 1:
5103 // Box
5105 break;
5106 case 2:
5107 // Axis
5109 break;
5110 case 3:
5111 // Background
5113 break;
5114 case 4:
5115 // Representation
5116 default_rep.rep = img -> rep;
5117 default_rep.zoom = img -> zoom;
5118 default_rep.gnear = img -> gnear;
5119 int i;
5120 for (i=0; i<2; i++)
5121 {
5122 default_rep.c_angle[i] = img -> c_angle[i];
5123 default_rep.c_shift[i] = img -> c_shift[i];
5124 }
5125 break;
5126 }
5127 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);
5128 if (ask_yes_no(_("Save atomes preferences to file ?"), str, GTK_MESSAGE_QUESTION, this_proj -> modelgl -> win))
5129 {
5131 {
5132 show_error ((pref_error) ? pref_error : _("Error while trying to save preferences to file"), 0, MainWindow);
5133 g_free (pref_error);
5134 pref_error = NULL;
5135 }
5136 }
5137 g_free (str);
5138 }
5139 else
5140 {
5141 g_free (str);
5142 }
5143}
5144
5153void add_global_option (GtkWidget * vbox, tint * oid)
5154{
5155 GtkWidget * hbox = create_hbox (5);
5156 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, TRUE, FALSE, 0);
5157 GtkWidget * but = create_button (_("Set default"), IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(set_default_options), oid);
5158 add_box_child_end (hbox, but, FALSE, FALSE, 0);
5159}
Binding to the Fortran90 subroutines.
double set_radius_(int *, int *)
GtkWidget * omega_max_hbox
Definition calc_menu.c:151
GtkWidget * omega_max_info
Definition calc_menu.c:152
GtkWidget * skt_all_info
Definition calc_menu.c:1505
int search_type
Definition calc_menu.c:105
Callback declarations for main window.
integer function chains()
Definition chains.F90:54
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
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:205
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:2242
int * duplicate_int(int num, int *old_val)
copy a list of int
Definition global.c:547
gboolean * duplicate_bool(int num, gboolean *old_val)
copy a list of gboolean
Definition global.c:563
int active_col
Definition dlp_mol.c:57
double * tmpcut
Definition w_cutoffs.c:50
void edit_chem(GtkWidget *vbox)
creation of the edit chemical properties widgets
Definition edit_menu.c:409
gchar * ATOMES_CONFIG
Definition global.c:139
int mol_update
Definition global.c:175
double * duplicate_double(int num, double *old_val)
copy a list of double
Definition global.c:595
int activep
Definition global.c:162
gboolean * allocbool(int val)
allocate a gboolean * pointer
Definition global.c:241
char * untime[5]
Definition global.c:153
int nprojects
Definition global.c:161
int frag_update
Definition global.c:174
double * allocdouble(int val)
allocate a double * pointer
Definition global.c:446
GtkWidget * MainWindow
Definition global.c:207
int bonds_update
Definition global.c:173
int * allocint(int val)
allocate an int * pointer
Definition global.c:301
gchar * ATOMES_CONFIG_DIR
Definition global.c:138
#define i18n(String)
Definition global.c:80
float * allocfloat(int val)
allocate a float * pointer
Definition global.c:385
double string_to_double(gpointer string)
convert string to double
Definition global.c:611
Global variable declarations Global convenience function declarations Global data structure defin...
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:616
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:533
#define SKT
Definition global.h:347
@ IMG_NONE
Definition global.h:276
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:935
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1401
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:688
void set_renderer_color(int tocol, GtkCellRenderer *renderer, ColRGBA col)
set the color of a GtkCellRenderer
Definition gtk-misc.c:1740
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2048
#define SQD
Definition global.h:338
void update_chains_menus(glwin *view)
#define ATOM_LIMIT
atom number limit to compute fragment(s) and molecule(s) analysis automatically
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2139
void combo_set_markup(GtkWidget *combo)
use pango markup in combo widget
Definition gtk-misc.c:970
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:2420
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:958
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:652
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1721
void clean_rings_data(int rid, glwin *view)
clean a ring type data for a glview
Definition ringscall.c:361
#define BSEP
Definition global.h:261
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:669
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1937
#define STEP_LIMIT
Definition global.h:293
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
Definition bdcall.c:559
@ CONTAINER_BUT
Definition global.h:269
@ CONTAINER_SCR
Definition global.h:267
#define ANG
Definition global.h:342
GtkWidget * create_button(gchar *text, int image_format, gchar *image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
create a simple button
Definition gtk-misc.c:1999
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:1010
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:861
#define CHA
Definition global.h:344
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
void clean_chains_data(glwin *view)
cleaning the OpenGL data related to chain statistics
Definition chainscall.c:263
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2406
#define MY_ENCODING
Definition global.h:103
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2235
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
#define SKD
Definition global.h:339
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:987
#define BND
Definition global.h:341
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1833
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:318
#define min(a, b)
Definition global.h:93
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
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:573
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:224
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
ColRGBA * duplicate_color(int num, ColRGBA *col)
duplicate a ColRGBA pointer
Definition gtk-misc.c:1689
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1899
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2067
#define GDK
Definition global.h:340
void update_rings_menus(glwin *view)
#define MSD
Definition global.h:346
#define GDR
Definition global.h:337
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
#define max(a, b)
Definition global.h:92
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1028
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:244
#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
#define NUM_COLORS
Definition glwin.h:65
char * text_filled[FILLED_STYLES]
Definition m_style.c:66
#define OGL_STYLES
Definition glwin.h:107
char * text_styles[OGL_STYLES]
Definition m_style.c:59
void show_error(char *error, int val, GtkWidget *win)
show error message
Definition interface.c:299
gboolean ask_yes_no(gchar *title, gchar *text, int type, GtkWidget *widg)
ask yes or no for something: prepare dialog
Definition interface.c:420
Messaging function declarations.
position
Definition m_proj.c:48
double z
Definition ogl_draw.c:63
double y
Definition ogl_draw.c:63
double x
Definition ogl_draw.c:63
gboolean default_cell
Light * init_light_source(int type, float size)
initialize a light source
Definition w_advance.c:336
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
void update_omega_max()
update omega max information string
Definition calc_menu.c:159
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
int default_skt_n_sets
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
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:897
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:1365
gchar * substitute_string(gchar *init, gchar *o_motif, gchar *n_motif)
substitute all patterns in string
Definition w_library.c:375
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
double xml_string_to_double(xmlChar *content)
convert XML string to double
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:712
G_MODULE_EXPORT void edit_cutoffs(GtkDialog *edit_cuts, gint response_id, gpointer data)
edit partial cutoffs - running the dialog
#define NUM_DELTA
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:1569
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:188
G_MODULE_EXPORT void set_default_map(GtkComboBox *box, gpointer data)
change default atom(s) or polyhedra color map
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:1265
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:241
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
gboolean tmp_skt_sets
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
int default_sqw_n_sets
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 * dyna_entry[2][2]
GtkWidget * bond_entry_over[6]
void duplicate_box_data(box *new_box, box *old_box)
duplicate box_data data structure
int tmp_skt_n_sets
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:1628
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:783
void apply_default_parameters_to_project(project *this_proj, gboolean with_analysis)
apply default parameters to project
Definition init_p.c:146
int tmp_sqw_freq
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
void calc_sk_t(GtkWidget *vbox)
creation of the s(k,t) calculation widgets
Definition calc_menu.c:1807
int * default_rsparam
float mat_min_max[5][2]
Definition w_advance.c:108
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:464
void dyna_parameters(GtkWidget *vbox, int cid)
create time related configuration widgets
Lightning tmp_lightning
void set_parameter(xmlChar *content, gchar *key, int vid, dint *bond, vec3_t *vect, float start, float end, ColRGBA *col)
set default parameter
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)
Light ** copy_light_sources(int dima, int dimb, Light **old_sp)
create a copy of a list of light sources
Definition w_advance.c:400
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
int default_sqw_freq
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:1338
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:205
gboolean * tmp_o_bd_rw
gboolean default_skt_sets
double * tmp_at_rs
gchar * xml_style_leg[6]
axis default_axis
bond_cutoff * default_bond_cutoff
GtkWidget * edit_colob
ColRGBA * tmp_color
int tmp_sqw_n_sets
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:334
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:146
background * tmp_background
G_MODULE_EXPORT void scale_quality(GtkRange *range, gpointer data)
update OpenGL quality - range callback
Definition w_advance.c:1282
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:578
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 tmp_acl_format[2]
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
GtkWidget * dyna_combo[2]
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:425
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
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...
void active_project_changed(int id)
change the active project
Definition update_p.c:220
int update_project()
update project: send data to Fortran90, and update calculation interactors
Definition update_p.c:162
float blue
Definition global.h:138
float alpha
Definition global.h:139
float red
Definition global.h:136
float green
Definition global.h:137
Definition glwin.h:234
Definition glwin.h:182
Definition glwin.h:332
Definition glwin.h:350
Definition global.h:111
int b
Definition global.h:113
int a
Definition global.h:112
Definition glwin.h:967
Definition glwin.h:364
Definition global.h:118
float y
Definition math_3d.h:130
float x
Definition math_3d.h:130
float z
Definition math_3d.h:130
int status
Definition w_advance.c:173
GtkWidget * res[2]
Definition w_encode.c:342
G_MODULE_EXPORT void set_id(GtkEntry *entry, gpointer data)
set search id if >= 10 000 atoms
Definition w_search.c:1690
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.