Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

PageTrim Class Reference

This class controls the scene trimmer notebook page. More...

#include <page_trim.h>

Inheritance diagram for PageTrim:

Inheritance graph
[legend]
Collaboration diagram for PageTrim:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 PageTrim (KinoCommon *common)
virtual ~PageTrim ()
 Destructor for the trimmer page object.
FrameDisplayergetFrameDisplayer ()
int getInPoint ()
int getOutPoint ()
PlayListgetPlayList ()
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

KinoCommoncommon
FrameDisplayerdisplayer
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
PlayListg_copiedPlayList

Detailed Description

This class controls the scene trimmer notebook page.

Definition at line 51 of file page_trim.h.


Constructor & Destructor Documentation

PageTrim::PageTrim KinoCommon common  ) 
 

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 }

PageTrim::~PageTrim  )  [virtual]
 

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 }


Member Function Documentation

gulong PageTrim::activate  )  [virtual]
 

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 }

void PageTrim::clean  )  [virtual]
 

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 }

FrameDisplayer* PageTrim::getFrameDisplayer  )  [inline]
 

Definition at line 90 of file page_trim.h.

References displayer.

Referenced by showFrame(), and stopNavigator().

00091     {
00092         return this->displayer;
00093     }

std::string PageTrim::getHelpPage  )  [inline, virtual]
 

Reimplemented from Page.

Definition at line 169 of file page_trim.h.

00170     {
00171         return "trim";
00172     }

int PageTrim::getInPoint  )  [inline]
 

Definition at line 94 of file page_trim.h.

References in.

00095     {
00096         return this->in;
00097     }

int PageTrim::getOutPoint  )  [inline]
 

Definition at line 98 of file page_trim.h.

References out.

00099     {
00100         return this->out;
00101     }

PlayList& PageTrim::getPlayList  )  [inline]
 

Definition at line 102 of file page_trim.h.

References playlist.

Referenced by processCommand().

00103     {
00104         return this->playlist;
00105     }

int PageTrim::getPosition  )  [inline]
 

Definition at line 110 of file page_trim.h.

References pos.

00111     {
00112         return this->pos;
00113     }

int PageTrim::getSceneIndex  ) 
 

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 }

int PageTrim::getTotalFrames  )  [inline]
 

Definition at line 106 of file page_trim.h.

References max.

00107     {
00108         return this->max + 1;
00109     }

void PageTrim::insertScene TrimInsertMode  insertMode  ) 
 

Inserts the clip currently in the trimmer into the movie.

Parameters:
insertMode Indicates whether to insert before or after the current position.

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 }

bool PageTrim::loadFile const string &  filename  ) 
 

Loads a clip into the trimmer.

Parameters:
filename The name of the clip to load.
Returns:
true if the clip loaded successfully.

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 }

void PageTrim::loadScene int  newScene  ) 
 

Load a scene from the movie into the trimmer to edit it.

Parameters:
newScene The index of the scene to load.

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 }

void PageTrim::movedToFrame int  frame  )  [virtual]
 

Called when the current frame has changed through the common moveToFrame method and this page is the current page.

Parameters:
frame frame moved to

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 }

void PageTrim::newFile  )  [virtual]
 

New File action.

Reimplemented from Page.

Definition at line 530 of file page_trim.cc.

References stopNavigator().

00531 {
00532     this->stopNavigator();
00533 }

gboolean PageTrim::processCommand char *  command  )  [virtual]
 

Internal method for handling a complete keyboard scene.

Parameters:
cmd command to be processed;

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