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.
233 lines
7.1 KiB
233 lines
7.1 KiB
![]()
4 years ago
|
//=========== 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
|