📄 expressiontool.cpp
字号:
int mx = (short)event->x;
int my = (short)event->y;
SetClickedPos( mx, my );
SetMouseOverPos( mx, my );
DrawMouseOverPos();
if ( event->buttons & mxEvent::MouseRightButton )
{
ShowContextMenu( event, false );
return iret;
}
if ( m_nDragType == DRAGTYPE_NONE )
{
if ( IsMouseOverScrubHandle( event ) )
{
if ( w2() > 0 )
{
float t = GetTimeValueForMouse( (short)event->x );
m_flScrubberTimeOffset = m_flScrub - t;
float maxoffset = 0.5f * (float)SCRUBBER_HANDLE_WIDTH / GetPixelsPerSecond();
m_flScrubberTimeOffset = clamp( m_flScrubberTimeOffset, -maxoffset, maxoffset );
t += m_flScrubberTimeOffset;
ForceScrubPosition( t );
}
StartDragging( DRAGTYPE_SCRUBBER, m_nClickedX, m_nClickedY, LoadCursor( NULL, IDC_SIZEWE ) );
}
else if ( IsMouseOverTag( m_nClickedX, m_nClickedY ) )
{
StartDragging( DRAGTYPE_FLEXTIMINGTAG, m_nClickedX, m_nClickedY, LoadCursor( NULL, IDC_SIZEWE ) );
}
else if ( IsMouseOverPoints( m_nClickedX, m_nClickedY ) )
{
if ( !m_bSelectionActive )
{
StartDragging( DRAGTYPE_SELECTSAMPLES, m_nClickedX, m_nClickedY, LoadCursor( NULL, IDC_SIZEWE ) );
}
else
{
// Either move, move edge if ctrl key is held, or deselect
if ( IsMouseOverSelection( m_nClickedX,m_nClickedY ) )
{
if ( IsMouseOverSelectionStartEdge( event ) )
{
StartDragging( DRAGTYPE_MOVESELECTIONSTART, m_nClickedX, m_nClickedY, LoadCursor( NULL, IDC_SIZEWE ) );
}
else if ( IsMouseOverSelectionEndEdge( event ) )
{
StartDragging( DRAGTYPE_MOVESELECTIONEND, m_nClickedX, m_nClickedY, LoadCursor( NULL, IDC_SIZEWE ) );
}
else
{
if ( shiftdown )
{
StartDragging( DRAGTYPE_MOVESELECTION, m_nClickedX, m_nClickedY, LoadCursor( NULL, IDC_SIZEALL ) );
}
}
}
else
{
m_bSelectionActive = false;
redraw();
return iret;
}
}
}
else
{
if ( w2() > 0 )
{
float t = GetTimeValueForMouse( (short)event->x );
SetScrubTargetTime( t );
}
}
CalcBounds( m_nDragType );
}
}
break;
case mxEvent::MouseDrag:
case mxEvent::MouseMove:
{
int mx = (short)event->x;
int my = (short)event->y;
SetMouseOverPos( mx, my );
DrawMouseOverPos();
OnMouseMove( event );
iret = 1;
}
break;
case mxEvent::MouseUp:
{
if ( event->buttons & mxEvent::MouseRightButton )
{
return 1;
}
int mx = (short)event->x;
int my = (short)event->y;
if ( m_nDragType != DRAGTYPE_NONE )
{
DrawFocusRect();
}
if ( m_hPrevCursor )
{
SetCursor( m_hPrevCursor );
m_hPrevCursor = 0;
}
switch ( m_nDragType )
{
case DRAGTYPE_NONE:
break;
case DRAGTYPE_SELECTSAMPLES:
FinishSelect( m_nStartX, mx );
break;
case DRAGTYPE_MOVESELECTION:
FinishMoveSelection( m_nStartX, mx );
break;
case DRAGTYPE_MOVESELECTIONSTART:
FinishMoveSelectionStart( m_nStartX, mx );
break;
case DRAGTYPE_MOVESELECTIONEND:
FinishMoveSelectionEnd( m_nStartX, mx );
break;
case DRAGTYPE_SCRUBBER:
{
ApplyBounds( mx, my );
int dx = mx - m_nStartX;
int dy = my = m_nStartY;
if ( w2() > 0 )
{
float t = GetTimeValueForMouse( (short)event->x );
t += m_flScrubberTimeOffset;
m_flScrubberTimeOffset = 0.0f;
ForceScrubPosition( t );
}
}
break;
case DRAGTYPE_FLEXTIMINGTAG:
{
ApplyBounds( mx, my );
int dx = mx - m_nStartX;
int dy = my = m_nStartY;
// Compute dx, dy and apply to sections
//Con_Printf( "dx == %i\n", dx );
CFlexTimingTag *tag = IsMouseOverTag( m_nStartX, m_nStartY );
CChoreoEvent *ev = GetSafeEvent();
if ( tag && g_pChoreoView && ev && ev->GetDuration() )
{
float t = GetTimeValueForMouse( mx );
float percent = t / ev->GetDuration();
g_pChoreoView->SetDirty( true );
g_pChoreoView->PushUndo( "Move Timing Tag" );
if ( tag->GetLocked() )
{
// Resample all control points on right/left
// of locked tags all the way to the next lock or edge
ResampleControlPoints( tag, percent );
}
tag->SetPercentage( percent );
g_pChoreoView->PushRedo( "Move Timing Tag" );
}
LayoutItems( true );
redraw();
}
break;
}
m_nDragType = DRAGTYPE_NONE;
SetMouseOverPos( mx, my );
DrawMouseOverPos();
iret = 1;
}
break;
case mxEvent::Action:
{
iret = 1;
switch ( event->action )
{
default:
iret = 0;
break;
case IDC_ET_RESET_ITEM_SIZE:
OnResetItemSize();
break;
case IDC_ET_RESET_ALL_ITEM_SIZES:
OnResetAllItemSizes();
break;
case IDC_ET_SELECTION_DELETE:
OnDeleteSelection( false );
break;
case IDC_ET_SELECTION_EXCISE:
OnDeleteSelection( true );
break;
case IDC_ET_SORT_BY_USED:
OnSortByUsed();
break;
case IDC_ET_SORT_BY_NAME:
OnSortByName();
break;
case IDC_EXPORT_FA:
OnExportFlexAnimation();
break;
case IDC_IMPORT_FA:
OnImportFlexAnimation();
break;
case IDC_LOCK_TIMING_TAG:
LockTimingTag();
break;
case IDC_UNLOCK_TIMING_TAG:
UnlockTimingTag();
break;
case IDC_DELETE_TIMING_TAG:
DeleteFlexTimingTag( m_nClickedX, m_nClickedY );
break;
case IDC_INSERT_TIMING_TAG:
AddFlexTimingTag( m_nClickedX );
break;
case IDC_EXPANDALL:
m_pWorkspace->ExpandAll();
break;
case IDC_COLLAPSEALL:
m_pWorkspace->CollapseAll( NULL );
break;
case IDC_COLLAPSE_ALL_EXCEPT:
m_pWorkspace->CollapseAll( m_pWorkspace->GetClickedItem() );
break;
case IDC_EXPANDVALID:
m_pWorkspace->ExpandValid();
break;
case IDC_COPY_TO_FLEX:
OnCopyToFlex();
break;
case IDC_COPY_FROM_FLEX:
OnCopyFromFlex();
break;
case IDC_NEW_EXPRESSION_FROM_FLEXANIMATION:
OnNewExpression();
break;
case IDC_UNDO_FA:
OnUndo();
break;
case IDC_REDO_FA:
OnRedo();
break;
case IDC_TL_EDITNORMAL:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->SetEditType( 0 );
item->DrawSelf();
}
}
break;
case IDC_TL_EDITLEFTRIGHT:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->SetEditType( 1 );
item->DrawSelf();
}
}
break;
case IDC_TL_EXPAND:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->SetCollapsed( false );
}
LayoutItems();
}
break;
case IDC_TL_COLLAPSE:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->SetCollapsed( true );
}
LayoutItems();
}
break;
case IDC_TL_ENABLE:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
g_pChoreoView->SetDirty( true );
g_pChoreoView->PushUndo( "Enable item" );
item->SetActive( true );
g_pChoreoView->PushRedo( "Enable item" );
item->DrawSelf();
}
}
break;
case IDC_TL_DISABLE:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
g_pChoreoView->SetDirty( true );
g_pChoreoView->PushUndo( "Disable item" );
item->SetActive( false );
g_pChoreoView->PushRedo( "Disable item" );
item->DrawSelf();
}
}
break;
case IDC_TL_COPY:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->Copy();
}
}
break;
case IDC_TL_PASTE:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->Paste();
item->DrawSelf();
}
}
break;
case IDC_TL_DELETE:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->Delete();
item->DrawSelf();
}
}
break;
case IDC_TL_DESELECT:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->DeselectAll();
item->DrawSelf();
}
}
break;
case IDC_TL_SELECTALL:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
item->SelectAll();
item->DrawSelf();
}
}
break;
case IDC_DISABLE_ALL_EXCEPT:
{
m_pWorkspace->DisableAllExcept();
}
break;
case IDC_ENABLE_ALL_VALID:
{
m_pWorkspace->EnableValid();
}
break;
case IDC_TL_SNAPSELECTED:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
g_pChoreoView->SetDirty( true );
g_pChoreoView->PushUndo( "Snap Selected" );
item->SnapSelected();
g_pChoreoView->PushRedo( "Snap Selected" );
item->DrawSelf();
}
}
break;
case IDC_TL_SNAPPOINTS:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
g_pChoreoView->SetDirty( true );
g_pChoreoView->PushUndo( "Snap Item" );
item->SnapAll();
g_pChoreoView->PushRedo( "Snap Item" );
item->DrawSelf();
}
}
break;
case IDC_TL_DELETECOLUMN:
{
m_pWorkspace->OnDeleteColumn();
}
break;
case IDC_TL_SNAPALL:
{
m_pWorkspace->OnSnapAll();
}
break;
case IDC_FLEXHSCROLL:
{
int offset = 0;
bool processed = true;
switch ( event->modifiers )
{
case SB_THUMBTRACK:
offset = event->height;
break;
case SB_PAGEUP:
offset = m_pHorzScrollBar->getValue();
offset -= 20;
offset = max( offset, m_pHorzScrollBar->getMinValue() );
break;
case SB_PAGEDOWN:
offset = m_pHorzScrollBar->getValue();
offset += 20;
offset = min( offset, m_pHorzScrollBar->getMaxValue() );
break;
case SB_LINEUP:
offset = m_pHorzScrollBar->getValue();
offset -= 10;
offset = max( offset, m_pHorzScrollBar->getMinValue() );
break;
case SB_LINEDOWN:
offset = m_pHorzScrollBar->getValue();
offset += 10;
offset = min( offset, m_pHorzScrollBar->getMaxValue() );
break;
default:
processed = false;
break;
}
if ( processed )
{
MoveTimeSliderToPos( offset );
}
}
break;
case IDC_FLEX_CHANGESCALE:
{
OnChangeScale();
}
break;
case IDC_FLEX_SCALESAMPLES:
{
OnScaleSamples();
}
break;
}
}
break;
case mxEvent::KeyDown:
case mxEvent::KeyUp:
{
TimelineItem *item = m_pWorkspace->GetClickedItem();
if ( item )
{
iret = item->handleEvent( event );
}
if ( !iret )
{
if ( event->key == VK_ESCAPE )
{
DeselectAll();
iret = 1;
}
}
}
break;
}
return iret;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : false -
//-----------------------------------------------------------------------------
void ExpressionTool::LayoutItems( bool force /*= false*/ )
{
m_pWorkspace->LayoutItems( force );
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *event -
//-----------------------------------------------------------------------------
void ExpressionTool::AddFlexTimingTag( int mx )
{
Assert( g_pChoreoView );
CChoreoEvent *event = GetSafeEvent();
if ( !event )
return;
if ( event->GetType() != CChoreoEvent::FLEXANIMATION )
{
Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, "Timing Tag: Can only tag FLEXANIMATION events\n" );
return;
}
CInputParams params;
memset( ¶ms, 0, sizeof( params ) );
strcpy( params.m_szDialogTitle, "Event Tag Name" );
strcpy( params.m_szPrompt, "Name:" );
strcpy( params.m_szInputText, "" );
if ( !InputProperties( ¶ms ) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -