atomes 1.3.2
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
190
191// Generic parameters for all calculations
192#define NUM_DELTA 9
193int * default_num_delta = NULL;
194int * tmp_num_delta = NULL;
195
196// Dynamical calculations
197double * default_delta_t = NULL;
198double * tmp_delta_t = NULL;
199
200// Ring statistics
201int * default_rsparam = NULL;
209int * tmp_rsparam = NULL;
210
211// Chain statistics
212int * default_csparam = NULL;
220int * tmp_csparam = NULL;
221
222// F(k,t) and S(q,w)
231
232// 5+3 styles + 5+3 cloned styles
235// 3 styles + 3 cloned styles
238// atoms + clones
243
245
246int * default_opengl = NULL;
247int * tmp_opengl = NULL;
254
255// Model
257gboolean tmp_clones;
259gboolean tmp_cell;
261gboolean * tmp_o_at_rs;
263double * tmp_at_rs;
265gboolean * tmp_o_bd_rw;
267double * tmp_bd_rw;
268
273gboolean default_mtilt[2];
274gboolean tmp_mtilt[2];
280double tmp_mwidth[2];
281
289box * tmp_box = NULL;
292axis * tmp_axis = NULL;
296
297gboolean preferences = FALSE;
299gchar * pref_error = NULL;
300
302
303gchar * xml_style_leg[6] = {"ball_and_stick", "wireframes", "spacefilled", "spheres", "cylinders", "dots"};
304gchar * xml_filled_leg[4] = {"covalent", "ionic", "van-der-waals", "crystal"};
305gchar * xml_atom_leg[3] = {"atoms_radius", "dot_size", "sphere_radius"};
306gchar * xml_bond_leg[3] = {"bond_radius", "wireframe_width", "cylinder_radius"};
307
318int xml_save_color_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, ColRGBA col)
319{
320 int rc;
321 gchar * str;
322 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
323 if (rc < 0) return 0;
324 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST legend);
325 if (rc < 0) return 0;
326 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST key);
327 if (rc < 0) return 0;
328 if (did > -1)
329 {
330 str = g_strdup_printf ("%d", did);
331 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST str);
332 g_free (str);
333 if (rc < 0) return 0;
334 }
335 str = g_strdup_printf ("%f", col.red);
336 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"red", BAD_CAST str);
337 g_free (str);
338 if (rc < 0) return 0;
339 str = g_strdup_printf ("%f", col.green);
340 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"green", BAD_CAST str);
341 g_free (str);
342 if (rc < 0) return 0;
343 str = g_strdup_printf ("%f", col.blue);
344 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"blue", BAD_CAST str);
345 g_free (str);
346 if (rc < 0) return 0;
347 str = g_strdup_printf ("%f", col.alpha);
348 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"alpha", BAD_CAST str);
349 g_free (str);
350 if (rc < 0) return 0;
351 rc = xmlTextWriterEndElement (writer);
352 if (rc < 0) return 0;
353 return 1;
354}
355
366int xml_save_xyz_to_file (xmlTextWriterPtr writer, int did, gchar * legend, gchar * key, vec3_t data)
367{
368 int rc;
369 gchar * str;
370 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
371 if (rc < 0) return 0;
372 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST legend);
373 if (rc < 0) return 0;
374 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST key);
375 if (rc < 0) return 0;
376 if (did > -1)
377 {
378 str = g_strdup_printf ("%d", did);
379 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST str);
380 g_free (str);
381 if (rc < 0) return 0;
382 }
383 str = g_strdup_printf ("%f", data.x);
384 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"x", BAD_CAST str);
385 g_free (str);
386 if (rc < 0) return 0;
387 str = g_strdup_printf ("%f", data.y);
388 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"y", BAD_CAST str);
389 g_free (str);
390 if (rc < 0) return 0;
391 str = g_strdup_printf ("%f", data.z);
392 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"z", BAD_CAST str);
393 g_free (str);
394 if (rc < 0) return 0;
395 rc = xmlTextWriterEndElement (writer);
396 if (rc < 0) return 0;
397 return 1;
398}
399
412int xml_save_parameter_to_file (xmlTextWriterPtr writer, gchar * xml_leg, gchar * xml_key, gboolean doid, int xml_id, gchar * value)
413{
414 int rc;
415 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
416 if (rc < 0) return 0;
417 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"info", BAD_CAST xml_leg);
418 if (rc < 0) return 0;
419 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST xml_key);
420 if (rc < 0) return 0;
421 if (doid)
422 {
423 gchar * str;
424 str = g_strdup_printf ("%d", xml_id);
425 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST (const xmlChar *)str);
426 g_free (str);
427 if (rc < 0) return 0;
428 }
429 rc = xmlTextWriterWriteFormatString (writer, "%s", value);
430 if (rc < 0) return 0;
431 rc = xmlTextWriterEndElement (writer);
432 if (rc < 0) return 0;
433 return 1;
434}
435
442{
443 int rc;
444 pref_error = NULL;
446 {
447#ifdef G_OS_WIN32
448 if (! CreateDirectory(ATOMES_CONFIG_DIR, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
449 {
450 pref_error = g_strdup_printf (_("Error: impossible to create %s (code: %lu)\n"), ATOMES_CONFIG_DIR, GetLastError());
451 return 0;
452 }
453#else
454 if (mkdir(ATOMES_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IRWXO) && errno != EEXIST)
455 {
456 pref_error = g_strdup_printf (_("Error: impossible to create %s (code: %s)\n"), ATOMES_CONFIG_DIR, strerror(errno));
457 return 0;
458 }
459#endif
460 }
461 xmlTextWriterPtr writer;
462
463 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"),
464 i18n("Dij: number of δr [min(Dij)-max(Dij)]"), i18n("Angles distribution: number of δθ [0-180°]"),
465 i18n("Spherical harmonics: l(max) in [2-40]"), i18n("MSD: steps between configurations"),
466 i18n("F(k,t): number of δk")};
467 gchar * xml_delta_t_leg[2] = {i18n("MSD: time steps δt"), i18n("MSD: time unit")};
468 gchar * xml_rings_leg[7] = {i18n("Default search"),
469 i18n("Atom(s) to initiate the search from"),
470 i18n("Maximum size for a ring"),
471 i18n("Maximum number of rings of size n per MD step"),
472 i18n("Only search for ABAB rings"),
473 i18n("No homopolar bonds in the rings (A-A, B-B ...)"),
474 i18n("No homopolar bonds in the connectivity matrix")};
475 gchar * xml_chain_leg[7] = {i18n("Atom(s) to initiate the search from"),
476 i18n("Maximum size for a ring"),
477 i18n("Maximum number of rings of size n per MD step"),
478 i18n("Only search for AAAA chains"),
479 i18n("Only search for ABAB chains"),
480 i18n("No homopolar bonds in the chains (A-A, B-B ...)"),
481 i18n("Only search for 1-(2)n-1 chains")};
482 gchar * xml_skt_leg[4] = {i18n("Analyze all correlated δt steps"),
483 i18n("Number of analyzed δt steps"),
484 i18n("Number of analyzed q points"),
485 i18n("Number of frequency points")};
486 gchar * xml_opengl_leg[5] = {i18n("Default style"),
487 i18n("Atom(s) color map"),
488 i18n("Polyhedra color map"),
489 i18n("Quality"),
490 i18n("Ray Tracing")};
491 gchar * xml_material_leg[8] = {i18n("Predefine material"),
492 i18n("Lightning model"),
493 i18n("Metallic"),
494 i18n("Roughness"),
495 i18n("Back lightning"),
496 "Gamma",
497 i18n("Opacity"),
498 i18n("Albedo")};
499 gchar * xml_lightning_leg[7] = {i18n("Type"),
500 i18n("Fix"),
501 i18n("Position"),
502 i18n("Direction"),
503 i18n("Intensity"),
504 i18n("Attenuation"),
505 i18n("Spot specifics")};
506 gchar * xml_fog_leg[5] = {i18n("Mode"),
507 i18n("Type"),
508 i18n("Density"),
509 i18n("Depth"),
510 i18n("Color")};
511 gchar * xml_model_leg[2] = {i18n("Show clones"),
512 i18n("Show box")};
513 gchar * xml_label_leg[6] = {i18n("Position"),
514 i18n("Rendering") ,
515 i18n("Scaling"),
516 i18n("Font"),
517 i18n("Shift"),
518 i18n("Colors")};
519 gchar * xml_axis_leg[3] = {i18n("Legend on x"),
520 i18n("Legend on y"),
521 i18n("Legend on z")};
522
523 /* Create a new XmlWriter for ATOMES_CONFIG, with no compression. */
524 writer = xmlNewTextWriterFilename (ATOMES_CONFIG, 0);
525 if (writer == NULL) return 0;
526 rc = xmlTextWriterSetIndent(writer, 1);
527 if (rc < 0) return 0;
528 /* Start the document with the xml default for the version,
529 * encoding MY_ENCODING and the default for the standalone
530 * declaration. */
531 rc = xmlTextWriterStartDocument (writer, NULL, MY_ENCODING, NULL);
532 if (rc < 0) return 0;
533
534 rc = xmlTextWriterWriteComment (writer, (const xmlChar *)_("atomes preferences XML file"));
535 if (rc < 0) return 0;
536
537 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atomes_preferences-xml");
538 if (rc < 0) return 0;
539 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"general");
540 if (rc < 0) return 0;
541 rc = xml_save_parameter_to_file (writer, _("File opening"), "default_instance", TRUE, 0, (default_instance) ? "single" : "multiple(s)");
542 if (! rc) return 0;
543 rc = xmlTextWriterEndElement (writer);
544 if (rc < 0) return 0;
545
546 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"analysis");
547 if (rc < 0) return 0;
548 int i, j, k, l, m, n, o;
549 gchar * str;
550
552 {
553 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"cutoffs");
554 if (rc < 0) return 0;
555 if (default_totcut > 0.0)
556 {
557 str = g_strdup_printf ("%lf", default_totcut);
558 rc = xml_save_parameter_to_file (writer, _("Total cutoff"), "default_totcut", TRUE, 0, str);
559 g_free (str);
560 if (! rc) return 0;
561 }
563 {
564 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"partials");
565 if (rc < 0) return 0;
567 while (tmp_cut)
568 {
569 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
570 if (rc < 0) return 0;
571 str = g_strdup_printf (_("cutoff %s-%s"), periodic_table_info[tmp_cut -> Z[0]].lab, periodic_table_info[tmp_cut -> Z[1]].lab);
572 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST (const xmlChar *)"info", BAD_CAST str);
573 g_free (str);
574 if (rc < 0) return 0;
575 str = g_strdup_printf ("%d", tmp_cut -> Z[0]);
576 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"α", BAD_CAST str);
577 g_free (str);
578 if (rc < 0) return 0;
579 str = g_strdup_printf ("%d", tmp_cut -> Z[1]);
580 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"β", BAD_CAST str);
581 g_free (str);
582 if (rc < 0) return 0;
583 str = g_strdup_printf ("%lf", tmp_cut -> cutoff);
584 rc = xmlTextWriterWriteFormatString (writer, "%s", str);
585 g_free (str);
586 if (rc < 0) return 0;
587 rc = xmlTextWriterEndElement (writer);
588 if (rc < 0) return 0;
589 tmp_cut = tmp_cut -> next;
590 }
591 rc = xmlTextWriterEndElement (writer);
592 if (rc < 0) return 0;
593 }
594 rc = xmlTextWriterEndElement (writer);
595 if (rc < 0) return 0;
596 }
597
598 for (i=0; i<NUM_DELTA; i++)
599 {
600 str = g_strdup_printf ("%d", default_num_delta[i]);
601 rc = xml_save_parameter_to_file (writer, _(xml_delta_num_leg[i]), "default_num_delta", TRUE, i, str);
602 g_free (str);
603 if (! rc) return 0;
604 }
605 // Delta t
606 for (i=0; i<2; i++)
607 {
608 str = g_strdup_printf ("%f", default_delta_t[i]);
609 rc = xml_save_parameter_to_file (writer, _(xml_delta_t_leg[i]), "default_delta_t", TRUE, i, str);
610 g_free (str);
611 if (! rc) return 0;
612 }
613 // Rings
614 for (i=0; i<7; i++)
615 {
616 str = g_strdup_printf ("%d", default_rsparam[i]);
617 rc = xml_save_parameter_to_file (writer, _(xml_rings_leg[i]), "default_rsparam", TRUE, i, str);
618 g_free (str);
619 if (! rc) return 0;
620 }
621 // Chains
622 for (i=0; i<7; i++)
623 {
624 str = g_strdup_printf ("%d", default_csparam[i]);
625 rc = xml_save_parameter_to_file (writer, _(xml_chain_leg[i]), "default_csparam", TRUE, i, str);
626 g_free (str);
627 if (! rc) return 0;
628 }
629 // F(k,t) and S(q,w)
630 // Work to do here !
631 str = g_strdup_printf ("%d", default_skt_sets);
632 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[0]), "default_skt_sets", FALSE, i, str);
633 g_free (str);
634 if (! rc) return 0;
635 str = g_strdup_printf ("%d", default_skt_n_sets);
636 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[1]), "default_skt_n_sets", FALSE, i, str);
637 g_free (str);
638 if (! rc) return 0;
639 str = g_strdup_printf ("%d", default_sqw_n_sets);
640 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[2]), "default_sqw_n_sets", FALSE, i, str);
641 g_free (str);
642 if (! rc) return 0;
643 str = g_strdup_printf ("%d", default_sqw_freq);
644 rc = xml_save_parameter_to_file (writer, _(xml_skt_leg[2]), "default_sqw_freq", FALSE, i, str);
645 g_free (str);
646 if (! rc) return 0;
647
648 // End analysis
649 rc = xmlTextWriterEndElement (writer);
650 if (rc < 0) return 0;
651
652 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"opengl");
653 if (rc < 0) return 0;
654 for (i=0; i<5; i++)
655 {
656
657 str = g_strdup_printf ("%d", default_opengl[i]);
658 rc = xml_save_parameter_to_file (writer, _(xml_opengl_leg[i]), "default_opengl", TRUE, i, str);
659 g_free (str);
660 if (! rc) return 0;
661 }
662
663 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"material");
664 if (rc < 0) return 0;
665
666 str = g_strdup_printf ("%d", default_material.predefine);
667 rc = xml_save_parameter_to_file (writer, _(xml_material_leg[0]), "default_material", TRUE, -1, str);
668 g_free (str);
669 if (! rc) return 0;
670
671 for (i=0; i<6; i++)
672 {
673 str = g_strdup_printf ("%f", default_material.param[i]);
674 rc = xml_save_parameter_to_file (writer, _(xml_material_leg[i+1]), "default_material", TRUE, i, str);
675 g_free (str);
676 if (! rc) return 0;
677 }
678
679 rc = xml_save_xyz_to_file (writer, 6, _(xml_material_leg[7]), "default_material", default_material.albedo);
680 if (! rc) return rc;
681
682 // End material
683 rc = xmlTextWriterEndElement (writer);
684 if (rc < 0) return 0;
685
686 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"lightning");
687 if (rc < 0) return 0;
688
689 str = g_strdup_printf ("%d", default_lightning.lights);
690 rc = xml_save_parameter_to_file (writer, _("Number of lights"), "default_lightning", TRUE, 0, str);
691 g_free (str);
692 if (! rc) return 0;
693
694 for (i=0; i<default_lightning.lights; i++)
695 {
696 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"light");
697 if (rc < 0) return 0;
698 str = g_strdup_printf ("%d", i);
699 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST (const xmlChar *)str);
700 g_free (str);
701 if (rc < 0) return 0;
702
703 str = g_strdup_printf ("%d", default_lightning.spot[i] -> type);
704 rc = xml_save_parameter_to_file (writer, _(xml_lightning_leg[0]), "light.type", FALSE, 0, str);
705 g_free (str);
706 if (! rc) return 0;
707 str = g_strdup_printf ("%d", default_lightning.spot[i] -> fix);
708 rc = xml_save_parameter_to_file (writer, _(xml_lightning_leg[1]), "light.fix", FALSE, 0, str);
709 g_free (str);
710 if (! rc) return 0;
711
712 if (default_lightning.spot[i] -> type)
713 {
714 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[2]), "light.position", default_lightning.spot[i] -> position);
715 if (! rc) return rc;
716 }
717 if (default_lightning.spot[i] -> type != 1)
718 {
719 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[3]), "light.direction", default_lightning.spot[i] -> direction);
720 if (! rc) return rc;
721 }
722 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[4]), "light.intensity", default_lightning.spot[i] -> intensity);
723 if (! rc) return rc;
724 if (default_lightning.spot[i] -> type)
725 {
726 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[5]), "light.attenuation", default_lightning.spot[i] -> attenuation);
727 if (! rc) return rc;
728 rc = xml_save_xyz_to_file (writer, -1, _(xml_lightning_leg[6]), "light.spot", default_lightning.spot[i] -> spot_data);
729 if (! rc) return rc;
730 }
731 rc = xmlTextWriterEndElement (writer);
732 if (rc < 0) return 0;
733 }
734
735 // End lightning
736 rc = xmlTextWriterEndElement (writer);
737 if (rc < 0) return 0;
738
739 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"fog");
740 if (rc < 0) return 0;
741 // Mode
742 str = g_strdup_printf ("%d", default_fog.mode);
743 rc = xml_save_parameter_to_file (writer, _(xml_fog_leg[0]), "fog.mode", TRUE, 0, str);
744 g_free (str);
745 if (! rc) return 0;
746 // Type
747 str = g_strdup_printf ("%d", default_fog.based);
748 rc = xml_save_parameter_to_file (writer, _(xml_fog_leg[1]), "fog.type", TRUE, 1, str);
749 g_free (str);
750 if (! rc) return 0;
751 // Density
752 str = g_strdup_printf ("%f", default_fog.density);
753 rc = xml_save_parameter_to_file (writer, _(xml_fog_leg[2]), "fog.density", TRUE, 2, str);
754 g_free (str);
755 if (! rc) return 0;
756 // Depth
757 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"parameter");
758 if (rc < 0) return 0;
759 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"info", BAD_CAST xml_fog_leg[3]);
760 if (rc < 0) return 0;
761 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"key", BAD_CAST "fog.depth");
762 if (rc < 0) return 0;
763 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"id", BAD_CAST "3");
764 if (rc < 0) return 0;
765 str = g_strdup_printf ("%f", default_fog.depth[0]);
766 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"start", BAD_CAST str);
767 g_free (str);
768 if (rc < 0) return 0;
769 str = g_strdup_printf ("%f", default_fog.depth[1]);
770 rc = xmlTextWriterWriteAttribute (writer, BAD_CAST (const xmlChar *)"end", BAD_CAST str);
771 g_free (str);
772 if (rc < 0) return 0;
773 rc = xmlTextWriterEndElement (writer);
774 if (rc < 0) return 0;
775 // Color
776 rc = xml_save_xyz_to_file (writer, 4, xml_fog_leg[4], "fog.color", default_fog.color);
777 if (! rc) return rc;
778 // End fog
779 rc = xmlTextWriterEndElement (writer);
780 if (rc < 0) return 0;
781
782 // End opengl
783 rc = xmlTextWriterEndElement (writer);
784 if (rc < 0) return 0;
785
786 // Model
787 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"model");
788 if (rc < 0) return 0;
789
790 if (default_clones)
791 {
792 str = g_strdup_printf ("%d", default_clones);
793 rc = xml_save_parameter_to_file (writer, _(xml_model_leg[0]), "default_clones", FALSE, 0, str);
794 g_free (str);
795 if (! rc) return 0;
796 }
797 if (! default_cell)
798 {
799 str = g_strdup_printf ("%d", default_cell);
800 rc = xml_save_parameter_to_file (writer, _(xml_model_leg[1]), "default_cell", FALSE, 0, str);
801 g_free (str);
802 if (! rc) return 0;
803 }
804 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atoms_and_bonds");
805 if (rc < 0) return 0;
806
807 element_radius * tmp_rad;
808 gboolean do_atoms;
809 gboolean do_bonds;
810 gchar * str_a, * str_b;
811 for (i=0; i<OGL_STYLES; i++)
812 {
813 do_atoms = do_bonds = FALSE;
814 if (i != 4)
815 {
816 j = (i < 4) ? i : 4;
817 if (default_o_at_rs[j] || default_o_at_rs[j+5]) do_atoms = TRUE;
818 if (default_atomic_rad[j] || default_atomic_rad[j+5]) do_atoms = TRUE;
819 if (! do_atoms)
820 {
821 if (j == 2)
822 {
823 for (k=0; k<3; k++)
824 {
825 if (default_atomic_rad[10+k] || default_atomic_rad[13+k]) do_atoms = TRUE;
826 }
827 }
828 }
829 }
830 if (i != 2 && i != 3 && i != 5)
831 {
832 j = (i < 2) ? i : 2;
833 if (default_o_bd_rw[j] || default_o_bd_rw[j+3]) do_bonds = TRUE;
834 if (default_bond_rad[j] || default_bond_rad[j+3]) do_bonds = TRUE;
835 }
836 if (do_atoms || do_bonds)
837 {
838 rc = xmlTextWriterStartElement (writer, BAD_CAST xml_style_leg[i]);
839 if (rc < 0) return 0;
840 if (do_atoms)
841 {
842 j = (i < 4) ? i : 4;
843 k = (j == 0 || j == 2) ? 0 : (j == 1 || j == 4) ? 1 : 2;
844 for (l=0; l<2; l++)
845 {
846 if (default_o_at_rs[j+l*5])
847 {
848 str_a = (l) ? g_strdup_printf ("clone-%s", _(xml_atom_leg[k])) : g_strdup_printf ("%s", _(xml_atom_leg[k]));
849 str_b = g_strdup_printf ("%f", default_at_rs[j+l*5]);
850 rc = xml_save_parameter_to_file (writer, str_a, "default_at_rs", TRUE, j+l*5, str_b);
851 g_free (str_a);
852 g_free (str_b);
853 if (! rc) return 0;
854 }
855 }
856 l = (j == 2) ? 4 : 1;
857 for (m=0; m < l; m++)
858 {
859 n = (m) ? 7 : 0;
860 for (o= 0; o<2; o++)
861 {
862 n = (o && m) ? 5 : n;
863 if (default_atomic_rad[j+n+5*o+m])
864 {
865 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]));
866 rc = xmlTextWriterStartElement (writer, BAD_CAST str_a);
867 g_free (str_a);
868 if (rc < 0) return 0;
869 tmp_rad = default_atomic_rad[j+n+5*o+m];
870 while (tmp_rad)
871 {
872 str = g_strdup_printf ("%f", tmp_rad -> rad);
873 rc = xml_save_parameter_to_file (writer, periodic_table_info[tmp_rad -> Z].lab, "default_atomic_rad", TRUE, tmp_rad -> Z, str);
874 g_free (str);
875 if (! rc) return 0;
876 tmp_rad = tmp_rad -> next;
877 }
878 rc = xmlTextWriterEndElement (writer);
879 if (rc < 0) return 0;
880 }
881 }
882 }
883 }
884 if (do_bonds)
885 {
886 j = (i < 2) ? i : 2;
887 for (k=0; k<2; k++)
888 {
889 if (default_o_bd_rw[j+k*3])
890 {
891 str_a = (k) ? g_strdup_printf ("clone-%s", _(xml_bond_leg[j])) : g_strdup_printf ("%s", _(xml_bond_leg[j]));
892 str_b = g_strdup_printf ("%f", default_bd_rw[j+k*3]);
893 rc = xml_save_parameter_to_file (writer, str_a, "default_bd_rw", TRUE, j+k*3, str_b);
894 g_free (str_a);
895 g_free (str_b);
896 if (! rc) return 0;
897 }
898 if (default_bond_rad[j+k*3])
899 {
900 str_a = (k) ? g_strdup_printf ("clone-%s", _(xml_bond_leg[j])) : g_strdup_printf ("%s", _(xml_bond_leg[j]));
901 rc = xmlTextWriterStartElement (writer, BAD_CAST str_a);
902 g_free (str_a);
903 if (rc < 0) return 0;
904 tmp_rad = default_bond_rad[j+k*3];
905 while (tmp_rad)
906 {
907 str = g_strdup_printf ("%f", tmp_rad -> rad);
908 rc = xml_save_parameter_to_file (writer, periodic_table_info[tmp_rad -> Z].lab, "default_bond_rad", TRUE, tmp_rad -> Z, str);
909 g_free (str);
910 if (! rc) return 0;
911 tmp_rad = tmp_rad -> next;
912 }
913 rc = xmlTextWriterEndElement (writer);
914 if (rc < 0) return 0;
915 }
916 }
917 }
918 rc = xmlTextWriterEndElement (writer);
919 if (rc < 0) return 0;
920 }
921 }
922
923 // End atoms_and_bonds
924 rc = xmlTextWriterEndElement (writer);
925 if (rc < 0) return 0;
926
927 element_color * tmp_col;
928 // atoms and clones labels
929 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
930 if (rc < 0) return 0;
931 gchar * obj[2]={"atoms", "clones"};
932 for (i=0; i<2; i++)
933 {
934 rc = xmlTextWriterStartElement (writer, BAD_CAST obj[i]);
935 if (rc < 0) return 0;
936
937 str = g_strdup_printf ("%d", default_label[i].position);
938 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[0]), "default_label", TRUE, 0, str);
939 g_free (str);
940 if (! rc) return 0;
941 str = g_strdup_printf ("%d", default_label[i].render);
942 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[1]), "default_label", TRUE, 1, str);
943 g_free (str);
944 if (! rc) return 0;
945 str = g_strdup_printf ("%d", default_label[i].scale);
946 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[2]), "default_label", TRUE, 2, str);
947 g_free (str);
948 if (! rc) return 0;
949 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[3]), "default_label", TRUE, 3, default_label[i].font);
950 if (! rc) return 0;
951 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]));
952 if (! rc) return 0;
953 str = g_strdup_printf ("%d", default_acl_format[i]);
954 rc = xml_save_parameter_to_file (writer, _("Format"), "default_label", TRUE, 5, str);
955 g_free (str);
956 if (! rc) return 0;
957 if (default_label[i].n_colors || default_label_color[i])
958 {
959 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"colors");
960 if (rc < 0) return 0;
961 if (default_label[i].n_colors)
962 {
963 xml_save_color_to_file (writer, i, _("Only label color"), "only_label_color", default_label[i].color[0]);
964 }
965 else
966 {
967 tmp_col = default_label_color[i];
968 while (tmp_col)
969 {
970 rc = xml_save_color_to_file (writer, tmp_col -> Z, periodic_table_info[tmp_col -> Z].lab, "default_label_color", tmp_col -> col);
971 if (! rc) return 0;
972 tmp_col = tmp_col -> next;
973 }
974 }
975 rc = xmlTextWriterEndElement (writer);
976 if (rc < 0) return 0;
977 }
978
979 rc = xmlTextWriterEndElement (writer);
980 if (rc < 0) return 0;
981 }
982
983 // End atoms and clones colors
984 rc = xmlTextWriterEndElement (writer);
985 if (rc < 0) return 0;
986
987 do_atoms = (default_atom_color[0] || default_atom_color[1]) ? TRUE : FALSE;
988 if (do_atoms)
989 {
990 // atoms and clones colors
991 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"colors");
992 if (rc < 0) return 0;
993 for (i=0; i<2; i++)
994 {
995 if (default_atom_color[i])
996 {
997 rc = xmlTextWriterStartElement (writer, BAD_CAST obj[i]);
998 if (rc < 0) return 0;
999 tmp_col = default_atom_color[i];
1000 while (tmp_col)
1001 {
1002 rc = xml_save_color_to_file (writer, tmp_col -> Z, periodic_table_info[tmp_col -> Z].lab, "default_atom_color", tmp_col -> col);
1003 if (! rc) return 0;
1004 tmp_col = tmp_col -> next;
1005 }
1006 rc = xmlTextWriterEndElement (writer);
1007 if (rc < 0) return 0;
1008 }
1009 }
1010 }
1011
1012 if (default_box.box != NONE)
1013 {
1014 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"box");
1015 if (rc < 0) return 0;
1016 str = g_strdup_printf ("%f", (default_box.box == WIREFRAME) ? default_box.line : default_box.rad);
1017 rc = xml_save_parameter_to_file (writer, (default_box.box == WIREFRAME) ? _("Wireframe width") : _("Cylinder radius"), "default_box", TRUE, default_box.box, str);
1018 g_free (str);
1019 if (! rc) return 0;
1020 rc = xml_save_color_to_file (writer, -1, _("Color"), "default_box", default_box.color);
1021 if (! rc) return 0;
1022 // End box
1023 rc = xmlTextWriterEndElement (writer);
1024 if (rc < 0) return 0;
1025 }
1026
1027 // End model
1028 rc = xmlTextWriterEndElement (writer);
1029 if (rc < 0) return 0;
1030
1031 // View
1032 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"view");
1033 if (rc < 0) return 0;
1034
1035 // Background
1036 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"background");
1037 str = g_strdup_printf ("%d", default_background.gradient);
1038 rc = xml_save_parameter_to_file (writer, _("Gradient"), "default_background", TRUE, 0, str);
1039 g_free (str);
1040 if (! rc) return 0;
1041 if (default_background.gradient)
1042 {
1043 str = g_strdup_printf ("%d", default_background.direction);
1044 rc = xml_save_parameter_to_file (writer, _("Direction"), "default_background", TRUE, 1, str);
1045 g_free (str);
1046 if (! rc) return 0;
1047 str = g_strdup_printf ("%f", default_background.position);
1048 rc = xml_save_parameter_to_file (writer, _("Mixed position"), "default_background", TRUE, 2, str);
1049 g_free (str);
1050 if (! rc) return 0;
1051 for (i=0; i<2; i++)
1052 {
1053 rc = xml_save_color_to_file (writer, i+3, _("Color"), "default_background", default_background.gradient_color[i]);
1054 if (! rc) return 0;
1055 }
1056 }
1057 else
1058 {
1059 rc = xml_save_color_to_file (writer, -1, _("Color"), "default_background", default_background.color);
1060 if (! rc) return 0;
1061 }
1062
1063 rc = xmlTextWriterEndElement (writer);
1064 if (rc < 0) return 0;
1065
1066
1067 // Representation
1068 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"representation");
1069 if (rc < 0) return 0;
1070 str = g_strdup_printf ("%d", default_rep.rep);
1071 rc = xml_save_parameter_to_file (writer, _("Representation type"), "default_rep", TRUE, 0, str);
1072 g_free (str);
1073 if (! rc) return 0;
1074 if (default_rep.rep)
1075 {
1076 str = g_strdup_printf ("%lf", default_rep.gnear);
1077 rc = xml_save_parameter_to_file (writer, _("Camera depth"), "default_rep", TRUE, 1, str);
1078 g_free (str);
1079 if (! rc) return 0;
1080 }
1081
1082 str = g_strdup_printf ("%lf", 1.0 - 0.5*default_rep.zoom);
1083 rc = xml_save_parameter_to_file (writer, _("Zoom"), "default_rep", TRUE, 2, str);
1084 g_free (str) ;
1085 if (! rc) return 0;
1086 for (i=0; i<2; i++)
1087 {
1088 str = g_strdup_printf ("%lf", - default_rep.c_angle[i]);
1089 rc = xml_save_parameter_to_file (writer, (i) ? _("Camera pitch") : _("Camera heading"), "default_rep", TRUE, 3+i, str);
1090 g_free (str) ;
1091 if (! rc) return 0;
1092 }
1093 for (i=0; i<2; i++)
1094 {
1095 str = g_strdup_printf ("%lf", default_rep.c_shift[i]);
1096 rc = xml_save_parameter_to_file (writer, (i) ? _("Camera x") : _("Camera y"), "default_rep", TRUE, 5+i, str);
1097 g_free (str) ;
1098 if (! rc) return 0;
1099 }
1100 // End representation
1101 rc = xmlTextWriterEndElement (writer);
1102 if (rc < 0) return 0;
1103
1104
1105 if (default_axis.axis != NONE)
1106 {
1107 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"axis");
1108 if (rc < 0) return 0;
1109 if (default_axis.t_pos != NONE)
1110 {
1111 str = g_strdup_printf ("%d", default_axis.t_pos);
1112 rc = xml_save_parameter_to_file (writer, _("Template position"), "default_axis", TRUE, 0, str);
1113 g_free (str);
1114 if (! rc) return 0;
1115 }
1116 else
1117 {
1118 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]));
1119 if (! rc) return 0;
1120 }
1121 str = g_strdup_printf ("%f", (default_axis.axis == WIREFRAME) ? default_axis.line : default_axis.rad);
1122 rc = xml_save_parameter_to_file (writer, (default_axis.axis == WIREFRAME) ? _("Wireframe width") : _("Cylinder radius"), "default_axis", TRUE, default_axis.axis, str);
1123 g_free (str);
1124 if (! rc) return 0;
1125 str = g_strdup_printf ("%f", default_axis.length);
1126 rc = xml_save_parameter_to_file (writer, _("Length"), "default_axis", TRUE, 2, str);
1127 g_free (str);
1128 if (! rc) return 0;
1129 if (default_axis.labels)
1130 {
1131 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
1132 if (rc < 0) return 0;
1133 str = g_strdup_printf ("%d", default_label[2].render);
1134 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[1]), "default_label", TRUE, 1, str);
1135 g_free (str);
1136 if (! rc) return 0;
1137 str = g_strdup_printf ("%d", default_label[2].scale);
1138 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[2]), "default_label", TRUE, 2, str);
1139 g_free (str);
1140 if (! rc) return 0;
1141 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[3]), "default_label", TRUE, 3, default_label[2].font);
1142 if (! rc) return 0;
1143 for (i=0; i<3; i++)
1144 {
1145 rc = xml_save_parameter_to_file (writer, _(xml_axis_leg[i]), "axis_legend", TRUE, i, default_axis.title[i]);
1146 if (! rc) return 0;
1147 }
1148 rc = xmlTextWriterEndElement (writer);
1149 if (rc < 0) return 0;
1150 }
1151 if (default_axis.color)
1152 {
1153 for (i=0; i<3; i++)
1154 {
1155 rc = xml_save_color_to_file (writer, i, _("Color"), "default_axis", default_axis.color[i]);
1156 if (! rc) return 0;
1157 }
1158 }
1159 // End axis
1160 rc = xmlTextWriterEndElement (writer);
1161 if (rc < 0) return 0;
1162 }
1163
1164 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"measures");
1165 if (rc < 0) return 0;
1166 gchar * m_key[2]={"standard", "selection"};
1167 for (i=0; i<2; i++)
1168 {
1169 rc = xmlTextWriterStartElement (writer, BAD_CAST m_key[i]);
1170 if (rc < 0) return 0;
1171 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"labels");
1172 if (rc < 0) return 0;
1173 str = g_strdup_printf ("%d", default_label[i+3].position);
1174 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[0]), "default_label", TRUE, 0, str);
1175 g_free (str);
1176 if (! rc) return 0;
1177 str = g_strdup_printf ("%d", default_label[i+3].render);
1178 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[1]), "default_label", TRUE, 1, str);
1179 g_free (str);
1180 if (! rc) return 0;
1181 str = g_strdup_printf ("%d", default_label[i+3].scale);
1182 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[2]), "default_label", TRUE, 2, str);
1183 g_free (str);
1184 if (! rc) return 0;
1185 rc = xml_save_parameter_to_file (writer, _(xml_label_leg[3]), "default_label", TRUE, 3, default_label[i+3].font);
1186 if (! rc) return 0;
1187 xml_save_color_to_file (writer, i+3, _("Font color"), "default_font_color", default_label[i+3].color[0]);
1188 if (! rc) return 0;
1189
1190 rc = xmlTextWriterEndElement (writer); // End label
1191 if (rc < 0) return 0;
1192 // mtilt
1193 str = g_strdup_printf ("%d", default_mtilt[i]);
1194 rc = xml_save_parameter_to_file (writer, _("Tilt along"), "default_mtilt", TRUE, i, str);
1195 g_free (str);
1196 if (! rc) return 0;
1197 // mtilt
1198 str = g_strdup_printf ("%d", default_mpattern[i]);
1199 rc = xml_save_parameter_to_file (writer, _("Pattern"), "default_mpattern", TRUE, i, str);
1200 g_free (str);
1201 if (! rc) return 0;
1202 // mfactor
1203 str = g_strdup_printf ("%d", default_mfactor[i]);
1204 rc = xml_save_parameter_to_file (writer, _("Factor"), "default_mfactor", TRUE, i, str);
1205 g_free (str);
1206 if (! rc) return 0;
1207 // mfactor
1208 str = g_strdup_printf ("%lf", default_mwidth[i]);
1209 rc = xml_save_parameter_to_file (writer, _("Width"), "default_mwidth", TRUE, i, str);
1210 g_free (str);
1211 if (! rc) return 0;
1212
1213 rc = xmlTextWriterEndElement (writer); // End measures type
1214 if (rc < 0) return 0;
1215 }
1216
1217 rc = xmlTextWriterEndElement (writer); // End measures
1218 if (rc < 0) return 0;
1219
1220 rc = xmlTextWriterStartElement (writer, BAD_CAST (const xmlChar *)"atom-selections");
1221 if (rc < 0) return 0;
1222 for (i=0; i<2; i++)
1223 {
1224 xml_save_color_to_file (writer, i, _("Selection color"), "default_sel_color", default_sel_color[i]);
1225 if (! rc) return 0;
1226 }
1227 rc = xmlTextWriterEndElement (writer);
1228 if (rc < 0) return 0;
1229
1230 // End view
1231 rc = xmlTextWriterEndElement (writer);
1232 if (rc < 0) return 0;
1233
1234 rc = xmlTextWriterEndElement (writer);
1235 if (rc < 0) return 0;
1236
1237 rc = xmlTextWriterEndDocument (writer);
1238 if (rc < 0) return 0;
1239
1240 xmlFreeTextWriter (writer);
1241 return 1;
1242}
1243
1245
1253double xml_string_to_double (xmlChar * content)
1254{
1255 return (g_strcmp0((const char *)content, "") == 0) ? 0.0 : string_to_double ((gpointer)content);
1256}
1257
1272void set_parameter (xmlChar * content, gchar * key, int vid, dint * bond, vec3_t * vect, float start, float end, ColRGBA * col)
1273{
1274 element_radius * tmp_rad;
1275 element_color * tmp_col;
1276 if (bond)
1277 {
1278 bond_cutoff * cut;
1280 {
1281 cut = default_bond_cutoff;
1282 while (cut -> next)
1283 {
1284 cut = cut -> next;
1285 }
1286 cut -> next = g_malloc0(sizeof*cut);
1287 cut = cut -> next;
1288 }
1289 else
1290 {
1291 default_bond_cutoff = g_malloc0(sizeof*default_bond_cutoff);
1292 cut = default_bond_cutoff;
1293 }
1294 cut -> Z[0] = bond -> a;
1295 cut -> Z[1] = bond -> b;
1296 cut -> use = TRUE;
1297 cut -> cutoff = xml_string_to_double(content);
1298 }
1299 else if (g_strcmp0(key, "default_instance") == 0)
1300 {
1301 default_instance = (g_strcmp0((gchar *)content, "single") == 0) ? TRUE : FALSE;
1302 }
1303 else if (g_strcmp0(key, "default_totcut") == 0)
1304 {
1306 }
1307 else if (g_strcmp0(key, "default_num_delta") == 0)
1308 {
1309 default_num_delta[vid] = (int)xml_string_to_double(content);
1310 }
1311 else if (g_strcmp0(key, "default_delta_t") == 0)
1312 {
1313 default_delta_t[vid] = xml_string_to_double(content);
1314 }
1315 else if (g_strcmp0(key, "default_rsparam") == 0)
1316 {
1317 default_rsparam[vid] = (int)xml_string_to_double(content);
1318 }
1319 else if (g_strcmp0(key, "default_csparam") == 0)
1320 {
1321 default_csparam[vid] = (int)xml_string_to_double(content);
1322 }
1323 else if (g_strcmp0(key, "default_skt_sets") == 0)
1324 {
1325 default_skt_sets = (int)xml_string_to_double(content);
1326 }
1327 else if (g_strcmp0(key, "default_skt_n_sets") == 0)
1328 {
1330 }
1331 else if (g_strcmp0(key, "default_sqw_n_sets") == 0)
1332 {
1334 }
1335 else if (g_strcmp0(key, "default_sqw_freq") == 0)
1336 {
1337 default_sqw_freq = (int)xml_string_to_double(content);
1338 }
1339 else if (g_strcmp0(key, "default_opengl") == 0)
1340 {
1341 default_opengl[vid] = (int)xml_string_to_double(content);
1342 }
1343 else if (g_strcmp0(key, "default_material") == 0)
1344 {
1345 if (vid < 0)
1346 {
1347 default_material.predefine = (int)xml_string_to_double(content);
1348 }
1349 else if (vid == 6 && vect)
1350 {
1351 default_material.albedo = * vect;
1352 }
1353 else
1354 {
1355 default_material.param[vid] = xml_string_to_double(content);
1356 }
1357 }
1358 else if (g_strcmp0(key, "default_lightning") == 0)
1359 {
1360 int lights = (int)xml_string_to_double(content);
1361 if (default_lightning.lights != lights)
1362 {
1363 int i;
1364 for (i=0; i<default_lightning.lights; i++)
1365 {
1366 g_free (default_lightning.spot[i]);
1367 }
1368 g_free (default_lightning.spot);
1369 default_lightning.lights = lights;
1370 default_lightning.spot = g_malloc0 (default_lightning.lights*sizeof*default_lightning.spot);
1371 for (i=0; i<default_lightning.lights; i++)
1372 {
1373 default_lightning.spot[i] = init_light_source ((i < 3) ? i : 1, 1.0);
1374 }
1375 }
1376 }
1377 else if (g_strcmp0(key, "light.type") == 0)
1378 {
1379 default_lightning.spot[vid] -> type = (int)xml_string_to_double(content);
1380 }
1381 else if (g_strcmp0(key, "light.fix") == 0)
1382 {
1383 default_lightning.spot[vid] -> fix = (int)xml_string_to_double(content);
1384 }
1385 else if (g_strcmp0(key, "light.direction") == 0 && vect)
1386 {
1387 default_lightning.spot[vid] -> direction = * vect;
1388 }
1389 else if (g_strcmp0(key, "light.position") == 0 && vect)
1390 {
1391 default_lightning.spot[vid] -> position = * vect;
1392 }
1393 else if (g_strcmp0(key, "light.intensity") == 0 && vect)
1394 {
1395 default_lightning.spot[vid] -> intensity = * vect;
1396 }
1397 else if (g_strcmp0(key, "light.attenuation") == 0 && vect)
1398 {
1399 default_lightning.spot[vid] -> attenuation = * vect;
1400 }
1401 else if (g_strcmp0(key, "light.spot") == 0 && vect)
1402 {
1403 default_lightning.spot[vid] -> spot_data = * vect;
1404 }
1405 else if (g_strcmp0(key, "fog.mode") == 0)
1406 {
1407 default_fog.mode = (int)xml_string_to_double(content);
1408 }
1409 else if (g_strcmp0(key, "fog.type") == 0)
1410 {
1411 default_fog.based = (int)xml_string_to_double(content);
1412 }
1413 else if (g_strcmp0(key, "fog.density") == 0)
1414 {
1415 default_fog.density = xml_string_to_double(content);
1416 }
1417 else if (g_strcmp0(key, "fog.depth") == 0)
1418 {
1419 if (start != -1.0) default_fog.depth[0] = start;
1420 if (end != -1.0) default_fog.depth[1] = end;
1421 }
1422 else if (g_strcmp0(key, "fog.color") == 0 && vect)
1423 {
1424 default_fog.color = * vect;
1425 }
1426 else if (g_strcmp0(key, "default_cell") == 0)
1427 {
1428 default_cell = (int)xml_string_to_double(content);
1429 }
1430 else if (g_strcmp0(key, "default_clones") == 0)
1431 {
1432 default_clones = (int)xml_string_to_double(content);
1433 }
1434 else if (g_strcmp0(key, "default_at_rs") == 0)
1435 {
1436 default_o_at_rs[vid] = TRUE;
1437 default_at_rs[vid] = xml_string_to_double(content);
1438 }
1439 else if (g_strcmp0(key, "default_bd_rw") == 0)
1440 {
1441 default_o_bd_rw[vid] = TRUE;
1442 default_bd_rw[vid] = xml_string_to_double(content);
1443 }
1444 else if (g_strcmp0(key, "default_atomic_rad") == 0)
1445 {
1447 {
1448 tmp_rad = default_atomic_rad[radius_id];
1449 while (tmp_rad -> next)
1450 {
1451 tmp_rad = tmp_rad -> next;
1452 }
1453 tmp_rad -> next = g_malloc0(sizeof*tmp_rad);
1454 tmp_rad = tmp_rad -> next;
1455 }
1456 else
1457 {
1459 tmp_rad = default_atomic_rad[radius_id];
1460 }
1461 tmp_rad -> Z = vid;
1462 tmp_rad -> rad = xml_string_to_double(content);
1463 }
1464 else if (g_strcmp0(key, "default_bond_rad") == 0)
1465 {
1467 {
1468 tmp_rad = default_bond_rad[radius_id];
1469 while (tmp_rad -> next)
1470 {
1471 tmp_rad = tmp_rad -> next;
1472 }
1473 tmp_rad -> next = g_malloc0(sizeof*tmp_rad);
1474 tmp_rad = tmp_rad -> next;
1475 }
1476 else
1477 {
1479 tmp_rad = default_bond_rad[radius_id];
1480 }
1481 tmp_rad -> Z = vid;
1482 tmp_rad -> rad = xml_string_to_double(content);
1483 }
1484 else if (g_strcmp0(key, "default_label") == 0)
1485 {
1486 switch (vid)
1487 {
1488 case 0:
1489 default_label[label_id].position = (int)xml_string_to_double(content);
1490 break;
1491 case 1:
1492 default_label[label_id].render = (int)xml_string_to_double(content);
1493 break;
1494 case 2:
1495 default_label[label_id].scale = (int)xml_string_to_double(content);
1496 break;
1497 case 3:
1498 default_label[label_id].font = g_strdup_printf ("%s", content);
1499 break;
1500 case 4:
1501 default_label[label_id].shift[0] = vect -> x;
1502 default_label[label_id].shift[1] = vect -> y;
1503 default_label[label_id].shift[2] = vect -> z;
1504 break;
1505 case 5:
1507 break;
1508 }
1509 }
1510 else if (g_strcmp0(key, "default_label_color") == 0)
1511 {
1512 if (! vid)
1513 {
1514 default_label[label_id].color = g_malloc0(sizeof*default_label[label_id].color);
1515 default_label[label_id].color[0] = * col;
1516 }
1517 else
1518 {
1520 {
1521 tmp_col = default_label_color[label_id];
1522 while (tmp_col -> next)
1523 {
1524 tmp_col = tmp_col -> next;
1525 }
1526 tmp_col -> next = g_malloc0(sizeof*tmp_col);
1527 tmp_col = tmp_col -> next;
1528 }
1529 else
1530 {
1532 tmp_col = default_label_color[label_id];
1533 }
1534 tmp_col -> Z = vid;
1535 tmp_col -> col = * col;
1536 }
1537 }
1538 else if (g_strcmp0(key, "default_font_color") == 0)
1539 {
1540 default_label[label_id].color = g_malloc0(sizeof*default_label[label_id].color);
1541 default_label[label_id].color[0] = * col;
1542 }
1543 else if (g_strcmp0(key, "default_atom_color") == 0)
1544 {
1546 {
1547 tmp_col = default_atom_color[label_id];
1548 while (tmp_col -> next)
1549 {
1550 tmp_col = tmp_col -> next;
1551 }
1552 tmp_col -> next = g_malloc0(sizeof*tmp_col);
1553 tmp_col = tmp_col -> next;
1554 }
1555 else
1556 {
1558 tmp_col = default_atom_color[label_id];
1559 }
1560 tmp_col -> Z = vid;
1561 tmp_col -> col = * col;
1562 }
1563 else if (g_strcmp0(key, "only_label_color") == 0)
1564 {
1565 default_label[label_id].n_colors = 1;
1566 default_label[label_id].color = g_malloc0(sizeof*default_label[label_id].color);
1567 default_label[label_id].color[0] = * col;
1568 }
1569 else if (g_strcmp0(key, "default_box") == 0)
1570 {
1571 if (col)
1572 {
1573 default_box.color = * col;
1574 }
1575 else
1576 {
1577 default_box.box = vid;
1578 if (default_box.box == WIREFRAME)
1579 {
1580 default_box.line = xml_string_to_double(content);
1581 }
1582 else
1583 {
1584 default_box.rad = xml_string_to_double(content);
1585 }
1586 }
1587 }
1588 else if (g_strcmp0(key, "default_background") == 0)
1589 {
1590 switch (vid)
1591 {
1592 case -1:
1593 if (col) default_background.color = * col;
1594 break;
1595 case 0:
1596 default_background.gradient = (int) xml_string_to_double(content);
1597 break;
1598 case 1:
1599 default_background.direction = (int) xml_string_to_double(content);
1600 break;
1601 case 2:
1602 default_background.position = xml_string_to_double(content);
1603 break;
1604 default:
1605 if (col) default_background.gradient_color[vid-3] = * col;
1606 break;
1607 }
1608 }
1609 else if (g_strcmp0(key, "default_rep") == 0)
1610 {
1611 switch (vid)
1612 {
1613 case 0:
1614 default_rep.rep = (int) xml_string_to_double(content);
1615 break;
1616 case 1:
1617 default_rep.gnear = xml_string_to_double(content);
1618 break;
1619 case 2:
1620 default_rep.zoom = 2.0*(1.0 - xml_string_to_double(content));
1621 break;
1622 default:
1623 if (vid < 5)
1624 {
1625 default_rep.c_angle[vid-3] = - xml_string_to_double(content);
1626 }
1627 else
1628 {
1629 default_rep.c_shift[vid-5] = xml_string_to_double(content);
1630 }
1631 break;
1632 }
1633 }
1634 else if (g_strcmp0(key, "default_axis") == 0)
1635 {
1636 if (vect)
1637 {
1638 default_axis.c_pos[0] = vect -> x;
1639 default_axis.c_pos[1] = vect -> y;
1640 default_axis.c_pos[2] = vect -> z;
1641 }
1642 else if (col)
1643 {
1644 if (! default_axis.color) default_axis.color = g_malloc0(3*sizeof*default_axis.color);
1645 default_axis.color[vid] = * col;
1646 }
1647 else
1648 {
1649 if (vid == 1 || vid == 4)
1650 {
1651 default_axis.axis = vid;
1652 if (vid == 1) default_axis.line = xml_string_to_double(content);
1653 if (vid == 4) default_axis.rad = xml_string_to_double(content);
1654 }
1655 else if (vid == 2)
1656 {
1657 default_axis.length = xml_string_to_double(content);
1658 }
1659 else if (! vid)
1660 {
1661 default_axis.t_pos = (int) xml_string_to_double(content);
1662 }
1663 }
1664 }
1665 else if (g_strcmp0(key, "axis_legend") == 0)
1666 {
1667 default_axis.title[vid] = g_strdup_printf ("%s", content);
1668 }
1669 else if (g_strcmp0(key, "default_mtilt") == 0)
1670 {
1671 default_mtilt[vid] = (int) xml_string_to_double(content);
1672 }
1673 else if (g_strcmp0(key, "default_mpattern") == 0)
1674 {
1675 default_mpattern[vid] = (int) xml_string_to_double(content);
1676 }
1677 else if (g_strcmp0(key, "default_mfactor") == 0)
1678 {
1679 default_mfactor[vid] = (int) xml_string_to_double(content);
1680 }
1681 else if (g_strcmp0(key, "default_mwidth") == 0)
1682 {
1683 default_mwidth[vid] = xml_string_to_double(content);
1684 }
1685 else if (g_strcmp0(key, "default_sel_color") == 0)
1686 {
1687 if (col)
1688 {
1689 default_sel_color[vid] = * col;
1690 }
1691 }
1692}
1693
1701void read_parameter (xmlNodePtr parameter_node)
1702{
1703 xmlNodePtr p_node;
1704 xmlAttrPtr p_details;
1705 gboolean set_codevar, set_id;
1706 gboolean set_x, set_y, set_z;
1707 gboolean set_r, set_g, set_b, set_a;
1708 gboolean set_alpha, set_beta;
1709 ColRGBA col;
1710 gchar * key = NULL;
1711 xmlChar * content, * p_cont;
1712 int id;
1713 dint bond;
1714 float start, end;
1715 vec3_t vec;
1716 while (parameter_node)
1717 {
1718 content = xmlNodeGetContent(parameter_node);
1719 p_details = parameter_node -> properties;
1720 set_codevar = set_id = FALSE;
1721 set_x = set_y = set_z = FALSE;
1722 set_r = set_g = set_b = set_a = FALSE;
1723 set_alpha = set_beta = FALSE;
1724 start = end = -1.0;
1725 id = -1;
1726 while (p_details)
1727 {
1728 p_node = p_details -> children;
1729 if (p_node)
1730 {
1731 p_cont = xmlNodeGetContent(p_node);
1732 if (g_strcmp0("key",(char *)p_details -> name) == 0)
1733 {
1734 key = g_strdup_printf ("%s", p_cont);
1735 set_codevar = TRUE;
1736 }
1737 else if (g_strcmp0("id",(char *)p_details -> name) == 0)
1738 {
1739 id = (int) string_to_double ((gpointer)p_cont);
1740 set_id = TRUE;
1741 }
1742 else if (g_strcmp0("α",(char *)p_details -> name) == 0)
1743 {
1744 bond.a = (int) string_to_double ((gpointer)p_cont);
1745 set_alpha = TRUE;
1746 }
1747 else if (g_strcmp0("β",(char *)p_details -> name) == 0)
1748 {
1749 bond.b = (int) string_to_double ((gpointer)p_cont);
1750 set_beta = TRUE;
1751 }
1752 else if (g_strcmp0("x",(char *)p_details -> name) == 0)
1753 {
1754 vec.x = string_to_double ((gpointer)p_cont);
1755 set_x = TRUE;
1756 }
1757 else if (g_strcmp0("y",(char *)p_details -> name) == 0)
1758 {
1759 vec.y = string_to_double ((gpointer)p_cont);
1760 set_y = TRUE;
1761 }
1762 else if (g_strcmp0("z",(char *)p_details -> name) == 0)
1763 {
1764 vec.z = string_to_double ((gpointer)p_cont);
1765 set_z = TRUE;
1766 }
1767 else if (g_strcmp0("start",(char *)p_details -> name) == 0)
1768 {
1769 start = string_to_double ((gpointer)p_cont);
1770 }
1771 else if (g_strcmp0("end",(char *)p_details -> name) == 0)
1772 {
1773 end = string_to_double ((gpointer)p_cont);
1774 }
1775 else if (g_strcmp0("red",(char *)p_details -> name) == 0)
1776 {
1777 col.red = string_to_double ((gpointer)p_cont);
1778 set_r = TRUE;
1779 }
1780 else if (g_strcmp0("green",(char *)p_details -> name) == 0)
1781 {
1782 col.green = string_to_double ((gpointer)p_cont);
1783 set_g = TRUE;
1784 }
1785 else if (g_strcmp0("blue",(char *)p_details -> name) == 0)
1786 {
1787 col.blue = string_to_double ((gpointer)p_cont);
1788 set_b = TRUE;
1789 }
1790 else if (g_strcmp0("alpha",(char *)p_details -> name) == 0)
1791 {
1792 col.alpha = string_to_double ((gpointer)p_cont);
1793 set_a = TRUE;
1794 }
1795 xmlFree (p_cont);
1796 }
1797 p_details = p_details -> next;
1798 }
1799
1800 if ((set_codevar && (set_id || (set_r && set_g && set_b && set_a))) || (set_alpha && set_beta))
1801 {
1802 // g_print ("key= %s, id= %d, content= %s\n", key, id, content);
1803 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);
1804 }
1805 if (key) g_free (key);
1806 xmlFree (content);
1807 parameter_node = parameter_node -> next;
1808 parameter_node = findnode (parameter_node, "parameter");
1809 }
1810}
1811
1819void read_light (xmlNodePtr light_node)
1820{
1821 xmlNodePtr l_node, p_node;
1822 xmlNodePtr parameter_node;
1823 xmlAttrPtr l_details, p_details;
1824 gchar * key = NULL;
1825 int lid;
1826 gboolean set_codevar;
1827 gboolean set_lid = FALSE;
1828 gboolean set_x, set_y, set_z;
1829 xmlChar * content, * p_cont;
1830 vec3_t vec;
1831 l_details = light_node -> properties;
1832 while (l_details)
1833 {
1834 l_node = l_details -> children;
1835 if (l_node)
1836 {
1837 if (g_strcmp0("id",(char *)l_details -> name) == 0)
1838 {
1839 content = xmlNodeGetContent(l_node);
1840 lid = (int) string_to_double ((gpointer)content);
1841 xmlFree (content);
1842 set_lid = TRUE;
1843 }
1844 }
1845 l_details = l_details -> next;
1846 }
1847 if (set_lid)
1848 {
1849 parameter_node = findnode (light_node -> children, "parameter");
1850 set_codevar = FALSE;
1851 set_x = set_y = set_z = FALSE;
1852 while (parameter_node)
1853 {
1854 content = xmlNodeGetContent(parameter_node);
1855 p_details = parameter_node -> properties;
1856 while (p_details)
1857 {
1858 p_node = p_details -> children;
1859 if (p_node)
1860 {
1861 p_cont = xmlNodeGetContent(p_node);
1862 if (g_strcmp0("key",(char *)p_details -> name) == 0)
1863 {
1864 key = g_strdup_printf ("%s", p_cont);
1865 set_codevar = TRUE;
1866 }
1867 else if (g_strcmp0("x",(char *)p_details -> name) == 0)
1868 {
1869 vec.x = string_to_double ((gpointer)p_cont);
1870 set_x = TRUE;
1871 }
1872 else if (g_strcmp0("y",(char *)p_details -> name) == 0)
1873 {
1874 vec.y = string_to_double ((gpointer)p_cont);
1875 set_y = TRUE;
1876 }
1877 else if (g_strcmp0("z",(char *)p_details -> name) == 0)
1878 {
1879 vec.z = string_to_double ((gpointer)p_cont);
1880 set_z = TRUE;
1881 }
1882 xmlFree (p_cont);
1883 }
1884 p_details = p_details -> next;
1885 }
1886 if (set_codevar)
1887 {
1888 set_parameter (content, key, lid, NULL, (set_x && set_y && set_z) ? & vec : NULL, -1.0, -1.0, NULL);
1889 }
1890 if (key) g_free (key);
1891 xmlFree (content);
1892 parameter_node = parameter_node -> next;
1893 parameter_node = findnode (parameter_node, "parameter");
1894 }
1895 }
1896}
1897
1905void read_preferences (xmlNodePtr preference_node)
1906{
1907 xmlNodePtr node;
1908 node = findnode (preference_node -> children, "parameter");
1909 read_parameter (node);
1910}
1911
1920void read_style_from_xml_file (xmlNodePtr style_node, int style)
1921{
1922 xmlNodePtr node;
1923 gchar * str;
1924 int i, j, k, l;
1925 i = (style == 0 || style == 2) ? 0 : (style == 1 || style == 4) ? 1 : 2;
1926 for (j=0; j<2; j++)
1927 {
1928 k = (style == 2) ? 4 : 1;
1929 for (l=0; l<k; l++)
1930 {
1931 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]);
1932 node = findnode (style_node, str);
1933 if (node)
1934 {
1935 if (j)
1936 {
1937 radius_id = (l) ? 12 + l : style + 5;
1938 }
1939 else
1940 {
1941 radius_id = (l) ? 9 + l : style;
1942 }
1943 read_preferences (node);
1944 }
1945 }
1946 }
1947 i = (style < 2) ? style : 2;
1948 for (j=0; j<2; j++)
1949 {
1950 str = (j) ? g_strdup_printf ("clone-%s", xml_bond_leg[i]) : g_strdup_printf ("%s", xml_bond_leg[i]);
1951 node = findnode (style_node, str);
1952 radius_id = (j) ? style + 3 : style;
1953 if (node) read_preferences(node);
1954 }
1955}
1956
1963{
1964 xmlDoc * doc;
1965 xmlTextReaderPtr reader;
1966 xmlNodePtr racine;
1967 xmlNodePtr node, p_node, l_node, c_node;
1968 int i;
1969 reader = xmlReaderForFile (ATOMES_CONFIG, NULL, 0);
1970 if (reader)
1971 {
1972 doc = xmlParseFile (ATOMES_CONFIG);
1973 if (doc)
1974 {
1975 racine = xmlDocGetRootElement (doc);
1976 if (racine)
1977 {
1978 if (g_strcmp0 ((char *)(racine -> name), "atomes_preferences-xml") == 0)
1979 {
1980 node = findnode(racine -> children, "general");
1981 if (node)
1982 {
1983 read_preferences (node);
1984 }
1985 node = findnode(racine -> children, "analysis");
1986 if (node)
1987 {
1988 p_node = findnode (node -> children, "cutoffs");
1989 if (p_node)
1990 {
1991 read_preferences (p_node);
1992 l_node = findnode(p_node -> children, "partials");
1993 if (l_node)
1994 {
1995 read_preferences (l_node);
1996 }
1997 }
1998 read_preferences (node);
1999 }
2000 node = findnode(racine -> children, "opengl");
2001 if (node)
2002 {
2003 p_node = findnode (node -> children, "material");
2004 if (p_node)
2005 {
2006 read_preferences (p_node);
2007 }
2008 p_node = findnode (node -> children, "lightning");
2009 if (p_node)
2010 {
2011 read_preferences (p_node);
2012 l_node = findnode (p_node -> children, "light");
2013 while (l_node)
2014 {
2015 read_light (l_node);
2016 l_node = l_node -> next;
2017 l_node = findnode (l_node, "light");
2018 }
2019 }
2020 p_node = findnode (node -> children, "fog");
2021 if (p_node)
2022 {
2023 read_preferences(p_node);
2024 }
2025 read_preferences (node);
2026 }
2027 node = findnode(racine -> children, "model");
2028 if (node)
2029 {
2030 read_preferences (node);
2031 p_node = findnode(node -> children, "atoms_and_bonds");
2032 if (p_node)
2033 {
2034 for (i=0; i<OGL_STYLES; i++)
2035 {
2036 l_node = findnode (p_node -> children, xml_style_leg[i]);
2037 if (l_node)
2038 {
2039 read_style_from_xml_file (l_node -> children, i);
2040 }
2041 }
2042 }
2043 p_node = findnode(node -> children, "labels");
2044 if (p_node)
2045 {
2046 for (i=0; i<2; i++)
2047 {
2048 l_node = findnode (p_node -> children, (i) ? "clones" : "atoms");
2049 if (l_node)
2050 {
2051 label_id = i;
2052 read_preferences (l_node);
2053 c_node = findnode(l_node -> children, "colors");
2054 if (c_node)
2055 {
2056 read_preferences (c_node);
2057 }
2058 }
2059 }
2060 }
2061 c_node = findnode(node -> children, "colors");
2062 if (c_node)
2063 {
2064 for (i=0; i<2; i++)
2065 {
2066 l_node = findnode (c_node -> children, (i) ? "clones" : "atoms");
2067 if (l_node)
2068 {
2069 label_id = i;
2070 read_preferences (l_node);
2071 }
2072 }
2073 }
2074 p_node = findnode(node -> children, "box");
2075 if (p_node)
2076 {
2077 read_preferences (p_node);
2078 }
2079 }
2080 node = findnode(racine -> children, "view");
2081 if (node)
2082 {
2083 read_preferences (node);
2084 p_node = findnode(node -> children, "background");
2085 if (p_node)
2086 {
2087 read_preferences (p_node);
2088 }
2089 p_node = findnode(node -> children, "representation");
2090 if (p_node)
2091 {
2092 read_preferences (p_node);
2093 }
2094 p_node = findnode(node -> children, "axis");
2095 if (p_node)
2096 {
2097 read_preferences (p_node);
2098 l_node = findnode(p_node -> children, "labels");
2099 if (l_node)
2100 {
2101 label_id = 2;
2102 default_axis.labels = TRUE;
2103 read_preferences (l_node);
2104 }
2105 c_node = findnode(p_node -> children, "colors");
2106 if (c_node)
2107 {
2108 read_preferences (c_node);
2109 }
2110 }
2111 p_node = findnode(node -> children, "measures");
2112 if (p_node)
2113 {
2114 l_node = findnode(p_node -> children, "standard");
2115 if (l_node)
2116 {
2117 c_node = findnode(l_node -> children, "labels");
2118 if (c_node)
2119 {
2120 label_id = 3;
2121 read_preferences (c_node);
2122 }
2123 read_preferences (l_node);
2124 }
2125 l_node = findnode(p_node -> children, "selection");
2126 if (l_node)
2127 {
2128 c_node = findnode(l_node -> children, "labels");
2129 if (c_node)
2130 {
2131 label_id = 4;
2132 read_preferences (c_node);
2133 }
2134 read_preferences (l_node);
2135 }
2136 }
2137 p_node = findnode(node -> children, "atom-selections");
2138 if (p_node)
2139 {
2140 read_preferences (p_node);
2141 }
2142 }
2143 }
2144 }
2145 xmlFreeDoc(doc);
2146 }
2147 xmlFreeTextReader(reader);
2148 }
2149 xmlCleanupParser();
2150}
2151
2158{
2159 int i, j;
2160
2161 // Software behavior
2162 default_instance = TRUE;
2163
2164 // Analysis preferences
2165
2166 default_totcut = 2.0;
2168 default_bond_cutoff = NULL;
2169 default_num_delta[GDR] = 1000;
2170 default_num_delta[SQD] = 1000;
2171 default_num_delta[SKD] = 1000;
2172 default_num_delta[GDK] = 1000;
2173 default_num_delta[BND] = 100;
2174 default_num_delta[ANG] = 90;
2175 default_num_delta[CHA-1] = 20;
2176 default_num_delta[MSD-2] = 0;
2177 default_num_delta[SKT-2] = 1000;
2178
2179 // Dynamical calculations
2180 default_delta_t[0] = 0.0;
2181 default_delta_t[1] = -1.0;
2182
2183 // Ring statistics
2184 default_rsparam[0] = -1;
2185 default_rsparam[1] = 0;
2186 default_rsparam[2] = 10;
2187 default_rsparam[3] = 500;
2188 default_rsparam[4] = 0;
2189 default_rsparam[5] = 0;
2190 default_rsparam[6] = 0;
2191
2192 // Chain statistics
2193 default_csparam[0] = 0;
2194 default_csparam[1] = 10;
2195 default_csparam[2] = 500;
2196 default_csparam[3] = 0;
2197 default_csparam[4] = 0;
2198 default_csparam[5] = 0;
2199
2200 // F(k,t) and S(q,w)
2201 default_skt_sets = FALSE;
2204 default_sqw_freq = 1000;
2205
2206 for (i=0; i<3; i++) default_opengl[i] = 0;
2208 default_opengl[4] = TRUE;
2209 // Material
2210 default_material.predefine = 4; // Plastic
2211 default_material.albedo = vec3(0.5, 0.5, 0.5);
2218
2219 // Lights
2220 default_lightning.lights = 3;
2221 if (default_lightning.spot)
2222 {
2223 for (i=0; i<default_lightning.lights; i++)
2224 {
2225 g_free (default_lightning.spot[i]);
2226 }
2227 g_free (default_lightning.spot);
2228 }
2229 default_lightning.spot = g_malloc0(3*sizeof*default_lightning.spot);
2230 default_lightning.spot[0] = init_light_source (0, 1.0);
2231 default_lightning.spot[1] = init_light_source (1, 1.0);
2232 default_lightning.spot[2] = init_light_source (2, 1.0);
2233
2234 // Fog
2235 default_fog.mode = 1;
2236 default_fog.based = 0;
2237 default_fog.density = 0.5;
2238 default_fog.depth[0] = 15.0;
2239 default_fog.depth[1] = 40.0;
2240 default_fog.color = vec3 (0.01f, 0.01f, 0.01f);
2241
2242 // Model
2243 default_clones = FALSE;
2244 default_cell = TRUE;
2245 for (i=0; i<5; i++)
2246 {
2247 default_o_at_rs[i] = default_o_at_rs[i+5] = FALSE;
2248 default_at_rs[i] = default_at_rs[i+5] = (i == 0 || i == 2) ? 0.5 : DEFAULT_SIZE;
2249 }
2250
2251 for (i=0; i<16; i++)
2252 {
2253 if (default_atomic_rad[i])
2254 {
2255 g_free (default_atomic_rad[i]);
2256 default_atomic_rad[i] = NULL;
2257 }
2258 }
2259 for (i=0; i<3; i++)
2260 {
2261 default_o_bd_rw[i] = default_o_bd_rw[i+3] = (i == 2) ? TRUE : FALSE;
2262 default_bd_rw[i] = default_bd_rw[i+3] = (i == 0) ? 0.5 : (i == 2) ? 0.1 : DEFAULT_SIZE;
2263 }
2264 for (i=0; i<6; i++)
2265 {
2266 if (default_bond_rad[i])
2267 {
2268 g_free (default_bond_rad[i]);
2269 default_bond_rad[i] = NULL;
2270 }
2271 }
2272 for (i=0; i<2; i++)
2273 {
2274 if (default_atom_color[i])
2275 {
2276 g_free (default_atom_color[i]);
2277 default_atom_color[i] = NULL;
2278 }
2279 if (default_label_color[i])
2280 {
2281 g_free (default_label_color[i]);
2282 default_label_color[i] = NULL;
2283 }
2284 }
2285 for (i=0; i<5; i++)
2286 {
2287 default_label[i].position = 1;
2288 default_label[i].render = BETTER_TEXT;
2289 default_label[i].scale = 0;
2290 for (j=0; j<3; j++) default_label[i].shift[j] = 0.0;
2291 default_label[i].n_colors = (i > 2) ? 1 : 0;
2292 if (default_label[i].n_colors)
2293 {
2294 default_label[i].color = g_malloc0(sizeof*default_label[i].color);
2295 default_label[i].color[0].red = 1.0;
2296 default_label[i].color[0].green = 1.0;
2297 default_label[i].color[0].blue = 1.0;
2298 default_label[i].color[0].alpha = 1.0;
2299 }
2300 default_label[i].font = (i > 2) ? g_strdup_printf ("FreeMono Bold 18") : g_strdup_printf ("Sans Bold 12");
2301 default_label[i].list = NULL;
2302 }
2303 for (i=0; i<2; i++)
2304 {
2306 default_mtilt[i] = TRUE;
2307 default_mpattern[i] = 0;
2308 default_mfactor[i] = 1;
2309 default_mwidth[i] = 1.0;
2310 }
2311
2312 default_box.box = WIREFRAME;
2313 default_box.color.red = 0.0;
2314 default_box.color.green = 1.0;
2315 default_box.color.blue = 0.0;
2316 default_box.color.alpha = 1.0;
2318 default_box.rad = 0.05;
2319
2320 // Representation
2321
2322 // Background color
2323 default_background.color.red = 0.0;
2324 default_background.color.green = 0.0;
2325 default_background.color.blue = 0.0;
2326 default_background.color.alpha = 1.0;
2327 default_background.gradient = 2;
2328 default_background.direction = 8;
2329 default_background.position = 0.5;
2330 default_background.gradient_color[0].red = 0.0;
2331 default_background.gradient_color[0].green = 0.01;
2332 default_background.gradient_color[0].blue = 0.21;
2333 default_background.gradient_color[0].alpha = 1.0;
2334 default_background.gradient_color[1].red = 0.0;
2335 default_background.gradient_color[1].green = 0.0;
2336 default_background.gradient_color[1].blue = 0.0;
2337 default_background.gradient_color[1].alpha = 1.0;
2338
2340 default_rep.proj = -1;
2341 default_rep.zoom = ZOOM;
2342 default_rep.c_angle[0] = - CAMERA_ANGLE_X;
2343 default_rep.c_angle[1] = - CAMERA_ANGLE_Y;
2344 for (i=0; i<2; i++) default_rep.c_shift[i] = 0.0;
2345 default_rep.gnear = 6.0;
2346
2347 // Axis
2348 default_axis.axis = NONE;
2350 default_axis.rad = 0.1;
2351 default_axis.t_pos = BOTTOM_RIGHT;
2352 default_axis.length = 2.0*DEFAULT_SIZE;
2353 default_axis.c_pos[0] = default_axis.c_pos[1] = 50.0;
2354 default_axis.c_pos[2] = 0.0;
2355 default_axis.title[0] = "x";
2356 default_axis.title[1] = "y";
2357 default_axis.title[2] = "z";
2358 if (default_axis.color) g_free (default_axis.color);
2359 default_axis.color = NULL;
2360
2361 // Selection color
2362 default_sel_color[0].red = 0.0;
2363 default_sel_color[0].green = 1.0;
2364 default_sel_color[0].blue = 1.0;
2365 default_sel_color[0].alpha = DEFAULT_OPACITY*0.75;
2366 // Selection color - edition mode
2367 default_sel_color[1].red = 1.0;
2368 default_sel_color[1].green = 0.00;
2369 default_sel_color[1].blue = 0.84;
2370 default_sel_color[1].alpha = DEFAULT_OPACITY*0.75;
2371}
2372
2394
2405GtkWidget * pref_list (gchar * mess[2], int nelem, gchar * mlist[nelem][2], gchar * end)
2406{
2407 gchar * str;
2408 GtkWidget * vbox = create_vbox (BSEP);
2409 GtkWidget * vvbox = create_vbox (BSEP);
2410 GtkWidget * hbox;
2411 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label(_(mess[0]), -1, -1, 0.5, 0.5), FALSE, FALSE, 5);
2412 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, markup_label(_(mess[1]), -1, -1, 0.5, 0.5), FALSE, FALSE, 0);
2413 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 20);
2414 int i;
2415 for (i=0; i<nelem; i++)
2416 {
2417 hbox = create_hbox (BSEP);
2418 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
2419 str = g_strdup_printf ("<b>%s</b>", _(mlist[i][0]));
2420 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 120, -1, 0.0, 0.5), FALSE, FALSE, 5);
2421 g_free (str);
2422 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(":", -1, -1, 1.0, 0.5), FALSE, FALSE, 0);
2423 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(mlist[i][1]), -1, -1, 0.0, 0.5), FALSE, FALSE, 10);
2424 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2425 }
2426 if (end)
2427 {
2428 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_(end), -1, -1, 0.5, 0.5), FALSE, FALSE, 20);
2429 }
2430 return vbox;
2431}
2432
2441G_MODULE_EXPORT void set_measures (GtkComboBox * box, gpointer data)
2442{
2443 int i, j;
2444 i = GPOINTER_TO_INT (data);
2445 j = combo_get_active ((GtkWidget *)box);
2446 if (i)
2447 {
2450 }
2451 else
2452 {
2455 }
2456}
2457
2466G_MODULE_EXPORT void set_selection_color (GtkColorChooser * colob, gpointer data)
2467{
2468 int i = GPOINTER_TO_INT (data);
2469 tmp_sel_color[i] = get_button_color (colob);
2470}
2471
2477GtkWidget * view_preferences ()
2478{
2479 GtkWidget * notebook = gtk_notebook_new ();
2480 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
2481 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
2482 GtkWidget * vbox = create_vbox (BSEP);
2483 gchar * info[2] = {i18n("The <b>View</b> tab regroups representation options"),
2484 i18n("which effect apply to the general aspect of the model:")};
2485 gchar * m_list[3][2] = {{i18n("Representation"), i18n("scene set-up and orientation")},
2486 {i18n("Axis"), i18n("axis options")},
2487 {i18n("Tools"), i18n("measures and selections option")}};
2488 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 30, 0.0, 0.0), FALSE, FALSE, 0);
2489 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, NULL), FALSE, FALSE, 30);
2490
2491 pref_gradient_win = g_malloc0(sizeof*pref_gradient_win);
2492 gradient_advanced (NULL, NULL);
2493 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_gradient_win -> win, FALSE, FALSE, 5);
2494
2495 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
2496
2497 // Tab for representation
2498 pref_rep_win = g_malloc0(sizeof*pref_rep_win);
2499 representation_advanced (NULL, NULL);
2500 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_rep_win -> win, gtk_label_new (_("Representation")));
2501
2502 // Axis
2503 pref_axis_win = g_malloc0(sizeof*pref_axis_win);
2504 axis_advanced (NULL, NULL);
2505 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_axis_win -> win, gtk_label_new (_("Axis")));
2506
2507 // Measures
2508 vbox = create_vbox (BSEP);
2509 GtkWidget * hbox;
2510 hbox = adv_box (vbox, _("<b>Select measure type</b>"), 5, 120, 0.0);
2512 combo_text_append (meas_combo, _("Standard"));
2513 combo_text_append (meas_combo, _("Edition mode"));
2515 g_signal_connect (G_OBJECT(meas_combo), "changed", G_CALLBACK(set_measures), GINT_TO_POINTER(0));
2516 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, meas_combo , FALSE, FALSE, 40);
2517 int i;
2518 for (i=0; i<2; i++)
2519 {
2520 meas_box[i] = create_vbox (BSEP);
2521 hbox = create_hbox (BSEP);
2522 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, labels_tab(NULL, i+3), FALSE, FALSE, 60);
2523 add_box_child_start (GTK_ORIENTATION_VERTICAL, meas_box[i], hbox, FALSE, FALSE, 5);
2524 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, meas_box[i], FALSE, FALSE, 0);
2525 }
2526
2527 hbox = adv_box (vbox, _("<b>Select selection type</b>"), 15, 120, 0.0);
2529 combo_text_append (sel_combo, _("Standard"));
2530 combo_text_append (sel_combo, _("Edition mode"));
2532 g_signal_connect (G_OBJECT(sel_combo), "changed", G_CALLBACK(set_measures), GINT_TO_POINTER(1));
2533 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sel_combo , FALSE, FALSE, 40);
2534 GtkWidget * hhbox, * vvbox;
2535 for (i=0; i<2; i++)
2536 {
2537 sel_box[i] = create_vbox (BSEP);
2538 hbox = create_hbox (BSEP);
2539 vvbox = create_hbox (BSEP);
2540 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vvbox, FALSE, FALSE, 60);
2541 hhbox = abox (vvbox, _("Color"), 0);
2542 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);
2543 add_box_child_start (GTK_ORIENTATION_VERTICAL, sel_box[i], hbox, FALSE, FALSE, 5);
2544 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, sel_box[i], FALSE, FALSE, 0);
2545 }
2546
2547 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("Tools")));
2548
2549 show_the_widgets (notebook);
2550
2551 return notebook;
2552}
2553
2557GtkWidget * pref_tree;
2559GtkWidget * edit_scrol;
2560GtkWidget * edit_colob;
2562
2563#ifdef GTK4
2572G_MODULE_EXPORT void toggled_default_stuff (GtkCheckButton * but, gpointer data)
2573#else
2582G_MODULE_EXPORT void toggled_default_stuff (GtkToggleButton * but, gpointer data)
2583#endif
2584{
2585 int status = button_get_status ((GtkWidget *)but);
2586 int object = GPOINTER_TO_INT(data);
2587 switch (object)
2588 {
2589 case 0:
2591 break;
2592 case 1:
2593 tmp_cell = status;
2594 break;
2595 default:
2596 if (object < 0)
2597 {
2598 // Bonds
2599 tmp_o_bd_rw[-object-2] = status;
2601 }
2602 else if (object < 100)
2603 {
2604 tmp_o_at_rs[object-2] = status;
2606 }
2607 else
2608 {
2611 ColRGBA col;
2612 col.red = col.green = col.blue = col.alpha = 1.0;
2613 if (status)
2614 {
2615 tmp_color = g_malloc0(sizeof*tmp_color);
2616 tmp_color -> red = tmp_color -> green = tmp_color -> blue = tmp_color -> alpha = 1.0;
2617 }
2618 else
2619 {
2620 if (tmp_color) g_free (tmp_color);
2621 tmp_color = NULL;
2622 }
2623 GdkRGBA rgb_col = colrgba_togtkrgba(col);
2624 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(edit_colob), & rgb_col);
2625 }
2626 break;
2627 }
2628}
2629
2638G_MODULE_EXPORT void set_default_stuff (GtkEntry * res, gpointer data)
2639{
2640 int i = GPOINTER_TO_INT(data);
2641 const gchar * m = entry_get_text (res);
2642 double value = string_to_double ((gpointer)m);
2643 if (i < 0)
2644 {
2645 // Bonds
2646 tmp_bd_rw[-i-2] = value;
2647 }
2648 else
2649 {
2650 tmp_at_rs[i-2] = value;
2651 }
2652 update_entry_double (res, value);
2653}
2654
2663{
2664 if (! old_list) return NULL;
2665 element_radius * new_list = g_malloc0(sizeof*new_list);
2666 element_radius * tmp_rad, * tmp_rbd;
2667 tmp_rad = old_list;
2668 tmp_rbd = new_list;
2669 while (tmp_rad)
2670 {
2671 tmp_rbd -> Z = tmp_rad -> Z;
2672 tmp_rbd -> rad = tmp_rad -> rad;
2673 if (tmp_rad -> next)
2674 {
2675 tmp_rbd -> next = g_malloc0(sizeof*tmp_rbd -> next);
2676 tmp_rbd -> next -> prev = tmp_rbd;
2677 tmp_rbd = tmp_rbd -> next;
2678 }
2679 tmp_rad = tmp_rad -> next;
2680 }
2681 return new_list;
2682}
2683
2694float get_radius (int object, int col, int z, element_radius * rad_list)
2695{
2696 element_radius * tmp_rad = rad_list;
2697 int ft;
2698 while (tmp_rad)
2699 {
2700 if (tmp_rad -> Z == z)
2701 {
2702 user_defined = TRUE;
2703 return tmp_rad -> rad;
2704 }
2705 tmp_rad = tmp_rad -> next;
2706 }
2707 if (object < 0)
2708 {
2709 object = - object - 2;
2710 // Bonds
2711 if (object == 0 || object == 3)
2712 {
2713 if (z < 119)
2714 {
2715 ft = 0;
2716 return set_radius_ (& z, & ft) / 4.0;
2717 }
2718 }
2719 else
2720 {
2721 return DEFAULT_SIZE;
2722 }
2723 }
2724 else
2725 {
2726 object -= 2;
2727 if (object == 2 || object == 7 || col)
2728 {
2729 ft = col;
2730 if (z < 119)
2731 {
2732 return set_radius_ (& z, & ft);
2733 }
2734 }
2735 else if (object == 1 || object == 4 || object == 6 || object == 9)
2736 {
2737 // Dots
2738 return DEFAULT_SIZE;
2739 }
2740 else if (object == 0 || object == 3 || object == 5 || object == 8)
2741 {
2742 ft = 0;
2743 return set_radius_ (& z, & ft) / 2.0;
2744 }
2745 }
2746 return 0.0;
2747}
2748
2757{
2758 if (! old_list) return NULL;
2759 element_color * new_list = g_malloc0(sizeof*new_list);
2760 element_color * tmp_rad, * tmp_rbd;
2761 tmp_rad = old_list;
2762 tmp_rbd = new_list;
2763 while (tmp_rad)
2764 {
2765 tmp_rbd -> Z = tmp_rad -> Z;
2766 tmp_rbd -> col = tmp_rad -> col;
2767 if (tmp_rad -> next)
2768 {
2769 tmp_rbd -> next = g_malloc0(sizeof*tmp_rbd -> next);
2770 tmp_rbd -> next -> prev = tmp_rbd;
2771 tmp_rbd = tmp_rbd -> next;
2772 }
2773 tmp_rad = tmp_rad -> next;
2774 }
2775 return new_list;
2776}
2777
2787{
2788 element_color * tmp_col = clist;
2789 while (tmp_col)
2790 {
2791 if (tmp_col -> Z == z)
2792 {
2793 user_defined = TRUE;
2794 return tmp_col -> col;
2795 }
2796 tmp_col = tmp_col -> next;
2797 }
2798 return set_default_color (z);
2799}
2800
2811G_MODULE_EXPORT void edit_pref (GtkCellRendererText * cell, gchar * path_string, gchar * new_text, gpointer user_data)
2812{
2813 int col = GPOINTER_TO_INT(user_data);
2814 GtkTreeModel * pref_model = gtk_tree_view_get_model(GTK_TREE_VIEW(pref_tree));
2815 GtkTreeIter row;
2816 gtk_tree_model_get_iter_from_string (pref_model, & row, path_string);
2817 int z;
2818 float val = string_to_double ((gpointer)new_text);
2819 gtk_tree_model_get (pref_model, & row, 3, & z, -1);
2820 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, col+4, val, -1);
2821 gboolean add_elem = FALSE;
2822 gboolean remove_elem = FALSE;
2823 element_radius * tmp_list;
2824 int col_val[4] = {1, 3, 5, 10};
2825 float v = get_radius (the_object, col, z, NULL);
2826 if (edit_list[col])
2827 {
2828 tmp_list = edit_list[col];
2829 add_elem = TRUE;
2830 while (tmp_list)
2831 {
2832 if (tmp_list -> Z == z)
2833 {
2834 tmp_list -> rad = val;
2835 if (val == v)
2836 {
2837 remove_elem = TRUE;
2838 if (tmp_list -> next)
2839 {
2840 if (tmp_list -> prev)
2841 {
2842 tmp_list -> prev -> next = tmp_list -> next;
2843 tmp_list -> next -> prev = tmp_list -> prev;
2844 }
2845 else
2846 {
2847 edit_list[col] = tmp_list -> next;
2848 edit_list[col] -> prev = NULL;
2849 }
2850 }
2851 else if (tmp_list -> prev)
2852 {
2853 edit_list[col] -> rad = tmp_list -> rad;
2854 edit_list[col] -> Z = tmp_list -> Z;
2855 edit_list[col] -> prev = NULL;
2856 }
2857 else
2858 {
2859 g_free (edit_list[col]);
2860 edit_list[col] = NULL;
2861 }
2862 add_elem = FALSE;
2863 }
2864 else
2865 {
2866 add_elem = FALSE;
2867 }
2868 }
2869 tmp_list = tmp_list -> next;
2870 }
2871 }
2872 else if (val != v)
2873 {
2874 add_elem = TRUE;
2875 }
2876
2877 if (add_elem)
2878 {
2879 if (edit_list[col])
2880 {
2881 tmp_list = edit_list[col];
2882 while (tmp_list)
2883 {
2884 if (! tmp_list -> next) break;
2885 tmp_list = tmp_list -> next;
2886 }
2887 tmp_list -> next = g_malloc0(sizeof*tmp_list -> next);
2888 tmp_list -> next -> prev = tmp_list;
2889 tmp_list = tmp_list -> next;
2890 }
2891 else
2892 {
2893 edit_list[col] = g_malloc0(sizeof*edit_list[col]);
2894 tmp_list = edit_list[col];
2895 }
2896 tmp_list -> Z = z;
2897 tmp_list -> rad = val;
2898 gtk_tree_model_get (pref_model, & row, 0, & z, -1);
2899 if (! z)
2900 {
2901 z = col_val[col];
2902 }
2903 else
2904 {
2905 int a, b, c, d;
2906 a = z / 10;
2907 b = (z - a * 10) / 5;
2908 c = (z - a * 10 - b * 5) / 3;
2909 d = z - a * 10 - b * 5 - c * 3;
2910 z = 0;
2911 if (a || col == 3) z += 10;
2912 if (b || col == 2) z += 5;
2913 if (c || col == 1) z += 3;
2914 if (d || col == 0) z += 1;
2915 }
2916 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, 0, z, -1);
2917 }
2918 else if (remove_elem)
2919 {
2920 gtk_tree_model_get (pref_model, & row, 0, & z, -1);
2921 z -= col_val[col];
2922 gtk_list_store_set (GTK_LIST_STORE(pref_model), & row, 0, z, -1);
2923 }
2924}
2925
2935G_MODULE_EXPORT void edit_chem_preferences (GtkDialog * edit_chem, gint response_id, gpointer data)
2936{
2937 int i, j, k, l;
2938 int object = GPOINTER_TO_INT (data);
2939 gboolean do_style = (object < 100) ? TRUE : FALSE;
2940 gboolean do_label = (object == 1000 || object == 1001) ? TRUE : FALSE;
2941 switch (response_id)
2942 {
2943 case GTK_RESPONSE_APPLY:
2944 if (do_style)
2945 {
2946 if (object < 0)
2947 {
2948 object = - object - 2;
2949 if (tmp_bond_rad[object]) g_free (tmp_bond_rad[object]);
2951 }
2952 else
2953 {
2954 j = (object == 4 || object == 9) ? 4 : 1;
2955 k = (object < 5) ? 7 : 5;
2956 object = object - 2;
2957 for (i=0; i<j; i++)
2958 {
2959 l = (i) ? 1 : 0;
2960 if (tmp_atomic_rad[object+l*k+i]) g_free (tmp_atomic_rad[object+l*k+i]);
2962 }
2963 }
2964 }
2965 else if (do_label)
2966 {
2967 object -= 1000;
2968 if (tmp_label_color[object]) g_free (tmp_label_color[object]);
2970 if (tmp_color)
2971 {
2972 if (! tmp_label[object] -> color) tmp_label[object] -> color = g_malloc0(sizeof*tmp_label[object] -> color);
2973 tmp_label[object] -> color[0] = * tmp_color;
2974 tmp_label[object] -> n_colors = 1;
2975 }
2976 }
2977 else
2978 {
2979 object -= 100;
2980 if (tmp_atom_color[object]) g_free (tmp_atom_color[object]);
2982 }
2983 break;
2984 default:
2985 if (do_style)
2986 {
2987 j = (object < 0) ? 1 : (object == 4 || object == 9) ? 4 : 1;
2988 for (i=0; i<j; i++)
2989 {
2990 if (edit_list[i])
2991 {
2992 g_free (edit_list[i]);
2993 edit_list[i] = NULL;
2994 }
2995 }
2996 g_free (edit_list);
2997 edit_list = NULL;
2998 }
2999 else
3000 {
3001 g_free (color_list);
3002 color_list = NULL;
3003 }
3004 break;
3005 }
3006 if (tmp_color) g_free (tmp_color);
3007 tmp_color = NULL;
3009}
3010
3022void color_set_color (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
3023{
3024 int z;
3025 gtk_tree_model_get (mod, iter, 3, & z, -1);
3026 GdkRGBA colo = colrgba_togtkrgba (get_spec_color (z, color_list));
3027 if (tmp_color) colo.alpha = 0.5;
3028 g_object_set (renderer, "background-rgba", & colo, "background-set", TRUE, NULL);
3029}
3030
3042void radius_set_color_and_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
3043{
3044 int cid = GPOINTER_TO_INT (data);
3045 int vid;
3046 gtk_tree_model_get (mod, iter, 0, & vid, -1);
3047 gboolean docol = FALSE;
3048 switch (vid)
3049 {
3050 case 1:
3051 docol = (cid == 0) ? TRUE : FALSE;
3052 break;
3053 case 3:
3054 docol = (cid == 1) ? TRUE : FALSE;
3055 break;
3056 case 5:
3057 docol = (cid == 2) ? TRUE : FALSE;
3058 break;
3059 case 10:
3060 docol = (cid == 3) ? TRUE : FALSE;
3061 break;
3062 case 4:
3063 docol = (cid == 0 || cid == 1) ? TRUE : FALSE;
3064 break;
3065 case 6:
3066 docol = (cid == 0 || cid == 2) ? TRUE : FALSE;
3067 break;
3068 case 8:
3069 docol = (cid == 1 || cid == 2) ? TRUE : FALSE;
3070 break;
3071 case 11:
3072 docol = (cid == 0 || cid == 3) ? TRUE : FALSE;
3073 break;
3074 case 13:
3075 docol = (cid == 1 || cid == 3) ? TRUE : FALSE;
3076 break;
3077 case 15:
3078 docol = (cid == 2 || cid == 3) ? TRUE : FALSE;
3079 break;
3080 case 9:
3081 docol = (cid != 3) ? TRUE : FALSE;
3082 break;
3083 case 14:
3084 docol = (cid != 2) ? TRUE : FALSE;
3085 break;
3086 case 16:
3087 docol = (cid != 1) ? TRUE : FALSE;
3088 break;
3089 case 18:
3090 docol = (cid != 0) ? TRUE : FALSE;
3091 break;
3092 case 19:
3093 docol = TRUE;
3094 break;
3095 }
3096 set_renderer_color (docol, renderer, init_color (cid, 4));
3097}
3098
3107gboolean are_identical_colors (ColRGBA col_a, ColRGBA col_b)
3108{
3109 if (col_a.red != col_b.red) return FALSE;
3110 if (col_a.green != col_b.green) return FALSE;
3111 if (col_a.blue != col_b.blue) return FALSE;
3112 if (col_a.alpha != col_b.alpha) return FALSE;
3113 return TRUE;
3114}
3115
3125G_MODULE_EXPORT void run_ac_color (GtkDialog * win, gint response_id, gpointer data)
3126{
3127 if (response_id == GTK_RESPONSE_OK)
3128 {
3129 ColRGBA colo = get_window_color (GTK_WIDGET(win));
3130 int i = GPOINTER_TO_INT (data);
3131 ColRGBA orig = set_default_color (i);
3132 gboolean add_elem;
3133 element_color * tmp_list;
3134 if (color_list)
3135 {
3136 tmp_list = color_list;
3137 add_elem = TRUE;
3138 while (tmp_list)
3139 {
3140 if (tmp_list -> Z == i)
3141 {
3142 tmp_list -> col = colo;
3143 if (are_identical_colors(colo, orig))
3144 {
3145 if (tmp_list -> next)
3146 {
3147 if (tmp_list -> prev)
3148 {
3149 tmp_list -> prev -> next = tmp_list -> next;
3150 tmp_list -> next -> prev = tmp_list -> prev;
3151 }
3152 else
3153 {
3154 color_list = tmp_list -> next;
3155 color_list -> prev = NULL;
3156 }
3157 }
3158 else if (tmp_list -> prev)
3159 {
3160 color_list -> col = tmp_list -> col;
3161 color_list -> Z = tmp_list -> Z;
3162 color_list -> prev = NULL;
3163 }
3164 else
3165 {
3166 g_free (color_list);
3167 color_list = NULL;
3168 }
3169 add_elem = FALSE;
3170 }
3171 else
3172 {
3173 add_elem = FALSE;
3174 }
3175 }
3176 tmp_list = tmp_list -> next;
3177 }
3178 }
3179 else if (! are_identical_colors(colo, orig))
3180 {
3181 add_elem = TRUE;
3182 }
3183 if (add_elem)
3184 {
3185 if (color_list)
3186 {
3187 tmp_list = color_list;
3188 while (tmp_list)
3189 {
3190 if (! tmp_list -> next) break;
3191 tmp_list = tmp_list -> next;
3192 }
3193 tmp_list -> next = g_malloc0(sizeof*tmp_list -> next);
3194 tmp_list -> next -> prev = tmp_list;
3195 tmp_list = tmp_list -> next;
3196 }
3197 else
3198 {
3199 color_list = g_malloc0(sizeof*color_list);
3200 tmp_list = color_list;
3201 }
3202 tmp_list -> Z = i;
3203 tmp_list -> col = colo;
3204 }
3205 }
3206 destroy_this_dialog (win);
3207}
3208
3220void color_button_event (GtkWidget * widget, double event_x, double event_y, guint event_button, gpointer data)
3221{
3222 if (event_button == 1)
3223 {
3224 GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
3225 GtkTreePath * path;
3226 GtkTreeViewColumn * column;
3227 int i, j;
3228#ifdef GTK4
3229 int e_x, e_y;
3230 gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW(widget), event_x, event_y, & e_x, & e_y);
3231 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), e_x, e_y, & path, & column, & i, & j))
3232#else
3233 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(widget), event_x, event_y, & path, & column, & i, & j))
3234#endif
3235 {
3236 if (g_strcmp0(_("Color"), gtk_tree_view_column_get_title (column)) == 0)
3237 {
3238 GtkTreeIter row;
3239 if (gtk_tree_model_get_iter (model, & row, path))
3240 {
3241 i = GPOINTER_TO_INT(data);
3242 gchar * obj[2]={_("atom"), _("clone")};
3243 int z;
3244 gtk_tree_model_get (model, & row, 3, & z, -1);
3245 gchar * str = g_strdup_printf (_("%s %s color"), periodic_table_info[z].lab, obj[i]);
3247 GtkWidget * win = gtk_color_chooser_dialog_new (str, GTK_WINDOW(atomes_main_window));
3248 gtk_window_set_modal (GTK_WINDOW(win), TRUE);
3249 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(win), TRUE);
3250 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(win), & col);
3251 g_free (str);
3252 run_this_gtk_dialog (win, G_CALLBACK(run_ac_color), GINT_TO_POINTER(z));
3253 }
3254 }
3255 }
3256 }
3257}
3258
3259#ifdef GTK4
3271G_MODULE_EXPORT void pref_color_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
3272{
3273 color_button_event (gtk_event_controller_get_widget ((GtkEventController*)gesture), x, y,
3274 gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), data);
3275}
3276#else
3286G_MODULE_EXPORT gboolean pref_color_button_event (GtkWidget * widget, GdkEvent * event, gpointer data)
3287{
3288 if (event -> type == GDK_BUTTON_PRESS)
3289 {
3290 GdkEventButton * bevent = (GdkEventButton*)event;
3291 color_button_event (widget, bevent -> x, bevent -> y, bevent -> button, data);
3292 }
3293 return FALSE;
3294}
3295#endif
3296
3305G_MODULE_EXPORT void set_stuff_color (GtkColorChooser * colob, gpointer data)
3306{
3307 * tmp_color = get_button_color (colob);
3308}
3309
3318G_MODULE_EXPORT void edit_species_parameters (GtkButton * but, gpointer data)
3319{
3320 gchar * ats[3]={_("atom(s)"), _("dot(s)"), _("sphere(s)")};
3321 gchar * dim[3]={_("radius"), _("size"), _("width")};
3322 gchar * bts[3]={_("bond(s)"), _("wireframe(s)"), _("cylinder(s)")};
3323 the_object = GPOINTER_TO_INT(data);
3324 int i, j, k, l, n, m;
3325 int aid, bid;
3326 int num_col;
3327 gchar * str;
3328 gboolean do_style = (the_object < 100) ? TRUE : FALSE;
3329 gboolean do_label = FALSE;
3330 if (do_style)
3331 {
3332 if (the_object < 0)
3333 {
3334 // Going for bonds
3335 aid = - the_object - 2;
3336 aid = (aid) > 2 ? aid - 3 : aid;
3337 bid = (the_object == -3 || the_object == -6) ? 2 : 0;
3338 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]);
3339 num_col = 5;
3340 }
3341 else
3342 {
3343 // Going for atoms
3344 aid = the_object - 2;
3345 aid = (aid == 0 || aid == 2 || aid == 5 || aid == 7) ? 0 : (aid == 1 || aid == 4 || aid == 6 || aid == 9) ? 1 : 2;
3346 bid = (the_object == 1 || the_object == 6) ? 1 : 0;
3347 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]);
3348 num_col = (the_object == 4 || the_object == 9) ? 8 : 5;
3349 }
3350 }
3351 else
3352 {
3353 // Going for colors
3354 if (the_object < 1000)
3355 {
3356 aid = the_object - 100;
3357 str = g_strdup_printf (_("Select %s color"), (aid) ? _("clone") : _("atom"));
3358 }
3359 else
3360 {
3361 aid = the_object - 1000;
3362 str = g_strdup_printf (_("Select %s label color"), (aid) ? _("clone") : _("atom"));
3363 do_label = TRUE;
3364 }
3365 num_col = 5;
3366 }
3367 edit_list = NULL;
3368 color_list = NULL;
3369 tmp_color = NULL;
3370 GtkWidget * win = dialog_cancel_apply (str, atomes_main_window, TRUE);
3371 g_free (str);
3372 gtk_window_set_default_size (GTK_WINDOW(win), (num_col == 8) ? 600 : 300, 600);
3373 GtkWidget * vbox = dialog_get_content_area (win);
3374 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};
3375 GType c_type[5] = {G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING};
3376 GtkTreeViewColumn * pref_col[num_col];
3377 GtkCellRenderer * pref_cel[num_col];
3378 GtkTreeSelection * pref_select;
3379 GtkListStore * pref_model;
3380 GtkTreeIter elem;
3381 if (do_style)
3382 {
3383 pref_model = gtk_list_store_newv (num_col, s_type);
3384 i = (the_object < 0) ? - the_object - 2 : the_object - 2;
3385 j = (num_col == 8) ? 4 : 1;
3386 k = ((the_object < 0 && i > 2) || (the_object > 0 && i > 4)) ? 1 : 0;
3387 edit_list = g_malloc0(j*sizeof*edit_list);
3388 for (l=0; l<j; l++)
3389 {
3390 if (the_object < 0)
3391 {
3393 }
3394 else
3395 {
3396 m = (k) ? 5 : 7;
3397 n = (l) ? 1 : 0;
3399 }
3400 }
3401 }
3402 else
3403 {
3404 pref_model = gtk_list_store_newv (num_col, c_type);
3406 }
3407
3408 for (i=1; i<119; i++)
3409 {
3410 user_defined = FALSE;
3411 gtk_list_store_append (pref_model, & elem);
3412 if (do_style)
3413 {
3414 gtk_list_store_set (pref_model, & elem, 0, user_defined,
3415 1, periodic_table_info[i].name,
3417 3, periodic_table_info[i].Z,
3418 4, get_radius (the_object, 0, i, edit_list[0]), -1);
3419 if (num_col == 8)
3420 {
3421 j = user_defined;
3422 user_defined = FALSE;
3423 gtk_list_store_set (pref_model, & elem, 5, get_radius (the_object, 1, i, edit_list[1]), -1);
3424 j += (user_defined) ? 3 : 0;
3425 user_defined = FALSE;
3426 gtk_list_store_set (pref_model, & elem, 6, get_radius (the_object, 2, i, edit_list[2]), -1);
3427 j += (user_defined) ? 5 : 0;
3428 user_defined = FALSE;
3429 gtk_list_store_set (pref_model, & elem, 7, get_radius (the_object, 3, i, edit_list[3]), -1);
3430 j += (user_defined) ? 10 : 0;
3431 user_defined = FALSE;
3432 gtk_list_store_set (pref_model, & elem, 0, j, -1);
3433 }
3434 }
3435 else
3436 {
3437 gtk_list_store_set (pref_model, & elem, 0, user_defined,
3438 1, periodic_table_info[i].name,
3440 3, periodic_table_info[i].Z,
3441 4, NULL, -1);
3442 }
3443 }
3444
3445 pref_tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(pref_model));
3446 gchar * name[3] = {_("Element"), _("Symbol"), "Z"};
3447 gchar * g_name[3] = {_("Radius"), _("Size"), _("Width")};
3448 gchar * f_name[4] = {_("Covalent [1]"),_("Ionic [2]"),"van der Waals [3]", _("Crystal [4,5]")};
3449 for (i=0; i<num_col; i++)
3450 {
3451 pref_cel[i] = gtk_cell_renderer_text_new();
3452 if (i > 3)
3453 {
3454 if (do_style)
3455 {
3456 g_object_set (pref_cel[i], "editable", TRUE, NULL);
3457 gtk_cell_renderer_set_alignment (pref_cel[i], 0.5, 0.5);
3458 g_signal_connect (G_OBJECT(pref_cel[i]), "edited", G_CALLBACK(edit_pref), GINT_TO_POINTER(i-4));
3459 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);
3460 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);
3461 }
3462 else
3463 {
3464 gtk_cell_renderer_set_alignment (pref_cel[i], 0.5, 0.5);
3465 pref_col[i] = gtk_tree_view_column_new_with_attributes(_("Color"), pref_cel[i], "text", i, NULL);
3466 gtk_tree_view_column_set_cell_data_func (pref_col[i], pref_cel[i], color_set_color, NULL, NULL);
3467 }
3468 }
3469 else if (i)
3470 {
3471 pref_col[i] = gtk_tree_view_column_new_with_attributes(name[i-1], pref_cel[i], "text", i, NULL);
3472 gtk_tree_view_column_set_alignment (pref_col[i], 0.5);
3473 gtk_tree_view_column_set_resizable (pref_col[i], TRUE);
3474 gtk_tree_view_column_set_min_width (pref_col[i], 50);
3475 }
3476 else
3477 {
3478 pref_col[i] = gtk_tree_view_column_new_with_attributes("", pref_cel[i], "text", i, NULL);
3479 gtk_tree_view_column_set_visible (pref_col[i], FALSE);
3480 }
3481 gtk_tree_view_append_column(GTK_TREE_VIEW(pref_tree), pref_col[i]);
3482 }
3483 g_object_unref (pref_model);
3484 pref_select = gtk_tree_view_get_selection (GTK_TREE_VIEW(pref_tree));
3485 gtk_tree_selection_set_mode (pref_select, GTK_SELECTION_SINGLE);
3486 gtk_tree_view_expand_all (GTK_TREE_VIEW(pref_tree));
3487
3488#ifdef GTK3
3489 g_signal_connect (G_OBJECT(pref_tree), "button_press_event", G_CALLBACK(pref_color_button_event), GINT_TO_POINTER(aid));
3490#else
3491 add_widget_gesture_and_key_action (pref_tree, "pref-context-click", G_CALLBACK(pref_color_button_pressed), GINT_TO_POINTER(aid),
3492 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
3493#endif
3494
3495 edit_scrol = create_scroll (vbox, -1, 570, GTK_SHADOW_ETCHED_IN);
3497 if (! do_label)
3498 {
3499 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);
3500 if (num_col == 8)
3501 {
3502 gchar * legend={_("\n<sub>[1] B. Cordero and al. <i>Dalton Trans</i>, <b>213</b>:1112 (2008).</sub>\n"
3503 "<sub>[2] Slater. <i>J. Chem. Phys.</i>, <b>41</b>:3199 (1964).</sub>\n"
3504 "<sub>[3] Bondi A. <i>J. Phys. Chem.</i>, <b>68</b>:441 (1964).</sub>\n"
3505 "<sub>[4] R.D. Shannon and C.T. Prewitt <i>Acta Cryst. B</i>, <b>25</b>:925-946 (1969).</sub>\n"
3506 "<sub>[5] R.D. Shannon <i>Acta Cryst. A</i>, <b>23</b>:751-767 (1976).</sub>")};
3507 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(legend, -1, 25, 0.0, 0.5), FALSE, FALSE, 0);
3508 }
3509 }
3510 else if (do_label)
3511 {
3512 gtk_widget_set_sensitive (edit_scrol, ! tmp_label[aid] -> n_colors);
3513 GtkWidget * vvbox = create_vbox (BSEP);
3514 GtkWidget * hbox = create_hbox (BSEP);
3515 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:")};
3516 for (i=0; i<2; i++)
3517 {
3518 hbox = create_hbox (BSEP);
3519 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(info[i], 300, -1, 0.5, 0.5), FALSE, FALSE, 5);
3520 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, hbox, FALSE, FALSE, 0);
3521 }
3522 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 10);
3523 hbox = create_hbox (BSEP);
3524 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(info[i], 300, -1, 0.5, 0.5), FALSE, FALSE, 5);
3525 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3526 hbox = create_hbox (BSEP);
3527 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);
3529 if (tmp_label[aid] -> n_colors)
3530 {
3531 tmp_color = g_malloc0(sizeof*tmp_color);
3532 * tmp_color = tmp_label[aid] -> color[0];
3533 active_col = tmp_label[aid] -> color[0];
3534 }
3535 active_col.red = active_col.green = active_col.blue = active_col.alpha = 1.0;
3536 edit_colob = color_button (active_col, TRUE, 100, -1, G_CALLBACK(set_stuff_color), tmp_color);
3537 widget_set_sensitive (edit_colob, tmp_label[aid] -> n_colors);
3538 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, edit_colob, FALSE, FALSE, 0);
3539 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3540 }
3541 run_this_gtk_dialog (win, G_CALLBACK(edit_chem_preferences), data);
3542}
3543
3552GtkWidget * over_param (int object, int style)
3553{
3554 GtkWidget * vbox = create_vbox (BSEP);
3555 GtkWidget * hbox = create_hbox (BSEP);
3556 int clone = ((object && style > 2) || (! object && style > 4)) ? 20 : 0;
3557 int mod = (object) ? -1 : 1;
3558 gboolean over = (! object) ? TRUE : (object && (style != 2 && style != 5)) ? TRUE : FALSE;
3559 gchar * leg;
3560 if (over)
3561 {
3562 hbox = create_hbox (BSEP);
3563 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3564 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);
3565 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3566 hbox = create_hbox (BSEP);
3567 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3568 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);
3569 }
3570 else
3571 {
3572 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 60+clone, -1, 0.0, 0.0), FALSE, FALSE, 0);
3573 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Set default value"), -1, -1, 0.0, 0.5), FALSE, FALSE, 10);
3574 }
3575 if (object)
3576 {
3577 bond_entry_over[style] = create_entry(G_CALLBACK(set_default_stuff), 100, 10, FALSE, GINT_TO_POINTER(mod*(style+2)));
3578 update_entry_double (GTK_ENTRY(bond_entry_over[style]), tmp_bd_rw[style]);
3579 if (over) widget_set_sensitive (bond_entry_over[style], tmp_o_bd_rw[style]);
3580 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, bond_entry_over[style], FALSE, FALSE, 0);
3581 leg = g_strdup_printf ("%s", (style == 1 || style == 4) ? "pts" : "&#xC5;");
3582 }
3583 else
3584 {
3585 atom_entry_over[style] = create_entry(G_CALLBACK(set_default_stuff), 100, 10, FALSE, GINT_TO_POINTER(mod*(style+2)));
3586 update_entry_double (GTK_ENTRY(atom_entry_over[style]), tmp_at_rs[style]);
3587 if (over) widget_set_sensitive (atom_entry_over[style], tmp_o_at_rs[style]);
3588 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, atom_entry_over[style], FALSE, FALSE, 0);
3589 leg = g_strdup_printf ("%s", (style == 1 || style == 6 || style == 4 || style == 9) ? "pts" : "&#xC5;");
3590 }
3591 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(leg, -1, -1, 0.0, 0.5), FALSE, FALSE, 5);
3592 g_free (leg);
3593 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3594 return vbox;
3595}
3596
3604GtkWidget * style_tab (int style)
3605{
3606 GtkWidget * vbox = create_vbox (BSEP);
3607 gchar * object[3]={i18n("<b>Atom(s)</b>"), i18n("<b>Bond(s)</b>"), i18n("\t<u>Clone(s)</u>")};
3608 gchar * dim[3]={i18n("Radius"), i18n("Size"), i18n("Width")};
3609 int i;
3610 int bsid;
3611 int lid;
3612 gchar * str;
3613 gboolean do_atoms = FALSE;
3614 gboolean do_bonds = FALSE;
3615 if (style == 0 || style == 1 || style == 2 || style == 3 || style == 5)
3616 {
3617 do_atoms = TRUE;
3618 }
3619 if (style == 0 || style == 1 || style == 4)
3620 {
3621 do_bonds = TRUE;
3622 bsid = (style == 4) ? 2 : style;
3623 }
3624 if (do_atoms)
3625 {
3626 lid = (style == 3) ? 2 : (style == 1 || style == 5) ? 1 : 0;
3627 for (i=0; i<2; i++)
3628 {
3629 adv_box (vbox, object[i*2], 10-5*i, 120, 0.0);
3630 str = g_strdup_printf ("\t%s", _(dim[(lid != 1) ? 0 : 1]));
3631 adv_box (vbox, str, 10, 120, 0.0);
3632 g_free (str);
3633 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, over_param (0, (style < 5) ? style+5*i : 4 + 5*i), FALSE, FALSE, 0);
3634 }
3635 }
3636 if (do_bonds)
3637 {
3638 // Bond(s) parameters
3639 for (i=0; i<2; i++)
3640 {
3641 adv_box (vbox, object[i+1], 10-5*i, 120, 0.0);
3642 str = g_strdup_printf ("\t%s", _(dim[(bsid != 1) ? 0 : 2]));
3643 adv_box (vbox, str, 10, 120, 0.0);
3644 g_free (str);
3645 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, over_param (1, bsid+3*i), FALSE, FALSE, 0);
3646 }
3647 }
3648
3649 return vbox;
3650}
3651
3657GtkWidget * model_preferences ()
3658{
3659 GtkWidget * notebook = gtk_notebook_new ();
3660 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
3661 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
3662 GtkWidget * vbox = create_vbox (BSEP);
3663 //GtkWidget * hbox;
3664 //GtkWidget * combo;
3665 gchar * info[2] = {i18n("The <b>Model</b> tab regroups atom(s), bond(s) and clone(s) options"),
3666 i18n("which effect apply when the corresponding <b>OpenGL</b> style is used:")};
3667 gchar * m_list[4][2] = {{i18n("Balls and Sticks"), i18n("atoms<sup>*</sup> and bonds radii")},
3668 {i18n("Wireframes"), i18n("dots<sup>**</sup> size and wireframes width")},
3669 {i18n("Spacefilled"), i18n("tabulated parameters")},
3670 {i18n("Cylinders"), i18n("bonds radii")}};
3671 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 30, 0.0, 0.0), FALSE, FALSE, 0);
3672 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 4, m_list, NULL), FALSE, FALSE, 0);
3673 gchar * other_info[2] = {i18n("It also provides options to customize atomic label(s),"), i18n("and, the model box, if any:")};
3674 gchar * o_list[2][2] = {{i18n("Labels"), i18n("atom labels")},
3675 {i18n("Box"), i18n("model box details")}};
3676 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (other_info, 2, o_list, NULL), FALSE, FALSE, 15);
3677 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 20, 0.0, 0.0), FALSE, FALSE, 0);
3678
3679 GtkWidget * hbox;
3680 gchar * obj[2] = {i18n("<b>Atoms</b>"), i18n("<b>Clones</b>")};
3681 int i;
3682 for (i=0; i<2; i++)
3683 {
3684 hbox = adv_box (vbox, _(obj[i]), 5, 150, 1.0);
3685 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);
3686 }
3687 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 5, 0.0, 0.0), FALSE, FALSE, 0);
3688 hbox = create_hbox (BSEP);
3689 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);
3690 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3691 hbox = create_hbox (BSEP);
3692 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);
3693 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3694 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 5, 0.0, 0.0), FALSE, FALSE, 0);
3695
3696 append_comments (vbox, "<sup>*</sup>", _("the same parameters are also used for the <b>spheres</b> style"));
3697 append_comments (vbox, "<sup>**</sup>", _("the same parameters are also used for the <b>dots</b> style"));
3698
3699 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
3700
3701 for (i=0; i<OGL_STYLES; i++)
3702 {
3703 if (i != 3 && i != 5) gtk_notebook_append_page (GTK_NOTEBOOK(notebook), style_tab (i), gtk_label_new (_(text_styles[i])));
3704 }
3705
3706 vbox = create_vbox (BSEP);
3707 GtkWidget * hhbox;
3708 for (i=0; i<2; i++)
3709 {
3710 hbox = adv_box (vbox, obj[i], 5, 120, 0.0);
3711 hbox = create_hbox (BSEP);
3712 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, labels_tab(NULL, i), FALSE, FALSE, 40);
3713 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
3714 hbox = create_hbox (BSEP);
3715 hhbox = create_hbox (BSEP);
3716 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
3717 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(_("Colors"), 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
3718 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);
3719 add_box_child_start (GTK_ORIENTATION_VERTICAL, hbox, hhbox, FALSE, FALSE, 40);
3720 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3721 }
3722 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("Labels")));
3723
3724 pref_box_win = g_malloc0(sizeof*pref_box_win);
3725 box_advanced (NULL, NULL);
3726 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pref_box_win -> win, gtk_label_new (_("Box")));
3727 show_the_widgets (notebook);
3728 return notebook;
3729}
3730
3739G_MODULE_EXPORT void set_default_style (GtkComboBox * box, gpointer data)
3740{
3741 GtkTreeIter iter;
3742 if (gtk_combo_box_get_active_iter (box, & iter))
3743 {
3744 GtkTreeModel * model = gtk_combo_box_get_model (box);
3745 int i;
3746 gtk_tree_model_get (model, & iter, 1, & i, -1);
3747 tmp_opengl[0] = (! i) ? 0 : i;
3748 }
3749}
3750
3756GtkTreeModel * style_combo_tree ()
3757{
3758 GtkTreeIter iter, iter2;
3759 GtkTreeStore * store;
3760 int i, j;
3761 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
3762 gtk_tree_store_append (store, & iter, NULL);
3763 gtk_tree_store_set (store, & iter, 0, _("f(atoms) <sup>*</sup>"), 1, 0, -1);
3764 for (i=0; i<OGL_STYLES; i++)
3765 {
3766 gtk_tree_store_append (store, & iter, NULL);
3767 gtk_tree_store_set (store, & iter, 0, _(text_styles[i]), 1, i+1, -1);
3768 if (i == SPACEFILL)
3769 {
3770 for (j=0; j<FILLED_STYLES; j++)
3771 {
3772 gtk_tree_store_append (store, & iter2, & iter);
3773 gtk_tree_store_set (store, & iter2, 0, _(text_filled[j]), 1, -j-1, -1);
3774 }
3775 }
3776 }
3777 return GTK_TREE_MODEL (store);
3778}
3779
3788G_MODULE_EXPORT void set_default_map (GtkComboBox * box, gpointer data)
3789{
3790 int i, j;
3791 i = combo_get_active ((GtkWidget *)box);
3792 j = GPOINTER_TO_INT(data);
3793 tmp_opengl[j+1] = i;
3794}
3795
3803GtkWidget * combo_map (int obj)
3804{
3805 GtkWidget * combo = create_combo ();
3806 combo_text_append (combo, _("Atomic Species"));
3807 combo_text_append (combo, _("Total Coordination(s)"));
3808 combo_text_append (combo, _("Partial Coordination(s)"));
3809 combo_set_active (combo, tmp_opengl[1+obj]);
3810 g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(set_default_map), GINT_TO_POINTER(obj));
3811 return combo;
3812}
3813
3820{
3821 GtkWidget * notebook = gtk_notebook_new ();
3822 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
3823 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
3824 GtkWidget * vbox = create_vbox (BSEP);
3825 GtkWidget * hbox;
3826 GtkWidget * combo;
3827
3828 // Creating an OpenGL edition data structure
3829 pref_ogl_edit = g_malloc0(sizeof*pref_ogl_edit);
3830 int i;
3831 for (i=0; i<6; i++)
3832 {
3833 pref_ogl_edit -> pointer[i].a = -1;
3834 pref_ogl_edit -> pointer[i].b = i;
3835 }
3836
3837 gchar * info[2] = {i18n("The <b>OpenGL</b> tab regroups rendering options"),
3838 i18n("use it to configure the OpenGL 3D scene:")};
3839 gchar * m_list[3][2] = {{i18n("Material"), i18n("aspect for atom(s) and bond(s)")},
3840 {i18n("Lights"), i18n("lightning of the scene")},
3841 {i18n("Fog"), i18n("atmosphere effects")}};
3842 gchar * end = i18n("It also offers to adjust the main visualization style and the color maps");
3843
3844 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, end), FALSE, FALSE, 30);
3845
3846 hbox = create_hbox (BSEP);
3847 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("<b>Style</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3848 GtkTreeModel * model = style_combo_tree ();
3849 combo = gtk_combo_box_new_with_model (model);
3850 g_object_unref (model);
3851 GtkCellRenderer * renderer = gtk_cell_renderer_combo_new ();
3852 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
3853 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "text", 0, NULL);
3854 combo_set_active (combo, tmp_opengl[0]);
3855 combo_set_markup (combo);
3856 g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(set_default_style), NULL);
3857 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 0);
3858 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3859 append_comments (vbox, "<sup>*</sup>", _("if 10 000 atoms or more: <b>Wireframes</b>, otherwise: <b>Balls and sticks</b>"));
3860
3861 hbox = create_hbox (BSEP);
3862 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("<b>Color maps</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3863 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 15);
3864 hbox = create_hbox (BSEP);
3865 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("\tatom(s) and bond(s)"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3866 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo_map(0), FALSE, FALSE, 0);
3867 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
3868
3869 hbox = create_hbox (BSEP);
3870 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (_("\tpolyhedra"), 250, -1, 0.0, 0.5), FALSE, FALSE, 15);
3871 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo_map(1), FALSE, FALSE, 0);
3872 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
3873
3875
3876 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
3877
3878 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), materials_tab (NULL, pref_ogl_edit, & tmp_material), gtk_label_new (_("Material")));
3879 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), lights_tab (NULL, pref_ogl_edit, & tmp_lightning), gtk_label_new (_("Lights")));
3880 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), fog_tab (NULL, pref_ogl_edit, & tmp_fog), gtk_label_new (_("Fog")));
3881
3882 gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), 0);
3883 return notebook;
3884}
3885
3894G_MODULE_EXPORT void set_default_num_delta (GtkEntry * res, gpointer data)
3895{
3896 int i = GPOINTER_TO_INT(data);
3897 const gchar * m = entry_get_text (res);
3898 double value = string_to_double ((gpointer)m);
3899 if (i == -1)
3900 {
3901 if (value > 0.0)
3902 {
3903 tmp_totcut = value;
3904 }
3906 }
3907 else if (i < 9)
3908 {
3909 if (value > 0) tmp_num_delta[i] = (int) value;
3911 if (i == 7 || i == 8)
3912 {
3913 update_entry_int (GTK_ENTRY(dyna_entry[(i == 7) ? 1 : 0][0]), tmp_num_delta[i]);
3915 }
3916 }
3917 else // delta_t
3918 {
3919 if (value > 0.0) tmp_delta_t[0] = value;
3921 update_entry_double (GTK_ENTRY(dyna_entry[(i == 9) ? 1 : 0][1]), tmp_delta_t[0]);
3923 }
3924}
3925
3934G_MODULE_EXPORT void tunit_changed (GtkComboBox * box, gpointer data)
3935{
3936 tmp_delta_t[1] = (double) combo_get_active ((GtkWidget *)box);
3937 int i = GPOINTER_TO_INT(data);
3938 combo_set_active (dyna_combo[(i == 7) ? 1 : 0], (int)tmp_delta_t[1]);
3940}
3941
3942GtkWidget * all_cut_box = NULL;
3943GtkWidget * cut_combo[2];
3944GtkWidget * pcut_box[2];
3945GtkWidget * tcut_entry = NULL;
3946GtkWidget * tcut_box = NULL;
3947GtkWidget * cut_comments = NULL;
3949
3958G_MODULE_EXPORT void totcut_changed (GtkComboBox * box, gpointer data)
3959{
3960 if (combo_get_active((GtkWidget *)box))
3961 {
3962 tmp_totcut = 2.0;
3964 }
3965 else
3966 {
3967 tmp_totcut = 0.0;
3969 }
3971}
3972
3981G_MODULE_EXPORT void edit_pc_value (GtkEntry * res, gpointer data)
3982{
3983 bond_cutoff * cut = (bond_cutoff *)data;
3984 const gchar * m = entry_get_text (res);
3985 double value = string_to_double ((gpointer)m);
3986 if (value > 0.0)
3987 {
3988 cut -> cutoff = value;
3989 }
3990 update_entry_double (res, cut -> cutoff);
3991}
3992
3993#ifdef GTK4
4002G_MODULE_EXPORT void toggled_use_cutoff (GtkCheckButton * but, gpointer data)
4003#else
4012G_MODULE_EXPORT void toggled_use_cutoff (GtkToggleButton * but, gpointer data)
4013#endif
4014{
4015 bond_cutoff * cut = (bond_cutoff *)data;
4016 cut -> use = button_get_status ((GtkWidget *)but);
4017}
4018
4025{
4026 GtkWidget * hbox;
4027 GtkWidget * entry;
4028
4029 int i;
4030 for (i=0; i<2; i++) pcut_box[i] = NULL;
4031 pcut_box[0] = create_vbox (BSEP);
4032 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, pcut_box[0], FALSE, FALSE, 10);
4033 if (cut_list)
4034 {
4035 hbox = create_hbox (BSEP);
4036 add_box_child_start (GTK_ORIENTATION_VERTICAL, pcut_box[0], hbox, FALSE, FALSE, 10);
4037 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B1;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 10);
4038 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B2;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 10);
4039 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);
4040 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Use <sup>*</sup>"), 20, -1, 0.5, 0.5), FALSE, FALSE, 10);
4041 }
4042 pcut_box[1] = create_vbox (BSEP);
4043 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, pcut_box[1], FALSE, FALSE, 10);
4044 bond_cutoff * tmp_cut = cut_list;
4045 while (tmp_cut)
4046 {
4047 hbox = create_hbox (BSEP);
4048 add_box_child_start (GTK_ORIENTATION_VERTICAL, pcut_box[1], hbox, FALSE, FALSE, 0);
4049 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);
4050 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);
4051 entry = create_entry (G_CALLBACK(edit_pc_value), 100, 10, FALSE, (gpointer)tmp_cut);
4052 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
4053 update_entry_double ((GtkEntry *)entry, tmp_cut -> cutoff);
4054 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);
4055 tmp_cut = tmp_cut -> next;
4056 }
4057
4060 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, cut_comments, FALSE, FALSE, 10);
4061 if (cut_list) append_comments (cut_comments, "<sup>*</sup>", _("Unused values will not be saved !"));
4062
4063 for (i=0; i<2; i++) combo_set_active (cut_combo[i], -1);
4065}
4066
4072gboolean not_in_cutoffs (int z_a, int z_b)
4073{
4074 bond_cutoff * tmp_cut = cut_list;
4075 while (tmp_cut)
4076 {
4077 if (tmp_cut -> Z[0] == z_a && tmp_cut -> Z[1] == z_b) return FALSE;
4078 tmp_cut = tmp_cut -> next;
4079 }
4080 return TRUE;
4081}
4082
4091G_MODULE_EXPORT void cut_spec_changed (GtkComboBox * box, gpointer data)
4092{
4093 int i, j, k, l;
4094 i = combo_get_active (cut_combo[0]);
4095 j = combo_get_active (cut_combo[1]);
4096 k = min (i+1, j+1);
4097 l = max (i+1, j+1);
4098 if (k && l)
4099 {
4100 if (not_in_cutoffs(k, l))
4101 {
4102 bond_cutoff * tmp_cut;
4103 if (! cut_list)
4104 {
4105 cut_list = g_malloc0(sizeof*cut_list);
4106 tmp_cut = cut_list;
4107 }
4108 else
4109 {
4110 tmp_cut = cut_list;
4111 while (tmp_cut -> next)
4112 {
4113 tmp_cut = tmp_cut -> next;
4114 }
4115 tmp_cut -> next = g_malloc0(sizeof*tmp_cut -> next);
4116 tmp_cut -> next -> prev = tmp_cut;
4117 tmp_cut = tmp_cut -> next;
4118 }
4119 tmp_cut -> Z[0] = min(k, l);
4120 tmp_cut -> Z[1] = max(k, l);
4121 tmp_cut -> use = FALSE;
4122 tmp_cut -> cutoff = 1.0;
4123 add_cut_box ();
4124 }
4125 }
4126}
4127
4136{
4137 bond_cutoff * new_cutoff = NULL;
4138 bond_cutoff * cut_a, * cut_b;
4139 cut_a = old_cutoff;
4140 while (cut_a)
4141 {
4142 if (cut_a -> use)
4143 {
4144 if (! new_cutoff)
4145 {
4146 new_cutoff = g_malloc0(sizeof*new_cutoff);
4147 cut_b = new_cutoff;
4148 }
4149 else
4150 {
4151 cut_b -> next = g_malloc0(sizeof*cut_b -> next);
4152 cut_b -> next -> prev = cut_b;
4153 cut_b = cut_b -> next;
4154 }
4155 cut_b -> Z[0] = cut_a -> Z[0];
4156 cut_b -> Z[1] = cut_a -> Z[1];
4157 cut_b -> use = cut_a -> use;
4158 cut_b -> cutoff = cut_a -> cutoff;
4159 }
4160 cut_a = cut_a -> next;
4161 }
4162 return new_cutoff;
4163}
4164
4174G_MODULE_EXPORT void edit_cutoffs (GtkDialog * edit_cuts, gint response_id, gpointer data)
4175{
4176 switch (response_id)
4177 {
4178 case GTK_RESPONSE_APPLY:
4180 break;
4181 }
4182 if (cut_list)
4183 {
4184 g_free (cut_list);
4185 cut_list = NULL;
4186 }
4187 int i;
4188 for (i=0; i<2; i++)
4189 {
4192 }
4195 destroy_this_widget ((GtkWidget *)edit_cuts);
4196}
4197
4206G_MODULE_EXPORT void set_cutoffs_default (GtkButton * but, gpointer data)
4207{
4208 GtkWidget * win = dialog_cancel_apply (_("Select partial cutoffs(s)"), atomes_main_window, TRUE);
4209 GtkWidget * vbox = dialog_get_content_area (win);
4210 GtkWidget * hbox = create_hbox (BSEP);
4211 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4213 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, all_cut_box, FALSE, FALSE, 50);
4215 hbox = create_hbox (BSEP);
4216 add_box_child_start (GTK_ORIENTATION_VERTICAL, all_cut_box, hbox, FALSE, FALSE, 5);
4217 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B1;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
4218 int i, j;
4219 for (i=0; i<2; i++)
4220 {
4221 cut_combo[i] = NULL;
4222 cut_combo[i] = create_combo ();
4223 for (j=1; j<119; j++)
4224 {
4226 }
4227 g_signal_connect(G_OBJECT(cut_combo[i]), "changed", G_CALLBACK(cut_spec_changed), NULL);
4229 }
4230 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, cut_combo[0], FALSE, FALSE, 5);
4231 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" ", 20, -1, 0.0, 0.5), FALSE, FALSE, 0);
4232 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Spec. &#x3B2;"), 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
4233 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, cut_combo[1], FALSE, FALSE, 5);
4234
4235 add_cut_box ();
4236
4237 run_this_gtk_dialog (win, G_CALLBACK(edit_cutoffs), NULL);
4238}
4239
4248void dyna_parameters (GtkWidget * vbox, int cid)
4249{
4250 gchar * default_leg[2] = {i18n("Step(s) between configurations"), i18n("Step(s) between conf.")};
4251 int wid = (cid == 7) ? 0 : 1;
4252 GtkWidget * hbox;
4253 hbox = create_hbox (BSEP);
4254 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);
4255 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));
4256 update_entry_int ((GtkEntry *)dyna_entry[wid][0], tmp_num_delta[cid]);
4257 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, dyna_entry[wid][0], FALSE, FALSE, (cid == 7) ? 0 : 10);
4258 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4259
4260 hbox = create_hbox (BSEP);
4261 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);
4262 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));
4263 update_entry_double ((GtkEntry *)dyna_entry[wid][1], tmp_delta_t[0]);
4264 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, dyna_entry[wid][1], FALSE, FALSE, (cid == 7) ? 0 : 10);
4265 dyna_combo[wid] = create_combo ();
4266 int i;
4267 for (i=0; i<5 ; i++) combo_text_append (dyna_combo[wid], untime[i]);
4268
4269 combo_set_active (dyna_combo[wid], (int)tmp_delta_t[1]);
4270 g_signal_connect(G_OBJECT(dyna_combo[wid]), "changed", G_CALLBACK(tunit_changed), GINT_TO_POINTER(cid));
4271 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, dyna_combo[wid], FALSE, FALSE, 0);
4272
4273 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4274}
4275
4281GtkWidget * calc_preferences ()
4282{
4283 GtkWidget * notebook = gtk_notebook_new ();
4284 GtkWidget * vbox;
4285 GtkWidget * hbox;
4286 gtk_notebook_set_scrollable (GTK_NOTEBOOK(notebook), TRUE);
4287 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
4288 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"),
4289 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°]"),
4290 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")};
4291 gchar * info[2] = {i18n("The <b>Analysis</b> tab regroups calculation options"),
4292 i18n("use it to setup your own default parameters:")};
4293 gchar * m_list[4][2] = {{i18n("Calculations"), i18n("most analysis options")},
4294 {i18n("Rings"), i18n("ring statistics options")},
4295 {i18n("Chains"), i18n("chain statistics options")},
4296 {"S(q,&#969;)", i18n("dynamic structure factor options")}};
4297
4298 vbox = create_vbox (BSEP);
4299 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, pref_list (info, 3, m_list, NULL), FALSE, FALSE, 20);
4300
4301 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);
4302 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);
4303 GtkWidget * vvbox = create_vbox (BSEP);
4304 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, vvbox, FALSE, FALSE, 10);
4305 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);
4306 edit_bonds (vbox);
4307 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);
4308
4309 hbox = create_hbox (BSEP);
4310 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4311 GtkWidget * 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>Total cutoff</b>"), 120, -1, 0.0, 0.5), FALSE, FALSE, 0);
4314 GtkWidget * combo = create_combo();
4315 combo_text_append (combo, _("Evaluated by <b>atomes</b>"));
4316 combo_text_append (combo, _("User Defined <sup>*</sup>"));
4317 combo_set_markup (combo);
4318 gtk_widget_set_size_request (combo, 180, -1);
4319 combo_set_active (combo, (tmp_totcut == 0.0) ? 0 : 1);
4320 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(totcut_changed), NULL);
4321 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, combo, FALSE, FALSE, 10);
4322
4324 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, tcut_box, FALSE, FALSE, 10);
4325 tcut_entry = create_entry (G_CALLBACK(set_default_num_delta), 100, 10, FALSE, GINT_TO_POINTER(-1));
4327 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, tcut_box, tcut_entry, FALSE, FALSE, 0);
4328 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, tcut_box, markup_label ("&#xC5;", -1, -1, 0.0, 0.5), FALSE, FALSE, 5);
4329
4330 hbox = create_hbox (BSEP);
4331 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
4332 hhbox = create_hbox (BSEP);
4333 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
4334 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(_("<b>Partial cutoff(s)</b>"), 120, -1, 0.0, 0.5), FALSE, FALSE, 0);
4335 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);
4336
4337 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(" ", -1, 20, 0.0, 0.0), FALSE, FALSE, 0);
4338 append_comments (vbox, "<sup>*</sup>", _("The highest this value is, the highest the number of neighbors around an atom."));
4339
4340 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("General")));
4341
4342 GtkWidget * entry;
4343 vbox = create_vbox (BSEP);
4344 int i;
4345 for (i=0; i<NUM_DELTA; i++)
4346 {
4347 if (i != 7 && i != 8)
4348 {
4349 hbox = create_hbox (BSEP);
4350 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);
4351 entry = create_entry (G_CALLBACK(set_default_num_delta), 110, 10, FALSE, GINT_TO_POINTER(i));
4352 update_entry_int ((GtkEntry *)entry, tmp_num_delta[i]);
4353 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 0);
4354 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4355 }
4356 }
4357 // MSD
4358 i = 7;
4359 hbox = create_hbox (BSEP);
4360 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);
4361 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
4362 dyna_parameters (vbox, i);
4363
4364 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new (_("Calculations")));
4365
4366 for (i=0; i<2; i++)
4367 {
4368 vbox = create_vbox (BSEP);
4369 search_type = i;
4370 calc_rings (vbox);
4371 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, gtk_label_new ((i) ? _("Chains") : _("Rings")));
4372 }
4373 /*vbox = create_vbox (BSEP);
4374 calc_sk_t (vbox);
4375 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, markup_label("S(q,&#969;)", -1, -1, 0.0, 0.5));*/
4376
4377 show_the_widgets (notebook);
4378 return notebook;
4379}
4380
4387{
4388 int i;
4389 if (tmp_num_delta)
4390 {
4391 g_free (tmp_num_delta);
4392 tmp_num_delta = NULL;
4393 }
4394 if (tmp_delta_t)
4395 {
4396 g_free (tmp_delta_t);
4397 tmp_delta_t = NULL;
4398 }
4399 if (tmp_rsparam)
4400 {
4401 g_free (tmp_rsparam);
4402 tmp_rsparam = NULL;
4403 }
4404 if (tmp_csparam)
4405 {
4406 g_free (tmp_csparam);
4407 tmp_csparam = NULL;
4408 }
4409 if (tmp_opengl)
4410 {
4411 g_free (tmp_opengl);
4412 tmp_opengl = NULL;
4413 }
4414 if (tmp_lightning.spot)
4415 {
4416 for (i=0; i<tmp_lightning.lights; i++)
4417 {
4418 g_free (tmp_lightning.spot[i]);
4419 }
4420 g_free (tmp_lightning.spot);
4421 tmp_lightning.spot = NULL;
4422 }
4423 if (tmp_o_at_rs)
4424 {
4425 g_free (tmp_o_at_rs);
4426 tmp_o_at_rs = NULL;
4427 }
4428 if (tmp_at_rs)
4429 {
4430 g_free (tmp_at_rs);
4431 tmp_at_rs = NULL;
4432 }
4433 if (tmp_o_bd_rw)
4434 {
4435 g_free (tmp_o_bd_rw);
4436 tmp_o_bd_rw = NULL;
4437 }
4438 if (tmp_bd_rw)
4439 {
4440 g_free (tmp_bd_rw);
4441 tmp_bd_rw = NULL;
4442 }
4443
4444 for (i=0; i<16; i++)
4445 {
4446 if (tmp_atomic_rad[i])
4447 {
4448 g_free (tmp_atomic_rad[i]);
4449 tmp_atomic_rad[i] = NULL;
4450 }
4451 }
4452 for (i=0; i<6; i++)
4453 {
4454 if (tmp_bond_rad[i])
4455 {
4456 g_free (tmp_bond_rad[i]);
4457 tmp_bond_rad[i] = NULL;
4458 }
4459 }
4460 for (i=0; i<2; i++)
4461 {
4462 if (tmp_atom_color[i])
4463 {
4464 g_free (tmp_atom_color[i]);
4465 tmp_atom_color[i] = NULL;
4466 }
4467 if (tmp_label_color[i])
4468 {
4469 g_free (tmp_label_color[i]);
4470 tmp_label_color[i] = NULL;
4471 }
4472 }
4473 for (i=0; i<5; i++)
4474 {
4475 if (tmp_label[i])
4476 {
4477 g_free (tmp_label[i]);
4478 tmp_label[i] = NULL;
4479 }
4480 }
4481 if (tmp_box)
4482 {
4483 g_free (tmp_box);
4484 tmp_box = NULL;
4485 }
4486 if (tmp_axis)
4487 {
4488 g_free (tmp_axis);
4489 tmp_axis = NULL;
4490 }
4491 if (tmp_rep)
4492 {
4493 g_free (tmp_rep);
4494 tmp_rep = NULL;
4495 }
4496}
4497
4506void duplicate_rep_data (rep_data * new_rep, rep_data * old_rep)
4507{
4508 new_rep -> rep = old_rep -> rep;
4509 new_rep -> proj = old_rep -> proj;
4510 new_rep -> zoom = old_rep -> zoom;
4511 new_rep -> gnear = old_rep -> gnear;
4512 int i;
4513 for (i=0; i<2; i++)
4514 {
4515 new_rep -> c_angle[i] = old_rep -> c_angle[i];
4516 new_rep -> c_shift[i] = old_rep -> c_shift[i];
4517 }
4518}
4519
4529{
4530 new_back -> gradient = old_back -> gradient;
4531 new_back -> direction = old_back -> direction;
4532 new_back -> position = old_back -> position;
4533 new_back -> color = old_back -> color;
4534 int i;
4535 for (i=0; i<2; i++)
4536 {
4537 new_back -> gradient_color[i] = old_back -> gradient_color[i];
4538 }
4539}
4540
4549void duplicate_box_data (box * new_box, box * old_box)
4550{
4551 new_box -> box = old_box -> box;
4552 new_box -> color = old_box -> color;
4553 new_box -> line = old_box -> line;
4554 new_box -> rad = old_box -> rad;
4555}
4556
4565void duplicate_axis_data (axis * new_axis, axis * old_axis)
4566{
4567 new_axis -> axis = old_axis -> axis;
4568 new_axis -> length = old_axis -> length;
4569 new_axis -> color = old_axis -> color;
4570 new_axis -> line = old_axis -> line;
4571 new_axis -> rad = old_axis -> rad;
4572 new_axis -> t_pos = old_axis -> t_pos;
4573 new_axis -> labels = old_axis -> labels;
4574 int i;
4575 for (i=0; i<3; i++)
4576 {
4577 new_axis -> c_pos[i] = old_axis -> c_pos[i];
4578 if (old_axis -> title[i]) new_axis -> title[i] = g_strdup_printf ("%s", old_axis -> title[i]);
4579 }
4580 if (old_axis -> color)
4581 {
4582 new_axis -> color = duplicate_color (3, old_axis -> color);
4583 }
4584}
4585
4592{
4593 clean_all_tmp ();
4599 // Ring statistics
4601 // Chain statistics
4603 // F(k,t) and S(q,w)
4608
4611 tmp_lightning.lights = default_lightning.lights;
4620 int i;
4621 for (i=0; i<16; i++)tmp_atomic_rad[i] = duplicate_element_radius (default_atomic_rad[i]);
4622 for (i=0; i<6; i++) tmp_bond_rad[i] = duplicate_element_radius (default_bond_rad[i]);
4623 for (i=0; i<2; i++)
4624 {
4627 }
4628 for (i=0; i<5; i++)
4629 {
4630 tmp_label[i] = g_malloc0(sizeof*tmp_label[i]);
4632 }
4633 for (i=0; i<2; i++)
4634 {
4636 tmp_mtilt[i] = default_mtilt[i];
4639 tmp_mwidth[i] = default_mwidth[i];
4640 }
4641
4642 tmp_box = g_malloc0(sizeof*tmp_box);
4644
4645 tmp_background = g_malloc0(sizeof*tmp_background);
4647
4648 tmp_rep = g_malloc0(sizeof*tmp_rep);
4650
4651 tmp_axis = g_malloc0(sizeof*tmp_axis);
4653
4654 for (i=0; i<2; i++) tmp_sel_color[i] = default_sel_color[i];
4655}
4656
4657gboolean * up_project;
4658
4668G_MODULE_EXPORT void update_projects (GtkDialog * proj_sel, gint response_id, gpointer data)
4669{
4670 int i, j, k, l;
4671 float * tmpcut;
4672 gboolean update_bonds;
4673 switch (response_id)
4674 {
4675 case GTK_RESPONSE_OK:
4676 // To write apply to opened projects
4677 for (i=0; i<nprojects; i++)
4678 {
4679 if (up_project[i])
4680 {
4681 project * this_proj = get_project_by_id(i);
4682 if (up_project[i+nprojects])
4683 {
4684 update_bonds = FALSE;
4685 l = this_proj -> nspec * this_proj -> nspec;
4686 tmpcut = allocfloat(l);
4687 l = 0;
4688 for (j=0; j<this_proj -> nspec; j++)
4689 {
4690 for (k=0; k<this_proj -> nspec; k++, l++)
4691 {
4692 tmpcut[l] = this_proj -> chemistry -> cutoffs[j][k];
4693 }
4694 }
4695 if (this_proj -> chemistry -> grtotcutoff != default_totcut) update_bonds = TRUE;
4696 }
4698 if (up_project[i+nprojects])
4699 {
4700 if (! update_bonds)
4701 {
4702 l = 0;
4703 for (j=0; j<this_proj -> nspec; j++)
4704 {
4705 for (k=0; k<this_proj -> nspec; k++, l++)
4706 {
4707 if (this_proj -> chemistry -> cutoffs[j][k] != tmpcut[l]) update_bonds = TRUE;
4708 }
4709 }
4710 }
4711 if (update_bonds)
4712 {
4713 if (this_proj -> modelgl -> rings)
4714 {
4715 this_proj -> modelgl -> rings = FALSE;
4716 for (j=0; j<5; j++)
4717 {
4718 clean_rings_data (j, this_proj -> modelgl);
4719#ifdef GTK3
4720 update_rings_menus (this_proj -> modelgl);
4721#endif
4722 }
4723 }
4724 if (this_proj -> modelgl -> chains)
4725 {
4726 clean_chains_data (this_proj -> modelgl);
4727#ifdef GTK3
4728 update_chains_menus (this_proj -> modelgl);
4729#endif
4730 }
4731 bonds_update = 1;
4732 frag_update = (this_proj -> natomes > ATOM_LIMIT) ? 0 : 1;
4733 mol_update = (frag_update) ? ((this_proj -> steps > STEP_LIMIT) ? 0 : 1) : 0;
4734 this_proj -> runc[0] = FALSE;
4735 this_proj -> dmtx = FALSE;
4736 if (this_proj -> id != activep)
4737 {
4738 k = activep;
4739 active_project_changed (this_proj -> id);
4740 on_calc_bonds_released (NULL, NULL);
4742 }
4743 else
4744 {
4745 update_project ();
4746 on_calc_bonds_released (NULL, NULL);
4747 }
4748 }
4749 }
4750 }
4751 }
4752 break;
4753 default:
4754 break;
4755 }
4756 g_free (up_project);
4757 up_project = NULL;
4758 destroy_this_dialog (proj_sel);
4759}
4760
4761#ifdef GTK4
4770G_MODULE_EXPORT void toggled_select_project (GtkCheckButton * but, gpointer data)
4771#else
4780G_MODULE_EXPORT void toggled_select_project (GtkToggleButton * but, gpointer data)
4781#endif
4782{
4783 up_project[GPOINTER_TO_INT(data)] = button_get_status ((GtkWidget *)but);
4784}
4785
4792{
4794 g_print ("default_instance = %d\n", default_instance);
4797 {
4798 g_free (default_bond_cutoff);
4799 default_bond_cutoff = NULL;
4800 }
4803 {
4804 g_free (default_num_delta);
4805 default_num_delta = NULL;
4806 }
4809 if (default_rsparam)
4810 {
4811 g_free (default_rsparam);
4812 default_rsparam = NULL;
4813 }
4815 if (default_csparam)
4816 {
4817 g_free (default_csparam);
4818 default_csparam = NULL;
4819 }
4821 if (default_opengl)
4822 {
4823 g_free (default_opengl);
4824 default_opengl = NULL;
4825 }
4830
4833 default_lightning.lights = tmp_lightning.lights;
4836
4837 // Model
4840 if (default_o_at_rs)
4841 {
4842 g_free (default_o_at_rs);
4843 default_o_at_rs = NULL;
4844 }
4846 if (default_at_rs)
4847 {
4848 g_free (default_at_rs);
4849 default_at_rs = NULL;
4850 }
4852 if (default_o_bd_rw)
4853 {
4854 g_free (default_o_bd_rw);
4855 default_o_bd_rw = NULL;
4856 }
4858 if (default_bd_rw)
4859 {
4860 g_free (default_bd_rw);
4861 default_bd_rw = NULL;
4862 }
4864 int i;
4865 for (i=0; i<16; i++)
4866 {
4867 if (default_atomic_rad[i]) g_free (default_atomic_rad[i]);
4869 }
4870 for (i=0; i<6; i++)
4871 {
4872 if (default_bond_rad[i]) g_free (default_bond_rad[i]);
4874 }
4875 for (i=0; i<2; i++)
4876 {
4877 if (default_atom_color[i]) g_free (default_atom_color[i]);
4879 if (default_label_color[i]) g_free (default_label_color[i]);
4881 }
4882 for (i=0; i<5; i++)
4883 {
4885 }
4886 for (i=0; i<2; i++)
4887 {
4889 default_mtilt[i] = tmp_mtilt[i];
4892 default_mwidth[i] = tmp_mwidth[i];
4893 }
4898
4899 for (i=0; i<2; i++) default_sel_color[i] = tmp_sel_color[i];
4900
4901 if (nprojects)
4902 {
4903 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))
4904 {
4905 // Select project here
4906 GtkWidget * proj_sel = message_dialogmodal (_("Project selection"), _("Select to apply preferences"), GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK, atomes_main_window);
4907 GtkWidget * vbox = dialog_get_content_area (proj_sel);
4908 GtkWidget * hbox;
4910 for (i=0; i<nprojects; i++)
4911 {
4912 hbox = create_hbox (BSEP);
4913 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
4914 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);
4915 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);
4916 }
4917 run_this_gtk_dialog (proj_sel, G_CALLBACK(update_projects), NULL);
4918 }
4919 }
4920}
4921
4928{
4929 int i;
4930 if (tmp_totcut == 0.0)
4931 {
4933 }
4934 else
4935 {
4937 }
4941 if (tmp_box -> box > NONE)
4942 {
4943 hide_the_widgets ((tmp_box -> box == WIREFRAME) ? pref_box_win -> radius_box : pref_box_win -> width_box);
4944 }
4945 hide_the_widgets ((tmp_axis -> axis == WIREFRAME) ? pref_axis_win -> radius_box : pref_axis_win -> width_box);
4946 for (i=0; i<2; i++) widget_set_sensitive (pref_axis_win -> axis_label_box[i], tmp_axis -> labels);
4949 i = (i < 0) ? 0 : i;
4953 i = (i < 0) ? 0 : i;
4956}
4957
4966G_MODULE_EXPORT void restore_defaults_parameters (GtkButton * but, gpointer data)
4967{
4968
4969 if (ask_yes_no(_("Restore default parameters"), _("Are you sure ?"), GTK_MESSAGE_QUESTION, atomes_main_window))
4970 {
4973 int i;
4974 for (i=4; i>0; i--)
4975 {
4976 destroy_this_widget (gtk_notebook_get_nth_page (GTK_NOTEBOOK (preference_notebook), i));
4977 }
4978 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), calc_preferences(), gtk_label_new (_("Analysis ")));
4979 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), opengl_preferences(), gtk_label_new ("OpenGL"));
4980 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), model_preferences(), gtk_label_new (_("Model")));
4981 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), view_preferences(), gtk_label_new (_("View")));
4982 gtk_notebook_set_current_page (GTK_NOTEBOOK(preference_notebook), 0);
4985 }
4986}
4987
4997G_MODULE_EXPORT void edit_preferences (GtkDialog * edit_prefs, gint response_id, gpointer data)
4998{
4999 switch (response_id)
5000 {
5001 case GTK_RESPONSE_APPLY:
5002 if (ask_yes_no(_("Save parameters"), _("Are you sure ?"), GTK_MESSAGE_QUESTION, atomes_main_window))
5003 {
5005 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);
5006 if (ask_yes_no(_("Save atomes preferences to file ?"), str, GTK_MESSAGE_QUESTION, (GtkWidget *)edit_prefs))
5007 {
5009 {
5010 show_error ((pref_error) ? pref_error : _("Error while trying to save preferences to file"), 0, atomes_main_window);
5011 g_free (pref_error);
5012 pref_error = NULL;
5013 }
5014 }
5015 g_free (str);
5016 }
5017 break;
5018 default:
5022 preferences = FALSE;
5023 clean_all_tmp ();
5024 g_free (pref_pointer);
5025 pref_pointer = NULL;
5026 if (pref_box_win) g_free (pref_box_win);
5027 pref_box_win = NULL;
5028 if (pref_rep_win) g_free (pref_rep_win);
5029 pref_rep_win = NULL;
5030 if (pref_axis_win) g_free (pref_axis_win);
5031 pref_axis_win = NULL;
5033 pref_gradient_win = NULL;
5035 destroy_this_dialog ((GtkDialog *)edit_prefs);
5036 edit_prefs = NULL;
5037 break;
5038 }
5039}
5040
5041
5042#ifdef GTK4
5051G_MODULE_EXPORT void set_instance_mode (GtkCheckButton * but, gpointer data)
5052#else
5061G_MODULE_EXPORT void set_instance_mode (GtkToggleButton * but, gpointer data)
5062#endif
5063{
5064 int i = GPOINTER_TO_INT(data);
5065 tmp_instance = (i) ? FALSE : TRUE;
5066}
5067
5074{
5075 GtkWidget * win = dialog_cancel_apply (_("User preferences"), atomes_main_window, TRUE);
5076 preferences = TRUE;
5078 GtkWidget * vbox = dialog_get_content_area (win);
5079 gtk_widget_set_size_request (win, 625, 645);
5080 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
5081 preference_notebook = gtk_notebook_new ();
5082 gtk_notebook_set_scrollable (GTK_NOTEBOOK(preference_notebook), TRUE);
5083 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(preference_notebook), GTK_POS_LEFT);
5084 gtk_widget_set_size_request (preference_notebook, 600, 635);
5085 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, preference_notebook, FALSE, FALSE, 0);
5086
5087 GtkWidget * gbox = create_vbox (BSEP);
5088 gchar * mess[2] = {i18n("Browse the following to modify the default configuration of <b>atomes</b>"),
5089 i18n("by replacing internal parameters by user defined preferences.")};
5090 gchar * mlist[4][2]= {{i18n("Analysis "), i18n("calculation preferences")},
5091 {"OpenGL", i18n("rendering preferences")},
5092 {i18n("Model"), i18n("atom(s), bond(s) and box preferences")},
5093 {i18n("View"), i18n("representation and projection preferences")}};
5094 gchar * end = i18n("Default parameters are used for any new project added to the workspace\n");
5095
5096 pref_pointer = g_malloc0(NUM_COLORS*sizeof*pref_pointer);
5097 int i;
5098 for (i=0; i<NUM_COLORS; i++)
5099 {
5100 pref_pointer[i].a = -1;
5101 pref_pointer[i].b = i;
5102 pref_pointer[i].c = -1;
5103 }
5104
5105 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, pref_list(mess, 4, mlist, end), FALSE, FALSE, 20);
5106
5107 GtkWidget * hbox = create_hbox (BSEP);
5108 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, hbox, FALSE, FALSE, 10);
5109 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("<b>atomes</b> default behavior:"), 200, -1, 0.5, 0.5), FALSE, FALSE, 100);
5110 gchar * but_text[2] = {i18n("Single instance (1)"), i18n("Multiple instance(s) (2)")};
5111 GtkWidget * beh_but[2];
5112 gboolean val;
5113 for (i=0; i<2; i++)
5114 {
5115 val = (! i) ? tmp_instance : ! tmp_instance;
5116#ifdef GTK4
5117 beh_but[i] = check_button (_(but_text[i]), 150, -1, val, G_CALLBACK(set_instance_mode), GINT_TO_POINTER(i));
5118 if (i)
5119 {
5120 gtk_check_button_set_group ((GtkCheckButton *) beh_but[i], (GtkCheckButton *)beh_but[0]);
5121 }
5122#else
5123 if (! i)
5124 {
5125 beh_but[i] = radio_button (_(but_text[i]), 150, -1, val, G_CALLBACK(set_instance_mode), GINT_TO_POINTER(i));
5126 }
5127 else
5128 {
5129 beh_but[i] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(beh_but[0]), _(but_text[i]));
5130 g_signal_connect (G_OBJECT (beh_but[i]), "toggled", G_CALLBACK(set_instance_mode), GINT_TO_POINTER(i));
5131 }
5132#endif
5133 hbox = create_hbox (BSEP);
5134 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, hbox, FALSE, FALSE, 5);
5135 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, beh_but[i], FALSE, FALSE, 150);
5136 }
5137#ifdef GTK3
5138 gtk_toggle_button_set_active ((GtkToggleButton *)beh_but[1], ! tmp_instance);
5139#endif // GTK3
5140 gchar * instance_about[2] = {i18n("(1) Each and every file is opened in a single <b>atomes</b> instance"),
5141 i18n("(2) When required files are opened in a separate, new, <b>atomes</b> instance")};
5142 for (i=0; i<2; i++)
5143 {
5144 hbox = create_hbox (BSEP);
5145 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, hbox, FALSE, FALSE, 5);
5146 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox,markup_label(_(instance_about[i]), 200, -1, 0.0, 0.5), FALSE, FALSE, 50);
5147 }
5148
5149 hbox = create_hbox (BSEP);
5150 GtkWidget * but = create_button (NULL, IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(restore_defaults_parameters), NULL);
5151 GtkWidget * but_lab = markup_label (_("Restore <b>atomes</b> default parameters"), -1, -1, 0.5, 0.5);
5152 add_container_child (CONTAINER_BUT, but, but_lab);
5153 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, but, FALSE, FALSE, 150);
5154 add_box_child_start (GTK_ORIENTATION_VERTICAL, gbox, hbox, FALSE, FALSE, 40);
5155
5156 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), gbox, gtk_label_new (_("General")));
5157
5158 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), calc_preferences(), gtk_label_new (_("Analysis ")));
5159 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), opengl_preferences(), gtk_label_new ("OpenGL"));
5160 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), model_preferences(), gtk_label_new (_("Model")));
5161 gtk_notebook_append_page (GTK_NOTEBOOK(preference_notebook), view_preferences(), gtk_label_new ("View"));
5163 gtk_notebook_set_current_page (GTK_NOTEBOOK(preference_notebook), 0);
5164 run_this_gtk_dialog (win, G_CALLBACK(edit_preferences), NULL);
5165}
5166
5175G_MODULE_EXPORT void set_default_options (GtkButton * but, gpointer data)
5176{
5177 tint * oid = (tint *)data;
5178 gchar * pstring[5]={i18n("rendering"), i18n("box"), i18n("axis"), i18n("background"), i18n("representation")};
5179 gchar * str = g_strdup_printf (_("Set %s preferences as default preferences ?"), _(pstring[oid -> b]));
5180 project * this_proj = get_project_by_id(oid -> a);
5181 if (ask_yes_no(_("Set model preferences as default ?"), str, GTK_MESSAGE_QUESTION, this_proj -> modelgl -> win))
5182 {
5183 g_free (str);
5184 image * img = this_proj -> modelgl -> anim -> last -> img;
5185 switch (oid -> b)
5186 {
5187 case 0:
5188 // OpenGL preferences, style and color mpas not included : rendering only
5189 default_opengl[3] = img -> quality;
5190 default_opengl[4] = img -> ray_tracing;
5191 duplicate_material (& default_material, & img -> m_terial);
5192 default_lightning.lights = img -> l_ghtning.lights;
5193 default_lightning.spot = copy_light_sources (img -> l_ghtning.lights, img -> l_ghtning.lights, img -> l_ghtning.spot);
5194 duplicate_fog (& default_fog, & img -> f_g);
5195 break;
5196 case 1:
5197 // Box
5199 break;
5200 case 2:
5201 // Axis
5203 break;
5204 case 3:
5205 // Background
5207 break;
5208 case 4:
5209 // Representation
5210 default_rep.rep = img -> rep;
5211 default_rep.zoom = img -> zoom;
5212 default_rep.gnear = img -> gnear;
5213 int i;
5214 for (i=0; i<2; i++)
5215 {
5216 default_rep.c_angle[i] = img -> c_angle[i];
5217 default_rep.c_shift[i] = img -> c_shift[i];
5218 }
5219 break;
5220 }
5221 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);
5222 if (ask_yes_no(_("Save atomes preferences to file ?"), str, GTK_MESSAGE_QUESTION, this_proj -> modelgl -> win))
5223 {
5225 {
5226 show_error ((pref_error) ? pref_error : _("Error while trying to save preferences to file"), 0, atomes_main_window);
5227 g_free (pref_error);
5228 pref_error = NULL;
5229 }
5230 }
5231 g_free (str);
5232 }
5233 else
5234 {
5235 g_free (str);
5236 }
5237}
5238
5247void add_global_option (GtkWidget * vbox, tint * oid)
5248{
5249 GtkWidget * hbox = create_hbox (5);
5250 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, TRUE, FALSE, 0);
5251 GtkWidget * but = create_button (_("Set default"), IMG_NONE, NULL, -1, -1, GTK_RELIEF_NORMAL, G_CALLBACK(set_default_options), oid);
5252 add_box_child_end (hbox, but, FALSE, FALSE, 0);
5253}
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:548
gboolean * duplicate_bool(int num, gboolean *old_val)
copy a list of gboolean
Definition global.c:564
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:596
GtkWidget * atomes_main_window
Definition global.c:208
int activep
Definition global.c:162
gboolean * allocbool(int val)
allocate a gboolean * pointer
Definition global.c:242
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:447
int bonds_update
Definition global.c:173
int * allocint(int val)
allocate an int * pointer
Definition global.c:302
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:386
double string_to_double(gpointer string)
convert string to double
Definition global.c:612
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:349
@ IMG_NONE
Definition global.h:277
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:340
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:262
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:669
#define NONE
Definition global.h:285
GtkWidget * radio_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a radio button
Definition gtk-misc.c:1970
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:295
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
Definition bdcall.c:559
@ CONTAINER_BUT
Definition global.h:270
@ CONTAINER_SCR
Definition global.h:268
#define ANG
Definition global.h:344
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:346
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:104
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:341
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:987
#define BND
Definition global.h:343
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:94
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:342
void update_rings_menus(glwin *view)
#define MSD
Definition global.h:348
#define GDR
Definition global.h:339
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:93
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:243
#define DEFAULT_LIGHTNING
Default OpenGL material ligthning.
Definition glview.h:50
#define DEFAULT_AMBIANT_OCCLUSION
Default OpenGL material ambiant occlusion.
Definition glview.h:65
@ BOTTOM_RIGHT
Definition glview.h:215
#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:190
@ 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:222
@ SYMBOL_AND_NUM
Definition glview.h:225
#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:183
@ WIREFRAME
Definition glview.h:182
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:378
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]
int default_instance
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 set_instance_mode(GtkToggleButton *but, gpointer data)
set default instance mode
int tmp_instance
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:139
float alpha
Definition global.h:140
float red
Definition global.h:137
float green
Definition global.h:138
Definition glwin.h:234
Definition glwin.h:182
Definition glwin.h:332
Definition glwin.h:350
Definition global.h:112
int b
Definition global.h:114
int a
Definition global.h:113
Definition glwin.h:967
Definition glwin.h:364
Definition global.h:119
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.