mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-18 14:31:58 +00:00
1
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user