//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include #include "hlfaceposer.h" #include "choreoviewcolors.h" #include "choreoglobaleventwidget.h" #include "choreowidgetdrawhelper.h" #include "ChoreoView.h" #include "choreoevent.h" #include "choreoeventwidget.h" //----------------------------------------------------------------------------- // Purpose: // Input : *parent - //----------------------------------------------------------------------------- CChoreoGlobalEventWidget::CChoreoGlobalEventWidget( CChoreoWidget *parent ) : CChoreoWidget( parent ) { m_pEvent = NULL; m_bDragging = false; m_xStart = 0; m_hPrevCursor = 0; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CChoreoGlobalEventWidget::~CChoreoGlobalEventWidget( void ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoGlobalEventWidget::Create( void ) { } //----------------------------------------------------------------------------- // Purpose: // Input : rc - //----------------------------------------------------------------------------- void CChoreoGlobalEventWidget::Layout( RECT& rc ) { setBounds( rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top ); } //----------------------------------------------------------------------------- // Redraw to screen //----------------------------------------------------------------------------- void CChoreoGlobalEventWidget::redraw( CChoreoWidgetDrawHelper& drawHelper ) { if ( !getVisible() ) return; CChoreoEvent *event = GetEvent(); if ( !event ) return; RECT rcTab; rcTab = getBounds(); bool isLoop = false; Color pointColor = COLOR_CHOREO_SEGMENTDIVIDER; Color clr = COLOR_CHOREO_SEGMENTDIVIDER_BG; switch ( event->GetType() ) { default: break; case CChoreoEvent::LOOP: { clr = COLOR_CHOREO_LOOPPOINT_BG; pointColor = COLOR_CHOREO_LOOPPOINT; isLoop = true; } break; case CChoreoEvent::STOPPOINT: { clr = COLOR_CHOREO_STOPPOINT_BG; pointColor = COLOR_CHOREO_STOPPOINT; } break; } if ( IsSelected() ) { InflateRect( &rcTab, 2, 2 ); drawHelper.DrawTriangleMarker( rcTab, pointColor ); InflateRect( &rcTab, -2, -2 ); drawHelper.DrawTriangleMarker( rcTab, Color( 240, 240, 220 ) ); } else { drawHelper.DrawTriangleMarker( rcTab, pointColor ); } RECT rcClient; drawHelper.GetClientRect( rcClient ); RECT rcLine = rcTab; rcLine.top = rcTab.bottom + 2; rcLine.bottom = rcClient.bottom; rcLine.left = ( rcLine.left + rcLine.right ) / 2; rcLine.right = rcLine.left; if ( IsSelected() ) { drawHelper.DrawColoredLine( clr, PS_DOT, 2, rcLine.left, rcLine.top, rcLine.right, rcLine.bottom ); } else { drawHelper.DrawColoredLine( clr, PS_DOT, 1, rcLine.left, rcLine.top, rcLine.right, rcLine.bottom ); } if ( event->GetType() == CChoreoEvent::STOPPOINT ) { OffsetRect( &rcTab, -4, 15 ); mxbitmapdata_t *image = CChoreoEventWidget::GetImage( event->GetType() ); if ( image ) { drawHelper.OffsetSubRect( rcTab ); DrawBitmapToDC( drawHelper.GrabDC(), rcTab.left, rcTab.top, 16, 16, *image ); } } if ( !isLoop ) return; Color labelText = COLOR_INFO_TEXT; DrawLabel( drawHelper, labelText, rcLine.left, rcLine.top + 2, false ); // Figure out loop spot float looptime = (float)atof( event->GetParameters() ); // Find pixel for that bool clipped = false; int x = m_pView->GetPixelForTimeValue( looptime, &clipped ); if ( clipped ) return; rcLine.left = x; rcLine.right = x; clr = COLOR_CHOREO_LOOPPOINT_START_BG; drawHelper.DrawColoredLine( clr, PS_SOLID, 1, rcLine.left, rcLine.top, rcLine.right, rcLine.top + 28); DrawLabel( drawHelper, labelText, rcLine.left, rcLine.top + 2, true ); } void CChoreoGlobalEventWidget::DrawLabel( CChoreoWidgetDrawHelper& drawHelper, const Color& clr, int x, int y, bool right ) { CChoreoEvent *event = GetEvent(); if ( !event ) return; int len = drawHelper.CalcTextWidth( "Arial", 9, FW_NORMAL, va( "%s", event->GetName() ) ); RECT rcText; rcText.top = y; rcText.bottom = y + 10; rcText.left = x - len / 2; rcText.right = rcText.left + len; if ( !right ) { drawHelper.DrawColoredTextCharset( "Marlett", 9, FW_NORMAL, SYMBOL_CHARSET, clr, rcText, "3" ); OffsetRect( &rcText, 8, 0 ); drawHelper.DrawColoredText( "Arial", 9, FW_NORMAL, clr, rcText, va( "%s", event->GetName() ) ); } else { drawHelper.DrawColoredText( "Arial", 9, FW_NORMAL, clr, rcText, va( "%s", event->GetName() ) ); OffsetRect( &rcText, len, 0 ); drawHelper.DrawColoredTextCharset( "Marlett", 9, FW_NORMAL, SYMBOL_CHARSET, clr, rcText, "4" ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoGlobalEventWidget::DrawFocusRect( void ) { HDC dc = GetDC( NULL ); ::DrawFocusRect( dc, &m_rcFocus ); ReleaseDC( NULL, dc ); } //----------------------------------------------------------------------------- // Purpose: // Output : CChoreoEvent //----------------------------------------------------------------------------- CChoreoEvent *CChoreoGlobalEventWidget::GetEvent( void ) { return m_pEvent; } //----------------------------------------------------------------------------- // Purpose: // Input : *event - //----------------------------------------------------------------------------- void CChoreoGlobalEventWidget::SetEvent( CChoreoEvent *event ) { m_pEvent = event; }