|
|
//========= 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
|