You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
723 lines
14 KiB
723 lines
14 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include <stdio.h> |
|
#include <windows.h> |
|
#include "mxExpressionSlider.h" |
|
#include "expressiontool.h" |
|
#include "mathlib/mathlib.h" |
|
#include "hlfaceposer.h" |
|
#include "choreowidgetdrawhelper.h" |
|
|
|
mxExpressionSlider::mxExpressionSlider (mxWindow *parent, int x, int y, int w, int h, int id ) |
|
: mxWindow( parent, x, y, w, h ) |
|
{ |
|
setId( id ); |
|
setType( MX_SLIDER ); |
|
|
|
FacePoser_AddWindowStyle( this, WS_CLIPCHILDREN | WS_CLIPSIBLINGS ); |
|
|
|
m_flMin[ 0 ] = 0.0; |
|
m_flMax[ 0 ] = 1.0f; |
|
m_nTicks[ 0 ] = 20; |
|
m_flCurrent[ 0 ] = 0.0f; |
|
|
|
m_flMin[ 1 ] = 0.0; |
|
m_flMax[ 1 ] = 1.0f; |
|
m_nTicks[ 1 ] = 20; |
|
m_flCurrent[ 1 ] = 0.5f; |
|
|
|
m_flSetting[ 0 ] = 0.0; |
|
m_flSetting[ 1 ] = 0.0; |
|
|
|
m_bIsEdited[ 0 ] = false; |
|
m_bIsEdited[ 1 ] = false; |
|
|
|
m_bDraggingThumb = false; |
|
m_nCurrentBar = 0; |
|
|
|
m_bPaired = false; |
|
|
|
m_nTitleWidth = 120; |
|
m_bDrawTitle = true; |
|
|
|
m_pInfluence = new mxCheckBox( this, 2, 4, 12, 12, "", IDC_INFLUENCE ); |
|
} |
|
|
|
mxExpressionSlider::~mxExpressionSlider( void ) |
|
{ |
|
} |
|
|
|
void mxExpressionSlider::SetTitleWidth( int width ) |
|
{ |
|
m_nTitleWidth = width; |
|
redraw(); |
|
} |
|
|
|
void mxExpressionSlider::SetDrawTitle( bool drawTitle ) |
|
{ |
|
m_bDrawTitle = drawTitle; |
|
redraw(); |
|
} |
|
|
|
|
|
void mxExpressionSlider::SetMode( bool paired ) |
|
{ |
|
if ( m_bPaired != paired ) |
|
{ |
|
m_bPaired = paired; |
|
redraw(); |
|
} |
|
} |
|
|
|
void mxExpressionSlider::BoundValue( void ) |
|
{ |
|
for ( int i = 0; i < NUMBARS; i++ ) |
|
{ |
|
if ( m_flCurrent[ i ] > m_flMax[ i ] ) |
|
{ |
|
m_flCurrent[ i ] = m_flMax[ i ]; |
|
} |
|
if ( m_flCurrent[ i ] < m_flMin[ i ] ) |
|
{ |
|
m_flCurrent[ i ] = m_flMin[ i ]; |
|
} |
|
} |
|
} |
|
|
|
|
|
void mxExpressionSlider::setValue( int barnum, float value ) |
|
{ |
|
if (m_flSetting[ barnum ] == value && m_bIsEdited[ barnum ] == false) |
|
return; |
|
|
|
m_flSetting[ barnum ] = value; |
|
m_bIsEdited[ barnum ] = false; |
|
|
|
if (m_bPaired) |
|
{ |
|
if (m_flSetting[ 0 ] < m_flSetting[ 1 ]) |
|
{ |
|
m_flCurrent[ 0 ] = m_flSetting[ 1 ]; |
|
m_flCurrent[ 1 ] = 1.0 - (m_flSetting[ 0 ] / m_flSetting[ 1 ]) * 0.5; |
|
} |
|
else if (m_flSetting[ 0 ] > m_flSetting[ 1 ]) |
|
{ |
|
m_flCurrent[ 0 ] = m_flSetting[ 0 ]; |
|
m_flCurrent[ 1 ] = (m_flSetting[ 1 ] / m_flSetting[ 0 ]) * 0.5; |
|
} |
|
else |
|
{ |
|
m_flCurrent[ 0 ] = m_flSetting[ 0 ]; |
|
m_flCurrent[ 1 ] = 0.5; |
|
} |
|
} |
|
else |
|
{ |
|
m_flCurrent[ barnum ] = value; |
|
} |
|
|
|
BoundValue(); |
|
// FIXME: delay this until all sliders are set |
|
if (!m_bPaired || barnum == 1) |
|
redraw(); |
|
} |
|
|
|
void mxExpressionSlider::setRange( int barnum, float min, float max, int ticks /*= 100*/ ) |
|
{ |
|
m_flMin[ barnum ] = min; |
|
m_flMax[ barnum ] = max; |
|
|
|
Assert( m_flMax[ barnum ] > m_flMin[ barnum ] ); |
|
|
|
m_nTicks[ barnum ] = ticks; |
|
|
|
BoundValue(); |
|
|
|
redraw(); |
|
} |
|
|
|
void mxExpressionSlider::setInfluence( float value ) |
|
{ |
|
bool bWasChecked = m_pInfluence->isChecked( ); |
|
bool bNowChecked = value > 0.0f ? true : false; |
|
if (bNowChecked != bWasChecked) |
|
{ |
|
m_pInfluence->setChecked( bNowChecked ); |
|
redraw(); |
|
} |
|
} |
|
|
|
float mxExpressionSlider::getRawValue( int barnum ) const |
|
{ |
|
return m_flCurrent[ barnum ]; |
|
} |
|
|
|
float mxExpressionSlider::getValue( int barnum ) const |
|
{ |
|
float scale = 1.0; |
|
if (m_bPaired) |
|
{ |
|
// if it's paired, this is assuming that m_flCurrent[0] holds the max value, |
|
// and m_flCurrent[1] is a weighting from 0 to 1, with 0.5 being even |
|
if (barnum == 0 && m_flCurrent[ 1 ] > 0.5) |
|
{ |
|
scale = (1.0 - m_flCurrent[ 1 ]) / 0.5; |
|
} |
|
else if (barnum == 1 && m_flCurrent[ 1 ] < 0.5) |
|
{ |
|
scale = (m_flCurrent[ 1 ] / 0.5); |
|
} |
|
} |
|
|
|
return m_flCurrent[ 0 ] * scale; |
|
} |
|
|
|
float mxExpressionSlider::getMinValue( int barnum ) const |
|
{ |
|
return m_flMin[ barnum ]; |
|
} |
|
|
|
float mxExpressionSlider::getMaxValue( int barnum ) const |
|
{ |
|
return m_flMax[ barnum ]; |
|
} |
|
|
|
float mxExpressionSlider::getInfluence( ) const |
|
{ |
|
return m_pInfluence->isChecked() ? 1.0f : 0.0f; |
|
} |
|
|
|
void mxExpressionSlider::setEdited( int barnum, bool isEdited ) |
|
{ |
|
if (m_bIsEdited[ barnum ] == isEdited) |
|
return; |
|
|
|
m_bIsEdited[ barnum ] = isEdited; |
|
redraw(); |
|
} |
|
|
|
bool mxExpressionSlider::isEdited( int barnum ) const |
|
{ |
|
return (m_bIsEdited[ barnum ]); |
|
} |
|
|
|
void mxExpressionSlider::GetSliderRect( RECT& rc ) |
|
{ |
|
HWND wnd = (HWND)getHandle(); |
|
if ( !wnd ) |
|
return; |
|
|
|
GetClientRect( wnd, &rc ); |
|
|
|
if ( m_bDrawTitle ) |
|
{ |
|
rc.left += m_nTitleWidth; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : &rc - |
|
//----------------------------------------------------------------------------- |
|
void mxExpressionSlider::GetBarRect( RECT &rcBar ) |
|
{ |
|
RECT rc; |
|
GetSliderRect( rc ); |
|
|
|
rcBar = rc; |
|
|
|
InflateRect( &rcBar, -10, 0 ); |
|
rcBar.top += 5; |
|
rcBar.bottom = rcBar.top + 2; |
|
|
|
int midy = ( rcBar.top + rcBar.bottom ) / 2; |
|
rcBar.top = midy - 1; |
|
rcBar.bottom = midy + 1; |
|
} |
|
|
|
|
|
void mxExpressionSlider::GetThumbRect( int barnum, RECT &rcThumb ) |
|
{ |
|
RECT rc; |
|
GetSliderRect( rc ); |
|
|
|
RECT rcBar = rc; |
|
GetBarRect( rcBar ); |
|
|
|
float frac = 0.0f; |
|
|
|
if ( m_flMax[ barnum ] - m_flMin[ barnum ] > 0 ) |
|
{ |
|
frac = (m_flCurrent[ barnum ] - m_flMin[ barnum ]) / ( m_flMax[ barnum ] - m_flMin[ barnum ] ); |
|
} |
|
|
|
int tickmark = (int)( frac * m_nTicks[ barnum ] + 0.5 ); |
|
tickmark = min( m_nTicks[ barnum ], tickmark ); |
|
tickmark = max( 0, tickmark ); |
|
|
|
int thumbwidth = 20; |
|
int thumbheight = 14; |
|
int xoffset = -thumbwidth / 2; |
|
int yoffset = -thumbheight / 2 + 2; |
|
|
|
int leftedge = rcBar.left + (int)( (float)( rcBar.right - rcBar.left ) * (float)(tickmark) / (float)m_nTicks[ barnum ] ); |
|
|
|
rcThumb.left = leftedge + xoffset; |
|
rcThumb.right = rcThumb.left + thumbwidth; |
|
rcThumb.top = rcBar.top + yoffset; |
|
rcThumb.bottom = rcThumb.top + thumbheight; |
|
} |
|
|
|
void mxExpressionSlider::DrawBar( HDC& dc ) |
|
{ |
|
RECT rcBar; |
|
|
|
GetBarRect( rcBar ); |
|
|
|
HPEN oldPen; |
|
|
|
HPEN shadow; |
|
HBRUSH face; |
|
HPEN hilight; |
|
|
|
shadow = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_3DSHADOW ) ); |
|
hilight = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_3DHIGHLIGHT ) ); |
|
face = CreateSolidBrush( GetSysColor( COLOR_3DFACE ) ); |
|
|
|
oldPen = (HPEN)SelectObject( dc, hilight ); |
|
|
|
MoveToEx( dc, rcBar.left, rcBar.bottom, NULL ); |
|
LineTo( dc, rcBar.left, rcBar.top ); |
|
LineTo( dc, rcBar.right, rcBar.top ); |
|
|
|
SelectObject( dc, shadow ); |
|
|
|
LineTo( dc, rcBar.right, rcBar.bottom ); |
|
LineTo( dc, rcBar.left, rcBar.bottom ); |
|
|
|
rcBar.left += 1; |
|
//rcBar.right -= 1; |
|
rcBar.top += 1; |
|
rcBar.bottom -= 1; |
|
|
|
FillRect( dc, &rcBar, face ); |
|
|
|
SelectObject( dc, oldPen ); |
|
|
|
DeleteObject( face ); |
|
DeleteObject( shadow ); |
|
DeleteObject( hilight ); |
|
} |
|
|
|
void mxExpressionSlider::DrawThumb( int barnum, HDC& dc ) |
|
{ |
|
RECT rcThumb; |
|
|
|
GetThumbRect( barnum, rcThumb ); |
|
|
|
// Draw it |
|
|
|
|
|
HPEN oldPen; |
|
|
|
HPEN shadow; |
|
HBRUSH face; |
|
HPEN hilight; |
|
|
|
shadow = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_3DDKSHADOW ) ); |
|
hilight = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_3DHIGHLIGHT ) ); |
|
|
|
switch ( barnum ) |
|
{ |
|
default: |
|
case MAGNITUDE_BAR: |
|
{ |
|
float frac; |
|
if (m_flCurrent[ barnum ] < 0) |
|
{ |
|
frac = m_flCurrent[ barnum ] / m_flMin[ barnum ]; |
|
} |
|
else |
|
{ |
|
frac = m_flCurrent[ barnum ] / m_flMax[ barnum ]; |
|
} |
|
frac = min( 1.0f, frac ); |
|
frac = max( 0.0f, frac ); |
|
|
|
COLORREF clr = GetSysColor( COLOR_3DFACE ); |
|
int r, g, b; |
|
r = GetRValue( clr ); |
|
g = GetRValue( clr ); |
|
b = GetRValue( clr ); |
|
|
|
// boost colors |
|
r = (int)( (1-frac) * b ); |
|
b = min( 255, (int)(r + ( 255 - r ) * frac ) ); |
|
g = (int)( (1-frac) * g ); |
|
|
|
face = CreateSolidBrush( RGB( r, g, b ) ); |
|
} |
|
break; |
|
case BALANCE_BAR: |
|
{ |
|
float frac = m_flCurrent[ barnum ]; |
|
frac = min( 1.0f, frac ); |
|
frac = max( 0.0f, frac ); |
|
|
|
COLORREF clr = GetSysColor( COLOR_3DFACE ); |
|
int r, g, b; |
|
r = GetRValue( clr ); |
|
g = GetRValue( clr ); |
|
b = GetRValue( clr ); |
|
|
|
// boost colors toward red if we are not at 0.5 |
|
float boost = 2.0 * ( fabs( frac - 0.5f ) ); |
|
|
|
r = r + ( 255 - r ) * boost; |
|
g = ( 1 - boost ) * g; |
|
b = ( 1 - boost ) * b; |
|
|
|
face = CreateSolidBrush( RGB( r, g, b ) ); |
|
} |
|
break; |
|
} |
|
|
|
//rcThumb.left += 1; |
|
//rcThumb.right -= 1; |
|
//rcThumb.top += 1; |
|
//rcThumb.bottom -= 1; |
|
|
|
//FillRect( dc, &rcThumb, face ); |
|
POINT region[3]; |
|
int cPoints = 3; |
|
|
|
InflateRect( &rcThumb, -2, 0 ); |
|
|
|
// int height = rcThumb.bottom - rcThumb.top; |
|
// int offset = height / 2 + 1; |
|
int offset = 2; |
|
|
|
switch ( barnum ) |
|
{ |
|
case MAGNITUDE_BAR: |
|
default: |
|
{ |
|
region[ 0 ].x = rcThumb.left; |
|
region[ 0 ].y = rcThumb.top; |
|
|
|
region[ 1 ].x = rcThumb.right; |
|
region[ 1 ].y = rcThumb.top; |
|
|
|
region[ 2 ].x = ( rcThumb.left + rcThumb.right ) / 2; |
|
region[ 2 ].y = rcThumb.bottom - offset; |
|
} |
|
break; |
|
case BALANCE_BAR: |
|
{ |
|
region[ 0 ].x = ( rcThumb.left + rcThumb.right ) / 2; |
|
region[ 0 ].y = rcThumb.top + offset; |
|
|
|
region[ 1 ].x = rcThumb.left; |
|
region[ 1 ].y = rcThumb.bottom; |
|
|
|
region[ 2 ].x = rcThumb.right; |
|
region[ 2 ].y = rcThumb.bottom; |
|
|
|
} |
|
break; |
|
} |
|
|
|
HRGN rgn = CreatePolygonRgn( region, cPoints, ALTERNATE ); |
|
|
|
int oldPF = SetPolyFillMode( dc, ALTERNATE ); |
|
FillRgn( dc, rgn, face ); |
|
SetPolyFillMode( dc, oldPF ); |
|
|
|
DeleteObject( rgn ); |
|
|
|
oldPen = (HPEN)SelectObject( dc, hilight ); |
|
|
|
MoveToEx( dc, region[0].x, region[0].y, NULL ); |
|
LineTo( dc, region[1].x, region[1].y ); |
|
SelectObject( dc, shadow ); |
|
LineTo( dc, region[2].x, region[2].y ); |
|
SelectObject( dc, hilight ); |
|
LineTo( dc, region[0].x, region[0].y ); |
|
|
|
SelectObject( dc, oldPen ); |
|
|
|
DeleteObject( face ); |
|
DeleteObject( shadow ); |
|
DeleteObject( hilight ); |
|
} |
|
|
|
void mxExpressionSlider::DrawTitle( HDC &dc ) |
|
{ |
|
if ( !m_bDrawTitle ) |
|
return; |
|
|
|
HWND wnd = (HWND)getHandle(); |
|
if ( !wnd ) |
|
return; |
|
|
|
RECT rc; |
|
GetClientRect( wnd, &rc ); |
|
rc.right = m_nTitleWidth; |
|
rc.left += 16; |
|
|
|
InflateRect( &rc, -5, -2 ); |
|
|
|
char sz[ 128 ]; |
|
sprintf( sz, "%s", getLabel() ); |
|
|
|
HFONT fnt, oldfont; |
|
|
|
fnt = CreateFont( |
|
-12 // H |
|
, 0 // W |
|
, 0 // Escapement |
|
, 0 // Orient |
|
, FW_NORMAL // Wt. (BOLD) |
|
, 0 // Ital. |
|
, 0 // Underl. |
|
, 0 // SO |
|
, ANSI_CHARSET // Charset |
|
, OUT_TT_PRECIS // Out prec. |
|
, CLIP_DEFAULT_PRECIS // Clip prec. |
|
, PROOF_QUALITY // Qual. |
|
, VARIABLE_PITCH | FF_DONTCARE // Pitch and Fam. |
|
, "Arial" ); |
|
|
|
COLORREF oldColor; |
|
|
|
if (!isEdited( 0 )) |
|
{ |
|
oldColor = SetTextColor( dc, GetSysColor( COLOR_BTNTEXT ) ); |
|
} |
|
else |
|
{ |
|
oldColor = SetTextColor( dc, RGB( 255, 0, 0 ) ); |
|
} |
|
int oldMode = SetBkMode( dc, TRANSPARENT ); |
|
oldfont = (HFONT)SelectObject( dc, fnt ); |
|
|
|
DrawText( dc, sz, -1, &rc, DT_NOPREFIX | DT_VCENTER | DT_SINGLELINE | DT_LEFT | DT_WORD_ELLIPSIS ); |
|
|
|
SelectObject( dc, oldfont ); |
|
DeleteObject( fnt ); |
|
SetBkMode( dc, oldMode ); |
|
SetTextColor( dc, oldColor ); |
|
} |
|
|
|
void mxExpressionSlider::redraw() |
|
{ |
|
HWND wnd = (HWND)getHandle(); |
|
if ( !wnd ) |
|
return; |
|
|
|
HDC finalDC = GetDC( wnd ); |
|
if ( !finalDC ) |
|
return; |
|
|
|
RECT rc; |
|
GetClientRect( wnd, &rc ); |
|
|
|
int w = rc.right - rc.left; |
|
int h = rc.bottom - rc.top; |
|
|
|
HDC dc = CreateCompatibleDC( finalDC ); |
|
HBITMAP oldbm, bm; |
|
|
|
bm = CreateCompatibleBitmap( finalDC, w, h ); |
|
|
|
oldbm = (HBITMAP)SelectObject( dc, bm ); |
|
|
|
HBRUSH br = CreateSolidBrush( GetSysColor( COLOR_3DFACE ) ); |
|
|
|
FillRect( dc, &rc, br ); |
|
|
|
DeleteObject( br ); |
|
|
|
DrawTitle( dc ); |
|
|
|
DrawBar( dc ); |
|
|
|
// Draw slider |
|
for ( int i = ( m_bPaired ? 1 : 0 ); i >= 0 ; i-- ) |
|
{ |
|
DrawThumb( i, dc ); |
|
} |
|
|
|
BitBlt( finalDC, 0, 0, w, h, dc, 0, 0, SRCCOPY ); |
|
|
|
SelectObject( dc, oldbm ); |
|
|
|
DeleteObject( bm ); |
|
|
|
DeleteDC( dc ); |
|
|
|
ReleaseDC( wnd, finalDC ); |
|
ValidateRect( wnd, &rc ); |
|
} |
|
|
|
void mxExpressionSlider::MoveThumb( int barnum, int xpos, bool finish ) |
|
{ |
|
RECT rcBar; |
|
|
|
GetBarRect( rcBar ); |
|
|
|
if ( xpos < rcBar.left ) |
|
{ |
|
m_flCurrent[ barnum ] = m_flMin[ barnum ]; |
|
} |
|
else if ( xpos > rcBar.right ) |
|
{ |
|
m_flCurrent[ barnum ] = m_flMax[ barnum ]; |
|
} |
|
else |
|
{ |
|
float frac = (float)( xpos - rcBar.left ) / (float)( rcBar.right - rcBar.left ); |
|
// snap slider to nearest "tick" so that it get drawn in the correct place |
|
int curtick = (int)( frac * m_nTicks[ 0 ] + 0.5); |
|
m_flCurrent[ barnum ] = m_flMin[ barnum ] + ((float)curtick / (float)m_nTicks[ 0 ]) * (m_flMax[ barnum ] - m_flMin[ barnum ]); |
|
} |
|
|
|
// update equivalent setting |
|
m_flSetting[ 0 ] = getValue( 0 ); |
|
m_flSetting[ 1 ] = getValue( 1 ); |
|
|
|
m_bIsEdited[ 0 ] = true; |
|
m_bIsEdited[ 1 ] = true; |
|
|
|
// Send message to parent |
|
HWND parent = (HWND)( getParent() ? getParent()->getHandle() : NULL ); |
|
if ( parent ) |
|
{ |
|
LPARAM lp; |
|
WPARAM wp; |
|
|
|
wp = MAKEWPARAM( finish ? SB_ENDSCROLL : SB_THUMBPOSITION, barnum ); |
|
lp = (long)getHandle(); |
|
|
|
SendMessage( parent, WM_HSCROLL, wp, lp ); |
|
} |
|
|
|
BoundValue(); |
|
redraw(); |
|
} |
|
|
|
bool mxExpressionSlider::PaintBackground( void ) |
|
{ |
|
return false; |
|
} |
|
|
|
int mxExpressionSlider::handleEvent( mxEvent *event ) |
|
{ |
|
int iret = 0; |
|
switch ( event->event ) |
|
{ |
|
case mxEvent::Action: |
|
{ |
|
iret = 1; |
|
switch ( event->action ) |
|
{ |
|
default: |
|
iret = 0; |
|
break; |
|
case IDC_INFLUENCE: |
|
{ |
|
SetFocus( (HWND)getHandle() ); |
|
|
|
setEdited( 0, false ); |
|
setEdited( 1, false ); |
|
|
|
// Send message to parent |
|
HWND parent = (HWND)( getParent() ? getParent()->getHandle() : NULL ); |
|
if ( parent ) |
|
{ |
|
LPARAM lp; |
|
WPARAM wp; |
|
|
|
wp = MAKEWPARAM( SB_ENDSCROLL, m_nCurrentBar ); |
|
lp = (long)getHandle(); |
|
|
|
SendMessage( parent, WM_HSCROLL, wp, lp ); |
|
} |
|
break; |
|
} |
|
} |
|
} |
|
break; |
|
case mxEvent::MouseDown: |
|
{ |
|
SetFocus( (HWND)getHandle() ); |
|
|
|
if ( !m_bDraggingThumb ) |
|
{ |
|
RECT rcThumb; |
|
POINT pt; |
|
|
|
pt.x = (short)event->x; |
|
pt.y = (short)event->y; |
|
|
|
m_nCurrentBar = ( event->buttons & mxEvent::MouseRightButton ) ? BALANCE_BAR : MAGNITUDE_BAR; |
|
GetThumbRect( m_nCurrentBar, rcThumb ); |
|
|
|
if ( PtInRect( &rcThumb, pt ) ) |
|
{ |
|
m_bDraggingThumb = true; |
|
} |
|
|
|
// Snap position if they didn't click on the thumb itself |
|
#if 0 |
|
else |
|
{ |
|
m_bDraggingThumb = true; |
|
MoveThumb( m_nCurrentBar, (short)event->x, false ); |
|
} |
|
#endif |
|
} |
|
iret = 1; |
|
} |
|
break; |
|
case mxEvent::MouseDrag: |
|
case mxEvent::MouseMove: |
|
{ |
|
if ( m_bDraggingThumb ) |
|
{ |
|
m_pInfluence->setChecked( true ); |
|
MoveThumb( m_nCurrentBar, (short)event->x, false ); |
|
iret = 1; |
|
} |
|
} |
|
break; |
|
case mxEvent::MouseUp: |
|
{ |
|
if ( m_bDraggingThumb ) |
|
{ |
|
m_pInfluence->setChecked( true ); |
|
m_bDraggingThumb = false; |
|
MoveThumb( m_nCurrentBar, (short)event->x, true ); |
|
m_nCurrentBar = 0; |
|
} |
|
iret = 1; |
|
} |
|
break; |
|
case mxEvent::KeyDown: |
|
{ |
|
if ( event->key == VK_RETURN || |
|
event->key == 'S' ) |
|
{ |
|
// See if there is an event in the flex animation window |
|
g_pExpressionTool->OnSetSingleKeyFromFlex( getLabel() ); |
|
} |
|
} |
|
break; |
|
} |
|
|
|
return iret; |
|
}
|
|
|