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.
284 lines
9.9 KiB
284 lines
9.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#ifndef ATTRIBUTESLIDER_H |
|
#define ATTRIBUTESLIDER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "vgui_controls/EditablePanel.h" |
|
#include "dme_controls/AnimSetAttributeValue.h" |
|
#include "materialsystem/MaterialSystemUtil.h" |
|
#include "datamodel/dmehandle.h" |
|
|
|
using namespace vgui; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Forward declarations |
|
//----------------------------------------------------------------------------- |
|
class CBaseAnimSetAttributeSliderPanel; |
|
class CDmElement; |
|
class CAttributeSliderTextEntry; |
|
class CSubRectImage; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// CAttributeSlider |
|
//----------------------------------------------------------------------------- |
|
|
|
// THIS CODE IS KIND OF A MESS WRT THE VARIOUS STATES WE CAN BE IN: |
|
// we can be driven by the preset pane or by dragging on any individual control |
|
// we can also be driven by ctrl hovering over the preset pane or an individual control |
|
// if we move from control to control in the preset or here, we need to be able to decay into/out of the various individual sliders |
|
class CAttributeSlider : public EditablePanel |
|
{ |
|
DECLARE_CLASS_SIMPLE( CAttributeSlider, EditablePanel ); |
|
|
|
// Overridden methods of EditablePanel |
|
public: |
|
virtual void Paint(); |
|
virtual void PaintBackground(); |
|
virtual void ApplySchemeSettings( IScheme *scheme ); |
|
virtual void PerformLayout(); |
|
virtual void OnCursorMoved(int x, int y); |
|
virtual void OnMousePressed(MouseCode code); |
|
virtual void OnMouseDoublePressed(MouseCode code); |
|
virtual void OnMouseReleased(MouseCode code); |
|
virtual void OnCursorEntered(); |
|
virtual void OnCursorExited(); |
|
virtual void OnKeyCodeTyped( KeyCode code ); |
|
|
|
// Other public methods |
|
public: |
|
CAttributeSlider( CBaseAnimSetAttributeSliderPanel *parent, const char *panelName, CDmElement *control ); |
|
virtual ~CAttributeSlider(); |
|
|
|
// Returns the control we're modifying |
|
CDmElement *GetControl(); |
|
|
|
// Activates/deactivates a slider control |
|
// NOTE: Slider control 'value' defaults to active, 'balance' and 'multilevel' defaults to inactive |
|
void ActivateControl( AnimationControlType_t type, bool bActive ); |
|
bool IsControlActive( AnimationControlType_t type ); |
|
|
|
// Gets/sets the slider value. |
|
// NOTE: This may not match the value pushed into the control because of fading |
|
void SetValue( AnimationControlType_t type, float flValue ); |
|
float GetValue( AnimationControlType_t type ) const; |
|
void SetValue( const AttributeValue_t& value ); |
|
const AttributeValue_t& GetValue() const; |
|
|
|
// Is this slider manipulating a transform control? |
|
// [NOTE: This is a utility method; the control contains these states] |
|
bool IsTransform() const; |
|
|
|
// Returns the default value for a control |
|
// [NOTE: These is a utility method; the control contains these states] |
|
float GetControlDefaultValue( AnimationControlType_t type ) const; |
|
|
|
// Are we dragging? If so, what control is being dragged? |
|
bool IsDragging() const; |
|
AnimationControlType_t GetDragControl() const; |
|
|
|
// Are we in text entry mode? If so, what control is having text entered? |
|
bool IsInTextEntry() const; |
|
AnimationControlType_t GetTextEntryControl() const; |
|
|
|
// Estimates the value of the control given a local coordinate |
|
float EstimateValueAtPos( int nLocalX, int nLocalY ) const; |
|
|
|
void SetPreview( const AttributeValue_t &value, const AttributeValue_t &full, bool instantaneous, bool startfromcurrent ); |
|
float GetPreview( AnimationControlType_t type ) const; |
|
const AttributeValue_t &GetPreview() const; |
|
|
|
void EnablePreview( bool state, bool simple, bool faderdrag ); |
|
bool IsPreviewEnabled() const; |
|
bool IsSimplePreview() const; |
|
|
|
void UpdateTime( float dt ); |
|
void UpdateFaderAmount( float amount ); |
|
|
|
bool IsRampingTowardPreview() const; |
|
void RampDown(); |
|
|
|
bool IsFaderBeingDragged(); |
|
|
|
void SetIsLogPreviewControl( bool state ); |
|
|
|
void SetSelected( bool state ); |
|
bool IsSelected() const; |
|
|
|
private: |
|
// Various slider modes |
|
enum SliderMode_t |
|
{ |
|
SLIDER_MODE_FIRST_DRAG_MODE = 0x0, |
|
SLIDER_MODE_FIRST_TEXT_MODE = 0x4, |
|
SLIDER_MODE_LAST_DRAG_MODE = SLIDER_MODE_FIRST_DRAG_MODE + ANIM_CONTROL_COUNT - 1, |
|
SLIDER_MODE_LAST_TEXT_MODE = SLIDER_MODE_FIRST_TEXT_MODE + ANIM_CONTROL_COUNT - 1, |
|
|
|
SLIDER_MODE_NONE = -1, |
|
|
|
SLIDER_MODE_DRAG_VALUE = SLIDER_MODE_FIRST_DRAG_MODE + ANIM_CONTROL_VALUE, |
|
SLIDER_MODE_DRAG_BALANCE = SLIDER_MODE_FIRST_DRAG_MODE + ANIM_CONTROL_BALANCE, |
|
SLIDER_MODE_DRAG_MULTILEVEL = SLIDER_MODE_FIRST_DRAG_MODE + ANIM_CONTROL_MULTILEVEL, |
|
|
|
SLIDER_MODE_TEXT_VALUE = SLIDER_MODE_FIRST_TEXT_MODE + ANIM_CONTROL_VALUE, |
|
SLIDER_MODE_TEXT_BALANCE = SLIDER_MODE_FIRST_TEXT_MODE + ANIM_CONTROL_BALANCE, |
|
SLIDER_MODE_TEXT_MULTILEVEL = SLIDER_MODE_FIRST_TEXT_MODE + ANIM_CONTROL_MULTILEVEL, |
|
}; |
|
|
|
struct Preview_t |
|
{ |
|
AttributeValue_t m_Current; |
|
AttributeValue_t m_Full; |
|
}; |
|
|
|
private: |
|
// Returns the location of a particular control |
|
void GetControlRect( Rect_t *pRect, AnimationControlType_t type ) const; |
|
|
|
// Given a mouse position in (x,y) in local coordinates, which animation control is it over? |
|
AnimationControlType_t DetermineControl( int x, int y ); |
|
|
|
// Draws a tick on a circular control |
|
void DrawCircularTick( const Color& clr, float flValue, int nCenterX, int nCenterY, float flRadius ); |
|
|
|
// Draws a preview of a circular control |
|
void DrawCircularPreview( AnimationControlType_t type, bool bMainTick, float flRadius ); |
|
|
|
// Paints the a circular control |
|
void PaintCircularControl( float flValue, const Rect_t& rect ); |
|
|
|
// Called by the text entry code to enter the value into the logs |
|
void StampValueIntoLogs( AnimationControlType_t type, float flValue ); |
|
|
|
// Methods related to rendering |
|
void DrawMidpoint( int x, int ty, int ttall ); |
|
void DrawPreviewTick( bool mainTick ); |
|
void DrawTick( const Color& clr, float frac, int width, int inset ); |
|
void DrawNameLabel(); |
|
void DrawValueLabel( float flValue ); |
|
float GetPreviewAlphaScale() const; |
|
|
|
// Methods related to text entry mode |
|
void EnterTextEntryMode( AnimationControlType_t type, bool bRelatchValues ); |
|
void AcceptTextEntryValue(); |
|
void DiscardTextEntryValue(); |
|
|
|
private: |
|
CBaseAnimSetAttributeSliderPanel *m_pParent; |
|
TextImage *m_pName; |
|
TextImage *m_pValues[ 3 ]; |
|
CSubRectImage *m_pCircleImage; // The background for the balance + multilevel controls |
|
|
|
// This is the control we're modifying |
|
CDmeHandle< CDmElement > m_hControl; |
|
|
|
// White material used for drawing non-textured things |
|
CMaterialReference m_pWhite; |
|
|
|
// The current mode of the slider |
|
SliderMode_t m_SliderMode; |
|
|
|
// The slider value; it may not match the control attribute value due to blending |
|
AttributeValue_t m_Control; |
|
|
|
// Is the slider control active? |
|
bool m_bIsControlActive[ANIM_CONTROL_COUNT]; |
|
|
|
// Info used when in text entry mode |
|
AttributeValue_t m_InitialTextEntryValue; |
|
CAttributeSliderTextEntry *m_pTextField; // if this is a stereo control, then this will be the left text field |
|
CAttributeSliderTextEntry *m_pRightTextField; |
|
|
|
Preview_t m_Next; |
|
Preview_t m_Previous; |
|
Preview_t m_Preview; |
|
float m_flPreviewGoalTime; |
|
float m_flFaderAmount; |
|
|
|
// Fields used to help with drag |
|
int m_nDragStartPosition[2]; // Where was the mouse clicked? |
|
int m_nAccum[2]; // What's the total mouse movement during the drag? |
|
float m_flDragStartValue; // What was the value of the slider before the drag started? |
|
float m_flDragStartBalance; // What was the balance of the slider before the drag started? |
|
|
|
bool m_bCursorInsidePanel : 1; // Used to |
|
bool m_bRampUp : 1; |
|
bool m_bPreviewEnabled : 1; |
|
bool m_bSimplePreviewOnly : 1; |
|
bool m_bFaderBeingDragged : 1; |
|
bool m_bIsLogPreviewControl : 1; |
|
bool m_bTransform : 1; |
|
bool m_bSelected : 1; |
|
|
|
friend class CAttributeSliderTextEntry; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Inline methods |
|
//----------------------------------------------------------------------------- |
|
|
|
//----------------------------------------------------------------------------- |
|
// Returns the control |
|
//----------------------------------------------------------------------------- |
|
inline CDmElement *CAttributeSlider::GetControl() |
|
{ |
|
return m_hControl; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Returns information about the control |
|
//----------------------------------------------------------------------------- |
|
inline bool CAttributeSlider::IsTransform() const |
|
{ |
|
// NOTE: We may well not wish to cache this off in the constructor. |
|
// It's done purely for efficiency reasons. |
|
// Uncomment the line to make it read from the control. |
|
// return m_hControl->GetValue< bool >( "transform" ) |
|
return m_bTransform; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Are we dragging? |
|
//----------------------------------------------------------------------------- |
|
inline bool CAttributeSlider::IsDragging() const |
|
{ |
|
COMPILE_TIME_ASSERT( ANIM_CONTROL_COUNT < 4 ); |
|
return ( m_SliderMode >= SLIDER_MODE_FIRST_DRAG_MODE && m_SliderMode <= SLIDER_MODE_LAST_DRAG_MODE ); |
|
} |
|
|
|
inline AnimationControlType_t CAttributeSlider::GetDragControl() const |
|
{ |
|
if ( IsDragging() ) |
|
return (AnimationControlType_t)( m_SliderMode - SLIDER_MODE_FIRST_DRAG_MODE ); |
|
return ANIM_CONTROL_INVALID; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Are we in text entry mode? |
|
//----------------------------------------------------------------------------- |
|
inline bool CAttributeSlider::IsInTextEntry() const |
|
{ |
|
COMPILE_TIME_ASSERT( ANIM_CONTROL_COUNT < 4 ); |
|
return ( m_SliderMode >= SLIDER_MODE_FIRST_TEXT_MODE && m_SliderMode <= SLIDER_MODE_LAST_TEXT_MODE ); |
|
} |
|
|
|
inline AnimationControlType_t CAttributeSlider::GetTextEntryControl() const |
|
{ |
|
if ( IsInTextEntry() ) |
|
return (AnimationControlType_t)( m_SliderMode - SLIDER_MODE_FIRST_TEXT_MODE ); |
|
return ANIM_CONTROL_INVALID; |
|
} |
|
|
|
#endif // ATTRIBUTESLIDER_H
|
|
|