]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/camera/dialogs.cpp
40985b38f9acafcae01fc1888c4bc8f1c237a90b
[xonotic/netradiant.git] / contrib / camera / dialogs.cpp
1 /*
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 /*
23 Camera plugin for GtkRadiant
24 Copyright (C) 2002 Splash Damage Ltd.
25 */
26
27 #include "camera.h"
28
29 #include <glib.h>
30 #include <glib/gi18n.h>
31
32 static GSList *g_pEditTypeRadio = NULL;
33 static GtkWidget *g_pEditModeEditRadioButton = NULL;
34 GtkWidget *g_pEditModeAddRadioButton = NULL;
35 static GtkWidget *g_pSecondsEntry = NULL;
36 static GtkWidget *g_pEventsList = NULL;
37 static GtkLabel *g_pCurrentTime = NULL;
38 static GtkLabel *g_pTotalTime = NULL;
39 static GtkAdjustment *g_pTimeLine = NULL;
40 static GtkWidget *g_pTrackCamera = NULL;
41 static GtkWidget *g_pCamName = NULL;
42 static char *g_cNull = '\0';
43
44 static gint ci_editmode_edit( GtkWidget *widget, gpointer data )
45 {
46         g_iEditMode = 0;
47
48         return TRUE;
49 }
50
51 static gint ci_editmode_add( GtkWidget *widget, gpointer data )
52 {
53         g_iEditMode = 1;
54
55         return TRUE;
56 }
57
58 /*static gint ci_delete_selected( GtkWidget *widget, gpointer data )
59 {
60   return TRUE;
61 }
62
63 static gint ci_select_all( GtkWidget *widget, gpointer data )
64 {
65   return TRUE;
66 }*/
67
68 static gint ci_new( GtkWidget *widget, gpointer data )
69 {
70         GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame; //, *name;
71         GtkWidget *fixed, *interpolated, *spline;
72         int ret, loop = 1;
73         GSList *targetTypeRadio = NULL;
74 //      char buf[128];
75
76         // create the window
77   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
78         gtk_window_set_title( GTK_WINDOW (window), "New Camera" );
79   gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
80   gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
81   gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
82
83         g_object_set_data (G_OBJECT (window), "loop", &loop);
84         g_object_set_data (G_OBJECT (window), "ret", &ret);
85
86         gtk_widget_realize (window);
87
88         // fill the window
89         vbox = gtk_vbox_new( FALSE, 5 );
90         gtk_container_add (GTK_CONTAINER (window), vbox);
91         gtk_widget_show( vbox );
92
93   // -------------------------- //
94
95         hbox = gtk_hbox_new( FALSE, 5 );
96   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
97         gtk_widget_show( hbox );
98
99   frame = gtk_frame_new( _("Type") );
100   gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
101   gtk_widget_show( frame );
102
103         vbox2 = gtk_vbox_new( FALSE, 5 );
104         gtk_container_add( GTK_CONTAINER( frame ), vbox2 );
105   gtk_container_set_border_width( GTK_CONTAINER (vbox2), 5 );
106         gtk_widget_show( vbox2 );
107
108         // -------------------------- //
109
110         fixed = gtk_radio_button_new_with_label( targetTypeRadio, "Fixed" );
111         gtk_box_pack_start( GTK_BOX( vbox2 ), fixed, FALSE, FALSE, 3 );
112   gtk_widget_show( fixed );
113   targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( fixed ) );
114
115         interpolated = gtk_radio_button_new_with_label( targetTypeRadio, "Interpolated" );
116         gtk_box_pack_start( GTK_BOX( vbox2 ), interpolated, FALSE, FALSE, 3 );
117   gtk_widget_show( interpolated );
118   targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( interpolated ) );
119
120         spline = gtk_radio_button_new_with_label( targetTypeRadio, "Spline" );
121         gtk_box_pack_start( GTK_BOX( vbox2 ), spline, FALSE, FALSE, 3 );
122   gtk_widget_show( spline );
123   targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( spline ) );
124
125   // -------------------------- //
126
127   w = gtk_hseparator_new ();
128   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
129   gtk_widget_show (w);
130
131         // -------------------------- //
132
133         hbox = gtk_hbox_new( FALSE, 5 );
134   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
135         gtk_widget_show( hbox );
136
137         w = gtk_button_new_with_label ("Ok");
138         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
139         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
140         gtk_widget_show (w);
141
142         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
143         gtk_widget_grab_default( w );
144
145         w = gtk_button_new_with_label ("Cancel");
146         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
147         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
148         gtk_widget_show (w);
149         ret = IDCANCEL;
150
151         // -------------------------- //
152
153         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
154         gtk_widget_show (window);
155         gtk_grab_add (window);
156
157         bool dialogError = TRUE;
158         while (dialogError) {
159                 loop = 1;
160                 while (loop)
161                         gtk_main_iteration ();
162
163                 dialogError = FALSE;
164
165                 if( ret == IDOK ) {
166                         if( gtk_toggle_button_get_active( (GtkToggleButton*)fixed ) )
167                                 DoNewFixedCamera();
168                         else if( gtk_toggle_button_get_active( (GtkToggleButton*)interpolated ) )
169                                 DoNewInterpolatedCamera();
170                         else if( gtk_toggle_button_get_active( (GtkToggleButton*)spline ) )
171                                 DoNewSplineCamera();
172                 }
173         }
174
175         gtk_grab_remove (window);
176         gtk_widget_destroy (window);
177
178   return TRUE;
179 }
180
181 static gint ci_load( GtkWidget *widget, gpointer data )
182 {
183   DoLoadCamera();
184
185   return TRUE;
186 }
187
188 static gint ci_save( GtkWidget *widget, gpointer data )
189 {
190   DoSaveCamera();
191
192   return TRUE;
193 }
194
195 static gint ci_unload( GtkWidget *widget, gpointer data )
196 {
197         DoUnloadCamera();
198
199         return TRUE;
200 }
201
202 static gint ci_apply( GtkWidget *widget, gpointer data )
203 {
204         if( GetCurrentCam() ) {
205                 const char *str;
206                 char buf[128];
207                 bool build = false;
208
209                 str = gtk_entry_get_text( GTK_ENTRY(g_pCamName) );
210
211                 if( str ) {
212                         GetCurrentCam()->GetCam()->setName( str );
213                         build = true;
214                 }
215
216                 str = gtk_entry_get_text( GTK_ENTRY(g_pSecondsEntry) );
217
218                 if( str ) {
219                         GetCurrentCam()->GetCam()->setBaseTime( atof( str ) );
220                         build = true;
221                 }
222
223                 if( build ) {
224                         GetCurrentCam()->GetCam()->buildCamera();
225                 }
226
227                 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getBaseTime() );
228                 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), buf );
229
230                 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
231                 gtk_label_set_text( g_pCurrentTime, "0.00" );
232                 gtk_label_set_text( g_pTotalTime, buf );
233
234                 gtk_adjustment_set_value( g_pTimeLine, 0.f );
235                 g_pTimeLine->upper = GetCurrentCam()->GetCam()->getTotalTime() * 1000;
236
237                 GetCurrentCam()->HasBeenModified();
238         }
239
240   return TRUE;
241 }
242
243 static gint ci_preview( GtkWidget *widget, gpointer data )
244 {
245         if( GetCurrentCam() ) {
246                 g_iPreviewRunning = 1;
247                 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );
248         }
249
250   return TRUE;
251 }
252
253 static gint ci_expose( GtkWidget *widget, gpointer data )
254 {
255   // start edit mode
256   DoStartEdit( GetCurrentCam() );
257
258   return FALSE;
259 }
260
261 static gint ci_close( GtkWidget *widget, gpointer data )
262 {
263   gtk_widget_hide( g_pCameraInspectorWnd );
264
265   // exit edit mode
266   DoStopEdit();
267
268   return TRUE;
269 }
270
271 static GtkWidget *g_pPathListCombo = NULL;
272 static GtkLabel *g_pPathType = NULL;
273
274 static void RefreshPathListCombo( void )
275 {
276   if( !g_pPathListCombo )
277     return;
278
279   GList *combo_list = (GList*)NULL;
280
281   if( GetCurrentCam() ) {
282     combo_list = g_list_append( combo_list, (void *)GetCurrentCam()->GetCam()->getPositionObj()->getName() );
283     for( int i = 0; i < GetCurrentCam()->GetCam()->numTargets(); i++ ) {
284       combo_list = g_list_append( combo_list, (void *)GetCurrentCam()->GetCam()->getActiveTarget( i )->getName() );
285     }
286   } else {
287                 // add one empty string make gtk be quiet
288                 combo_list = g_list_append( combo_list, (gpointer)g_cNull );
289   }
290
291   gtk_combo_set_popdown_strings( GTK_COMBO( g_pPathListCombo ), combo_list );
292   g_list_free( combo_list );
293 }
294
295 static gint ci_pathlist_changed( GtkWidget *widget, gpointer data )
296 {
297   const char *str = gtk_entry_get_text( GTK_ENTRY(widget) );
298
299   if( !str || !GetCurrentCam() )
300     return TRUE;
301
302         int i;
303   for( i = 0; i < GetCurrentCam()->GetCam()->numTargets(); i++ ) {
304     if( !strcmp( str, GetCurrentCam()->GetCam()->getActiveTarget( i )->getName() ) )
305       break;
306   }
307
308   if( i >= 0 && i < GetCurrentCam()->GetCam()->numTargets() ) {
309     GetCurrentCam()->GetCam()->setActiveTarget( i );
310
311     g_iActiveTarget = i;
312                 if( g_pPathType )
313                         gtk_label_set_text( g_pPathType, GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->typeStr() );
314   } else {
315     g_iActiveTarget = -1;
316                 if( g_pPathType )
317                         gtk_label_set_text( g_pPathType, GetCurrentCam()->GetCam()->getPositionObj()->typeStr() );
318   }
319
320   // start edit mode
321   if( g_pCameraInspectorWnd && GTK_WIDGET_VISIBLE( g_pCameraInspectorWnd ) )
322     DoStartEdit( GetCurrentCam() );
323
324   return TRUE;
325 }
326
327 static void RefreshEventList( void )
328 {
329         int i;
330         char buf[128];
331
332         // Clear events list
333         gtk_clist_freeze( GTK_CLIST(g_pEventsList) );
334         gtk_clist_clear( GTK_CLIST(g_pEventsList) );
335
336         if( GetCurrentCam() ) {
337                 // Fill events list
338                 for( i = 0; i < GetCurrentCam()->GetCam()->numEvents(); i++ ) {
339                         char rowbuf[3][128], *row[3];
340                         // FIXME: sort by time?
341                         sprintf( rowbuf[0], "%li", GetCurrentCam()->GetCam()->getEvent(i)->getTime() );                 row[0] = rowbuf[0];
342                         strncpy( rowbuf[1], GetCurrentCam()->GetCam()->getEvent(i)->typeStr(), sizeof(rowbuf[0]) );     row[1] = rowbuf[1];
343                         strncpy( rowbuf[2], GetCurrentCam()->GetCam()->getEvent(i)->getParam(), sizeof(rowbuf[1]) );    row[2] = rowbuf[2];
344                         gtk_clist_append( GTK_CLIST(g_pEventsList), row );
345                 }
346
347                 // Total duration might have changed
348                 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
349                 gtk_label_set_text( g_pCurrentTime, "0.00" );
350                 gtk_label_set_text( g_pTotalTime, buf );
351
352                 gtk_adjustment_set_value( g_pTimeLine, 0.f );
353                 g_pTimeLine->upper = ( GetCurrentCam()->GetCam()->getTotalTime() * 1000 );
354         }
355
356         gtk_clist_thaw( GTK_CLIST(g_pEventsList) );
357 }
358
359 static gint ci_rename( GtkWidget *widget, gpointer data )
360 {
361         GtkWidget *window, *w, *vbox, *hbox, *name;
362         int ret, loop = 1;
363
364         if( !GetCurrentCam() )
365                 return TRUE;
366
367         // create the window
368   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
369         gtk_window_set_title( GTK_WINDOW (window), "Rename Path" );
370   gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
371   gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
372   gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
373
374         g_object_set_data (G_OBJECT (window), "loop", &loop);
375         g_object_set_data (G_OBJECT (window), "ret", &ret);
376
377         gtk_widget_realize ( window );
378
379         // fill the window
380         vbox = gtk_vbox_new( FALSE, 5 );
381         gtk_container_add (GTK_CONTAINER (window), vbox);
382         gtk_widget_show( vbox );
383
384   // -------------------------- //
385
386         hbox = gtk_hbox_new( FALSE, 5 );
387   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
388         gtk_widget_show( hbox );
389
390   w = gtk_label_new( "Name:" );
391         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
392         gtk_widget_show( w );
393
394   name = gtk_entry_new();
395   gtk_box_pack_start( GTK_BOX( hbox ), name, FALSE, FALSE, 0 );
396   gtk_widget_show( name );
397
398         if( g_iActiveTarget < 0 )
399                 gtk_entry_set_text( GTK_ENTRY(name), GetCurrentCam()->GetCam()->getPositionObj()->getName() );
400         else
401                 gtk_entry_set_text( GTK_ENTRY(name), GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->getName() );
402
403   // -------------------------- //
404
405   w = gtk_hseparator_new ();
406   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
407   gtk_widget_show (w);
408
409         // -------------------------- //
410
411         hbox = gtk_hbox_new( FALSE, 5 );
412   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
413         gtk_widget_show( hbox );
414
415         w = gtk_button_new_with_label ("Ok");
416         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
417         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
418         gtk_widget_show (w);
419
420         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
421         gtk_widget_grab_default( w );
422
423         w = gtk_button_new_with_label ("Cancel");
424         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
425         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
426         gtk_widget_show (w);
427         ret = IDCANCEL;
428
429         // -------------------------- //
430
431         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
432         gtk_widget_show (window);
433         gtk_grab_add (window);
434
435         bool dialogError = TRUE;
436         while (dialogError) {
437                 loop = 1;
438                 while (loop)
439                         gtk_main_iteration ();
440
441                 dialogError = FALSE;
442
443                 if( ret == IDOK ) {
444                         const char *str = gtk_entry_get_text( GTK_ENTRY(name) );
445
446                         if( str && str[0] ) {
447                                 // Update the path
448                                 if( g_iActiveTarget < 0 )
449                                         GetCurrentCam()->GetCam()->getPositionObj()->setName( str );
450                                 else
451                                         GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->setName( str );
452
453                                 GetCurrentCam()->GetCam()->buildCamera();
454
455                                 // Rebuild the listbox
456                                 RefreshPathListCombo();
457                         } else {
458                                 dialogError = TRUE;
459                         }
460                 }
461         }
462
463         gtk_grab_remove (window);
464         gtk_widget_destroy (window);
465
466   return TRUE;
467 }
468
469 static gint ci_add_target( GtkWidget *widget, gpointer data )
470 {
471         GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame, *name;
472         GtkWidget *fixed, *interpolated, *spline;
473         int ret, loop = 1;
474         GSList *targetTypeRadio = NULL;
475         char buf[128];
476
477         if( !GetCurrentCam() )
478                 return TRUE;
479
480         // create the window
481   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
482         gtk_window_set_title( GTK_WINDOW (window), "Add Target" );
483   gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
484   gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
485   gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
486
487         g_object_set_data (G_OBJECT (window), "loop", &loop);
488         g_object_set_data (G_OBJECT (window), "ret", &ret);
489
490         gtk_widget_realize (window);
491
492         // fill the window
493         vbox = gtk_vbox_new( FALSE, 5 );
494         gtk_container_add (GTK_CONTAINER (window), vbox);
495         gtk_widget_show( vbox );
496
497   // -------------------------- //
498
499         hbox = gtk_hbox_new( FALSE, 5 );
500   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
501         gtk_widget_show( hbox );
502
503   w = gtk_label_new( "Name:" );
504         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
505         gtk_widget_show( w );
506
507   name = gtk_entry_new();
508   gtk_box_pack_start( GTK_BOX( hbox ), name, TRUE, TRUE, 0 );
509   gtk_widget_show( name );
510
511         sprintf( buf, "target%i", GetCurrentCam()->GetCam()->numTargets() + 1 );
512         gtk_entry_set_text( GTK_ENTRY(name), buf );
513
514   // -------------------------- //
515
516         hbox = gtk_hbox_new( FALSE, 5 );
517   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
518         gtk_widget_show( hbox );
519
520   frame = gtk_frame_new( _("Type") );
521   gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
522   gtk_widget_show( frame );
523
524         vbox2 = gtk_vbox_new( FALSE, 5 );
525         gtk_container_add( GTK_CONTAINER( frame ), vbox2 );
526   gtk_container_set_border_width( GTK_CONTAINER (vbox2), 5 );
527         gtk_widget_show( vbox2 );
528
529         // -------------------------- //
530
531         fixed = gtk_radio_button_new_with_label( targetTypeRadio, _("Fixed") );
532         gtk_box_pack_start( GTK_BOX( vbox2 ), fixed, FALSE, FALSE, 3 );
533   gtk_widget_show( fixed );
534   targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( fixed ) );
535
536         interpolated = gtk_radio_button_new_with_label( targetTypeRadio, _("Interpolated") );
537         gtk_box_pack_start( GTK_BOX( vbox2 ), interpolated, FALSE, FALSE, 3 );
538   gtk_widget_show( interpolated );
539   targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( interpolated ) );
540
541         spline = gtk_radio_button_new_with_label( targetTypeRadio, _("Spline") );
542         gtk_box_pack_start( GTK_BOX( vbox2 ), spline, FALSE, FALSE, 3 );
543   gtk_widget_show( spline );
544   targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( spline ) );
545
546   // -------------------------- //
547
548   w = gtk_hseparator_new ();
549   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
550   gtk_widget_show (w);
551
552         // -------------------------- //
553
554         hbox = gtk_hbox_new( FALSE, 5 );
555   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
556         gtk_widget_show( hbox );
557
558         w = gtk_button_new_with_label (_("Ok"));
559         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
560         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
561         gtk_widget_show (w);
562
563         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
564         gtk_widget_grab_default( w );
565
566         w = gtk_button_new_with_label (_("Cancel"));
567         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
568         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
569         gtk_widget_show (w);
570         ret = IDCANCEL;
571
572         // -------------------------- //
573
574         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
575         gtk_widget_show (window);
576         gtk_grab_add (window);
577
578         bool dialogError = TRUE;
579         while (dialogError) {
580                 loop = 1;
581                 while (loop)
582                         gtk_main_iteration ();
583
584                 dialogError = FALSE;
585
586                 if( ret == IDOK ) {
587                         const char *str = gtk_entry_get_text( GTK_ENTRY(name) );
588
589                         if( str && str[0] ) {
590                                 int type;
591                                 GList *li;
592
593                                 if( gtk_toggle_button_get_active( (GtkToggleButton*)fixed ) )
594                                         type = 0;
595                                 else if( gtk_toggle_button_get_active( (GtkToggleButton*)interpolated ) )
596                                         type = 1;
597                                 else if( gtk_toggle_button_get_active( (GtkToggleButton*)spline ) )
598                                         type = 2;
599
600                                 // Add the target
601                                 GetCurrentCam()->GetCam()->addTarget( str, static_cast<idCameraPosition::positionType>(type) );
602
603                                 // Rebuild the listbox
604                                 RefreshPathListCombo();
605
606                                 // Select the last item in the listbox
607                                 li = g_list_last( GTK_LIST(GTK_COMBO(g_pPathListCombo)->list)->children );
608                                 gtk_list_select_child( GTK_LIST(GTK_COMBO(g_pPathListCombo)->list), GTK_WIDGET (li->data) );
609
610                                 // If this was the first one, refresh the event list
611                                 if( GetCurrentCam()->GetCam()->numTargets() == 1 ) {
612                                         RefreshEventList();
613                                 }
614
615                                 // Go to editmode Add
616                                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(g_pEditModeAddRadioButton), TRUE );
617
618                         } else {
619                                 dialogError = TRUE;
620                         }
621                 }
622         }
623
624         gtk_grab_remove (window);
625         gtk_widget_destroy (window);
626
627   return TRUE;
628 }
629
630 static GtkWidget *g_pCamListCombo = NULL;
631 static GtkLabel *g_pCamType = NULL;
632
633 void RefreshCamListCombo( void )
634 {
635   if( !g_pCamListCombo )
636     return;
637
638   GList *combo_list = (GList*)NULL;
639   CCamera *combo_cam = firstCam;
640         if( combo_cam ) {
641                 while( combo_cam ) {
642                         //combo_list = g_list_append( combo_list, (void *)combo_cam->GetCam()->getName() );
643                         //if( combo_cam->HasBeenSaved() ) {
644                                 combo_list = g_list_append( combo_list, (void *)combo_cam->GetFileName() );
645                         /*} else {
646                                 char buf[128];
647                                 sprintf( buf, "Unsaved Camera %i", combo_cam->GetCamNum() );
648                                 combo_list = g_list_append( combo_list, (void *)buf );
649
650                                 //combo_list = g_list_append( combo_list, (void *)combo_cam->GetCam()->getName() );     // FIXME: this requires camera.dll to create unique names for new cams
651                         }*/
652                         combo_cam = combo_cam->GetNext();
653                 }
654         }else {
655                 // add one empty string make gtk be quiet
656                 combo_list = g_list_append( combo_list, (gpointer)g_cNull );
657         }
658   gtk_combo_set_popdown_strings( GTK_COMBO( g_pCamListCombo ), combo_list );
659   g_list_free( combo_list );
660
661   // select our current entry in the list
662   if( GetCurrentCam() ) {
663     // stop editing on the current cam
664     //GetCurrentCam()->GetCam()->stopEdit();    // FIXME: this crashed on creating new cameras, why is it here?
665
666     GList *li = GTK_LIST( GTK_COMBO(g_pCamListCombo)->list)->children;
667     combo_cam = firstCam;
668     while( li && combo_cam ) {
669       if( combo_cam == GetCurrentCam() ) {
670         gtk_list_select_child( GTK_LIST( GTK_COMBO(g_pCamListCombo)->list ), GTK_WIDGET( li->data ) );
671         break;
672       }
673       li = li->next;
674       combo_cam = combo_cam->GetNext();
675     }
676   }
677
678   RefreshPathListCombo();
679 }
680
681 static gint ci_camlist_changed( GtkWidget *widget, gpointer data )
682 {
683   const char *str = gtk_entry_get_text( GTK_ENTRY(widget) );
684
685   CCamera *combo_cam = firstCam;
686   while( str && combo_cam ) {
687     //if( !strcmp( str, combo_cam->GetCam()->getName() ) )
688                 //if( combo_cam->HasBeenSaved() ) {
689                         if( !strcmp( str, combo_cam->GetFileName() ) )
690                                 break;
691                 /*} else {
692                         char buf[128];
693                         sprintf( buf, "Unsaved Camera %i", combo_cam->GetCamNum() );
694                         if( !strcmp( str, buf ) )
695                         //if( !strcmp( str, combo_cam->GetCam()->getName() ) )
696                                 break;
697                 }*/
698
699     combo_cam = combo_cam->GetNext();
700   }
701
702   SetCurrentCam( combo_cam );
703
704         if( g_pCamType ) {
705                 if( GetCurrentCam() ) {
706                         // Fill in our widgets fields for this camera
707                         char buf[128];
708
709                         // Set Name
710                         gtk_entry_set_text( GTK_ENTRY(g_pCamName), GetCurrentCam()->GetCam()->getName() );
711
712                         // Set type
713                         gtk_label_set_text( g_pCamType, GetCurrentCam()->GetCam()->getPositionObj()->typeStr() );
714
715                         // Set duration
716                         sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getBaseTime() );
717                         gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), buf );
718
719                         sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
720                         gtk_label_set_text( g_pCurrentTime, "0.00" );
721                         gtk_label_set_text( g_pTotalTime, buf );
722
723                         gtk_adjustment_set_value( g_pTimeLine, 0.f );
724                         g_pTimeLine->upper = GetCurrentCam()->GetCam()->getTotalTime() * 1000;
725                 } else {
726                         // Set Name
727                         gtk_entry_set_text( GTK_ENTRY(g_pCamName), "" );
728
729                         // Set type
730                         gtk_label_set_text( g_pCamType, "" );
731
732                         // Set duration
733                         gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), "30.00" );
734
735                         gtk_label_set_text( g_pCurrentTime, "0.00" );
736                         gtk_label_set_text( g_pTotalTime, "30.00" );
737
738                         gtk_adjustment_set_value( g_pTimeLine, 0.f );
739                         g_pTimeLine->upper = 30000;
740                 }
741
742                 // Refresh event list
743                 RefreshEventList();
744         }
745
746   RefreshPathListCombo();
747
748   // start edit mode
749   g_iActiveTarget = -1;
750   if( g_pCameraInspectorWnd && GTK_WIDGET_VISIBLE( g_pCameraInspectorWnd ) )
751     DoStartEdit( GetCurrentCam() );
752
753   return TRUE;
754 }
755
756 enum camEventType {
757         EVENT_NA = 0x00,
758         EVENT_WAIT,                             //
759         EVENT_TARGETWAIT,       //
760         EVENT_SPEED,                    //
761         EVENT_TARGET,                   // char(name)
762         EVENT_SNAPTARGET,       //
763         EVENT_FOV,                              // int(time), int(targetfov)
764         EVENT_CMD,                              //
765         EVENT_TRIGGER,          //
766         EVENT_STOP,                             //
767         EVENT_CAMERA,                   //
768         EVENT_FADEOUT,          // int(time)
769         EVENT_FADEIN,                   // int(time)
770         EVENT_FEATHER,          //
771         EVENT_COUNT
772 };
773
774 // { requires parameters, enabled }
775 const bool camEventFlags[][2] = {
776   { false, false },
777   { false, true },
778   { false, false },
779   { false, false },
780   { true, true },
781   { false, false },
782   { true, true },
783   { false, false },
784   { false, false },
785   { false, true },
786   { true, true },
787   { true, true },
788   { true, true },
789   { false, true },
790 };
791
792 const char *camEventStr[] = {
793         N_("n/a"),
794         N_("Wait"),
795         N_("Target wait"),
796         N_("Speed"),
797         N_("Change Target <string:name>"),
798         N_("Snap Target"),
799         N_("FOV <int:duration> <int:targetfov>"),
800         N_("Run Script"),
801         N_("Trigger"),
802         N_("Stop"),
803         N_("Change to Camera <string:camera> (or <int:cameranum> <string:camera>"),
804         N_("Fade Out <int:duration>"),
805         N_("Fade In <int:duration>"),
806         N_("Feather")
807 };
808
809 static gint ci_add( GtkWidget *widget, gpointer data )
810 {
811         GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame, *parameters;
812         GtkWidget *eventWidget[EVENT_COUNT];
813         int i, ret, loop = 1;
814         GSList *eventTypeRadio = NULL;
815 //      char buf[128];
816
817         if( !GetCurrentCam() )
818                 return TRUE;
819
820         // create the window
821   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
822         gtk_window_set_title( GTK_WINDOW (window), _("Add Event") );
823   gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
824   gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
825   gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
826
827         g_object_set_data (G_OBJECT (window), "loop", &loop);
828         g_object_set_data (G_OBJECT (window), "ret", &ret);
829
830         gtk_widget_realize (window);
831
832         // fill the window
833         vbox = gtk_vbox_new( FALSE, 5 );
834         gtk_container_add (GTK_CONTAINER (window), vbox);
835         gtk_widget_show( vbox );
836
837   // -------------------------- //
838
839         hbox = gtk_hbox_new( FALSE, 5 );
840   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
841         gtk_widget_show( hbox );
842
843   frame = gtk_frame_new( _("Type") );
844   gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
845   gtk_widget_show( frame );
846
847         vbox2 = gtk_vbox_new( FALSE, 5 );
848         gtk_container_add( GTK_CONTAINER( frame ), vbox2 );
849   gtk_container_set_border_width( GTK_CONTAINER (vbox2), 5 );
850         gtk_widget_show( vbox2 );
851
852         // -------------------------- //
853
854         for( i = 1; i < EVENT_COUNT; i++ ) {
855                 eventWidget[i] = gtk_radio_button_new_with_label( eventTypeRadio, camEventStr[i] );
856                 gtk_box_pack_start( GTK_BOX( vbox2 ), eventWidget[i], FALSE, FALSE, 3 );
857                 gtk_widget_show( eventWidget[i] );
858                 eventTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( eventWidget[i] ) );
859     if( camEventFlags[i][1] == false )
860       gtk_widget_set_sensitive (eventWidget[i], FALSE);
861         }
862
863   // -------------------------- //
864
865         hbox = gtk_hbox_new( FALSE, 5 );
866   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
867         gtk_widget_show( hbox );
868
869   w = gtk_label_new( _("Parameters:") );
870         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
871         gtk_widget_show( w );
872
873   parameters = gtk_entry_new();
874   gtk_box_pack_start( GTK_BOX( hbox ), parameters, TRUE, TRUE, 0 );
875   gtk_widget_show( parameters );
876
877   // -------------------------- //
878
879   w = gtk_hseparator_new ();
880   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
881   gtk_widget_show (w);
882
883         // -------------------------- //
884
885         hbox = gtk_hbox_new( FALSE, 5 );
886   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
887         gtk_widget_show( hbox );
888
889         w = gtk_button_new_with_label (_("Ok"));
890         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
891         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
892         gtk_widget_show (w);
893
894         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
895         gtk_widget_grab_default( w );
896
897         w = gtk_button_new_with_label (_("Cancel"));
898         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
899         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
900         gtk_widget_show (w);
901         ret = IDCANCEL;
902
903         // -------------------------- //
904
905         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
906         gtk_widget_show (window);
907         gtk_grab_add (window);
908
909         bool dialogError = TRUE;
910         while (dialogError) {
911                 loop = 1;
912                 while (loop)
913                         gtk_main_iteration ();
914
915                 dialogError = FALSE;
916
917                 if( ret == IDOK ) {
918                         const char *str = gtk_entry_get_text( GTK_ENTRY(parameters) );
919
920                         if( !camEventFlags[i][0] || ( str && str[0] ) ) {
921                                 int type = 0;
922 //                              GList *li;
923
924                                 for( type = 1; type < EVENT_COUNT; type++ ) {
925                                         if( gtk_toggle_button_get_active( (GtkToggleButton*)eventWidget[type] ) )
926                                                 break;
927                                 }
928
929                                 // Add the event
930                                 GetCurrentCam()->GetCam()->addEvent( static_cast<idCameraEvent::eventType>(type), str, (long)(g_pTimeLine->value) );
931
932                                 // Refresh event list
933                                 RefreshEventList();
934                         } else {
935                                 dialogError = TRUE;
936                         }
937                 }
938         }
939
940         gtk_grab_remove (window);
941         gtk_widget_destroy (window);
942
943   return TRUE;
944 }
945
946 static gint ci_del( GtkWidget *widget, gpointer data )
947 {
948         // TODO: add support to splines lib
949         if(     GetCurrentCam() && GTK_CLIST(g_pEventsList)->focus_row >= 0 ) {
950                 GetCurrentCam()->GetCam()->removeEvent( GTK_CLIST(g_pEventsList)->focus_row );
951                 // Refresh event list
952                 RefreshEventList();
953         }
954
955   return TRUE;
956 }
957
958 static gint ci_timeline_changed( GtkAdjustment *adjustment )
959 {
960         char buf[128];
961
962         sprintf( buf, "%.2f", adjustment->value / 1000.f );
963         gtk_label_set_text( g_pCurrentTime, buf );
964
965         // FIXME: this will never work completely perfect. Startcamera calls buildcamera, which sets all events to 'nottriggered'.
966         // So if you have a wait at the end of the path, this will go to nontriggered immediately when you go over it and the camera
967         // will have no idea where on the track it should be.
968         if( GetCurrentCam() && gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(g_pTrackCamera) ) ) {
969                 float fov;
970     vec3_t origin = { 0.0f, 0.0f, 0.0f }, dir = { 0.0f, 0.0f, 0.0f}, angles;
971
972     GetCurrentCam()->GetCam()->startCamera( 0 );
973
974                 GetCurrentCam()->GetCam()->getCameraInfo( (long)(adjustment->value), &origin[0], &dir[0], &fov );
975                 VectorSet( angles, asin (dir[2])*180/3.14159, atan2 (dir[1], dir[0])*180/3.14159, 0 );
976                 g_CameraTable.m_pfnSetCamera( origin, angles );
977         }
978
979         return TRUE;
980 }
981
982 GtkWidget *CreateCameraInspectorDialog( void )
983 {
984   GtkWidget     *window, *w, *vbox, *hbox, *table, *frame;
985
986   // create the window
987   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
988         gtk_window_set_title( GTK_WINDOW (window), _("Camera Inspector") );
989   gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( ci_close ), NULL );
990   gtk_signal_connect( GTK_OBJECT (window), "expose_event", GTK_SIGNAL_FUNC( ci_expose ), NULL );
991         //  gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
992   gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pRadiantWnd ) );
993
994   // don't use show, as you don't want to have it displayed on startup ;-)
995   gtk_widget_realize( window );
996
997   // fill the window
998
999   // the table
1000   // -------------------------- //
1001
1002   table = gtk_table_new( 3, 2, FALSE );
1003   gtk_widget_show( table );
1004   gtk_container_add( GTK_CONTAINER( window ), table );
1005   gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1006   gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1007   gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1008
1009   // the properties column
1010         // -------------------------- //
1011
1012         vbox = gtk_vbox_new( FALSE, 5 );
1013         gtk_widget_show( vbox );
1014   gtk_table_attach( GTK_TABLE( table ), vbox, 0, 1, 0, 1,
1015                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1016                     (GtkAttachOptions) (GTK_FILL), 0, 0 );
1017
1018   // -------------------------- //
1019
1020         hbox = gtk_hbox_new( FALSE, 5 );
1021   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1022         gtk_widget_show( hbox );
1023
1024   w = gtk_label_new( _("File:") );
1025         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1026         gtk_widget_show( w );
1027
1028   g_pCamListCombo = gtk_combo_new();
1029   gtk_box_pack_start (GTK_BOX( hbox ), g_pCamListCombo, TRUE, TRUE, 0);
1030   gtk_widget_show( g_pCamListCombo );
1031
1032   // -------------------------- //
1033
1034         hbox = gtk_hbox_new( FALSE, 5 );
1035   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1036         gtk_widget_show( hbox );
1037
1038         w = gtk_label_new( _("Name:") );
1039         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1040         gtk_widget_show( w );
1041
1042   g_pCamName = gtk_entry_new();
1043   gtk_box_pack_start( GTK_BOX( hbox ), g_pCamName, FALSE, FALSE, 0 );
1044   gtk_widget_show( g_pCamName );
1045
1046   w = gtk_label_new( _("Type:") );
1047         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1048         gtk_widget_show( w );
1049
1050   w = gtk_label_new( "" );
1051   gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1052   gtk_widget_show( w );
1053         g_pCamType = GTK_LABEL( w );
1054
1055   RefreshCamListCombo();
1056
1057   gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(g_pCamListCombo)->entry ), FALSE );
1058   gtk_signal_connect( GTK_OBJECT(GTK_COMBO(g_pCamListCombo)->entry), "changed", GTK_SIGNAL_FUNC( ci_camlist_changed ), NULL );
1059
1060   // -------------------------- //
1061
1062   frame = gtk_frame_new( _("Path and Target editing") );
1063   gtk_widget_show( frame );
1064   gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 1, 2,
1065                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1066                     (GtkAttachOptions) (GTK_FILL), 0, 0 );
1067
1068         vbox = gtk_vbox_new( FALSE, 5 );
1069         gtk_container_add( GTK_CONTAINER( frame ), vbox );
1070   gtk_container_set_border_width( GTK_CONTAINER (vbox), 5 );
1071         gtk_widget_show( vbox );
1072
1073   // -------------------------- //
1074
1075         hbox = gtk_hbox_new( FALSE, 5 );
1076         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1077         gtk_widget_show( hbox );
1078
1079   w = gtk_label_new( _("Edit:") );
1080         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1081         gtk_widget_show( w );
1082
1083   g_pPathListCombo = gtk_combo_new();
1084   gtk_box_pack_start (GTK_BOX( hbox ), g_pPathListCombo, TRUE, TRUE, 0);
1085   gtk_widget_show( g_pPathListCombo );
1086
1087   RefreshPathListCombo();
1088
1089         gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(g_pPathListCombo)->entry ), FALSE );
1090   gtk_signal_connect( GTK_OBJECT(GTK_COMBO(g_pPathListCombo)->entry), "changed", GTK_SIGNAL_FUNC( ci_pathlist_changed ), NULL );
1091
1092   // -------------------------- //
1093
1094   hbox = gtk_hbox_new( FALSE, 5 );
1095         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1096         gtk_widget_show( hbox );
1097
1098         g_pEditModeEditRadioButton = gtk_radio_button_new_with_label( g_pEditTypeRadio, _("Edit Points") );
1099         gtk_box_pack_start( GTK_BOX( hbox ), g_pEditModeEditRadioButton, FALSE, FALSE, 3 );
1100   gtk_widget_show( g_pEditModeEditRadioButton );
1101   g_pEditTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( g_pEditModeEditRadioButton ) );
1102
1103         gtk_signal_connect( GTK_OBJECT( g_pEditModeEditRadioButton ), "clicked", GTK_SIGNAL_FUNC( ci_editmode_edit ), NULL );
1104
1105         g_pEditModeAddRadioButton = gtk_radio_button_new_with_label( g_pEditTypeRadio, _("Add Points") );
1106         gtk_box_pack_start( GTK_BOX( hbox ), g_pEditModeAddRadioButton, FALSE, FALSE, 3 );
1107   gtk_widget_show( g_pEditModeAddRadioButton );
1108   g_pEditTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( g_pEditModeAddRadioButton ) );
1109
1110         gtk_signal_connect( GTK_OBJECT( g_pEditModeAddRadioButton ), "clicked", GTK_SIGNAL_FUNC( ci_editmode_add ), NULL );
1111
1112         // see if we should use a different default
1113         if( g_iEditMode == 1 ) {
1114                 // Go to editmode Add
1115                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(g_pEditModeAddRadioButton), TRUE );
1116         }
1117
1118   w = gtk_label_new( _("Type:") );
1119         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1120         gtk_widget_show( w );
1121
1122   w = gtk_label_new( "" );
1123   gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1124   gtk_widget_show( w );
1125         g_pPathType = GTK_LABEL( w );
1126
1127   // -------------------------- //
1128
1129         hbox = gtk_hbox_new( FALSE, 5 );
1130         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1131         gtk_widget_show( hbox );
1132
1133         w = gtk_button_new_with_label( _("Rename...") );
1134         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1135         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_rename ), NULL );
1136         gtk_widget_show( w );
1137
1138         w = gtk_button_new_with_label( _("Add Target...") );
1139         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1140         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_add_target ), NULL );
1141         gtk_widget_show( w );
1142
1143         // not available in splines library
1144         /*w = gtk_button_new_with_label( "Delete Selected" );
1145         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1146         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_delete_selected ), NULL );
1147         gtk_widget_show( w );
1148
1149         w = gtk_button_new_with_label( "Select All" );
1150         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1151         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_select_all ), NULL );
1152         gtk_widget_show( w );*/
1153
1154   // -------------------------- //
1155
1156   frame = gtk_frame_new( _("Time") );
1157   gtk_widget_show( frame );
1158   gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 2, 3,
1159                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1160                     (GtkAttachOptions) (GTK_FILL), 0, 0 );
1161
1162         vbox = gtk_vbox_new( FALSE, 5 );
1163         gtk_container_add( GTK_CONTAINER( frame ), vbox );
1164   gtk_container_set_border_width( GTK_CONTAINER (vbox), 5 );
1165         gtk_widget_show( vbox );
1166
1167   // -------------------------- //
1168
1169   hbox = gtk_hbox_new( FALSE, 5 );
1170         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1171         gtk_widget_show( hbox );
1172
1173   w = gtk_label_new( _("Length (seconds):") );
1174         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1175         gtk_widget_show( w );
1176
1177   g_pSecondsEntry = gtk_entry_new();
1178   gtk_box_pack_start( GTK_BOX( hbox ), g_pSecondsEntry, FALSE, FALSE, 0 );
1179   gtk_widget_show( g_pSecondsEntry );
1180
1181   // -------------------------- //
1182
1183   hbox = gtk_hbox_new( FALSE, 5 );
1184         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1185         gtk_widget_show( hbox );
1186
1187   w = gtk_label_new( _("Current Time:") );
1188         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1189         gtk_widget_show( w );
1190
1191   w = gtk_label_new( _("0.00") );
1192   gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1193   gtk_widget_show( w );
1194         g_pCurrentTime = GTK_LABEL( w );
1195
1196   w = gtk_label_new( _(" of ") );
1197         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1198         gtk_widget_show( w );
1199
1200   w = gtk_label_new( _("0.00") );
1201   gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1202   gtk_widget_show( w );
1203         g_pTotalTime = GTK_LABEL( w );
1204
1205   // -------------------------- //
1206
1207   hbox = gtk_hbox_new( FALSE, 5 );
1208         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1209         gtk_widget_show( hbox );
1210
1211         g_pTimeLine = GTK_ADJUSTMENT( gtk_adjustment_new( 0, 0, 30000, 100, 250, 0 ) );
1212         gtk_signal_connect( GTK_OBJECT(g_pTimeLine), "value_changed", GTK_SIGNAL_FUNC( ci_timeline_changed ), NULL );
1213   w = gtk_hscale_new( g_pTimeLine );
1214   gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1215   gtk_widget_show( w );
1216   gtk_scale_set_draw_value( GTK_SCALE( w ), FALSE );
1217
1218   // -------------------------- //
1219
1220   hbox = gtk_hbox_new( FALSE, 5 );
1221         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1222         gtk_widget_show( hbox );
1223
1224   g_pTrackCamera = gtk_check_button_new_with_label( _("Track Camera") );
1225   gtk_box_pack_start( GTK_BOX( hbox ), g_pTrackCamera, FALSE, FALSE, 0 );
1226   gtk_widget_show( g_pTrackCamera );
1227
1228   // -------------------------- //
1229
1230   hbox = gtk_hbox_new( FALSE, 5 );
1231         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1232         gtk_widget_show( hbox );
1233
1234   w = gtk_label_new( _("Events:") );
1235         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1236         gtk_widget_show( w );
1237
1238   // -------------------------- //
1239
1240   hbox = gtk_hbox_new( FALSE, 5 );
1241         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1242         gtk_widget_show( hbox );
1243
1244   w = gtk_scrolled_window_new( NULL, NULL );
1245   gtk_widget_set_usize( w, 0, 150 );
1246   gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( w ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
1247   gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1248   gtk_widget_show( w );
1249
1250   g_pEventsList = gtk_clist_new( 3 );
1251   gtk_container_add( GTK_CONTAINER(w), g_pEventsList);
1252   //gtk_signal_connect( GTK_OBJECT(g_pEventsList), "select_row", GTK_SIGNAL_FUNC (proplist_select_row), NULL);
1253   gtk_clist_set_selection_mode( GTK_CLIST(g_pEventsList), GTK_SELECTION_BROWSE );
1254   gtk_clist_column_titles_hide( GTK_CLIST(g_pEventsList) );
1255   gtk_clist_set_column_auto_resize( GTK_CLIST(g_pEventsList), 0, TRUE );
1256   gtk_clist_set_column_auto_resize( GTK_CLIST(g_pEventsList), 1, TRUE );
1257         gtk_clist_set_column_auto_resize( GTK_CLIST(g_pEventsList), 2, TRUE );
1258         gtk_widget_show( g_pEventsList );
1259
1260   vbox = gtk_vbox_new( FALSE, 5 );
1261         gtk_box_pack_start( GTK_BOX( hbox ), vbox, FALSE, FALSE, 0 );
1262         gtk_widget_show( vbox );
1263
1264         w = gtk_button_new_with_label( _("Add...") );
1265         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1266         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_add ), NULL );
1267         gtk_widget_show( w );
1268
1269         w = gtk_button_new_with_label( _("Del") );
1270         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1271         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_del ), NULL );
1272         gtk_widget_show( w );
1273
1274   // -------------------------- //
1275
1276   /*/
1277    |
1278    |
1279    |
1280   */
1281
1282   // the buttons column
1283   // -------------------------- //
1284
1285   vbox = gtk_vbox_new( FALSE, 5 );
1286         gtk_widget_show( vbox );
1287   gtk_table_attach( GTK_TABLE( table ), vbox, 1, 2, 0, 1,
1288                     (GtkAttachOptions) (GTK_FILL),
1289                     (GtkAttachOptions) (GTK_FILL), 0, 0 );
1290
1291         w = gtk_button_new_with_label( _("New...") );
1292         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1293         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_new ), NULL );
1294         gtk_widget_show( w );
1295
1296         w = gtk_button_new_with_label( _("Load...") );
1297         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1298         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_load ), NULL );
1299         gtk_widget_show( w );
1300
1301   // -------------------------- //
1302
1303   vbox = gtk_vbox_new( FALSE, 5 );
1304         gtk_widget_show( vbox );
1305   gtk_table_attach( GTK_TABLE( table ), vbox, 1, 2, 1, 2,
1306                     (GtkAttachOptions) (GTK_FILL),
1307                     (GtkAttachOptions) (GTK_FILL), 0, 0 );
1308
1309         w = gtk_button_new_with_label( _("Save...") );
1310         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1311         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_save ), NULL );
1312         gtk_widget_show( w );
1313
1314         w = gtk_button_new_with_label( _("Unload") );
1315         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1316         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_unload ), NULL );
1317         gtk_widget_show( w );
1318
1319   hbox = gtk_hbox_new( FALSE, 5 );
1320         gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1321         gtk_widget_show( hbox );
1322
1323   w = gtk_button_new_with_label( _("Apply") );
1324         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1325         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_apply ), NULL );
1326         gtk_widget_show( w );
1327
1328         w = gtk_button_new_with_label( _("Preview") );
1329         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1330         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_preview ), NULL );
1331         gtk_widget_show( w );
1332
1333   // -------------------------- //
1334
1335         vbox = gtk_vbox_new( FALSE, 5 );
1336         gtk_widget_show( vbox );
1337   gtk_table_attach( GTK_TABLE( table ), vbox, 1, 2, 2, 3,
1338                     (GtkAttachOptions) (GTK_FILL),
1339                     (GtkAttachOptions) (GTK_FILL), 0, 0 );
1340
1341         hbox = gtk_hbox_new( FALSE, 5 );
1342         gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1343         gtk_widget_show( hbox );
1344
1345         w = gtk_button_new_with_label( _("Close") );
1346         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1347         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_close ), NULL );
1348         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1349         gtk_widget_grab_default( w );
1350         gtk_widget_show( w );
1351
1352   // -------------------------- //
1353
1354   return window;
1355 }