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.
190 lines
5.7 KiB
190 lines
5.7 KiB
5 years ago
|
//=========== Copyright Valve Corporation, All rights reserved. ===============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef GRID_H
|
||
|
#define GRID_H
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "panel2d.h"
|
||
|
#include "panorama/controls/label.h"
|
||
|
#include "panorama/controls/mousescroll.h"
|
||
|
|
||
|
namespace panorama
|
||
|
{
|
||
|
|
||
|
DECLARE_PANEL_EVENT0( ReadyPanelForDisplay )
|
||
|
DECLARE_PANEL_EVENT0( PanelDoneWithDisplay )
|
||
|
DECLARE_PANEL_EVENT0( GridMotionTimeout );
|
||
|
DECLARE_PANEL_EVENT0( GridInFastMotion );
|
||
|
DECLARE_PANEL_EVENT0( GridStoppingFastMotion );
|
||
|
DECLARE_PANEL_EVENT0( GridPageLeft );
|
||
|
DECLARE_PANEL_EVENT0( GridPageRight );
|
||
|
DECLARE_PANEL_EVENT0( GridDirectionalMove );
|
||
|
DECLARE_PANEL_EVENT1( ChildIndexSelected, int );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Button
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CGrid : public CPanel2D
|
||
|
{
|
||
|
DECLARE_PANEL2D( CGrid, CPanel2D );
|
||
|
|
||
|
public:
|
||
|
CGrid( CPanel2D *parent, const char * pchPanelID );
|
||
|
virtual ~CGrid();
|
||
|
|
||
|
CPanel2D * AccessSelectedPanel() { return m_pFocusedChild.Get(); }
|
||
|
|
||
|
virtual void SetupJavascriptObjectTemplate() OVERRIDE;
|
||
|
|
||
|
// Scroll the grid so the focused panel is in the top left corner
|
||
|
void MoveFocusToTopLeft();
|
||
|
|
||
|
// Scroll the grid all the way to the left regardless of what's
|
||
|
// focused.
|
||
|
void ScrollPanelToLeftEdge();
|
||
|
|
||
|
// Trigger fast motion style temporarily, do this if you are directly setting focus ahead a bunch
|
||
|
void TriggerFastMotion();
|
||
|
void BumpFastMotionTimeout();
|
||
|
|
||
|
void SetHorizontalCount( int nCount ) { SetHorizontalAndVerticalCount( nCount, m_nVerticalCount ); }
|
||
|
void SetVerticalCount( int nCount ) { SetHorizontalAndVerticalCount( m_nHorizontalCount, nCount ); }
|
||
|
int GetHorizontalCount() const { return m_nHorizontalCount; }
|
||
|
int GetVerticalCount() const { return m_nVerticalCount; }
|
||
|
|
||
|
void SetHorizontalFocusLimit( int nCount ) { m_nHorizontalFocusLimit = nCount; InvalidateSizeAndPosition(); }
|
||
|
int GetHorizontalFocusLimit() const { return m_nHorizontalFocusLimit; }
|
||
|
|
||
|
float GetScrollProgress() const { return m_flScrollProgress; }
|
||
|
|
||
|
virtual bool OnMoveUp( int nRepeats );
|
||
|
virtual bool OnMoveDown( int nRepeats );
|
||
|
virtual bool OnMoveRight( int nRepeats );
|
||
|
virtual bool OnMoveLeft( int nRepeats );
|
||
|
virtual bool OnTabForward( int nRepeats );
|
||
|
virtual bool OnTabBackward( int nRepeats );
|
||
|
virtual bool OnMouseWheel( const panorama::MouseData_t &code );
|
||
|
virtual bool OnGamePadDown( const panorama::GamePadData_t &code );
|
||
|
virtual bool OnKeyDown( const KeyData_t &code );
|
||
|
|
||
|
virtual bool BRequiresContentClipLayer() OVERRIDE { return true; }
|
||
|
|
||
|
virtual void Paint();
|
||
|
virtual bool OnSetFocusToNextPanel( int nRepeats, EFocusMoveDirection moveType, bool bAllowWrap, float flTabIndexCurrent, float flXPosCurrent, float flYPosCurrent, float flXStart, float fYStart ) OVERRIDE
|
||
|
{
|
||
|
switch( moveType )
|
||
|
{
|
||
|
case k_ENextInTabOrder:
|
||
|
if ( OnTabForward( nRepeats ) )
|
||
|
return true;
|
||
|
break;
|
||
|
case k_ENextByXPosition:
|
||
|
if ( OnMoveRight( nRepeats ) )
|
||
|
return true;
|
||
|
break;
|
||
|
case k_EPrevInTabOrder:
|
||
|
if ( OnTabBackward( nRepeats ) )
|
||
|
return true;
|
||
|
break;
|
||
|
case k_EPrevByXPosition:
|
||
|
if ( OnMoveLeft( nRepeats ) )
|
||
|
return true;
|
||
|
break;
|
||
|
case k_ENextByYPosition:
|
||
|
if ( OnMoveDown( nRepeats ) )
|
||
|
return true;
|
||
|
break;
|
||
|
case k_EPrevByYPosition:
|
||
|
if ( OnMoveUp( nRepeats ) )
|
||
|
return true;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void SetHorizontalAndVerticalCount( int nHorizontalCount, int nVerticalCount );
|
||
|
|
||
|
void SetIgnoreFastMotion( bool bValue ) { m_bIgnoreFastMotion = bValue; }
|
||
|
|
||
|
#ifdef DBGFLAG_VALIDATE
|
||
|
virtual void ValidateClientPanel( CValidator &validator, const tchar *pchName ) OVERRIDE;
|
||
|
#endif
|
||
|
|
||
|
protected:
|
||
|
virtual bool BSetProperty( CPanoramaSymbol symName, const char *pchValue ) OVERRIDE;
|
||
|
virtual void OnLayoutTraverse( float flFinalWidth, float flFinalHeight );
|
||
|
virtual void OnBeforeChildrenChanged() { m_bForceRelayout = true; }
|
||
|
|
||
|
virtual void OnChildStylesChanged() OVERRIDE { m_bVecVisibleDirty = true; }
|
||
|
virtual void OnAfterChildrenChanged() OVERRIDE { m_bVecVisibleDirty = true; }
|
||
|
private:
|
||
|
|
||
|
void UpdateVecVisible();
|
||
|
int GetVisibleChildCount();
|
||
|
CPanel2D *GetVisibleChild( int iVisibleIndex );
|
||
|
|
||
|
// event handlers
|
||
|
bool EventInputFocusSet( const CPanelPtr< IUIPanel > &ptrPanel );
|
||
|
bool EventInputFocusLost( const CPanelPtr< IUIPanel > &ptrPanel );
|
||
|
bool MotionTimeout( const CPanelPtr< IUIPanel > &ptrPanel );
|
||
|
bool OnMouseScroll( const CPanelPtr< IUIPanel > &ptrPanel, int cRepeat );
|
||
|
void LayoutMouseScrollRegions( float flFinalWidth, float flFinalHeight );
|
||
|
bool EventWindowCursorShown( IUIWindow *pWindow );
|
||
|
bool EventWindowCursorHidden( IUIWindow *pWindow );
|
||
|
|
||
|
void RegisterForCursorChanges();
|
||
|
void UnregisterForCursorChanges();
|
||
|
|
||
|
int GetFocusedChildVisibleIndex();
|
||
|
void UpdateChildPositions( bool bForceTopLeft = false );
|
||
|
|
||
|
bool m_bHadFocus;
|
||
|
|
||
|
CPanelPtr< CPanel2D > m_pFocusedChild;
|
||
|
CUtlVector< CPanelPtr<CPanel2D> > m_vecPanelsReadyForDisplay;
|
||
|
|
||
|
int m_nScrollOffset;
|
||
|
|
||
|
float m_flChildWidth;
|
||
|
float m_flChildHeight;
|
||
|
float m_flScaleOffset;
|
||
|
|
||
|
float m_flScrollProgress;
|
||
|
|
||
|
int m_nHorizontalCount;
|
||
|
int m_nVerticalCount;
|
||
|
|
||
|
// Override how far right you can move before all items must shift, should be smaller than m_nHorizontalCount
|
||
|
int m_nHorizontalFocusLimit;
|
||
|
|
||
|
double m_flLastMouseWheel;
|
||
|
bool m_bForceRelayout;
|
||
|
|
||
|
bool m_bIgnoreFastMotion;
|
||
|
double m_flStartedMotion;
|
||
|
double m_flLastMotion;
|
||
|
uint64 m_ulMotionSinceStart;
|
||
|
bool m_bFastMotionStarted;
|
||
|
bool m_bVecVisibleDirty;
|
||
|
|
||
|
CUtlVector< CPanel2D * > m_vecVisibleChildren;
|
||
|
|
||
|
panorama::CMouseScrollRegion *m_pLeftMouseScrollRegion;
|
||
|
panorama::CMouseScrollRegion *m_pRightMouseScrollRegion;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
} // namespace panorama
|
||
|
|
||
|
#endif // GRID_H
|