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