2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
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.
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.
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
23 Camera plugin for GtkRadiant
24 Copyright (C) 2002 Splash Damage Ltd.
30 #include <glib/gi18n.h>
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';
44 static gint ci_editmode_edit( GtkWidget *widget, gpointer data )
51 static gint ci_editmode_add( GtkWidget *widget, gpointer data )
58 /*static gint ci_delete_selected( GtkWidget *widget, gpointer data )
63 static gint ci_select_all( GtkWidget *widget, gpointer data )
68 static gint ci_new( GtkWidget *widget, gpointer data )
70 GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame; //, *name;
71 GtkWidget *fixed, *interpolated, *spline;
73 GSList *targetTypeRadio = NULL;
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 ) );
83 g_object_set_data (G_OBJECT (window), "loop", &loop);
84 g_object_set_data (G_OBJECT (window), "ret", &ret);
86 gtk_widget_realize (window);
89 vbox = gtk_vbox_new( FALSE, 5 );
90 gtk_container_add (GTK_CONTAINER (window), vbox);
91 gtk_widget_show( vbox );
93 // -------------------------- //
95 hbox = gtk_hbox_new( FALSE, 5 );
96 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
97 gtk_widget_show( hbox );
99 frame = gtk_frame_new( _("Type") );
100 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
101 gtk_widget_show( frame );
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 );
108 // -------------------------- //
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 ) );
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 ) );
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 ) );
125 // -------------------------- //
127 w = gtk_hseparator_new ();
128 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
131 // -------------------------- //
133 hbox = gtk_hbox_new( FALSE, 5 );
134 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
135 gtk_widget_show( hbox );
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));
142 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
143 gtk_widget_grab_default( w );
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));
151 // -------------------------- //
153 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
154 gtk_widget_show (window);
155 gtk_grab_add (window);
157 bool dialogError = TRUE;
158 while (dialogError) {
161 gtk_main_iteration ();
166 if( gtk_toggle_button_get_active( (GtkToggleButton*)fixed ) )
168 else if( gtk_toggle_button_get_active( (GtkToggleButton*)interpolated ) )
169 DoNewInterpolatedCamera();
170 else if( gtk_toggle_button_get_active( (GtkToggleButton*)spline ) )
175 gtk_grab_remove (window);
176 gtk_widget_destroy (window);
181 static gint ci_load( GtkWidget *widget, gpointer data )
188 static gint ci_save( GtkWidget *widget, gpointer data )
195 static gint ci_unload( GtkWidget *widget, gpointer data )
202 static gint ci_apply( GtkWidget *widget, gpointer data )
204 if( GetCurrentCam() ) {
209 str = gtk_entry_get_text( GTK_ENTRY(g_pCamName) );
212 GetCurrentCam()->GetCam()->setName( str );
216 str = gtk_entry_get_text( GTK_ENTRY(g_pSecondsEntry) );
219 GetCurrentCam()->GetCam()->setBaseTime( atof( str ) );
224 GetCurrentCam()->GetCam()->buildCamera();
227 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getBaseTime() );
228 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), buf );
230 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
231 gtk_label_set_text( g_pCurrentTime, "0.00" );
232 gtk_label_set_text( g_pTotalTime, buf );
234 gtk_adjustment_set_value( g_pTimeLine, 0.f );
235 g_pTimeLine->upper = GetCurrentCam()->GetCam()->getTotalTime() * 1000;
237 GetCurrentCam()->HasBeenModified();
243 static gint ci_preview( GtkWidget *widget, gpointer data )
245 if( GetCurrentCam() ) {
246 g_iPreviewRunning = 1;
247 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );
253 static gint ci_expose( GtkWidget *widget, gpointer data )
256 DoStartEdit( GetCurrentCam() );
261 static gint ci_close( GtkWidget *widget, gpointer data )
263 gtk_widget_hide( g_pCameraInspectorWnd );
271 static GtkWidget *g_pPathListCombo = NULL;
272 static GtkLabel *g_pPathType = NULL;
274 static void RefreshPathListCombo( void )
276 if( !g_pPathListCombo )
279 GList *combo_list = (GList*)NULL;
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() );
287 // add one empty string make gtk be quiet
288 combo_list = g_list_append( combo_list, (gpointer)g_cNull );
291 gtk_combo_set_popdown_strings( GTK_COMBO( g_pPathListCombo ), combo_list );
292 g_list_free( combo_list );
295 static gint ci_pathlist_changed( GtkWidget *widget, gpointer data )
297 const char *str = gtk_entry_get_text( GTK_ENTRY(widget) );
299 if( !str || !GetCurrentCam() )
303 for( i = 0; i < GetCurrentCam()->GetCam()->numTargets(); i++ ) {
304 if( !strcmp( str, GetCurrentCam()->GetCam()->getActiveTarget( i )->getName() ) )
308 if( i >= 0 && i < GetCurrentCam()->GetCam()->numTargets() ) {
309 GetCurrentCam()->GetCam()->setActiveTarget( i );
313 gtk_label_set_text( g_pPathType, GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->typeStr() );
315 g_iActiveTarget = -1;
317 gtk_label_set_text( g_pPathType, GetCurrentCam()->GetCam()->getPositionObj()->typeStr() );
321 if( g_pCameraInspectorWnd && GTK_WIDGET_VISIBLE( g_pCameraInspectorWnd ) )
322 DoStartEdit( GetCurrentCam() );
327 static void RefreshEventList( void )
333 gtk_clist_freeze( GTK_CLIST(g_pEventsList) );
334 gtk_clist_clear( GTK_CLIST(g_pEventsList) );
336 if( GetCurrentCam() ) {
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 );
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 );
352 gtk_adjustment_set_value( g_pTimeLine, 0.f );
353 g_pTimeLine->upper = ( GetCurrentCam()->GetCam()->getTotalTime() * 1000 );
356 gtk_clist_thaw( GTK_CLIST(g_pEventsList) );
359 static gint ci_rename( GtkWidget *widget, gpointer data )
361 GtkWidget *window, *w, *vbox, *hbox, *name;
364 if( !GetCurrentCam() )
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 ) );
374 g_object_set_data (G_OBJECT (window), "loop", &loop);
375 g_object_set_data (G_OBJECT (window), "ret", &ret);
377 gtk_widget_realize ( window );
380 vbox = gtk_vbox_new( FALSE, 5 );
381 gtk_container_add (GTK_CONTAINER (window), vbox);
382 gtk_widget_show( vbox );
384 // -------------------------- //
386 hbox = gtk_hbox_new( FALSE, 5 );
387 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
388 gtk_widget_show( hbox );
390 w = gtk_label_new( "Name:" );
391 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
392 gtk_widget_show( w );
394 name = gtk_entry_new();
395 gtk_box_pack_start( GTK_BOX( hbox ), name, FALSE, FALSE, 0 );
396 gtk_widget_show( name );
398 if( g_iActiveTarget < 0 )
399 gtk_entry_set_text( GTK_ENTRY(name), GetCurrentCam()->GetCam()->getPositionObj()->getName() );
401 gtk_entry_set_text( GTK_ENTRY(name), GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->getName() );
403 // -------------------------- //
405 w = gtk_hseparator_new ();
406 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
409 // -------------------------- //
411 hbox = gtk_hbox_new( FALSE, 5 );
412 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
413 gtk_widget_show( hbox );
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));
420 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
421 gtk_widget_grab_default( w );
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));
429 // -------------------------- //
431 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
432 gtk_widget_show (window);
433 gtk_grab_add (window);
435 bool dialogError = TRUE;
436 while (dialogError) {
439 gtk_main_iteration ();
444 const char *str = gtk_entry_get_text( GTK_ENTRY(name) );
446 if( str && str[0] ) {
448 if( g_iActiveTarget < 0 )
449 GetCurrentCam()->GetCam()->getPositionObj()->setName( str );
451 GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->setName( str );
453 GetCurrentCam()->GetCam()->buildCamera();
455 // Rebuild the listbox
456 RefreshPathListCombo();
463 gtk_grab_remove (window);
464 gtk_widget_destroy (window);
469 static gint ci_add_target( GtkWidget *widget, gpointer data )
471 GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame, *name;
472 GtkWidget *fixed, *interpolated, *spline;
474 GSList *targetTypeRadio = NULL;
477 if( !GetCurrentCam() )
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 ) );
487 g_object_set_data (G_OBJECT (window), "loop", &loop);
488 g_object_set_data (G_OBJECT (window), "ret", &ret);
490 gtk_widget_realize (window);
493 vbox = gtk_vbox_new( FALSE, 5 );
494 gtk_container_add (GTK_CONTAINER (window), vbox);
495 gtk_widget_show( vbox );
497 // -------------------------- //
499 hbox = gtk_hbox_new( FALSE, 5 );
500 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
501 gtk_widget_show( hbox );
503 w = gtk_label_new( "Name:" );
504 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
505 gtk_widget_show( w );
507 name = gtk_entry_new();
508 gtk_box_pack_start( GTK_BOX( hbox ), name, TRUE, TRUE, 0 );
509 gtk_widget_show( name );
511 sprintf( buf, "target%i", GetCurrentCam()->GetCam()->numTargets() + 1 );
512 gtk_entry_set_text( GTK_ENTRY(name), buf );
514 // -------------------------- //
516 hbox = gtk_hbox_new( FALSE, 5 );
517 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
518 gtk_widget_show( hbox );
520 frame = gtk_frame_new( _("Type") );
521 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
522 gtk_widget_show( frame );
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 );
529 // -------------------------- //
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 ) );
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 ) );
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 ) );
546 // -------------------------- //
548 w = gtk_hseparator_new ();
549 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
552 // -------------------------- //
554 hbox = gtk_hbox_new( FALSE, 5 );
555 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
556 gtk_widget_show( hbox );
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));
563 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
564 gtk_widget_grab_default( w );
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));
572 // -------------------------- //
574 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
575 gtk_widget_show (window);
576 gtk_grab_add (window);
578 bool dialogError = TRUE;
579 while (dialogError) {
582 gtk_main_iteration ();
587 const char *str = gtk_entry_get_text( GTK_ENTRY(name) );
589 if( str && str[0] ) {
593 if( gtk_toggle_button_get_active( (GtkToggleButton*)fixed ) )
595 else if( gtk_toggle_button_get_active( (GtkToggleButton*)interpolated ) )
597 else if( gtk_toggle_button_get_active( (GtkToggleButton*)spline ) )
601 GetCurrentCam()->GetCam()->addTarget( str, static_cast<idCameraPosition::positionType>(type) );
603 // Rebuild the listbox
604 RefreshPathListCombo();
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) );
610 // If this was the first one, refresh the event list
611 if( GetCurrentCam()->GetCam()->numTargets() == 1 ) {
615 // Go to editmode Add
616 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(g_pEditModeAddRadioButton), TRUE );
624 gtk_grab_remove (window);
625 gtk_widget_destroy (window);
630 static GtkWidget *g_pCamListCombo = NULL;
631 static GtkLabel *g_pCamType = NULL;
633 void RefreshCamListCombo( void )
635 if( !g_pCamListCombo )
638 GList *combo_list = (GList*)NULL;
639 CCamera *combo_cam = firstCam;
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() );
647 sprintf( buf, "Unsaved Camera %i", combo_cam->GetCamNum() );
648 combo_list = g_list_append( combo_list, (void *)buf );
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
652 combo_cam = combo_cam->GetNext();
655 // add one empty string make gtk be quiet
656 combo_list = g_list_append( combo_list, (gpointer)g_cNull );
658 gtk_combo_set_popdown_strings( GTK_COMBO( g_pCamListCombo ), combo_list );
659 g_list_free( combo_list );
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?
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 ) );
674 combo_cam = combo_cam->GetNext();
678 RefreshPathListCombo();
681 static gint ci_camlist_changed( GtkWidget *widget, gpointer data )
683 const char *str = gtk_entry_get_text( GTK_ENTRY(widget) );
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() ) )
693 sprintf( buf, "Unsaved Camera %i", combo_cam->GetCamNum() );
694 if( !strcmp( str, buf ) )
695 //if( !strcmp( str, combo_cam->GetCam()->getName() ) )
699 combo_cam = combo_cam->GetNext();
702 SetCurrentCam( combo_cam );
705 if( GetCurrentCam() ) {
706 // Fill in our widgets fields for this camera
710 gtk_entry_set_text( GTK_ENTRY(g_pCamName), GetCurrentCam()->GetCam()->getName() );
713 gtk_label_set_text( g_pCamType, GetCurrentCam()->GetCam()->getPositionObj()->typeStr() );
716 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getBaseTime() );
717 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), buf );
719 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
720 gtk_label_set_text( g_pCurrentTime, "0.00" );
721 gtk_label_set_text( g_pTotalTime, buf );
723 gtk_adjustment_set_value( g_pTimeLine, 0.f );
724 g_pTimeLine->upper = GetCurrentCam()->GetCam()->getTotalTime() * 1000;
727 gtk_entry_set_text( GTK_ENTRY(g_pCamName), "" );
730 gtk_label_set_text( g_pCamType, "" );
733 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), "30.00" );
735 gtk_label_set_text( g_pCurrentTime, "0.00" );
736 gtk_label_set_text( g_pTotalTime, "30.00" );
738 gtk_adjustment_set_value( g_pTimeLine, 0.f );
739 g_pTimeLine->upper = 30000;
742 // Refresh event list
746 RefreshPathListCombo();
749 g_iActiveTarget = -1;
750 if( g_pCameraInspectorWnd && GTK_WIDGET_VISIBLE( g_pCameraInspectorWnd ) )
751 DoStartEdit( GetCurrentCam() );
761 EVENT_TARGET, // char(name)
763 EVENT_FOV, // int(time), int(targetfov)
768 EVENT_FADEOUT, // int(time)
769 EVENT_FADEIN, // int(time)
774 // { requires parameters, enabled }
775 const bool camEventFlags[][2] = {
792 const char *camEventStr[] = {
797 N_("Change Target <string:name>"),
799 N_("FOV <int:duration> <int:targetfov>"),
803 N_("Change to Camera <string:camera> (or <int:cameranum> <string:camera>"),
804 N_("Fade Out <int:duration>"),
805 N_("Fade In <int:duration>"),
809 static gint ci_add( GtkWidget *widget, gpointer data )
811 GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame, *parameters;
812 GtkWidget *eventWidget[EVENT_COUNT];
813 int i, ret, loop = 1;
814 GSList *eventTypeRadio = NULL;
817 if( !GetCurrentCam() )
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 ) );
827 g_object_set_data (G_OBJECT (window), "loop", &loop);
828 g_object_set_data (G_OBJECT (window), "ret", &ret);
830 gtk_widget_realize (window);
833 vbox = gtk_vbox_new( FALSE, 5 );
834 gtk_container_add (GTK_CONTAINER (window), vbox);
835 gtk_widget_show( vbox );
837 // -------------------------- //
839 hbox = gtk_hbox_new( FALSE, 5 );
840 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
841 gtk_widget_show( hbox );
843 frame = gtk_frame_new( _("Type") );
844 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
845 gtk_widget_show( frame );
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 );
852 // -------------------------- //
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);
863 // -------------------------- //
865 hbox = gtk_hbox_new( FALSE, 5 );
866 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
867 gtk_widget_show( hbox );
869 w = gtk_label_new( _("Parameters:") );
870 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
871 gtk_widget_show( w );
873 parameters = gtk_entry_new();
874 gtk_box_pack_start( GTK_BOX( hbox ), parameters, TRUE, TRUE, 0 );
875 gtk_widget_show( parameters );
877 // -------------------------- //
879 w = gtk_hseparator_new ();
880 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
883 // -------------------------- //
885 hbox = gtk_hbox_new( FALSE, 5 );
886 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
887 gtk_widget_show( hbox );
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));
894 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
895 gtk_widget_grab_default( w );
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));
903 // -------------------------- //
905 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
906 gtk_widget_show (window);
907 gtk_grab_add (window);
909 bool dialogError = TRUE;
910 while (dialogError) {
913 gtk_main_iteration ();
918 const char *str = gtk_entry_get_text( GTK_ENTRY(parameters) );
920 if( !camEventFlags[i][0] || ( str && str[0] ) ) {
924 for( type = 1; type < EVENT_COUNT; type++ ) {
925 if( gtk_toggle_button_get_active( (GtkToggleButton*)eventWidget[type] ) )
930 GetCurrentCam()->GetCam()->addEvent( static_cast<idCameraEvent::eventType>(type), str, (long)(g_pTimeLine->value) );
932 // Refresh event list
940 gtk_grab_remove (window);
941 gtk_widget_destroy (window);
946 static gint ci_del( GtkWidget *widget, gpointer data )
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
958 static gint ci_timeline_changed( GtkAdjustment *adjustment )
962 sprintf( buf, "%.2f", adjustment->value / 1000.f );
963 gtk_label_set_text( g_pCurrentTime, buf );
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) ) ) {
970 vec3_t origin = { 0.0f, 0.0f, 0.0f }, dir = { 0.0f, 0.0f, 0.0f}, angles;
972 GetCurrentCam()->GetCam()->startCamera( 0 );
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 );
982 GtkWidget *CreateCameraInspectorDialog( void )
984 GtkWidget *window, *w, *vbox, *hbox, *table, *frame;
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 ) );
994 // don't use show, as you don't want to have it displayed on startup ;-)
995 gtk_widget_realize( window );
1000 // -------------------------- //
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 );
1009 // the properties column
1010 // -------------------------- //
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 );
1018 // -------------------------- //
1020 hbox = gtk_hbox_new( FALSE, 5 );
1021 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1022 gtk_widget_show( hbox );
1024 w = gtk_label_new( _("File:") );
1025 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1026 gtk_widget_show( w );
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 );
1032 // -------------------------- //
1034 hbox = gtk_hbox_new( FALSE, 5 );
1035 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1036 gtk_widget_show( hbox );
1038 w = gtk_label_new( _("Name:") );
1039 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1040 gtk_widget_show( w );
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 );
1046 w = gtk_label_new( _("Type:") );
1047 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1048 gtk_widget_show( w );
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 );
1055 RefreshCamListCombo();
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 );
1060 // -------------------------- //
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 );
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 );
1073 // -------------------------- //
1075 hbox = gtk_hbox_new( FALSE, 5 );
1076 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1077 gtk_widget_show( hbox );
1079 w = gtk_label_new( _("Edit:") );
1080 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1081 gtk_widget_show( w );
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 );
1087 RefreshPathListCombo();
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 );
1092 // -------------------------- //
1094 hbox = gtk_hbox_new( FALSE, 5 );
1095 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1096 gtk_widget_show( hbox );
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 ) );
1103 gtk_signal_connect( GTK_OBJECT( g_pEditModeEditRadioButton ), "clicked", GTK_SIGNAL_FUNC( ci_editmode_edit ), NULL );
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 ) );
1110 gtk_signal_connect( GTK_OBJECT( g_pEditModeAddRadioButton ), "clicked", GTK_SIGNAL_FUNC( ci_editmode_add ), NULL );
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 );
1118 w = gtk_label_new( _("Type:") );
1119 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1120 gtk_widget_show( w );
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 );
1127 // -------------------------- //
1129 hbox = gtk_hbox_new( FALSE, 5 );
1130 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1131 gtk_widget_show( hbox );
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 );
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 );
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 );
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 );*/
1154 // -------------------------- //
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 );
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 );
1167 // -------------------------- //
1169 hbox = gtk_hbox_new( FALSE, 5 );
1170 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1171 gtk_widget_show( hbox );
1173 w = gtk_label_new( _("Length (seconds):") );
1174 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1175 gtk_widget_show( w );
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 );
1181 // -------------------------- //
1183 hbox = gtk_hbox_new( FALSE, 5 );
1184 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1185 gtk_widget_show( hbox );
1187 w = gtk_label_new( _("Current Time:") );
1188 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1189 gtk_widget_show( w );
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 );
1196 w = gtk_label_new( _(" of ") );
1197 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1198 gtk_widget_show( w );
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 );
1205 // -------------------------- //
1207 hbox = gtk_hbox_new( FALSE, 5 );
1208 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1209 gtk_widget_show( hbox );
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 );
1218 // -------------------------- //
1220 hbox = gtk_hbox_new( FALSE, 5 );
1221 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1222 gtk_widget_show( hbox );
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 );
1228 // -------------------------- //
1230 hbox = gtk_hbox_new( FALSE, 5 );
1231 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1232 gtk_widget_show( hbox );
1234 w = gtk_label_new( _("Events:") );
1235 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1236 gtk_widget_show( w );
1238 // -------------------------- //
1240 hbox = gtk_hbox_new( FALSE, 5 );
1241 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1242 gtk_widget_show( hbox );
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 );
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 );
1260 vbox = gtk_vbox_new( FALSE, 5 );
1261 gtk_box_pack_start( GTK_BOX( hbox ), vbox, FALSE, FALSE, 0 );
1262 gtk_widget_show( vbox );
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 );
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 );
1274 // -------------------------- //
1282 // the buttons column
1283 // -------------------------- //
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 );
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 );
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 );
1301 // -------------------------- //
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 );
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 );
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 );
1319 hbox = gtk_hbox_new( FALSE, 5 );
1320 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1321 gtk_widget_show( hbox );
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 );
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 );
1333 // -------------------------- //
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 );
1341 hbox = gtk_hbox_new( FALSE, 5 );
1342 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1343 gtk_widget_show( hbox );
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 );
1352 // -------------------------- //