summaryrefslogtreecommitdiff
path: root/public/dme_controls/attributeslider.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/dme_controls/attributeslider.h')
-rw-r--r--public/dme_controls/attributeslider.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/public/dme_controls/attributeslider.h b/public/dme_controls/attributeslider.h
new file mode 100644
index 0000000..1f68dbf
--- /dev/null
+++ b/public/dme_controls/attributeslider.h
@@ -0,0 +1,284 @@
+//========= 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