#include <page_trim.h>
Inheritance diagram for PageTrim:


Public Member Functions | |
| PageTrim (KinoCommon *common) | |
| virtual | ~PageTrim () |
| Destructor for the trimmer page object. | |
| FrameDisplayer * | getFrameDisplayer () |
| int | getInPoint () |
| int | getOutPoint () |
| PlayList & | getPlayList () |
| int | getTotalFrames () |
| int | getPosition () |
| void | setInPoint (int value) |
| void | setOutPoint (int value) |
| void | setPosition (int value) |
| gulong | activate () |
| Activate the returned widgets. | |
| void | newFile () |
| New File action. | |
| void | start () |
| Start action. | |
| void | clean () |
| Clean action. | |
| gboolean | processKeyboard (GdkEventKey *event) |
| Process a keyboard event. | |
| gboolean | processCommand (char *cmd) |
| Internal method for handling a complete keyboard scene. | |
| void | selectScene (int) |
| Load the selected scene. | |
| void | videoStartOfMovie () |
| Move to the start of the scene. | |
| void | videoPreviousScene () |
| Move to the in point of the scene. | |
| void | videoStartOfScene () |
| Move to the in point of the scene. | |
| void | videoRewind () |
| Rewind. | |
| void | videoBack (int step=-1) |
| Move one frame back. | |
| void | videoPlay () |
| Play. | |
| void | videoForward (int step=1) |
| Move one frame forward. | |
| void | videoFastForward () |
| Fast forward. | |
| void | videoShuttle (int) |
| Shuttle. | |
| void | videoNextScene () |
| Move to the end of the current scene. | |
| void | videoEndOfScene () |
| Move to the end of the current scene. | |
| void | videoEndOfMovie () |
| Move to the end of the play list. | |
| void | videoPause () |
| Pause. | |
| void | videoStop () |
| Stop. | |
| void | startNavigator () |
| Starts the navigator thread. | |
| void | stopNavigator () |
| Stops the navigator thread. | |
| void | movedToFrame (int frame) |
| Called when the current frame has changed through the common moveToFrame method and this page is the current page. | |
| void | showFrame (int, gboolean) |
| Show the frame requested. | |
| void | showFrame (int, Frame &) |
| void | windowMoved () |
| void | showFrameInfo (int) |
| void | resetInPoint () |
| void | resetOutPoint () |
| int | getSceneIndex () |
| bool | loadFile (const string &) |
| Loads a clip into the trimmer. | |
| void | insertScene (TrimInsertMode) |
| Inserts the clip currently in the trimmer into the movie. | |
| void | loadScene (int currentScene) |
| Load a scene from the movie into the trimmer to edit it. | |
| void | saveScene () |
| Saves the scene currently being edited back to the movie. | |
| void | setMode (PageTrimMode) |
| void | timeFormatChanged () |
| std::string | getHelpPage () |
Private Attributes | |
| KinoCommon * | common |
| FrameDisplayer * | displayer |
| GtkDrawingArea * | frameArea |
| GtkLabel * | positionLabelCurrent |
| GtkLabel * | positionLabelTotal |
| GtkWidget * | trim |
| GtkButton * | reset_in |
| GtkButton * | reset_out |
| PlayList | playlist |
| gint | idleCommand |
| gboolean | idleCommandActive |
| int | start_orig |
| int | update_start |
| int | end_orig |
| int | in_orig |
| int | out_orig |
| int | in |
| int | out |
| int | max |
| int | pos |
| int | currentScene |
| int | lastPos |
| PageTrimMode | mode |
| bool | changed |
| PlayList * | g_copiedPlayList |
Definition at line 51 of file page_trim.h.
|
|
Definition at line 476 of file page_trim.cc. References frameArea, g_copiedPlayList, KinoCommon::getWidget(), gtk_enhanced_scale_new(), link_toggle, lookup_widget(), loop_toggle, on_trim_button_press_event(), on_trim_button_release_event(), on_trim_value_changed_event(), positionLabelCurrent, positionLabelTotal, spin_in, spin_out, trim, trim_adj, TRIM_ADJ_IN, TRIM_ADJ_OUT, and TRIM_ADJ_POS. 00476 : 00477 start_orig( 0 ), update_start(0), end_orig( 0 ), in_orig( 0 ), out_orig( 0 ), in( 0 ), out( 0 ), 00478 max( 0 ), pos( -1 ), currentScene( 0 ), lastPos( -1 ), mode( PAGE_TRIM_MODE_UNKNOWN ), 00479 changed( false ) 00480 { 00481 cerr << "> Creating page trim" << endl; 00482 this->common = common; 00483 this->frameArea = GTK_DRAWING_AREA( lookup_widget( common->getWidget(), "drawingarea_trim" ) ); 00484 gtk_widget_set_double_buffered( GTK_WIDGET( frameArea ), FALSE ); 00485 this->positionLabelCurrent = GTK_LABEL( lookup_widget( common->getWidget(), "position_label_current" ) ); 00486 this->positionLabelTotal = GTK_LABEL( lookup_widget( common->getWidget(), "position_label_total" ) ); 00487 spin_in = GTK_SPIN_BUTTON( lookup_widget( common->getWidget(), "spinbutton_trim_in" ) ); 00488 spin_out = GTK_SPIN_BUTTON( lookup_widget( common->getWidget(), "spinbutton_trim_out" ) ); 00489 link_toggle = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(), "togglebutton_trim_link" ) ); 00490 loop_toggle = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(), "togglebutton_trim_loop" ) ); 00491 00492 this->g_copiedPlayList = new PlayList(); 00493 00494 // Attach the custom GTK+ Trim control 00495 trim_adj[ TRIM_ADJ_POS ] = GTK_ADJUSTMENT( 00496 gtk_adjustment_new( 0, 0, 0, 1, 10, 0 ) ); 00497 trim_adj[ TRIM_ADJ_IN ] = GTK_ADJUSTMENT( 00498 gtk_adjustment_new( 0, 0, 0, 1, 10, 0 ) ); 00499 trim_adj[ TRIM_ADJ_OUT ] = GTK_ADJUSTMENT( 00500 gtk_adjustment_new( 0, 0, 0, 1, 10, 0 ) ); 00501 for ( int i = 0; i < 3; i++ ) 00502 g_signal_connect ( G_OBJECT ( trim_adj[ i ] ), "value_changed", 00503 G_CALLBACK( on_trim_value_changed_event ), ( gpointer ) i ); 00504 trim = gtk_enhanced_scale_new( ( GtkObject** ) trim_adj, 3 ); 00505 gtk_widget_set_name ( trim, "trim" ); 00506 gtk_widget_ref( trim ); 00507 gtk_object_set_data_full ( GTK_OBJECT( common->getWidget() ), "trim", trim, 00508 ( GtkDestroyNotify ) gtk_widget_unref ); 00509 GtkWidget *vbox_trim = lookup_widget( common->getWidget(), "vbox_trim_custom" ); 00510 gtk_widget_show( trim ); 00511 gtk_box_pack_start( GTK_BOX ( vbox_trim ), trim, FALSE, TRUE, 0 ); 00512 g_signal_connect( G_OBJECT( trim ), "button_press_event", 00513 G_CALLBACK( on_trim_button_press_event ), NULL ); 00514 g_signal_connect( G_OBJECT( trim ), "button_release_event", 00515 G_CALLBACK( on_trim_button_release_event ), NULL ); 00516 }
|
|
|
Destructor for the trimmer page object.
Definition at line 521 of file page_trim.cc. References g_copiedPlayList. 00522 {
00523 cerr << "> Destroying page trim" << endl;
00524 delete this->g_copiedPlayList;
00525 }
|
|
|
Activate the returned widgets.
Reimplemented from Page. Definition at line 605 of file page_trim.cc. References EDIT_MENU, INFO_FRAME, SCENE_LIST, VIDEO_BACK, VIDEO_END_OF_MOVIE, VIDEO_FAST_FORWARD, VIDEO_FORWARD, VIDEO_NEXT_SCENE, VIDEO_PAUSE, VIDEO_PLAY, VIDEO_REWIND, VIDEO_SHUTTLE, VIDEO_START_OF_MOVIE, VIDEO_START_OF_SCENE, and VIDEO_STOP. 00606 {
00607 return EDIT_MENU |
00608 SCENE_LIST |
00609 VIDEO_START_OF_MOVIE |
00610 VIDEO_START_OF_SCENE |
00611 VIDEO_REWIND |
00612 VIDEO_BACK |
00613 VIDEO_PLAY |
00614 VIDEO_PAUSE |
00615 VIDEO_STOP |
00616 VIDEO_FORWARD |
00617 VIDEO_FAST_FORWARD |
00618 VIDEO_NEXT_SCENE |
00619 VIDEO_END_OF_MOVIE |
00620 VIDEO_SHUTTLE |
00621 INFO_FRAME;
00622 }
|
|
|
Clean action. Called when another page becomes current. Reimplemented from Page. Definition at line 627 of file page_trim.cc. References displayer, frameContent, GetFramePool(), PLAYBACK_FRAMES, saveScene(), stopNavigator(), and writer1394. 00628 {
00629 cerr << ">> Leaving Trimmer" << endl;
00630 stopNavigator();
00631 delete displayer;
00632 displayer = 0;
00633 delete writer1394;
00634 writer1394 = NULL;
00635 saveScene();
00636 for ( int i = 0; i < PLAYBACK_FRAMES; i ++ )
00637 GetFramePool( ) ->DoneWithFrame( frameContent[ i ] );
00638
00639 cerr << ">> Left Trimmer" << endl;
00640 }
|
|
|
Definition at line 90 of file page_trim.h. References displayer. Referenced by showFrame(), and stopNavigator(). 00091 {
00092 return this->displayer;
00093 }
|
|
|
Reimplemented from Page. Definition at line 169 of file page_trim.h. 00170 {
00171 return "trim";
00172 }
|
|
|
Definition at line 94 of file page_trim.h. References in. 00095 {
00096 return this->in;
00097 }
|
|
|
Definition at line 98 of file page_trim.h. References out. 00099 {
00100 return this->out;
00101 }
|
|
|
Definition at line 102 of file page_trim.h. References playlist. Referenced by processCommand(). 00103 {
00104 return this->playlist;
00105 }
|
|
|
Definition at line 110 of file page_trim.h. References pos. 00111 {
00112 return this->pos;
00113 }
|
|
|
Definition at line 1330 of file page_trim.cc. References common, currentScene, KinoCommon::getPageEditor(), and KinoCommon::getPlayList(). Referenced by insertScene(), and processCommand(). 01331 {
01332 int i = 0;
01333 if ( common->getPlayList()->GetNumFrames() > 0 )
01334 {
01335 vector <int> scene = common->getPageEditor() ->GetScene();
01336 for ( i = 0; i < (int) scene.size() - 1; i++ )
01337 if ( currentScene < scene[ i ] )
01338 break;
01339 }
01340 else
01341 {
01342 i = -1;
01343 }
01344 return i;
01345 }
|
|
|
Definition at line 106 of file page_trim.h. References max. 00107 {
00108 return this->max + 1;
00109 }
|
|
|
Inserts the clip currently in the trimmer into the movie.
Definition at line 834 of file page_trim.cc. References common, PlayList::Delete(), end_orig, navigate_control::escaped, KinoCommon::g_currentFrame, g_nav_ctl, GetEditorBackup(), GetFileMap(), PlayList::GetNumFrames(), KinoCommon::getPageEditor(), KinoCommon::getPlayList(), getSceneIndex(), KinoCommon::getWidget(), KinoCommon::hasListChanged, in, lookup_widget(), max, out, playlist, selectScene(), KinoCommon::setCurrentScene(), KinoCommon::setWindowTitle(), start_orig, TRIM_INSERT_MODE_AFTER, and TRIM_INSERT_MODE_BEFORE. Referenced by processCommand(). 00835 {
00836 if ( playlist.GetNumFrames() > 0 )
00837 {
00838 int i = getSceneIndex();
00839
00840 if ( insertMode == TRIM_INSERT_MODE_BEFORE )
00841 {
00842 PlayList tmp;
00843 tmp = playlist;
00844 tmp.Delete( out + 1, max );
00845 tmp.Delete( 0, in - 1 );
00846 common->getPlayList()->InsertPlayList( tmp, start_orig );
00847 }
00848 else if ( insertMode == TRIM_INSERT_MODE_AFTER )
00849 {
00850 PlayList tmp;
00851 tmp = playlist;
00852 tmp.Delete( out + 1, max );
00853 tmp.Delete( 0, in - 1 );
00854 common->getPlayList()->InsertPlayList( tmp, end_orig + 1 );
00855 i++;
00856 }
00857 GetEditorBackup()->Store( common->getPlayList() );
00858 common->hasListChanged = TRUE;
00859 common->setWindowTitle( );
00860 common->getPageEditor()->DrawBar( common->g_currentFrame );
00861 selectScene( i );
00862 common->setCurrentScene( start_orig );
00863
00864 // Refresh the combo menu
00865 GList *items = NULL;
00866 const char *filename = gtk_entry_get_text( GTK_ENTRY( lookup_widget( GTK_WIDGET( common->getWidget() ), "entry_trim_clip" ) ) );
00867 map<string, FileHandler*>::iterator n;
00868 items = g_list_append( items, ( void* ) filename );
00869 for ( n = GetFileMap()->GetMap().begin(); n != GetFileMap()->GetMap().end(); ++n )
00870 if ( strcmp( n->first.c_str(), filename ) )
00871 items = g_list_append( items, ( void* ) n->first.c_str() );
00872 g_nav_ctl.escaped = TRUE;
00873 gtk_combo_set_popdown_strings( GTK_COMBO( lookup_widget( common->getWidget(), "combo_trim_clip" ) ), items);
00874 g_nav_ctl.escaped = FALSE;
00875 }
00876 }
|
|
|
Loads a clip into the trimmer.
Definition at line 770 of file page_trim.cc. References changed, common, currentScene, end_orig, PlayList::GetNumFrames(), KinoCommon::getPlayList(), in, in_orig, lastPos, PlayList::LoadMediaObject(), max, out, out_orig, playlist, pos, spin_in, spin_out, start_orig, timeFormatChanged(), trim_adj, TRIM_ADJ_IN, TRIM_ADJ_OUT, and TRIM_ADJ_POS. Referenced by movedToFrame(). 00771 {
00772 PlayList newList;
00773 bool result = true;
00774
00775 try
00776 {
00777 if ( newList.LoadMediaObject( const_cast< char* >( filename.c_str() ) ) )
00778 {
00779 playlist = newList;
00780 start_orig = common->getPlayList()->FindStartOfScene( currentScene );
00781 end_orig = common->getPlayList()->FindEndOfScene( currentScene );
00782 in = in_orig = lastPos = pos = 0;
00783 out = out_orig = max = playlist.GetNumFrames() - 1;
00784 changed = true;
00785
00786 trim_adj[ TRIM_ADJ_IN ] ->upper = max;
00787 trim_adj[ TRIM_ADJ_IN ] ->value = in;
00788 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_IN ], "changed" );
00789 trim_adj[ TRIM_ADJ_OUT ] ->upper = max;
00790 trim_adj[ TRIM_ADJ_OUT ] ->value = out;
00791 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_OUT ], "changed" );
00792 trim_adj[ TRIM_ADJ_POS ] ->upper = max;
00793 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_POS ], "changed" );
00794
00795 GtkAdjustment *adjust = gtk_spin_button_get_adjustment( spin_in );
00796 adjust->lower = 0;
00797 adjust->upper = max;
00798 adjust->value = in;
00799 g_signal_emit_by_name( adjust, "changed" );
00800 gtk_spin_button_set_value( spin_in, ( gfloat ) in );
00801
00802 adjust = gtk_spin_button_get_adjustment( spin_out );
00803 adjust->lower = 0;
00804 adjust->upper = max;
00805 adjust->value = out;
00806 g_signal_emit_by_name( adjust, "changed" );
00807 gtk_spin_button_set_value( spin_out, ( gfloat ) out );
00808
00809 timeFormatChanged();
00810 }
00811 else
00812 {
00813 // XXX: the following is making gtk abort
00814 // modal_message( _( "Failed to load media file." ) );
00815 result = false;
00816 }
00817 }
00818 catch ( string s )
00819 {
00820 cerr << "Could not load file " << filename << ", because an exception has occurred: " << endl;
00821 cerr << s << endl;
00822 result = false;
00823 }
00824
00825 return result;
00826 }
|
|
|
Load a scene from the movie into the trimmer to edit it.
Definition at line 647 of file page_trim.cc. References common, currentScene, end_orig, navigate_control::escaped, PlayList::FindEndOfScene(), PlayList::FindStartOfScene(), g_nav_ctl, PlayList::GetClipBegin(), PlayList::GetClipEnd(), PlayList::GetMediaObject(), PlayList::GetNumFrames(), PlayList::GetPlayList(), KinoCommon::getPlayList(), FileHandler::GetTotalFrames(), KinoCommon::getWidget(), in, in_orig, lastPos, lookup_widget(), max, out, out_orig, playlist, pos, PlayList::SetClipBegin(), PlayList::SetClipEnd(), KinoCommon::setCurrentScene(), spin_in, spin_out, start_orig, timeFormatChanged(), trim_adj, TRIM_ADJ_IN, TRIM_ADJ_OUT, TRIM_ADJ_POS, and update_start. Referenced by movedToFrame(), processCommand(), selectScene(), setMode(), and start(). 00648 {
00649 char value[ 20 ];
00650 PlayList newPlayList;
00651 playlist = newPlayList;
00652 PlayList *pl = common->getPlayList();
00653 FileHandler *media;
00654
00655 currentScene = newScene;
00656
00657 // first, save begin and end time markers to region of the
00658 // the whole movie that this scene represents
00659 update_start = start_orig = pl->FindStartOfScene( currentScene );
00660 end_orig = pl->FindEndOfScene( currentScene );
00661
00662 // get a local playlist representing just the scene
00663 // based on time markers in the movie
00664 pl->GetPlayList( start_orig, end_orig, playlist );
00665
00666 // set the in point and current position to the in point
00667 // of the first clip in the scene
00668 in = in_orig = lastPos = pos = pl->GetClipBegin( currentScene );
00669
00670 // unwind the clip at the beginning of the scene
00671 playlist.SetClipBegin( 0, "0" );
00672
00673 // get the clip at the end of the scene
00674 playlist.GetMediaObject( playlist.FindEndOfScene( 0 ), &media );
00675
00676 // unwind the clip at the end of the scene
00677 // XXX: what about frames deleted from the beginning or middle
00678 // of a multi-clip scene?
00679 int prevClipEnd = playlist.GetClipEnd( playlist.GetNumFrames() - 1 );
00680 int newClipEnd = media->GetTotalFrames() - 1;
00681 snprintf( value, 19, "%i", newClipEnd );
00682 playlist.SetClipEnd( playlist.GetNumFrames() - 1, value );
00683
00684 // get the total number of frames now in the local playlist
00685 max = playlist.GetNumFrames() - 1;
00686
00687 // set the out point to the difference between out point before
00688 // and after unwinding
00689 out = out_orig = max - ( newClipEnd - prevClipEnd );
00690
00691 // inform controller of our scene change
00692 common->setCurrentScene( start_orig );
00693
00694 // update the trim UI
00695 trim_adj[ TRIM_ADJ_IN ] ->upper = max;
00696 trim_adj[ TRIM_ADJ_IN ] ->value = in;
00697 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_IN ], "changed" );
00698 trim_adj[ TRIM_ADJ_OUT ] ->upper = max;
00699 trim_adj[ TRIM_ADJ_OUT ] ->value = out;
00700 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_OUT ], "changed" );
00701 trim_adj[ TRIM_ADJ_POS ] ->upper = max;
00702 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_POS ], "changed" );
00703
00704 // Recalibrate the spinners
00705 GtkAdjustment *adjust = gtk_spin_button_get_adjustment( spin_in );
00706 adjust->lower = 0;
00707 adjust->upper = max;
00708 adjust->value = in;
00709 g_signal_emit_by_name( adjust, "changed" );
00710 gtk_spin_button_set_value( spin_in, ( gfloat ) in );
00711
00712 adjust = gtk_spin_button_get_adjustment( spin_out );
00713 adjust->lower = 0;
00714 adjust->upper = max;
00715 adjust->value = out;
00716 g_signal_emit_by_name( adjust, "changed" );
00717 gtk_spin_button_set_value( spin_out, ( gfloat ) out );
00718
00719 g_nav_ctl.escaped = TRUE;
00720 gtk_entry_set_text( GTK_ENTRY( lookup_widget( common->getWidget(), "entry_trim_clip" ) ), "" );
00721 g_nav_ctl.escaped = FALSE;
00722
00723 timeFormatChanged();
00724 }
|
|
|
Called when the current frame has changed through the common moveToFrame method and this page is the current page.
Reimplemented from Page. Definition at line 944 of file page_trim.cc. References navigate_control::active, common, g_nav_ctl, Preferences::getInstance(), KinoCommon::getPageEditor(), KinoCommon::getPlayList(), KinoCommon::getWidget(), KinoCommon::hasListChanged, in, lastFrame, lastPos, loadFile(), loadScene(), lookup_widget(), loop_toggle, max, mode, newFrame, out, PAGE_TRIM_MODE_INSERT, PAGE_TRIM_MODE_UPDATE, pos, showFrame(), skipPosUpdate, and startNavigator(). Referenced by processCommand(), selectScene(), start(), videoEndOfMovie(), videoEndOfScene(), videoNextScene(), videoPreviousScene(), videoStartOfMovie(), and videoStartOfScene(). 00945 {
00946 if ( common->hasListChanged == TRUE )
00947 {
00948 common->getPageEditor()->ResetBar();
00949 common->hasListChanged = FALSE;
00950
00951 if ( mode == PAGE_TRIM_MODE_UPDATE &&
00952 common->getPlayList() ->GetNumFrames() > 0 )
00953 {
00954 loadScene( frame );
00955 frame = in;
00956 }
00957 else if ( mode == PAGE_TRIM_MODE_INSERT )
00958 {
00959 const char *file = gtk_entry_get_text( GTK_ENTRY( lookup_widget( GTK_WIDGET( common->getWidget() ), "entry_trim_clip" ) ) );
00960 if ( file && strcmp( file, "" ) )
00961 {
00962 loadFile( file );
00963 frame = pos;
00964 }
00965 }
00966 }
00967 if ( max > 0 )
00968 {
00969 if ( frame > out && gtk_toggle_button_get_active( loop_toggle ) == TRUE )
00970 pos = in;
00971 else if ( frame < in && gtk_toggle_button_get_active( loop_toggle ) == TRUE )
00972 pos = out;
00973 else if ( frame >= 0 && frame <= max )
00974 pos = frame;
00975 else if ( frame >= max )
00976 pos = max;
00977 else if ( frame < 0 && max > 0 )
00978 pos = 0;
00979 else
00980 pos = -1;
00981
00982 if ( g_nav_ctl.active == FALSE )
00983 {
00984 skipPosUpdate = FALSE;
00985 showFrame( pos, ( pos == lastPos ) || ( Preferences::getInstance().audioScrub == FALSE ) );
00986 }
00987 else
00988 {
00989 lastFrame = newFrame = pos;
00990 startNavigator();
00991 }
00992 }
00993 }
|
|
|
New File action.
Reimplemented from Page. Definition at line 530 of file page_trim.cc. References stopNavigator(). 00531 {
00532 this->stopNavigator();
00533 }
|
|
|
Internal method for handling a complete keyboard scene.
Reimplemented from Page. Definition at line 1483 of file page_trim.cc. References _getOneSecond(), navigate_control::active, CAPTURE_FRAME_APPEND, CAPTURE_MOVIE_APPEND, KinoCommon::changePageRequest(), cmd, common, count, currentScene, end_orig, KinoCommon::g_currentFrame, g_nav_ctl, GetEditorBackup(), FileTracker::GetInstance(), KinoCommon::getPageEditor(), KinoCommon::getPageTrim(), KinoCommon::getPlayList(), getPlayList(), getSceneIndex(), KinoCommon::hasListChanged, in, insertScene(), KinoCommon::keyboardFeedback(), kinoDeactivate(), lastcmd, link_toggle, loadScene(), loop_toggle, mode, movedToFrame(), KinoCommon::moveToFrame(), moveToFrame(), out, PAGE_CAPTURE, PAGE_EDITOR, PAGE_EXPORT, PAGE_MAGICK, PAGE_TIMELINE, PAGE_TRIM_MODE_INSERT, PAGE_TRIM_MODE_UPDATE, pos, resetInPoint(), resetOutPoint(), KinoCommon::savePlayList(), saveScene(), selectScene(), setMode(), KinoCommon::setStatusBar(), start_orig, trim_adj, TRIM_ADJ_IN, TRIM_ADJ_OUT, TRIM_ADJ_POS, TRIM_INSERT_MODE_AFTER, TRIM_INSERT_MODE_BEFORE, KinoCommon::videoEndOfMovie(), KinoCommon::videoEndOfScene(), KinoCommon::videoPause(), KinoCommon::videoPlay(), KinoCommon::videoStartOfMovie(), KinoCommon::videoStartOfScene(), and KinoCommon::videoStop(). Referenced by processKeyboard(). 01484 {
01485 int end;
01486 int count = 1;
01487 char real[ 256 ] = "";
01488
01489 strcpy( cmd, command );
01490
01491 switch ( sscanf( cmd, "%d%s", &count, real ) )
01492 {
01493 case 1:
01494 // Numeric value only - return immediately if the cmd is not "0"
01495 if ( strcmp( cmd, "0" ) )
01496 {
01497 common->keyboardFeedback( cmd, "" );
01498 return FALSE;
01499 }
01500 break;
01501 case 0:
01502 sscanf( cmd, "%s", real );
01503 count = 1;
01504 break;
01505 }
01506
01507 if ( strcmp( cmd, "." ) )
01508 strcpy( lastcmd, cmd );
01509
01510 /* Navigation */
01511
01512 /* play, pause */
01513
01514 if ( strcmp( cmd, " " ) == 0 )
01515 {
01516 if ( g_nav_ctl.active == TRUE )
01517 {
01518 common->keyboardFeedback( cmd, _( "Pause" ) );
01519 common->videoPause( );
01520 }
01521 else
01522 {
01523 common->keyboardFeedback( cmd, _( "Play" ) );
01524 common->videoPlay( );
01525 }
01526 cmd[ 0 ] = 0;
01527 }
01528
01529 else if ( strcmp( real, "Esc" ) == 0 )
01530 {
01531 common->keyboardFeedback( cmd, _( "Stop" ) );
01532 common->videoStop( );
01533 cmd[ 0 ] = 0;
01534 }
01535
01536 else if ( strcmp( real, "Enter" ) == 0 )
01537 {
01538 if ( mode == PAGE_TRIM_MODE_UPDATE )
01539 {
01540 int pos = common->getPageTrim()->getPosition();
01541 common->keyboardFeedback( cmd, _( "Overwrite" ) );
01542 saveScene();
01543 loadScene( currentScene );
01544 movedToFrame( pos );
01545 }
01546 else if ( mode == PAGE_TRIM_MODE_INSERT )
01547 {
01548 common->keyboardFeedback( cmd, _( "Insert After" ) );
01549 insertScene( TRIM_INSERT_MODE_AFTER );
01550 movedToFrame( in );
01551 }
01552 cmd[ 0 ] = 0;
01553 }
01554
01555 else if ( strcmp( real, ":r" ) == 0 )
01556 {
01557 common->keyboardFeedback( cmd, _( "Insert Before" ) );
01558 insertScene( TRIM_INSERT_MODE_BEFORE );
01559 cmd[ 0 ] = 0;
01560 }
01561
01562 else if ( strcmp( real, ":a" ) == 0 )
01563 {
01564 common->keyboardFeedback( cmd, _( "Insert After" ) );
01565 insertScene( TRIM_INSERT_MODE_AFTER );
01566 cmd[ 0 ] = 0;
01567 }
01568
01569 else if ( strcmp( real, "Ins" ) == 0 )
01570 {
01571 common->keyboardFeedback( cmd, _( "Toggle Insert/Overwrite" ) );
01572 setMode( mode == PAGE_TRIM_MODE_UPDATE ? PAGE_TRIM_MODE_INSERT : PAGE_TRIM_MODE_UPDATE );
01573 cmd[ 0 ] = 0;
01574 }
01575
01576 /* advance one frame */
01577
01578 else if ( strcmp( real, "l" ) == 0 )
01579 {
01580 common->keyboardFeedback( cmd, _( "Move forward" ) );
01581 movedToFrame( pos + count );
01582 cmd[ 0 ] = 0;
01583 }
01584
01585 /* backspace one frame */
01586
01587 else if ( strcmp( real, "h" ) == 0 )
01588 {
01589 common->keyboardFeedback( cmd, _( "Move backward" ) );
01590 movedToFrame( pos - count );
01591 cmd[ 0 ] = 0;
01592 }
01593
01594 /* advance one second */
01595
01596 else if ( strcmp( real, "w" ) == 0 || strcmp( real, "W" ) == 0 ||
01597 strcmp( real, "e" ) == 0 || strcmp( real, "E" ) == 0 )
01598 {
01599 common->keyboardFeedback( cmd, _( "Move forward second" ) );
01600 movedToFrame( pos + count * _getOneSecond() );
01601 cmd[ 0 ] = 0;
01602 }
01603
01604 /* backspace one second */
01605
01606 else if ( ( strcmp( real, "b" ) == 0 ) || ( strcmp( real, "B" ) == 0 ) )
01607 {
01608 common->keyboardFeedback( cmd, _( "Move backwards one second" ) );
01609 moveToFrame( pos - count * _getOneSecond() );
01610 cmd[ 0 ] = 0;
01611 }
01612
01613 /* start of scene */
01614
01615 else if ( ( strcmp( cmd, "0" ) == 0 ) || ( strcmp( real, "^" ) == 0 ) )
01616 {
01617 common->videoStartOfScene( );
01618 common->keyboardFeedback( cmd, _( "Move to start of scene" ) );
01619 cmd[ 0 ] = 0;
01620 }
01621
01622 /* end of scene */
01623
01624 else if ( strcmp( real, "$" ) == 0 )
01625 {
01626 common->videoEndOfScene( );
01627 common->keyboardFeedback( cmd, _( "Move to end of scene" ) );
01628 cmd[ 0 ] = 0;
01629 }
01630
01631 /* start of next scene */
01632
01633 else if ( ( strcmp( real, "j" ) == 0 ) || strcmp( real, "+" ) == 0 )
01634 {
01635 selectScene( getSceneIndex() + 1 );
01636 common->keyboardFeedback( cmd, _( "Move to start of next scene" ) );
01637 cmd[ 0 ] = 0;
01638 }
01639
01640 /* start of previous scene */
01641
01642 else if ( ( strcmp( real, "k" ) == 0 ) || ( strcmp( real, "-" ) == 0 ) )
01643 {
01644 selectScene( getSceneIndex() - 1 );
01645 common->keyboardFeedback( cmd, _( "Move to start of previous scene" ) );
01646 cmd[ 0 ] = 0;
01647 }
01648
01649 /* first frame */
01650
01651 else if ( strcmp( cmd, "gg" ) == 0 )
01652 {
01653 common->videoStartOfMovie( );
01654 common->keyboardFeedback( cmd, _( "Move to first frame" ) );
01655 cmd[ 0 ] = 0;
01656 }
01657
01658 /* last frame */
01659
01660 else if ( strcmp( cmd, "G" ) == 0 )
01661 {
01662 common->videoEndOfMovie( );
01663 common->keyboardFeedback( cmd, _( "Move to last frame" ) );
01664 cmd[ 0 ] = 0;
01665 }
01666
01667 /* delete current scene */
01668
01669 else if ( strcmp( real, "dd" ) == 0 )
01670 {
01671 end_orig = start_orig;
01672 for ( ; count >= 1 && end_orig <= common->getPlayList() ->GetNumFrames() - 1; count -- )
01673 {
01674 end_orig = common->getPlayList() ->FindEndOfScene( end_orig );
01675 end_orig ++;
01676 }
01677 common->getPageEditor()->CopyFrames( start_orig, end_orig - 1 );
01678 common->getPageEditor()->DeleteFrames( start_orig, end_orig - 1 );
01679 if ( start_orig > common->getPlayList() ->GetNumFrames() - 1 )
01680 start_orig = common->getPlayList() ->GetNumFrames() - 1;
01681 common->moveToFrame( start_orig );
01682 common->keyboardFeedback( cmd, _( "Cut current scene" ) );
01683 common->getPageEditor()->DrawBar( common->g_currentFrame );
01684 cmd[ 0 ] = 0;
01685 }
01686
01687 /* delete from current frame up to end of scene */
01688
01689 else if ( ( strcmp( cmd, "o" ) == 0 ) || ( strcmp( cmd, "d$" ) == 0 ) )
01690 {
01691 out = pos;
01692 gtk_adjustment_set_value( trim_adj[ TRIM_ADJ_OUT ], ( gfloat ) out );
01693 common->keyboardFeedback( cmd, _( "Cut to end of scene" ) );
01694 cmd[ 0 ] = 0;
01695 }
01696
01697 /* delete from start of scene just before current frame */
01698
01699 else if ( ( strcmp( cmd, "i" ) == 0 ) || ( strcmp( cmd, "d0" ) == 0 ) || strcmp( cmd, "d^" ) == 0 )
01700 {
01701 in = pos;
01702 gtk_adjustment_set_value( trim_adj[ TRIM_ADJ_IN ], ( gfloat ) in );
01703 common->keyboardFeedback( cmd, _( "Cut from start of scene" ) );
01704 cmd[ 0 ] = 0;
01705 }
01706
01707 /* copy current scene */
01708
01709 else if ( ( strcmp( real, "yy" ) == 0 ) || ( strcmp( real, "Y" ) == 0 ) )
01710 {
01711 end_orig = start_orig;
01712 for ( ; count >= 1; count -- )
01713 {
01714 end_orig = common->getPlayList() ->FindEndOfScene( end_orig );
01715 end_orig ++;
01716 }
01717 common->getPageEditor()->CopyFrames( start_orig, end_orig - 1 );
01718 common->keyboardFeedback( cmd, _( "Copy current scene" ) );
01719 cmd[ 0 ] = 0;
01720 }
01721
01722 /* paste after current frame */
01723
01724 else if ( strcmp( real, "p" ) == 0 )
01725 {
01726 for ( ; count >= 1; count -- )
01727 common->getPageEditor()->PasteFrames( common->g_currentFrame + 1 );
01728 movedToFrame( pos );
01729 common->keyboardFeedback( cmd, _( "Paste after current frame" ) );
01730 common->getPageEditor()->DrawBar( common->g_currentFrame );
01731 cmd[ 0 ] = 0;
01732 }
01733
01734 /* paste before current frame */
01735
01736 else if ( strcmp( real, "P" ) == 0 )
01737 {
01738 for ( ; count >= 1; count -- )
01739 common->getPageEditor()->PasteFrames( common->g_currentFrame );
01740 end_orig = common->getPlayList() ->FindEndOfScene( common->g_currentFrame + 1 );
01741 movedToFrame( pos );
01742 common->keyboardFeedback( cmd, _( "Paste before current frame" ) );
01743 common->getPageEditor()->DrawBar( common->g_currentFrame );
01744 cmd[ 0 ] = 0;
01745 }
01746
01747 /* Switch to capture mode */
01748
01749 else if ( strcmp( cmd, "a" ) == 0 )
01750 {
01751 common->keyboardFeedback( cmd, _( "Capture, insert after frame" ) );
01752 end = common->getPlayList() ->FindEndOfScene( common->g_currentFrame );
01753 common->moveToFrame( end );
01754 FileTracker::GetInstance().SetMode( CAPTURE_FRAME_APPEND );
01755 common->changePageRequest( PAGE_CAPTURE );
01756 cmd[ 0 ] = 0;
01757 }
01758
01759 else if ( strcmp( cmd, "A" ) == 0 )
01760 {
01761 common->keyboardFeedback( cmd, _( "Capture, append to movie" ) );
01762 end = common->getPlayList() ->GetNumFrames();
01763 common->moveToFrame( end );
01764 FileTracker::GetInstance().SetMode( CAPTURE_MOVIE_APPEND );
01765 common->changePageRequest( PAGE_CAPTURE );
01766 cmd[ 0 ] = 0;
01767 }
01768
01769 else if ( strcmp( cmd, "v" ) == 0 )
01770 {
01771 common->keyboardFeedback( cmd, _( "Timeline" ) );
01772 common->changePageRequest( PAGE_TIMELINE );
01773 cmd[ 0 ] = 0;
01774 }
01775
01776 else if ( strcmp( cmd, "C" ) == 0 )
01777 {
01778 common->keyboardFeedback( cmd, _( "FX" ) );
01779 common->changePageRequest( PAGE_MAGICK );
01780 cmd[ 0 ] = 0;
01781 }
01782
01783 else if ( strcmp( cmd, "u" ) == 0 )
01784 {
01785 GetEditorBackup() ->Undo( common->getPlayList() );
01786 common->keyboardFeedback( cmd, _( "Undo" ) );
01787 common->hasListChanged = TRUE;
01788 movedToFrame( 0 );
01789 common->getPageEditor()->DrawBar( common->g_currentFrame );
01790 cmd[ 0 ] = 0;
01791 }
01792
01793 else if ( strcmp( cmd, "Ctrl+R" ) == 0 )
01794 {
01795 GetEditorBackup() ->Redo( common->getPlayList() );
01796 common->keyboardFeedback( cmd, _( "Redo" ) );
01797 common->hasListChanged = TRUE;
01798 movedToFrame( 0 );
01799 common->getPageEditor()->DrawBar( common->g_currentFrame );
01800 cmd[ 0 ] = 0;
01801 }
01802
01803 // the following are specific to Trim
01804 else if ( strcmp( cmd, "U" ) == 0 )
01805 {
01806 common->keyboardFeedback( cmd, _( "Undo" ) );
01807 resetInPoint();
01808 resetOutPoint();
01809 movedToFrame( pos );
01810 cmd[ 0 ] = 0;
01811 }
01812
01813 else if ( strcmp( cmd, "\\" ) == 0 )
01814 {
01815 common->keyboardFeedback( cmd, _( "Toggle Looping" ) );
01816 gtk_toggle_button_set_active( loop_toggle, ! gtk_toggle_button_get_active( loop_toggle ) );
01817 cmd[ 0 ] = 0;
01818 }
01819
01820 else if ( strcmp( cmd, "=" ) == 0 )
01821 {
01822 common->keyboardFeedback( cmd, _( "Toggle Link" ) );
01823 gtk_toggle_button_set_active( link_toggle, ! gtk_toggle_button_get_active( link_toggle ) );
01824 cmd[ 0 ] = 0;
01825 }
01826
01827 /* switch to export mode */
01828
01829 else if ( strcmp( cmd, ":W" ) == 0 )
01830 {
01831 common->keyboardFeedback( cmd, _( "Export" ) );
01832 common->changePageRequest( PAGE_EXPORT );
01833 cmd[ 0 ] = 0;
01834 }
01835
01836 else if ( strcmp( cmd, "F2" ) == 0 )
01837 {
01838 common->keyboardFeedback( cmd, _( "Edit" ) );
01839 common->changePageRequest( PAGE_EDITOR );
01840 cmd[ 0 ] = 0;
01841 }
01842
01843 /* write PlayList */
01844
01845 else if ( strcmp( cmd, ":w" ) == 0 )
01846 {
01847 common->keyboardFeedback( cmd, _( "Write playlist" ) );
01848 common->savePlayList( );
01849 cmd[ 0 ] = 0;
01850 }
01851
01852 /* quit */
01853
01854 else if ( strcmp( cmd, ":q" ) == 0 )
01855 {
01856 common->keyboardFeedback( cmd, _( "quit" ) );
01857 kinoDeactivate();
01858 cmd[ 0 ] = 0;
01859 }
01860
01861 else if ( strcmp( real, "J" ) == 0 )
01862 {
01863 common->keyboardFeedback( cmd, _( "Join scenes" ) );
01864 for ( ; count >= 1 && common->getPlayList() ->JoinScenesAt( common->g_currentFrame ); count -- )
01865 common->hasListChanged = TRUE;
01866 if ( common->hasListChanged == TRUE )
01867 {
01868 GetEditorBackup() ->Store( common->getPlayList() );
01869 movedToFrame( pos );
01870 g_signal_emit_by_name( trim_adj[ TRIM_ADJ_POS ], "value-changed" );
01871 }
01872 cmd[ 0 ] = 0;
01873 }
01874
01875 /* split scene */
01876
01877 else if ( strcmp( cmd, "Ctrl+J" ) == 0 && currentScene != -1 )
01878 {
01879 int newScene = getSceneIndex() + 1;
01880 |