diff options
Diffstat (limited to 'public/panorama/controls/carousel.h')
| -rw-r--r-- | public/panorama/controls/carousel.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/public/panorama/controls/carousel.h b/public/panorama/controls/carousel.h new file mode 100644 index 0000000..58bbca6 --- /dev/null +++ b/public/panorama/controls/carousel.h @@ -0,0 +1,232 @@ +//=========== Copyright Valve Corporation, All rights reserved. ===============// +// +// Purpose: +//=============================================================================// + +#ifndef CAROUSEL_H +#define CAROUSEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "mathlib/mathlib.h" +#include "mathlib/beziercurve.h" +#include "panel2d.h" +#include "panorama/controls/label.h" +#include "panorama/controls/mousescroll.h" + +namespace panorama +{ + +DECLARE_PANORAMA_EVENT0( ResetCarouselMouseWheelCounts ); +DECLARE_PANORAMA_EVENT1( SetCarouselSelectedChild, CPanelPtr<CPanel2D> ); + + +//----------------------------------------------------------------------------- +// Purpose: Button +//----------------------------------------------------------------------------- +class CCarousel : public CPanel2D +{ + DECLARE_PANEL2D( CCarousel, CPanel2D ); + +public: + CCarousel( CPanel2D *parent, const char * pchPanelID ); + virtual ~CCarousel(); + + enum EFocusType + { + k_EFocusTypeLeft, + k_EFocusTypeEdge, + k_EFocusTypeCenter + }; + + void SetTitleText( const char *pchTitle ); + void SetTitleVisible( bool bVisible ); + void SetWrap( bool bWrap ); + void SetFocusType( EFocusType eType ); + void SetOffset( CUILength len ); + void DrawFocusFrame( bool bDraw ); + void DeleteChildren(); + + bool SetFocusToIndex( int iFocus ); + int GetFocusIndex() const { return GetChildIndex( m_pFocusedChild.Get() ); } + CPanel2D *GetFocusChild() const { return m_pFocusedChild.Get(); } + + // Sets the child that will get focus when the carousel has focus. Remembered between focus calls + void SetSelectedChild( CPanel2D *pPanel ); + + // Sets the panel for which focus state is checked when applying focus offset. + void SetFocusOffsetPanel( CPanel2D *pPanel ) { m_ptrPanelFocusOffset = pPanel; } + + virtual bool BSetProperty( CPanoramaSymbol symName, const char *pchValue ) OVERRIDE; + virtual void GetDebugPropertyInfo( CUtlVector< DebugPropertyOutput_t *> *pvecProperties ); + virtual void OnLayoutTraverse( float flFinalWidth, float flFinalHeight ); + virtual void Paint(); + + virtual bool OnMoveRight( int nRepeats ); + virtual bool OnMoveLeft( int nRepeats ); + virtual bool OnTabForward( int nRepeats ) { return OnMoveRight( nRepeats ); } + virtual bool OnTabBackward( int nRepeats ) { return OnMoveLeft( nRepeats ); } + virtual bool OnMouseWheel( const panorama::MouseData_t &code ); + virtual void OnStylesChanged(); + + virtual void OnUIScaleFactorChanged( float flScaleFactor ) OVERRIDE; + + virtual bool BRequiresContentClipLayer() OVERRIDE { return true; } + + virtual void OnInitializedFromLayout(); + + virtual void SetupJavascriptObjectTemplate() OVERRIDE; + +#ifdef DBGFLAG_VALIDATE + virtual void ValidateClientPanel( CValidator &validator, const tchar *pchName ); +#endif + +protected: + + virtual bool OnSetFocusToNextPanel( int nRepeats, EFocusMoveDirection moveType, bool bAllowWrap, float flTabIndexCurrent, float flXPosCurrent, float flYPosCurrent, float flXStart, float fYStart ) OVERRIDE + { + if ( m_bWrap ) + { + switch( moveType ) + { + case k_ENextInTabOrder: + case k_ENextByXPosition: + return OnMoveRight( nRepeats ); + case k_EPrevInTabOrder: + case k_EPrevByXPosition: + return OnMoveLeft( nRepeats ); + default: + break; + } + } + else + { + int iFocusChild = GetChildIndex( m_pFocusedChild.Get() ); + switch( moveType ) + { + case k_ENextInTabOrder: + case k_ENextByXPosition: + if ( iFocusChild < GetChildCount() - 1 ) + { + return OnMoveRight( nRepeats ); + } + break; + case k_EPrevInTabOrder: + case k_EPrevByXPosition: + if ( iFocusChild > 0 ) + { + return OnMoveLeft( nRepeats ); + } + break; + default: + break; + } + } + + return false; + } + + // child management + virtual void OnBeforeChildrenChanged(); + virtual void OnCallBeforeStyleAndLayout() { UpdateFocusAndDirtyChildStyles(); } + +private: + enum EFocusEdge + { + k_EFocusEdgeLeft, + k_EFocusEdgeRight + }; + + // event handlers + bool EventInputFocusSet( const CPanelPtr< IUIPanel > &ptrPanel ); + bool EventInputFocusLost( const CPanelPtr< IUIPanel > &ptrPanel ); + bool OnResetMouseWheelCounts(); + bool EventCarouselMouseScroll( const CPanelPtr< IUIPanel > &ptrPanel, int cRepeat ); + bool EventWindowCursorShown( IUIWindow *pWindow ); + bool EventWindowCursorHidden( IUIWindow *pWindow ); + + // owned panels + CLabel *CreateTitleLabel(); + + // focus + bool BSetFocusToChild( CPanel2D *pPanel ); + void MarkFocusDirty(); + bool UpdateFocusAndDirtyChildStyles(); + + // helpers + int GetPreviousWrapPanel( int i ); + int GetNextWrapPanel( int i ); + float GetFinalChildWidth( CPanel2D *pChild, float flContainerHeight ); + void GetFinalChildDimensions( float *pflWidth, float *pflHeight, CPanel2D *pChild, float flContainerHeight ); + int CalcIndexDistanceBetweenPanels( int iLHS, int iRHS ); + int GetNextPanelInLayout( int iStart ); + int GetPreviousPanelInLayout( int iStart ); + void AddCarouselStyle( CPanel2D *pChild, int iChild, int iCurrentFocus ); + void RemoveCarouselStyle( CPanel2D *pChild, int iChild, int iCurrentFocus ); + void RegisterForCursorChanges(); + void UnregisterForCursorChanges(); + + // configured offets + void GetPanelOffsets( CUILength *plenX, CUILength *plenY, CUILength *plenZ, int nDistanceFromFocus, float flWidth, float flHeight ); + CUILength GetPanelOffset( int nDistanceFromFocus, bool bUseFocus, const CUtlVector< CUILength > &vecOffsets, const CUtlVector< CUILength > &vecFocusOffsets ); + + // layout related + void GetLayoutStart( int iFocusChild, float *pflOffset, float flLeft, float flCarouselOffset, const float flContainerWidth, const float flContainerHeight ); + void LayoutChildPanels( int iFocusChild, float flOffset, float flLeft, float flRight, const float flContainerWidth, const float flContainerHeight, const CUtlVector< CPanel2D* > &vecNewChildren ); + bool BPositionPanelRight( int iPanel, int nDistanceFromFocus, float *pflOffset, float flLeft, float flContainerWidth, float flContainerHeight, bool bCheckFits, const CUtlVector< CPanel2D* > &vecNewChildren ); + bool BPositionPanelLeft( int iPanel, int nDistanceFromFocus, float *pflOffset, float flLeft, float flContainerWidth, float flContainerHeight, bool bCheckFits, const CUtlVector< CPanel2D* > &vecNewChildren ); + void LayoutMouseScrollRegions( float flFinalWidth, float flFinalHeight ); + + struct DirtyChildStyles_t + { + int m_iOriginalFocus; + CUtlVector< CPanel2D* > m_vecPanels; + }; + DirtyChildStyles_t *m_pDirtyChildStyles; + + + CLabel *m_pTitleLabel; + CMouseScrollRegion *m_pLeftMouseScrollRegion; + CMouseScrollRegion *m_pRightMouseScrollRegion; + CPanelPtr< CPanel2D > m_pFocusedChild; + + EFocusType m_eFocusType; + bool m_bWrap; + CUILength m_lenOffset; + bool m_bIncludeScale2d; + + // for edge focus + EFocusEdge m_eLastFocusEdge; + int m_iFocusLastEdge; + + struct ChildOffsets_t + { + CUtlVector< CUILength > x; + CUtlVector< CUILength > y; + CUtlVector< CUILength > z; + }; + ChildOffsets_t m_childOffsets; + ChildOffsets_t m_childOffsetsFocus; + bool m_bFlowingLayout; + bool m_bHadFocus; + + double m_flLastMouseWheel; + uint32 m_unMouseWheelCount; + + double m_flLastMove; + bool m_bDelayedMovePosted; + bool m_bRegisteredForCursorChanges; + + bool m_bShuffleIntoView; + + int32 m_nPanelsVisible; + + CPanelPtr< CPanel2D > m_ptrPanelFocusOffset; +}; + + +} // namespace panorama + +#endif // CAROUSEL_H |