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.
29 static GSList *g_pEditTypeRadio = NULL;
30 static GtkWidget *g_pEditModeEditRadioButton = NULL;
31 GtkWidget *g_pEditModeAddRadioButton = NULL;
32 static GtkWidget *g_pSecondsEntry = NULL;
33 static GtkWidget *g_pEventsList = NULL;
34 static GtkLabel *g_pCurrentTime = NULL;
35 static GtkLabel *g_pTotalTime = NULL;
36 static GtkAdjustment *g_pTimeLine = NULL;
37 static GtkWidget *g_pTrackCamera = NULL;
38 static GtkWidget *g_pCamName = NULL;
39 static char *g_cNull = '\0';
41 static gint ci_editmode_edit( GtkWidget *widget, gpointer data )
48 static gint ci_editmode_add( GtkWidget *widget, gpointer data )
55 /*static gint ci_delete_selected( GtkWidget *widget, gpointer data )
60 static gint ci_select_all( GtkWidget *widget, gpointer data )
65 static gint ci_new( GtkWidget *widget, gpointer data )
67 GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame; //, *name;
68 GtkWidget *fixed, *interpolated, *spline;
70 GSList *targetTypeRadio = NULL;
74 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
75 gtk_window_set_title( GTK_WINDOW (window), "New Camera" );
76 gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
77 gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
78 gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
80 g_object_set_data (G_OBJECT (window), "loop", &loop);
81 g_object_set_data (G_OBJECT (window), "ret", &ret);
83 gtk_widget_realize (window);
86 vbox = gtk_vbox_new( FALSE, 5 );
87 gtk_container_add (GTK_CONTAINER (window), vbox);
88 gtk_widget_show( vbox );
90 // -------------------------- //
92 hbox = gtk_hbox_new( FALSE, 5 );
93 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
94 gtk_widget_show( hbox );
96 frame = gtk_frame_new( _("Type") );
97 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
98 gtk_widget_show( frame );
100 vbox2 = gtk_vbox_new( FALSE, 5 );
101 gtk_container_add( GTK_CONTAINER( frame ), vbox2 );
102 gtk_container_set_border_width( GTK_CONTAINER (vbox2), 5 );
103 gtk_widget_show( vbox2 );
105 // -------------------------- //
107 fixed = gtk_radio_button_new_with_label( targetTypeRadio, "Fixed" );
108 gtk_box_pack_start( GTK_BOX( vbox2 ), fixed, FALSE, FALSE, 3 );
109 gtk_widget_show( fixed );
110 targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( fixed ) );
112 interpolated = gtk_radio_button_new_with_label( targetTypeRadio, "Interpolated" );
113 gtk_box_pack_start( GTK_BOX( vbox2 ), interpolated, FALSE, FALSE, 3 );
114 gtk_widget_show( interpolated );
115 targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( interpolated ) );
117 spline = gtk_radio_button_new_with_label( targetTypeRadio, "Spline" );
118 gtk_box_pack_start( GTK_BOX( vbox2 ), spline, FALSE, FALSE, 3 );
119 gtk_widget_show( spline );
120 targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( spline ) );
122 // -------------------------- //
124 w = gtk_hseparator_new ();
125 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
128 // -------------------------- //
130 hbox = gtk_hbox_new( FALSE, 5 );
131 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
132 gtk_widget_show( hbox );
134 w = gtk_button_new_with_label ("Ok");
135 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
136 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
139 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
140 gtk_widget_grab_default( w );
142 w = gtk_button_new_with_label ("Cancel");
143 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
144 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
148 // -------------------------- //
150 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
151 gtk_widget_show (window);
152 gtk_grab_add (window);
154 bool dialogError = TRUE;
155 while (dialogError) {
158 gtk_main_iteration ();
163 if( gtk_toggle_button_get_active( (GtkToggleButton*)fixed ) )
165 else if( gtk_toggle_button_get_active( (GtkToggleButton*)interpolated ) )
166 DoNewInterpolatedCamera();
167 else if( gtk_toggle_button_get_active( (GtkToggleButton*)spline ) )
172 gtk_grab_remove (window);
173 gtk_widget_destroy (window);
178 static gint ci_load( GtkWidget *widget, gpointer data )
185 static gint ci_save( GtkWidget *widget, gpointer data )
192 static gint ci_unload( GtkWidget *widget, gpointer data )
199 static gint ci_apply( GtkWidget *widget, gpointer data )
201 if( GetCurrentCam() ) {
206 str = gtk_entry_get_text( GTK_ENTRY(g_pCamName) );
209 GetCurrentCam()->GetCam()->setName( str );
213 str = gtk_entry_get_text( GTK_ENTRY(g_pSecondsEntry) );
216 GetCurrentCam()->GetCam()->setBaseTime( atof( str ) );
221 GetCurrentCam()->GetCam()->buildCamera();
224 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getBaseTime() );
225 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), buf );
227 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
228 gtk_label_set_text( g_pCurrentTime, "0.00" );
229 gtk_label_set_text( g_pTotalTime, buf );
231 gtk_adjustment_set_value( g_pTimeLine, 0.f );
232 g_pTimeLine->upper = GetCurrentCam()->GetCam()->getTotalTime() * 1000;
234 GetCurrentCam()->HasBeenModified();
240 static gint ci_preview( GtkWidget *widget, gpointer data )
242 if( GetCurrentCam() ) {
243 g_iPreviewRunning = 1;
244 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );
250 static gint ci_expose( GtkWidget *widget, gpointer data )
253 DoStartEdit( GetCurrentCam() );
258 static gint ci_close( GtkWidget *widget, gpointer data )
260 gtk_widget_hide( g_pCameraInspectorWnd );
268 static GtkWidget *g_pPathListCombo = NULL;
269 static GtkLabel *g_pPathType = NULL;
271 static void RefreshPathListCombo( void )
273 if( !g_pPathListCombo )
276 GList *combo_list = (GList*)NULL;
278 if( GetCurrentCam() ) {
279 combo_list = g_list_append( combo_list, (void *)GetCurrentCam()->GetCam()->getPositionObj()->getName() );
280 for( int i = 0; i < GetCurrentCam()->GetCam()->numTargets(); i++ ) {
281 combo_list = g_list_append( combo_list, (void *)GetCurrentCam()->GetCam()->getActiveTarget( i )->getName() );
284 // add one empty string make gtk be quiet
285 combo_list = g_list_append( combo_list, (gpointer)g_cNull );
288 gtk_combo_set_popdown_strings( GTK_COMBO( g_pPathListCombo ), combo_list );
289 g_list_free( combo_list );
292 static gint ci_pathlist_changed( GtkWidget *widget, gpointer data )
294 const char *str = gtk_entry_get_text( GTK_ENTRY(widget) );
296 if( !str || !GetCurrentCam() )
300 for( i = 0; i < GetCurrentCam()->GetCam()->numTargets(); i++ ) {
301 if( !strcmp( str, GetCurrentCam()->GetCam()->getActiveTarget( i )->getName() ) )
305 if( i >= 0 && i < GetCurrentCam()->GetCam()->numTargets() ) {
306 GetCurrentCam()->GetCam()->setActiveTarget( i );
310 gtk_label_set_text( g_pPathType, GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->typeStr() );
312 g_iActiveTarget = -1;
314 gtk_label_set_text( g_pPathType, GetCurrentCam()->GetCam()->getPositionObj()->typeStr() );
318 if( g_pCameraInspectorWnd && GTK_WIDGET_VISIBLE( g_pCameraInspectorWnd ) )
319 DoStartEdit( GetCurrentCam() );
324 static void RefreshEventList( void )
330 gtk_clist_freeze( GTK_CLIST(g_pEventsList) );
331 gtk_clist_clear( GTK_CLIST(g_pEventsList) );
333 if( GetCurrentCam() ) {
335 for( i = 0; i < GetCurrentCam()->GetCam()->numEvents(); i++ ) {
336 char rowbuf[3][128], *row[3];
337 // FIXME: sort by time?
338 sprintf( rowbuf[0], "%li", GetCurrentCam()->GetCam()->getEvent(i)->getTime() ); row[0] = rowbuf[0];
339 strncpy( rowbuf[1], GetCurrentCam()->GetCam()->getEvent(i)->typeStr(), sizeof(rowbuf[0]) ); row[1] = rowbuf[1];
340 strncpy( rowbuf[2], GetCurrentCam()->GetCam()->getEvent(i)->getParam(), sizeof(rowbuf[1]) ); row[2] = rowbuf[2];
341 gtk_clist_append( GTK_CLIST(g_pEventsList), row );
344 // Total duration might have changed
345 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
346 gtk_label_set_text( g_pCurrentTime, "0.00" );
347 gtk_label_set_text( g_pTotalTime, buf );
349 gtk_adjustment_set_value( g_pTimeLine, 0.f );
350 g_pTimeLine->upper = ( GetCurrentCam()->GetCam()->getTotalTime() * 1000 );
353 gtk_clist_thaw( GTK_CLIST(g_pEventsList) );
356 static gint ci_rename( GtkWidget *widget, gpointer data )
358 GtkWidget *window, *w, *vbox, *hbox, *name;
361 if( !GetCurrentCam() )
365 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
366 gtk_window_set_title( GTK_WINDOW (window), "Rename Path" );
367 gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
368 gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
369 gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
371 g_object_set_data (G_OBJECT (window), "loop", &loop);
372 g_object_set_data (G_OBJECT (window), "ret", &ret);
374 gtk_widget_realize ( window );
377 vbox = gtk_vbox_new( FALSE, 5 );
378 gtk_container_add (GTK_CONTAINER (window), vbox);
379 gtk_widget_show( vbox );
381 // -------------------------- //
383 hbox = gtk_hbox_new( FALSE, 5 );
384 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
385 gtk_widget_show( hbox );
387 w = gtk_label_new( "Name:" );
388 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
389 gtk_widget_show( w );
391 name = gtk_entry_new();
392 gtk_box_pack_start( GTK_BOX( hbox ), name, FALSE, FALSE, 0 );
393 gtk_widget_show( name );
395 if( g_iActiveTarget < 0 )
396 gtk_entry_set_text( GTK_ENTRY(name), GetCurrentCam()->GetCam()->getPositionObj()->getName() );
398 gtk_entry_set_text( GTK_ENTRY(name), GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->getName() );
400 // -------------------------- //
402 w = gtk_hseparator_new ();
403 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
406 // -------------------------- //
408 hbox = gtk_hbox_new( FALSE, 5 );
409 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
410 gtk_widget_show( hbox );
412 w = gtk_button_new_with_label ("Ok");
413 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
414 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
417 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
418 gtk_widget_grab_default( w );
420 w = gtk_button_new_with_label ("Cancel");
421 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
422 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
426 // -------------------------- //
428 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
429 gtk_widget_show (window);
430 gtk_grab_add (window);
432 bool dialogError = TRUE;
433 while (dialogError) {
436 gtk_main_iteration ();
441 const char *str = gtk_entry_get_text( GTK_ENTRY(name) );
443 if( str && str[0] ) {
445 if( g_iActiveTarget < 0 )
446 GetCurrentCam()->GetCam()->getPositionObj()->setName( str );
448 GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->setName( str );
450 GetCurrentCam()->GetCam()->buildCamera();
452 // Rebuild the listbox
453 RefreshPathListCombo();
460 gtk_grab_remove (window);
461 gtk_widget_destroy (window);
466 static gint ci_add_target( GtkWidget *widget, gpointer data )
468 GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame, *name;
469 GtkWidget *fixed, *interpolated, *spline;
471 GSList *targetTypeRadio = NULL;
474 if( !GetCurrentCam() )
478 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
479 gtk_window_set_title( GTK_WINDOW (window), "Add Target" );
480 gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
481 gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
482 gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
484 g_object_set_data (G_OBJECT (window), "loop", &loop);
485 g_object_set_data (G_OBJECT (window), "ret", &ret);
487 gtk_widget_realize (window);
490 vbox = gtk_vbox_new( FALSE, 5 );
491 gtk_container_add (GTK_CONTAINER (window), vbox);
492 gtk_widget_show( vbox );
494 // -------------------------- //
496 hbox = gtk_hbox_new( FALSE, 5 );
497 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
498 gtk_widget_show( hbox );
500 w = gtk_label_new( "Name:" );
501 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
502 gtk_widget_show( w );
504 name = gtk_entry_new();
505 gtk_box_pack_start( GTK_BOX( hbox ), name, TRUE, TRUE, 0 );
506 gtk_widget_show( name );
508 sprintf( buf, "target%i", GetCurrentCam()->GetCam()->numTargets() + 1 );
509 gtk_entry_set_text( GTK_ENTRY(name), buf );
511 // -------------------------- //
513 hbox = gtk_hbox_new( FALSE, 5 );
514 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
515 gtk_widget_show( hbox );
517 frame = gtk_frame_new( _("Type") );
518 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
519 gtk_widget_show( frame );
521 vbox2 = gtk_vbox_new( FALSE, 5 );
522 gtk_container_add( GTK_CONTAINER( frame ), vbox2 );
523 gtk_container_set_border_width( GTK_CONTAINER (vbox2), 5 );
524 gtk_widget_show( vbox2 );
526 // -------------------------- //
528 fixed = gtk_radio_button_new_with_label( targetTypeRadio, _("Fixed") );
529 gtk_box_pack_start( GTK_BOX( vbox2 ), fixed, FALSE, FALSE, 3 );
530 gtk_widget_show( fixed );
531 targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( fixed ) );
533 interpolated = gtk_radio_button_new_with_label( targetTypeRadio, _("Interpolated") );
534 gtk_box_pack_start( GTK_BOX( vbox2 ), interpolated, FALSE, FALSE, 3 );
535 gtk_widget_show( interpolated );
536 targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( interpolated ) );
538 spline = gtk_radio_button_new_with_label( targetTypeRadio, _("Spline") );
539 gtk_box_pack_start( GTK_BOX( vbox2 ), spline, FALSE, FALSE, 3 );
540 gtk_widget_show( spline );
541 targetTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( spline ) );
543 // -------------------------- //
545 w = gtk_hseparator_new ();
546 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
549 // -------------------------- //
551 hbox = gtk_hbox_new( FALSE, 5 );
552 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
553 gtk_widget_show( hbox );
555 w = gtk_button_new_with_label (_("Ok"));
556 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
557 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
560 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
561 gtk_widget_grab_default( w );
563 w = gtk_button_new_with_label (_("Cancel"));
564 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
565 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
569 // -------------------------- //
571 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
572 gtk_widget_show (window);
573 gtk_grab_add (window);
575 bool dialogError = TRUE;
576 while (dialogError) {
579 gtk_main_iteration ();
584 const char *str = gtk_entry_get_text( GTK_ENTRY(name) );
586 if( str && str[0] ) {
590 if( gtk_toggle_button_get_active( (GtkToggleButton*)fixed ) )
592 else if( gtk_toggle_button_get_active( (GtkToggleButton*)interpolated ) )
594 else if( gtk_toggle_button_get_active( (GtkToggleButton*)spline ) )
598 GetCurrentCam()->GetCam()->addTarget( str, static_cast<idCameraPosition::positionType>(type) );
600 // Rebuild the listbox
601 RefreshPathListCombo();
603 // Select the last item in the listbox
604 li = g_list_last( GTK_LIST(GTK_COMBO(g_pPathListCombo)->list)->children );
605 gtk_list_select_child( GTK_LIST(GTK_COMBO(g_pPathListCombo)->list), GTK_WIDGET (li->data) );
607 // If this was the first one, refresh the event list
608 if( GetCurrentCam()->GetCam()->numTargets() == 1 ) {
612 // Go to editmode Add
613 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(g_pEditModeAddRadioButton), TRUE );
621 gtk_grab_remove (window);
622 gtk_widget_destroy (window);
627 static GtkWidget *g_pCamListCombo = NULL;
628 static GtkLabel *g_pCamType = NULL;
630 void RefreshCamListCombo( void )
632 if( !g_pCamListCombo )
635 GList *combo_list = (GList*)NULL;
636 CCamera *combo_cam = firstCam;
639 //combo_list = g_list_append( combo_list, (void *)combo_cam->GetCam()->getName() );
640 //if( combo_cam->HasBeenSaved() ) {
641 combo_list = g_list_append( combo_list, (void *)combo_cam->GetFileName() );
644 sprintf( buf, "Unsaved Camera %i", combo_cam->GetCamNum() );
645 combo_list = g_list_append( combo_list, (void *)buf );
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
649 combo_cam = combo_cam->GetNext();
652 // add one empty string make gtk be quiet
653 combo_list = g_list_append( combo_list, (gpointer)g_cNull );
655 gtk_combo_set_popdown_strings( GTK_COMBO( g_pCamListCombo ), combo_list );
656 g_list_free( combo_list );
658 // select our current entry in the list
659 if( GetCurrentCam() ) {
660 // stop editing on the current cam
661 //GetCurrentCam()->GetCam()->stopEdit(); // FIXME: this crashed on creating new cameras, why is it here?
663 GList *li = GTK_LIST( GTK_COMBO(g_pCamListCombo)->list)->children;
664 combo_cam = firstCam;
665 while( li && combo_cam ) {
666 if( combo_cam == GetCurrentCam() ) {
667 gtk_list_select_child( GTK_LIST( GTK_COMBO(g_pCamListCombo)->list ), GTK_WIDGET( li->data ) );
671 combo_cam = combo_cam->GetNext();
675 RefreshPathListCombo();
678 static gint ci_camlist_changed( GtkWidget *widget, gpointer data )
680 const char *str = gtk_entry_get_text( GTK_ENTRY(widget) );
682 CCamera *combo_cam = firstCam;
683 while( str && combo_cam ) {
684 //if( !strcmp( str, combo_cam->GetCam()->getName() ) )
685 //if( combo_cam->HasBeenSaved() ) {
686 if( !strcmp( str, combo_cam->GetFileName() ) )
690 sprintf( buf, "Unsaved Camera %i", combo_cam->GetCamNum() );
691 if( !strcmp( str, buf ) )
692 //if( !strcmp( str, combo_cam->GetCam()->getName() ) )
696 combo_cam = combo_cam->GetNext();
699 SetCurrentCam( combo_cam );
702 if( GetCurrentCam() ) {
703 // Fill in our widgets fields for this camera
707 gtk_entry_set_text( GTK_ENTRY(g_pCamName), GetCurrentCam()->GetCam()->getName() );
710 gtk_label_set_text( g_pCamType, GetCurrentCam()->GetCam()->getPositionObj()->typeStr() );
713 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getBaseTime() );
714 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), buf );
716 sprintf( buf, "%.2f", GetCurrentCam()->GetCam()->getTotalTime() );
717 gtk_label_set_text( g_pCurrentTime, "0.00" );
718 gtk_label_set_text( g_pTotalTime, buf );
720 gtk_adjustment_set_value( g_pTimeLine, 0.f );
721 g_pTimeLine->upper = GetCurrentCam()->GetCam()->getTotalTime() * 1000;
724 gtk_entry_set_text( GTK_ENTRY(g_pCamName), "" );
727 gtk_label_set_text( g_pCamType, "" );
730 gtk_entry_set_text( GTK_ENTRY(g_pSecondsEntry), "30.00" );
732 gtk_label_set_text( g_pCurrentTime, "0.00" );
733 gtk_label_set_text( g_pTotalTime, "30.00" );
735 gtk_adjustment_set_value( g_pTimeLine, 0.f );
736 g_pTimeLine->upper = 30000;
739 // Refresh event list
743 RefreshPathListCombo();
746 g_iActiveTarget = -1;
747 if( g_pCameraInspectorWnd && GTK_WIDGET_VISIBLE( g_pCameraInspectorWnd ) )
748 DoStartEdit( GetCurrentCam() );
758 EVENT_TARGET, // char(name)
760 EVENT_FOV, // int(time), int(targetfov)
765 EVENT_FADEOUT, // int(time)
766 EVENT_FADEIN, // int(time)
771 // { requires parameters, enabled }
772 const bool camEventFlags[][2] = {
789 const char *camEventStr[] = {
794 N_("Change Target <string:name>"),
796 N_("FOV <int:duration> <int:targetfov>"),
800 N_("Change to Camera <string:camera> (or <int:cameranum> <string:camera>"),
801 N_("Fade Out <int:duration>"),
802 N_("Fade In <int:duration>"),
806 static gint ci_add( GtkWidget *widget, gpointer data )
808 GtkWidget *window, *w, *vbox, *vbox2, *hbox, *frame, *parameters;
809 GtkWidget *eventWidget[EVENT_COUNT];
810 int i, ret, loop = 1;
811 GSList *eventTypeRadio = NULL;
814 if( !GetCurrentCam() )
818 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
819 gtk_window_set_title( GTK_WINDOW (window), _("Add Event") );
820 gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
821 gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
822 gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pCameraInspectorWnd ) );
824 g_object_set_data (G_OBJECT (window), "loop", &loop);
825 g_object_set_data (G_OBJECT (window), "ret", &ret);
827 gtk_widget_realize (window);
830 vbox = gtk_vbox_new( FALSE, 5 );
831 gtk_container_add (GTK_CONTAINER (window), vbox);
832 gtk_widget_show( vbox );
834 // -------------------------- //
836 hbox = gtk_hbox_new( FALSE, 5 );
837 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
838 gtk_widget_show( hbox );
840 frame = gtk_frame_new( _("Type") );
841 gtk_box_pack_start( GTK_BOX( hbox ), frame, TRUE, TRUE, 0 );
842 gtk_widget_show( frame );
844 vbox2 = gtk_vbox_new( FALSE, 5 );
845 gtk_container_add( GTK_CONTAINER( frame ), vbox2 );
846 gtk_container_set_border_width( GTK_CONTAINER (vbox2), 5 );
847 gtk_widget_show( vbox2 );
849 // -------------------------- //
851 for( i = 1; i < EVENT_COUNT; i++ ) {
852 eventWidget[i] = gtk_radio_button_new_with_label( eventTypeRadio, camEventStr[i] );
853 gtk_box_pack_start( GTK_BOX( vbox2 ), eventWidget[i], FALSE, FALSE, 3 );
854 gtk_widget_show( eventWidget[i] );
855 eventTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( eventWidget[i] ) );
856 if( camEventFlags[i][1] == false )
857 gtk_widget_set_sensitive (eventWidget[i], FALSE);
860 // -------------------------- //
862 hbox = gtk_hbox_new( FALSE, 5 );
863 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
864 gtk_widget_show( hbox );
866 w = gtk_label_new( _("Parameters:") );
867 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
868 gtk_widget_show( w );
870 parameters = gtk_entry_new();
871 gtk_box_pack_start( GTK_BOX( hbox ), parameters, TRUE, TRUE, 0 );
872 gtk_widget_show( parameters );
874 // -------------------------- //
876 w = gtk_hseparator_new ();
877 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
880 // -------------------------- //
882 hbox = gtk_hbox_new( FALSE, 5 );
883 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
884 gtk_widget_show( hbox );
886 w = gtk_button_new_with_label (_("Ok"));
887 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
888 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
891 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
892 gtk_widget_grab_default( w );
894 w = gtk_button_new_with_label (_("Cancel"));
895 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
896 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
900 // -------------------------- //
902 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
903 gtk_widget_show (window);
904 gtk_grab_add (window);
906 bool dialogError = TRUE;
907 while (dialogError) {
910 gtk_main_iteration ();
915 const char *str = gtk_entry_get_text( GTK_ENTRY(parameters) );
917 if( !camEventFlags[i][0] || ( str && str[0] ) ) {
921 for( type = 1; type < EVENT_COUNT; type++ ) {
922 if( gtk_toggle_button_get_active( (GtkToggleButton*)eventWidget[type] ) )
927 GetCurrentCam()->GetCam()->addEvent( static_cast<idCameraEvent::eventType>(type), str, (long)(g_pTimeLine->value) );
929 // Refresh event list
937 gtk_grab_remove (window);
938 gtk_widget_destroy (window);
943 static gint ci_del( GtkWidget *widget, gpointer data )
945 // TODO: add support to splines lib
946 if( GetCurrentCam() && GTK_CLIST(g_pEventsList)->focus_row >= 0 ) {
947 GetCurrentCam()->GetCam()->removeEvent( GTK_CLIST(g_pEventsList)->focus_row );
948 // Refresh event list
955 static gint ci_timeline_changed( GtkAdjustment *adjustment )
959 sprintf( buf, "%.2f", adjustment->value / 1000.f );
960 gtk_label_set_text( g_pCurrentTime, buf );
962 // FIXME: this will never work completely perfect. Startcamera calls buildcamera, which sets all events to 'nottriggered'.
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
964 // will have no idea where on the track it should be.
965 if( GetCurrentCam() && gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(g_pTrackCamera) ) ) {
967 vec3_t origin = { 0.0f, 0.0f, 0.0f }, dir = { 0.0f, 0.0f, 0.0f}, angles;
969 GetCurrentCam()->GetCam()->startCamera( 0 );
971 GetCurrentCam()->GetCam()->getCameraInfo( (long)(adjustment->value), &origin[0], &dir[0], &fov );
972 VectorSet( angles, asin (dir[2])*180/3.14159, atan2 (dir[1], dir[0])*180/3.14159, 0 );
973 g_CameraTable.m_pfnSetCamera( origin, angles );
979 GtkWidget *CreateCameraInspectorDialog( void )
981 GtkWidget *window, *w, *vbox, *hbox, *table, *frame;
984 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
985 gtk_window_set_title( GTK_WINDOW (window), _("Camera Inspector") );
986 gtk_signal_connect( GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC( ci_close ), NULL );
987 gtk_signal_connect( GTK_OBJECT (window), "expose_event", GTK_SIGNAL_FUNC( ci_expose ), NULL );
988 // gtk_signal_connect( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
989 gtk_window_set_transient_for( GTK_WINDOW( window ), GTK_WINDOW( g_pRadiantWnd ) );
991 // don't use show, as you don't want to have it displayed on startup ;-)
992 gtk_widget_realize( window );
997 // -------------------------- //
999 table = gtk_table_new( 3, 2, FALSE );
1000 gtk_widget_show( table );
1001 gtk_container_add( GTK_CONTAINER( window ), table );
1002 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1003 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1004 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1006 // the properties column
1007 // -------------------------- //
1009 vbox = gtk_vbox_new( FALSE, 5 );
1010 gtk_widget_show( vbox );
1011 gtk_table_attach( GTK_TABLE( table ), vbox, 0, 1, 0, 1,
1012 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1013 (GtkAttachOptions) (GTK_FILL), 0, 0 );
1015 // -------------------------- //
1017 hbox = gtk_hbox_new( FALSE, 5 );
1018 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1019 gtk_widget_show( hbox );
1021 w = gtk_label_new( _("File:") );
1022 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1023 gtk_widget_show( w );
1025 g_pCamListCombo = gtk_combo_new();
1026 gtk_box_pack_start (GTK_BOX( hbox ), g_pCamListCombo, TRUE, TRUE, 0);
1027 gtk_widget_show( g_pCamListCombo );
1029 // -------------------------- //
1031 hbox = gtk_hbox_new( FALSE, 5 );
1032 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1033 gtk_widget_show( hbox );
1035 w = gtk_label_new( _("Name:") );
1036 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1037 gtk_widget_show( w );
1039 g_pCamName = gtk_entry_new();
1040 gtk_box_pack_start( GTK_BOX( hbox ), g_pCamName, FALSE, FALSE, 0 );
1041 gtk_widget_show( g_pCamName );
1043 w = gtk_label_new( _("Type:") );
1044 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1045 gtk_widget_show( w );
1047 w = gtk_label_new( "" );
1048 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1049 gtk_widget_show( w );
1050 g_pCamType = GTK_LABEL( w );
1052 RefreshCamListCombo();
1054 gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(g_pCamListCombo)->entry ), FALSE );
1055 gtk_signal_connect( GTK_OBJECT(GTK_COMBO(g_pCamListCombo)->entry), "changed", GTK_SIGNAL_FUNC( ci_camlist_changed ), NULL );
1057 // -------------------------- //
1059 frame = gtk_frame_new( _("Path and Target editing") );
1060 gtk_widget_show( frame );
1061 gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 1, 2,
1062 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1063 (GtkAttachOptions) (GTK_FILL), 0, 0 );
1065 vbox = gtk_vbox_new( FALSE, 5 );
1066 gtk_container_add( GTK_CONTAINER( frame ), vbox );
1067 gtk_container_set_border_width( GTK_CONTAINER (vbox), 5 );
1068 gtk_widget_show( vbox );
1070 // -------------------------- //
1072 hbox = gtk_hbox_new( FALSE, 5 );
1073 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1074 gtk_widget_show( hbox );
1076 w = gtk_label_new( _("Edit:") );
1077 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1078 gtk_widget_show( w );
1080 g_pPathListCombo = gtk_combo_new();
1081 gtk_box_pack_start (GTK_BOX( hbox ), g_pPathListCombo, TRUE, TRUE, 0);
1082 gtk_widget_show( g_pPathListCombo );
1084 RefreshPathListCombo();
1086 gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(g_pPathListCombo)->entry ), FALSE );
1087 gtk_signal_connect( GTK_OBJECT(GTK_COMBO(g_pPathListCombo)->entry), "changed", GTK_SIGNAL_FUNC( ci_pathlist_changed ), NULL );
1089 // -------------------------- //
1091 hbox = gtk_hbox_new( FALSE, 5 );
1092 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1093 gtk_widget_show( hbox );
1095 g_pEditModeEditRadioButton = gtk_radio_button_new_with_label( g_pEditTypeRadio, _("Edit Points") );
1096 gtk_box_pack_start( GTK_BOX( hbox ), g_pEditModeEditRadioButton, FALSE, FALSE, 3 );
1097 gtk_widget_show( g_pEditModeEditRadioButton );
1098 g_pEditTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( g_pEditModeEditRadioButton ) );
1100 gtk_signal_connect( GTK_OBJECT( g_pEditModeEditRadioButton ), "clicked", GTK_SIGNAL_FUNC( ci_editmode_edit ), NULL );
1102 g_pEditModeAddRadioButton = gtk_radio_button_new_with_label( g_pEditTypeRadio, _("Add Points") );
1103 gtk_box_pack_start( GTK_BOX( hbox ), g_pEditModeAddRadioButton, FALSE, FALSE, 3 );
1104 gtk_widget_show( g_pEditModeAddRadioButton );
1105 g_pEditTypeRadio = gtk_radio_button_group( GTK_RADIO_BUTTON( g_pEditModeAddRadioButton ) );
1107 gtk_signal_connect( GTK_OBJECT( g_pEditModeAddRadioButton ), "clicked", GTK_SIGNAL_FUNC( ci_editmode_add ), NULL );
1109 // see if we should use a different default
1110 if( g_iEditMode == 1 ) {
1111 // Go to editmode Add
1112 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(g_pEditModeAddRadioButton), TRUE );
1115 w = gtk_label_new( _("Type:") );
1116 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1117 gtk_widget_show( w );
1119 w = gtk_label_new( "" );
1120 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1121 gtk_widget_show( w );
1122 g_pPathType = GTK_LABEL( w );
1124 // -------------------------- //
1126 hbox = gtk_hbox_new( FALSE, 5 );
1127 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1128 gtk_widget_show( hbox );
1130 w = gtk_button_new_with_label( _("Rename...") );
1131 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1132 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_rename ), NULL );
1133 gtk_widget_show( w );
1135 w = gtk_button_new_with_label( _("Add Target...") );
1136 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1137 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_add_target ), NULL );
1138 gtk_widget_show( w );
1140 // not available in splines library
1141 /*w = gtk_button_new_with_label( "Delete Selected" );
1142 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1143 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_delete_selected ), NULL );
1144 gtk_widget_show( w );
1146 w = gtk_button_new_with_label( "Select All" );
1147 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, TRUE, 0);
1148 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_select_all ), NULL );
1149 gtk_widget_show( w );*/
1151 // -------------------------- //
1153 frame = gtk_frame_new( _("Time") );
1154 gtk_widget_show( frame );
1155 gtk_table_attach( GTK_TABLE( table ), frame, 0, 1, 2, 3,
1156 (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1157 (GtkAttachOptions) (GTK_FILL), 0, 0 );
1159 vbox = gtk_vbox_new( FALSE, 5 );
1160 gtk_container_add( GTK_CONTAINER( frame ), vbox );
1161 gtk_container_set_border_width( GTK_CONTAINER (vbox), 5 );
1162 gtk_widget_show( vbox );
1164 // -------------------------- //
1166 hbox = gtk_hbox_new( FALSE, 5 );
1167 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1168 gtk_widget_show( hbox );
1170 w = gtk_label_new( _("Length (seconds):") );
1171 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1172 gtk_widget_show( w );
1174 g_pSecondsEntry = gtk_entry_new();
1175 gtk_box_pack_start( GTK_BOX( hbox ), g_pSecondsEntry, FALSE, FALSE, 0 );
1176 gtk_widget_show( g_pSecondsEntry );
1178 // -------------------------- //
1180 hbox = gtk_hbox_new( FALSE, 5 );
1181 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1182 gtk_widget_show( hbox );
1184 w = gtk_label_new( _("Current Time:") );
1185 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1186 gtk_widget_show( w );
1188 w = gtk_label_new( _("0.00") );
1189 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1190 gtk_widget_show( w );
1191 g_pCurrentTime = GTK_LABEL( w );
1193 w = gtk_label_new( _(" of ") );
1194 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1195 gtk_widget_show( w );
1197 w = gtk_label_new( _("0.00") );
1198 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1199 gtk_widget_show( w );
1200 g_pTotalTime = GTK_LABEL( w );
1202 // -------------------------- //
1204 hbox = gtk_hbox_new( FALSE, 5 );
1205 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1206 gtk_widget_show( hbox );
1208 g_pTimeLine = GTK_ADJUSTMENT( gtk_adjustment_new( 0, 0, 30000, 100, 250, 0 ) );
1209 gtk_signal_connect( GTK_OBJECT(g_pTimeLine), "value_changed", GTK_SIGNAL_FUNC( ci_timeline_changed ), NULL );
1210 w = gtk_hscale_new( g_pTimeLine );
1211 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1212 gtk_widget_show( w );
1213 gtk_scale_set_draw_value( GTK_SCALE( w ), FALSE );
1215 // -------------------------- //
1217 hbox = gtk_hbox_new( FALSE, 5 );
1218 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1219 gtk_widget_show( hbox );
1221 g_pTrackCamera = gtk_check_button_new_with_label( _("Track Camera") );
1222 gtk_box_pack_start( GTK_BOX( hbox ), g_pTrackCamera, FALSE, FALSE, 0 );
1223 gtk_widget_show( g_pTrackCamera );
1225 // -------------------------- //
1227 hbox = gtk_hbox_new( FALSE, 5 );
1228 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1229 gtk_widget_show( hbox );
1231 w = gtk_label_new( _("Events:") );
1232 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1233 gtk_widget_show( w );
1235 // -------------------------- //
1237 hbox = gtk_hbox_new( FALSE, 5 );
1238 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1239 gtk_widget_show( hbox );
1241 w = gtk_scrolled_window_new( NULL, NULL );
1242 gtk_widget_set_usize( w, 0, 150 );
1243 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( w ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
1244 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1245 gtk_widget_show( w );
1247 g_pEventsList = gtk_clist_new( 3 );
1248 gtk_container_add( GTK_CONTAINER(w), g_pEventsList);
1249 //gtk_signal_connect( GTK_OBJECT(g_pEventsList), "select_row", GTK_SIGNAL_FUNC (proplist_select_row), NULL);
1250 gtk_clist_set_selection_mode( GTK_CLIST(g_pEventsList), GTK_SELECTION_BROWSE );
1251 gtk_clist_column_titles_hide( GTK_CLIST(g_pEventsList) );
1252 gtk_clist_set_column_auto_resize( GTK_CLIST(g_pEventsList), 0, TRUE );
1253 gtk_clist_set_column_auto_resize( GTK_CLIST(g_pEventsList), 1, TRUE );
1254 gtk_clist_set_column_auto_resize( GTK_CLIST(g_pEventsList), 2, TRUE );
1255 gtk_widget_show( g_pEventsList );
1257 vbox = gtk_vbox_new( FALSE, 5 );
1258 gtk_box_pack_start( GTK_BOX( hbox ), vbox, FALSE, FALSE, 0 );
1259 gtk_widget_show( vbox );
1261 w = gtk_button_new_with_label( _("Add...") );
1262 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1263 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_add ), NULL );
1264 gtk_widget_show( w );
1266 w = gtk_button_new_with_label( _("Del") );
1267 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1268 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_del ), NULL );
1269 gtk_widget_show( w );
1271 // -------------------------- //
1279 // the buttons column
1280 // -------------------------- //
1282 vbox = gtk_vbox_new( FALSE, 5 );
1283 gtk_widget_show( vbox );
1284 gtk_table_attach( GTK_TABLE( table ), vbox, 1, 2, 0, 1,
1285 (GtkAttachOptions) (GTK_FILL),
1286 (GtkAttachOptions) (GTK_FILL), 0, 0 );
1288 w = gtk_button_new_with_label( _("New...") );
1289 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1290 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_new ), NULL );
1291 gtk_widget_show( w );
1293 w = gtk_button_new_with_label( _("Load...") );
1294 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1295 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_load ), NULL );
1296 gtk_widget_show( w );
1298 // -------------------------- //
1300 vbox = gtk_vbox_new( FALSE, 5 );
1301 gtk_widget_show( vbox );
1302 gtk_table_attach( GTK_TABLE( table ), vbox, 1, 2, 1, 2,
1303 (GtkAttachOptions) (GTK_FILL),
1304 (GtkAttachOptions) (GTK_FILL), 0, 0 );
1306 w = gtk_button_new_with_label( _("Save...") );
1307 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1308 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_save ), NULL );
1309 gtk_widget_show( w );
1311 w = gtk_button_new_with_label( _("Unload") );
1312 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1313 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_unload ), NULL );
1314 gtk_widget_show( w );
1316 hbox = gtk_hbox_new( FALSE, 5 );
1317 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1318 gtk_widget_show( hbox );
1320 w = gtk_button_new_with_label( _("Apply") );
1321 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1322 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_apply ), NULL );
1323 gtk_widget_show( w );
1325 w = gtk_button_new_with_label( _("Preview") );
1326 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1327 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_preview ), NULL );
1328 gtk_widget_show( w );
1330 // -------------------------- //
1332 vbox = gtk_vbox_new( FALSE, 5 );
1333 gtk_widget_show( vbox );
1334 gtk_table_attach( GTK_TABLE( table ), vbox, 1, 2, 2, 3,
1335 (GtkAttachOptions) (GTK_FILL),
1336 (GtkAttachOptions) (GTK_FILL), 0, 0 );
1338 hbox = gtk_hbox_new( FALSE, 5 );
1339 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1340 gtk_widget_show( hbox );
1342 w = gtk_button_new_with_label( _("Close") );
1343 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0);
1344 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( ci_close ), NULL );
1345 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1346 gtk_widget_grab_default( w );
1347 gtk_widget_show( w );
1349 // -------------------------- //