1 /* AnimationRotation.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4 
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9 
10   The above copyright notice and this permission notice shall be included in all copies or substantial portions
11   of the Software.
12 
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19 
20 #include "../../Config.h"
21 #include <stdlib.h>
22 #include "GlobalOrb.h"
23 #include "../Utils/Utils.h"
24 #include "../Utils/Constants.h"
25 #include "../Utils/UtilsInterface.h"
26 #include "../Display/StatusOrb.h"
27 #include "../Display/GLArea.h"
28 #include "../Display/AnimationRotation.h"
29 #include "../Files/FolderChooser.h"
30 #include "../Files/GabeditFolderChooser.h"
31 #include "../Common/Help.h"
32 #include "../Display/Images.h"
33 #include "../Display/PovrayGL.h"
34 
35 static	GtkWidget *WinDlg = NULL;
36 static	GtkWidget *EntryVelocity = NULL;
37 static	GtkWidget *EntryNRotation = NULL;
38 static	GtkWidget *LabelNRotation = NULL;
39 static	GtkWidget *PlayButton = NULL;
40 static	GtkWidget *StopButton = NULL;
41 static gboolean play = FALSE;
42 static gdouble velocity = 0.1;
43 static gint nRotation = 10;
44 static	GtkWidget *buttonXAxis = NULL;
45 static	GtkWidget *buttonYAxis = NULL;
46 static	GtkWidget *buttonZAxis = NULL;
47 
48 static GtkWidget *buttonCheckFilm = NULL;
49 static GtkWidget *buttonDirFilm = NULL;
50 static GtkWidget* comboListFilm = NULL;
51 static gboolean createFilm = FALSE;
52 static gint numFileFilm = 0;
53 static gchar formatFilm[100] = "BMP";
54 
55 typedef enum
56 {
57  XAXIS = 0,
58  YAXIS = 1,
59  ZAXIS = 2
60 } GabEditAxis;
61 GabEditAxis selectedAxis = YAXIS;
62 
63 /********************************************************************************/
64 static void animate_rotation();
65 static void stop_animation(GtkWidget *win, gpointer data);
66 static void play_animation(GtkWidget *win, gpointer data);
67 /********************************************************************************/
reset_last_directory(GtkWidget * dirSelector,gpointer data)68 static void reset_last_directory(GtkWidget *dirSelector, gpointer data)
69 {
70 	gchar* dirname = gabedit_folder_chooser_get_current_folder(GABEDIT_FOLDER_CHOOSER(dirSelector));
71 	gchar* filename = NULL;
72 
73 	if(dirname && strlen(dirname)>0)
74 	{
75 		if(dirname[strlen(dirname)-1] != G_DIR_SEPARATOR)
76 			filename = g_strdup_printf("%s%sdump.txt",dirname,G_DIR_SEPARATOR_S);
77 		else
78 			filename = g_strdup_printf("%sdump.txt",dirname);
79 	}
80 	else
81 	{
82 		dirname = g_strdup(g_get_home_dir());
83 		filename = g_strdup_printf("%s%sdump.txt",dirname,G_DIR_SEPARATOR_S);
84 	}
85 	if(dirname) g_free(dirname);
86 	if(filename)
87 	{
88 		set_last_directory(filename);
89 		g_free(filename);
90 	}
91 }
92 /********************************************************************************/
set_directory(GtkWidget * win,gpointer data)93 static void set_directory(GtkWidget *win, gpointer data)
94 {
95 	GtkWidget *dirSelector;
96 	dirSelector = selctionOfDir(reset_last_directory, _("Set folder"), GABEDIT_TYPEWIN_ORB);
97 	gtk_window_set_modal (GTK_WINDOW (dirSelector), TRUE);
98 	gtk_window_set_transient_for(GTK_WINDOW(dirSelector),GTK_WINDOW(PrincipalWindow));
99 	gtk_window_set_transient_for(GTK_WINDOW(dirSelector),GTK_WINDOW(WinDlg));
100 }
101 /********************************************************************************/
reset_parameters(GtkWidget * win,gpointer data)102 static void reset_parameters(GtkWidget *win, gpointer data)
103 {
104 	gdouble velo     = atof(gtk_entry_get_text(GTK_ENTRY(EntryVelocity)));
105 	gint nRot     = atoi(gtk_entry_get_text(GTK_ENTRY(EntryNRotation)));
106 	gchar t[BSIZE];
107 
108 	if(velo<0)
109 	{
110 		velo = -velo;
111 		sprintf(t,"%lf",velo);
112 		gtk_entry_set_text(GTK_ENTRY(EntryVelocity),t);
113 	}
114 	velocity = velo;
115 
116 	if(nRot==0)
117 	{
118 		nRot = 10;
119 		sprintf(t,"%d",nRot);
120 		gtk_entry_set_text(GTK_ENTRY(EntryNRotation),t);
121 	}
122 	if(nRot<0)
123 	{
124 		nRot = -nRot;
125 		sprintf(t,"%d",nRot);
126 		gtk_entry_set_text(GTK_ENTRY(EntryNRotation),t);
127 	}
128 	nRotation = nRot;
129 	if(!play)
130 		stop_animation(NULL,NULL);
131 
132 }
133 /********************************************************************************/
play_animation(GtkWidget * win,gpointer data)134 static void play_animation(GtkWidget *win, gpointer data)
135 {
136 	play = TRUE;
137 	gtk_widget_set_sensitive(PlayButton, FALSE);
138 	gtk_widget_set_sensitive(StopButton, TRUE);
139 	gtk_window_set_modal (GTK_WINDOW (WinDlg), TRUE);
140 	animate_rotation();
141 
142 }
143 /********************************************************************************/
stop_animation(GtkWidget * win,gpointer data)144 static void stop_animation(GtkWidget *win, gpointer data)
145 {
146 	play = FALSE;
147 	if(GTK_IS_WIDGET(PlayButton)) gtk_widget_set_sensitive(PlayButton, TRUE);
148 
149 	if(GTK_IS_WIDGET(StopButton)) gtk_widget_set_sensitive(StopButton, FALSE);
150 
151 	if(GTK_IS_WIDGET(WinDlg)) gtk_window_set_modal (GTK_WINDOW (WinDlg), FALSE);
152 
153 	while( gtk_events_pending() )
154 		gtk_main_iteration();
155 
156 	if(this_is_an_object((GtkObject*)GLArea))
157 		glarea_rafresh(GLArea);
158 }
159 /********************************************************************************/
destroyAnimationDlg(GtkWidget * win)160 static void destroyAnimationDlg(GtkWidget *win)
161 {
162 	createFilm = FALSE;
163 	numFileFilm = 0;
164 	stop_animation(NULL, NULL);
165 	gtk_widget_destroy(WinDlg);
166 	WinDlg = NULL;
167 }
168 /********************************************************************************/
get_format_image_from_option()169 static gchar* get_format_image_from_option()
170 {
171 	if(strcmp(formatFilm,"BMP")==0) return "bmp";
172 	if(strcmp(formatFilm,"PPM")==0) return "ppm";
173 	if(strcmp(formatFilm,"PNG")==0) return "png";
174 	if(strcmp(formatFilm,"JPEG")==0) return "jpg";
175 	if(strcmp(formatFilm,"PNG transparent")==0) return "png";
176 	if(strcmp(formatFilm,"Povray")==0) return "pov";
177 	return "UNK";
178 }
179 /********************************************************************************/
filmSelected(GtkWidget * widget)180 static void filmSelected(GtkWidget *widget)
181 {
182 	if(GTK_IS_WIDGET(buttonCheckFilm)&& GTK_TOGGLE_BUTTON (buttonCheckFilm)->active)
183 	{
184 		createFilm = TRUE;
185 		if(GTK_IS_WIDGET(buttonDirFilm))  gtk_widget_set_sensitive(buttonDirFilm, TRUE);
186 		if(GTK_IS_WIDGET(comboListFilm))  gtk_widget_set_sensitive(comboListFilm, TRUE);
187 	}
188 	else
189 	{
190 		createFilm = FALSE;
191 		if(GTK_IS_WIDGET(buttonDirFilm))  gtk_widget_set_sensitive(buttonDirFilm, FALSE);
192 		if(GTK_IS_WIDGET(comboListFilm))  gtk_widget_set_sensitive(comboListFilm, FALSE);
193 	}
194 }
195 /********************************************************************************/
showMessageEnd()196 static void showMessageEnd()
197 {
198 	gchar* format =get_format_image_from_option();
199 	gchar* message = messageAnimatedImage(format);
200 	gchar* t = g_strdup_printf(_("\nA series of gab*.%s files was created in \"%s\" directeory.\n\n\n%s") , format, get_last_directory(),message);
201 	GtkWidget* winDlg = Message(t,_("Info"),TRUE);
202 	g_free(message);
203 	gtk_window_set_modal (GTK_WINDOW (winDlg), TRUE);
204 	g_free(t);
205 }
206 /********************************************************************************/
unActivateFilm()207 static void unActivateFilm()
208 {
209 	createFilm = FALSE;
210 	numFileFilm = 0;
211 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonCheckFilm), FALSE);
212 	if(GTK_IS_WIDGET(buttonDirFilm))  gtk_widget_set_sensitive(buttonDirFilm, FALSE);
213 	if(GTK_IS_WIDGET(comboListFilm))  gtk_widget_set_sensitive(comboListFilm, FALSE);
214 }
215 /********************************************************************************************************/
set_format_film(GtkComboBox * combobox,gpointer d)216 static void set_format_film(GtkComboBox *combobox, gpointer d)
217 {
218 	GtkTreeIter iter;
219 	gchar* data = NULL;
220 	if (gtk_combo_box_get_active_iter (combobox, &iter))
221 	{
222 		GtkTreeModel* model = gtk_combo_box_get_model(combobox);
223 		gtk_tree_model_get (model, &iter, 0, &data, -1);
224 	}
225 	if(!data) return;
226 	sprintf(formatFilm ,"%s",(gchar*)data);
227 }
228 /********************************************************************************************************/
create_list_of_formats()229 static GtkWidget *create_list_of_formats()
230 {
231         GtkTreeIter iter;
232         GtkListStore *store;
233 	GtkTreeModel *model;
234 	GtkWidget *combobox;
235 	GtkCellRenderer *renderer;
236 	gint i;
237 	gint k;
238 	gchar* options[] = {"BMP","PPM", "JPEG", "PNG", "PNG transparent", "Povray"};
239 	guint numberOfElements = G_N_ELEMENTS (options);
240 
241 
242 	k = 0;
243 	store = gtk_list_store_new (1,G_TYPE_STRING);
244 	for(i=0;i<numberOfElements; i++)
245 	{
246         	gtk_list_store_append (store, &iter);
247         	gtk_list_store_set (store, &iter, 0, options[i], -1);
248 		if(strcmp(options[i],formatFilm)==0) k = i;
249 	}
250 
251         model = GTK_TREE_MODEL (store);
252 	combobox = gtk_combo_box_new_with_model (model);
253 	g_object_unref (model);
254 	g_signal_connect (G_OBJECT(combobox), "changed", G_CALLBACK(set_format_film), NULL);
255 	renderer = gtk_cell_renderer_text_new ();
256 	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
257 	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL);
258   	gtk_combo_box_set_active(GTK_COMBO_BOX (combobox), k);
259 	return combobox;
260 }
buttonAxisSelected(GtkWidget * widget)261 static void buttonAxisSelected(GtkWidget *widget)
262 {
263 	if(GTK_IS_WIDGET(buttonXAxis) && GTK_TOGGLE_BUTTON (buttonXAxis)->active) selectedAxis = XAXIS;
264 	if(GTK_IS_WIDGET(buttonYAxis) && GTK_TOGGLE_BUTTON (buttonYAxis)->active) selectedAxis = YAXIS;
265 	if(GTK_IS_WIDGET(buttonZAxis) && GTK_TOGGLE_BUTTON (buttonZAxis)->active) selectedAxis = ZAXIS;
266 
267 }
268 /********************************************************************************/
addEntrysButtons(GtkWidget * box)269 static void addEntrysButtons(GtkWidget* box)
270 {
271 	GtkWidget *Button;
272 	GtkWidget *frame;
273 	GtkWidget *vboxframe;
274 	GtkWidget *table;
275 	gchar t[BSIZE];
276 	gint i;
277 	GtkWidget *separator;
278 	GtkWidget* formatBox;
279 
280 	frame = gtk_frame_new (NULL);
281 	gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
282 	gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
283 	gtk_box_pack_start(GTK_BOX(box), frame,TRUE,TRUE,0);
284 	gtk_widget_show (frame);
285 
286 	vboxframe = create_vbox(frame);
287 
288   	table = gtk_table_new(11,3,FALSE);
289 	gtk_box_pack_start(GTK_BOX(vboxframe), table,TRUE,TRUE,0);
290 
291 	i = 0;
292 	buttonXAxis = gtk_radio_button_new_with_label( NULL,_("Rotation about X axis"));
293 	gtk_table_attach(GTK_TABLE(table),buttonXAxis,0,3,i,i+1,
294 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
295 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
296 		  3,3);
297 
298 	i++;
299 	buttonYAxis = gtk_radio_button_new_with_label( gtk_radio_button_get_group (GTK_RADIO_BUTTON (buttonXAxis)), _("Rotation about Y axis "));
300 	gtk_table_attach(GTK_TABLE(table),buttonYAxis,0,3,i,i+1,
301 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
302 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
303 		  3,3);
304 	i++;
305 	buttonZAxis = gtk_radio_button_new_with_label( gtk_radio_button_get_group (GTK_RADIO_BUTTON (buttonXAxis)), _("Rotation about Z axis "));
306 	gtk_table_attach(GTK_TABLE(table),buttonZAxis,0,3,i,i+1,
307 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
308 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
309 		  3,3);
310   	g_signal_connect (G_OBJECT(buttonXAxis), "toggled", G_CALLBACK (buttonAxisSelected), NULL);
311   	g_signal_connect (G_OBJECT(buttonYAxis), "toggled", G_CALLBACK (buttonAxisSelected), NULL);
312   	g_signal_connect (G_OBJECT(buttonZAxis), "toggled", G_CALLBACK (buttonAxisSelected), NULL);
313 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonYAxis), TRUE);
314 
315 	i++;
316 	separator = gtk_hseparator_new();
317 	gtk_table_attach(GTK_TABLE(table),separator,0,3,i,i+1,
318 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
319 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
320 		  3,3);
321 
322 
323 	i++;
324 	add_label_table(table,_(" Time step(s) "),(gushort)i,0);
325 	add_label_table(table," : ",(gushort)i,1);
326 	EntryVelocity = gtk_entry_new();
327 	gtk_table_attach(GTK_TABLE(table),EntryVelocity,2,2+1,i,i+1,
328 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
329 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
330 		  3,3);
331 	gtk_editable_set_editable((GtkEditable*) EntryVelocity,TRUE);
332 	sprintf(t,"%lf",velocity);
333 	gtk_entry_set_text(GTK_ENTRY(EntryVelocity),t);
334 
335 	i++;
336 	LabelNRotation = add_label_table(table,_(" Number of Rotation by cycle"),(gushort)i,0);
337 	add_label_table(table," : ",(gushort)i,1);
338 	EntryNRotation = gtk_entry_new();
339 	gtk_table_attach(GTK_TABLE(table),EntryNRotation,2,2+1,i,i+1,
340 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
341 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
342 		  3,3);
343 	gtk_editable_set_editable((GtkEditable*) EntryNRotation,TRUE);
344 	sprintf(t,"%d",nRotation);
345 	gtk_entry_set_text(GTK_ENTRY(EntryNRotation),t);
346 
347 	i++;
348 	separator = gtk_hseparator_new();
349 	gtk_table_attach(GTK_TABLE(table),separator,0,3,i,i+1,
350 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
351 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
352 		  3,3);
353 
354 	i++;
355 	buttonCheckFilm = gtk_check_button_new_with_label (_("Create a film"));
356 	createFilm = FALSE;
357 	numFileFilm = 0;
358 	gtk_table_attach(GTK_TABLE(table),buttonCheckFilm,0,1,i,i+1,
359 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
360 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
361 		  1,1);
362   	g_signal_connect (G_OBJECT(buttonCheckFilm), "toggled", G_CALLBACK (filmSelected), NULL);
363 
364 	formatBox = create_list_of_formats();
365 	gtk_table_attach(GTK_TABLE(table),formatBox,1,1+1,i,i+1,
366 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
367 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
368 		  1,1);
369 
370 	buttonDirFilm = create_button(WinDlg,_("Folder"));
371 	gtk_table_attach(GTK_TABLE(table),buttonDirFilm,2,2+1,i,i+1,
372 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
373 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
374 		  1,1);
375   	g_signal_connect(G_OBJECT(buttonDirFilm), "clicked",(GCallback)set_directory,NULL);
376 	comboListFilm = formatBox;
377 
378 	if(GTK_IS_WIDGET(buttonDirFilm))  gtk_widget_set_sensitive(buttonDirFilm, FALSE);
379 	if(GTK_IS_WIDGET(comboListFilm))  gtk_widget_set_sensitive(comboListFilm, FALSE);
380 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonCheckFilm), FALSE);
381 
382 
383 	i++;
384 	separator = gtk_hseparator_new();
385 	gtk_table_attach(GTK_TABLE(table),separator,0,3,i,i+1,
386 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
387 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
388 		  3,3);
389 
390 
391   	table = gtk_table_new(1,2,TRUE);
392 	gtk_box_pack_start (GTK_BOX (vboxframe), table, TRUE, TRUE, 0);
393 	i=0;
394 	Button = create_button(WinDlg,_("Play"));
395 	gtk_table_attach(GTK_TABLE(table),Button,0,0+1,i,i+1,
396 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
397 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
398 		  3,3);
399 	PlayButton = Button;
400 
401 	Button = create_button(WinDlg,_("Stop"));
402 	gtk_table_attach(GTK_TABLE(table),Button,1,1+1,i,i+1,
403 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
404 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
405 		  3,3);
406 	StopButton = Button;
407 
408   	g_signal_connect(G_OBJECT(PlayButton), "clicked",(GCallback)play_animation,NULL);
409   	g_signal_connect(G_OBJECT(StopButton), "clicked",(GCallback)stop_animation,NULL);
410   	g_signal_connect_swapped (G_OBJECT (EntryVelocity), "activate", (GCallback)reset_parameters, NULL);
411   	g_signal_connect_swapped (G_OBJECT (EntryNRotation), "activate", (GCallback)reset_parameters, NULL);
412 }
413 /*****************************************************************************/
createImagesFile()414 static gboolean createImagesFile()
415 {
416 	gchar* message = NULL;
417 	gchar* t;
418 	gchar* format;
419 	if(!createFilm)
420 	{
421 		setTextInProgress(" ");
422 		return FALSE;
423 	}
424 	format =get_format_image_from_option();
425 	t = g_strdup_printf(_("The %s%sgab%d.%s file was created"), get_last_directory(),G_DIR_SEPARATOR_S,numFileFilm, format);
426 
427 	if(!strcmp(formatFilm,"BMP")) message = new_bmp(get_last_directory(), ++numFileFilm);
428 	if(!strcmp(formatFilm,"PPM")) message = new_ppm(get_last_directory(), ++numFileFilm);
429 	if(!strcmp(formatFilm,"JPEG")) message = new_jpeg(get_last_directory(), ++numFileFilm);
430 	if(!strcmp(formatFilm,"PNG")) message = new_png(get_last_directory(), ++numFileFilm);
431 	if(!strcmp(formatFilm,"Povray")) message = new_pov(get_last_directory(), ++numFileFilm);
432 	if(!strcmp(formatFilm,"PNG transparent")) message = new_png_without_background(get_last_directory(), ++numFileFilm);
433 
434 	if(message == NULL) setTextInProgress(t);
435 	else
436 	{
437     		GtkWidget* m;
438 		createFilm = FALSE;
439 		numFileFilm = 0;
440     		m = Message(message,_("Error"),TRUE);
441 		gtk_window_set_modal (GTK_WINDOW (m), TRUE);
442 	}
443 	g_free(t);
444 	return TRUE;
445 }
446 /********************************************************************************/
animate_rotation()447 static void animate_rotation()
448 {
449 
450 	gdouble  phi = -360.0/nRotation;
451 	gint i = 0;
452 
453 	reset_parameters(NULL, NULL);
454 	numFileFilm = 0;
455 
456 	if(GTK_IS_WIDGET(buttonCheckFilm)) gtk_widget_set_sensitive(buttonCheckFilm, FALSE);
457 	if(GTK_IS_WIDGET(comboListFilm)) gtk_widget_set_sensitive(comboListFilm, FALSE);
458 	if(GTK_IS_WIDGET(buttonDirFilm))  gtk_widget_set_sensitive(buttonDirFilm, FALSE);
459 
460 	if(GTK_IS_WIDGET(buttonXAxis)) gtk_widget_set_sensitive(buttonXAxis, FALSE);
461 	if(GTK_IS_WIDGET(buttonYAxis)) gtk_widget_set_sensitive(buttonYAxis, FALSE);
462 	if(GTK_IS_WIDGET(buttonZAxis)) gtk_widget_set_sensitive(buttonZAxis, FALSE);
463 	if(GTK_IS_WIDGET(EntryNRotation)) gtk_widget_set_sensitive(EntryNRotation, FALSE);
464 	if(GTK_IS_WIDGET(LabelNRotation)) gtk_widget_set_sensitive(LabelNRotation, FALSE);
465 
466 	while(play)
467 	{
468 		rotationAboutAnAxis(GLArea, phi,selectedAxis);
469 		while( gtk_events_pending() ) gtk_main_iteration();
470 		glarea_rafresh(GLArea);
471 		createImagesFile();
472 		Waiting(velocity);
473 		i++;
474 
475 		if(i==nRotation)
476 		{
477 			i = 0;
478 			if(numFileFilm>0) showMessageEnd();
479 			unActivateFilm();
480 			while( gtk_events_pending() ) gtk_main_iteration();
481 		}
482 
483 
484 	}
485 
486 	if(numFileFilm>0) showMessageEnd();
487 	unActivateFilm();
488 
489 	if(GTK_IS_WIDGET(buttonCheckFilm)) gtk_widget_set_sensitive(buttonCheckFilm, TRUE);
490 	if(GTK_IS_WIDGET(comboListFilm)) gtk_widget_set_sensitive(comboListFilm, FALSE);
491 	if(GTK_IS_WIDGET(buttonDirFilm))  gtk_widget_set_sensitive(buttonDirFilm, FALSE);
492 
493 	if(GTK_IS_WIDGET(buttonXAxis)) gtk_widget_set_sensitive(buttonXAxis, TRUE);
494 	if(GTK_IS_WIDGET(buttonYAxis)) gtk_widget_set_sensitive(buttonYAxis, TRUE);
495 	if(GTK_IS_WIDGET(buttonZAxis)) gtk_widget_set_sensitive(buttonZAxis, TRUE);
496 	if(GTK_IS_WIDGET(EntryNRotation)) gtk_widget_set_sensitive(EntryNRotation, TRUE);
497 	if(GTK_IS_WIDGET(LabelNRotation)) gtk_widget_set_sensitive(LabelNRotation, TRUE);
498 	stop_animation(NULL, NULL);
499 }
500 /***********************************************************************/
animationRotationDlg()501 void animationRotationDlg()
502 {
503 	GtkWidget *Win;
504 	GtkWidget *vbox;
505 	GtkWidget *hbox;
506 	GtkWidget *parentWindow = PrincipalWindow;
507 
508 	if(WinDlg) return;
509 	if(nCenters <1 )
510 	{
511 		Message(_("Sorry, the number of atoms can not <1"),_("Error"),TRUE);
512 		return;
513 	}
514 
515 	Win= gtk_window_new(GTK_WINDOW_TOPLEVEL);
516 	gtk_window_set_position(GTK_WINDOW(Win),GTK_WIN_POS_CENTER);
517 	gtk_window_set_transient_for(GTK_WINDOW(Win),GTK_WINDOW(parentWindow));
518 	/* gtk_window_set_default_size (GTK_WINDOW(Win),-1,(gint)(ScreenHeight*0.69));*/
519 	gtk_window_set_title(GTK_WINDOW(Win),_("Rotation animation"));
520 	gtk_window_set_modal (GTK_WINDOW (Win), TRUE);
521 
522 	WinDlg = Win;
523 
524   	add_child(PrincipalWindow,Win,destroyAnimationDlg,"Anim. Rot.");
525   	g_signal_connect(G_OBJECT(Win),"delete_event",(GCallback)delete_child,NULL);
526 
527 	vbox = gtk_vbox_new (FALSE, 0);
528 	gtk_widget_show (vbox);
529 	gtk_container_add (GTK_CONTAINER (Win), vbox);
530 	hbox = create_hbox_false(vbox);
531 	gtk_widget_realize(Win);
532 
533 	addEntrysButtons(vbox);
534 	gtk_widget_show_all(vbox);
535 
536 	gtk_widget_show_now(Win);
537 
538 	/* fit_windows_position(PrincipalWindow, Win);*/
539 
540 	stop_animation(NULL, NULL);
541 }
542