//======= Copyright © 1996-2008, Valve Corporation, All rights reserved. ====== // // Purpose: A 2D Slider // //============================================================================= #ifndef C2DSLIDER_H #define C2DSLIDER_H #include class vgui::TextImage; //----------------------------------------------------------------------------- // Purpose: A 2D Slider //----------------------------------------------------------------------------- class C2DSlider : public vgui::Panel { DECLARE_CLASS_SIMPLE( C2DSlider, vgui::Panel ); public: C2DSlider( Panel *pParent, const char *pName ); virtual ~C2DSlider(); // interface virtual void SetValueX( float fValueX, bool bTriggerChangeMessage = true ); virtual float GetValueX() const; virtual void SetValueY( float fValueY, bool bTriggerChangeMessage = true ); virtual float GetValueY() const; virtual void SetValue( float fValueX, float fValueY, bool bTriggerChangeMessage = true ); virtual void GetValue( float &fValueX, float &fValueY ) const; virtual void SetRange( float fMinX, float fMaxX, float fMinY, float fMaxY, bool bTriggerChangeMessage = true ); virtual void GetRange( float &fMinX, float &fMaxX, float &fMinY, float &fMaxY ) const; virtual void SetLabelText( const char *pText ); virtual void SetLabelText( const wchar_t *pText ); virtual void GetLabelText( wchar_t *pBuffer, int nBufferLen ) const; virtual void GetLabelUnlocalizedText( char *pBuffer, int nBufferLen ) const; virtual void SetDrawLabel( bool bState ); virtual bool IsDrawingLabel() const; virtual void GetNobPos( int &nX, int &nY ); virtual void OnCursorMoved( int x, int y ); virtual void OnMousePressed( vgui::MouseCode mouseCode ); virtual void OnMouseDoublePressed( vgui::MouseCode mouseCode ); virtual void OnMouseReleased( vgui::MouseCode mouseCode ); virtual void SetNobWidth( int nWidth ); virtual int GetNobWidth() const; virtual void SetNobTall( int nTall ); virtual int GetNobTall() const; virtual void SetNobSize( int nWidth, int nTall ); virtual void GetNobSize( int &nWidth, int &nTall ) const; // If you click on the slider outside of the nob, the nob jumps // to the click position, and if this setting is enabled, the nob // is then draggable from the new position until the mouse is released virtual void SetDragOnRepositionNob( bool bState ); virtual bool IsDragOnRepositionNob() const; // Get if the slider nob is being dragged by user, usually the application // should refuse from forcefully setting slider value if it is being dragged // by user since the next frame the nob will pop back to mouse position virtual bool IsDragged() const; protected: virtual void OnSizeChanged( int nWide, int nTall ); virtual void Paint(); virtual void PaintBackground(); virtual void PerformLayout(); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void ApplySettings( KeyValues *pInResourceData ); virtual void GetSettings( KeyValues *pOutResourceData ); virtual const char *GetDescription(); virtual void OnKeyCodeTyped( vgui::KeyCode nKeyCode ); virtual void DrawNob(); virtual void GetTrackRect( int &x, int &y, int &w, int &t ); virtual void MoveNobRelative( int nX, int nY ); virtual void RecomputeNobPosFromValue(); virtual void RecomputeValueFromNobPos( bool bTriggerChangeMessage = true ); virtual void SendSliderMovedMessage(); virtual void SendSliderDragStartMessage(); virtual void SendSliderDragEndMessage(); enum Axis_t { kXAxis = 0, kYAxis = 1, kAxisCount = 2 }; int m_nNobPos[ kAxisCount ]; // Position of the center of the nob in client space pixels int m_nNobDragStartPos[ kAxisCount ]; int m_nDragStartPos[ kAxisCount ]; float m_fRange[ kAxisCount ][ 2 ]; float m_fValue[ kAxisCount ]; // the position of the Slider, in coordinates as specified by SetRange vgui::IBorder *m_pNobBorder; vgui::IBorder *m_pInsetBorder; int m_nNobHalfSize[ kAxisCount ]; // The number of pixels on each side of the nob center, can be 0 for a 1x1 pixel nob. nob size = m_nNobHalfSize * 2 + 1 static Color s_TextColor; static Color s_NobColor; static Color s_TickColor; static Color s_TickFillXColor; static Color s_TickFillYColor; static Color s_TickFillColor; static Color s_TrackColor; bool m_bDrawLabel : 1; bool m_bIsDragOnRepositionNob : 1; bool m_bDragging : 1; vgui::TextImage *m_pLabel; }; #endif // C2DSLIDER_H