⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expressiontool.cpp

📁 hl2 source code. Do not use it illegal.
💻 CPP
📖 第 1 页 / 共 5 页
字号:

			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( &params, 0, sizeof( params ) );

	strcpy( params.m_szDialogTitle, "Event Tag Name" );
	strcpy( params.m_szPrompt, "Name:" );

	strcpy( params.m_szInputText, "" );

	if ( !InputProperties( &params ) )
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -